From e634f0fbe4472a49d71e2baf128a1af185383654 Mon Sep 17 00:00:00 2001 From: "Collin J. Doering" Date: Tue, 11 Aug 2015 01:36:42 -0400 Subject: [PATCH] Consolidated default and nojs versions of site Removed old nojs specific templates and updated "templates/default.html" and "templates/partials/nav.html" to support nojs. All pages now use relativized urls. Navigation pages (including blog paginated pages) are generated to "/" instead of "/pages/". Site now works when javascript is disabled. Unfortunately, it no longer works when javascript is enabled. This is due to the client side router but needs to be debugged further. Signed-off-by: Collin J. Doering --- TODO.org | 61 +++++-- js/default.js | 244 +++++++++++++------------- posts/computer-from-scratch.markdown | 4 +- src/site.hs | 245 +++++++++++---------------- templates/default-nojs.html | 38 ----- templates/default.html | 20 ++- templates/partials/nav-nojs.html | 20 --- templates/partials/nav.html | 18 +- 8 files changed, 288 insertions(+), 362 deletions(-) delete mode 100644 templates/default-nojs.html delete mode 100644 templates/partials/nav-nojs.html diff --git a/TODO.org b/TODO.org index 4cc7d88..7efea35 100644 --- a/TODO.org +++ b/TODO.org @@ -1,26 +1,13 @@ * rm-js-req TODOs ** Goals -*** TODO Remove the javascipt requirement (so that all urls can be viewed without javascript) -*** TODO Only generate one version of the site *** TODO Have SPA functionality when javascript is enabled +*** Complete +**** DONE Remove the javascipt requirement (so that all urls can be viewed without javascript) + CLOSED: [2015-08-10 Mon 22:57] +**** DONE Only generate one version of the site + CLOSED: [2015-08-10 Mon 22:57] -** Implementation - In order to implement this, a reasonable size refactor needs to take place. Below is a list - of things to be completed in order to successfully achieve the aforementioned goals. - -*** TODO Generate nav with href pointing to normal urls, not virtual ones - (Eg. /pages/blog.html instead of #/blog.html) -*** TODO Modify URLs using javascript once page is loaded - If it is indeed enabled then the user can benefit from the SPA functionality of the site. - Otherwise they will be able to browse the site using the original, unmodified links. This is - similar to how the link withing the page-content div work currently, and mainly would have to - be adapted for the navigation. -*** TODO Generate pages/* to / - Instead of having the default version -*** TODO Generate complete pages (no snippets) - The enhanced javascipt additions to the site will then have to extract the page-content div - before loading it into the page. ** Benefits This refactor will have a couple added benefits. Namely: @@ -30,3 +17,41 @@ links to the posts are to the snippets instead of the virtual address (Eg. /posts/some-post.html instead of /#/posts/some-post.html). - Having two files for every post is bad for search engines (SEO). + +** Implementation + In order to implement this, a reasonable size refactor needs to take place. Below is a list + of things to be completed in order to successfully achieve the aforementioned goals. + +*** TODO Modify nav URLs using javascript once page is loaded + If it is indeed enabled then the user can benefit from the SPA functionality of the site. + Otherwise they will be able to browse the site using the original, unmodified links. This is + similar to how the link withing the page-content div work currently, and mainly would have to + be adapted for the navigation. + +*** TODO Fix issue with tag and pagination urls <> + All URLs are required to work without javascript. Thus there can't be any tricks employed + in javascript to modify urls (the js router rewriting). Currently this happens with the + + - "/blog.html" to "/blog1.html" + - "/tags/general.html" to "/tags/general1.html" + - etc.. + + Currently URLs to paginated pages (which includes the blog and tag pages) are broken. They + generate "/tags/*.html" instead of "/tags/*1.html". + +*** TODO Fix ajax page loading + Pages don't load properly when javascript is enabled. This likely is having an effect on + this [[page loading issue][issue]] as well. More debugging is required. + +*** Complete +**** DONE Generate nav with href pointing to normal urls, not virtual ones + CLOSED: [2015-08-10 Mon 22:55] + (Eg. /pages/blog.html instead of #/blog.html) + Note: must be relative urls (via relativizeUrls) +**** DONE Generate pages/* to / + CLOSED: [2015-08-10 Mon 22:56] + Instead of having the default version +**** DONE Generate complete pages (no snippets) + CLOSED: [2015-08-10 Mon 22:57] + The enhanced javascipt additions to the site will then have to extract the page-content div + before loading it into the page. diff --git a/js/default.js b/js/default.js index d324622..628f0bf 100644 --- a/js/default.js +++ b/js/default.js @@ -111,12 +111,12 @@ _paq.push(['enableLinkTracking']); acceptUrls: /.*/, rewriteGetUrl: function (url) { if (url === "/") { - url = "/home.html"; + url = "/index.html"; } return "pages" + url; }, rewriteVirtualUrl: function (url) { - if (url === "/home.html") { + if (url === "/index.html") { url = "/"; } return url; @@ -124,7 +124,7 @@ _paq.push(['enableLinkTracking']); ajaxCallbacks: { beforeSend: function (url, virt_url) { if (virt_url === "/") { - virt_url = "/home.html"; + virt_url = "/index.html"; } // Initially set the active menuitem in the nav @@ -176,144 +176,140 @@ _paq.push(['enableLinkTracking']); return spec; }()), - page = (function () { - // var pageId = '#page-content', navId = '#nav'; + page = (function () { + // var pageId = '#page-content', navId = '#nav'; - function loadPageContent(page_href, virt_href, handlerCallback) { - // Track page view with piwik - _paq.push(['setDocumentTitle', document.domain + '/' + virt_href]); - _paq.push(['trackPageView']); + function loadPageContent(page_href, virt_href, handlerCallback) { + // Track page view with piwik + _paq.push(['setDocumentTitle', document.domain + '/' + virt_href]); + _paq.push(['trackPageView']); - $.ajax({ - url: page_href, - type: 'GET', - dataType: 'html', - beforeSend: function (xhr, settings) { - // Remove loading error from page-content - $('#page-content').removeClass('loading-error'); + // Remove loading error from page-content + $('#page-content').removeClass('loading-error'); - // Add .loading to #page-content and #nav to facilitate a loading animation - $('#page-content, #nav').removeClass('loading-done').addClass('loading'); + // Add .loading to #page-content and #nav to facilitate a loading animation + $('#page-content, #nav').removeClass('loading-done').addClass('loading'); - // Run current handlers onSuccess callback (if it exists) - if (handlerCallback.hasOwnProperty('beforeSend') && typeof handlerCallback.beforeSend === 'function') { - handlerCallback.beforeSend(page_href, virt_href); - } + // Run current handlers onSuccess callback (if it exists) + if (handlerCallback.hasOwnProperty('beforeSend') && typeof handlerCallback.beforeSend === 'function') { + handlerCallback.beforeSend(page_href, virt_href); + } - console.log('beforeSend a.menuitem'); - }, - success: function (dta) { - // Remove the initial loading gif (if its there) - $('#page-content').removeClass('init'); + console.log('beforeSend a.menuitem'); - // Remove any status message errors or successes - $('#status').slideUp('normal', function () { - $('#status').removeClass('error').removeClass('success').children('p.message').remove(); - }); - - // Stop animations in the nav and page-content and scroll to the top of the page in a set amount of time - setTimeout(function () { - // Replace old page-content with new page-content - $('#page-content').html(dta); - - // Stop page loading - $('#page-content, #nav').removeClass('loading'); - - // Reload any new maths using MathJax - $('#page-content .math').each(function (math_elem) { - mj.Hub.Queue(["Typeset", mj.Hub, math_elem[0]]); - }); - - // Rewrite new URLs within new content inserted into #page-content - $('#page-content a').each(function (i) { - var href = $(this).attr('href'), - external_url_regexp = /https?:\/\/.*/, - mailto_regexp = /mailto:.*/, - files_regexp = /files\/.*/, - images_regexp = /images\/.*/; - - if (!(external_url_regexp.test(href) || mailto_regexp.test(href) || files_regexp.test(href) || images_regexp.test(href))) { - $(this).attr('href', "/#" + href); - } - }); - - // Add fullscreen functionality to inline-images and figures - $('article.post p > img').click(function () { - $(this).get(0).toggleFullScreen(); - }); - $('figure').click(function () { - $(this).children('img').get(0).toggleFullScreen(); - }); - - // Run current handles onSuccess callback (if it exists) - if (handlerCallback.hasOwnProperty('onSuccess') && typeof handlerCallback.onSuccess === 'function') { - handlerCallback.onSuccess(); - } - - // Scroll to top of the page - if ($('body').scrollTop() > $('#nav').offset().top - 15) { - $('html, body').animate({ - scrollTop: $('#nav').offset().top - 15 - }, 'fast'); - } - }, 250); - }, - error: function (xhr, status) { - /* Remove .loading from #page-content and #nav to stop the loading - * animation. Then add .loading-error to #page-content if its the sites - * first load (#page-content has class .init). Finally, display an error - * message in #status. - */ - $('#page-content, #nav').removeClass('loading'); - if ($('#page-content.init')[0]) { - // TODO: instead of immediately displaying error, check if the content is stored in local storage - $('#page-content').addClass('loading-error').html('

Error initially loading blog.rekahsoft.ca. Check the url! Given "' + page_href + '"

'); - } else if ($('#status.error')[0]) { - $('#status').prepend('

Error retrieving page ' + page_href + '

'); - } else { - $('#status').prepend('

Error retrieving page ' + page_href + '

'); - $('#status').addClass('error').slideDown(); - } - - // Run current handles onError callback (if it exists) - if (handlerCallback.hasOwnProperty('onError') && typeof handlerCallback.onError === 'function') { - handlerCallback.onError(); - } + $('#page-content').load(page_href + ' #page-content', function (dta, status, xhr) { + if (status === "error") { + /* Remove .loading from #page-content and #nav to stop the loading + * animation. Then add .loading-error to #page-content if its the sites + * first load (#page-content has class .init). Finally, display an error + * message in #status. + */ + $('#page-content, #nav').removeClass('loading'); + if ($('#page-content.init')[0]) { + // TODO: instead of immediately displaying error, check if the content is stored in local storage + $('#page-content').addClass('loading-error').html('

Error initially loading blog.rekahsoft.ca. Check the url! Given "' + page_href + '"

'); + } else if ($('#status.error')[0]) { + $('#status').prepend('

Error retrieving page ' + page_href + '

'); + } else { + $('#status').prepend('

Error retrieving page ' + page_href + '

'); + $('#status').addClass('error').slideDown(); } - }); - } - function init(router) { - router.setCallback(loadPageContent); + // Run current handles onError callback (if it exists) + if (handlerCallback.hasOwnProperty('onError') && typeof handlerCallback.onError === 'function') { + handlerCallback.onError(); + } + } else { + // Remove the initial loading gif (if its there) + $('#page-content').removeClass('init'); - $(document).ready(function () { - $('#nav-menu a.menuitem').click(function () { - $(this).closest('ul').find('li.active').removeClass('active'); - $(this).closest('li').addClass('active'); - //$('.navbar-collapse').collapse('hide'); + // Remove any status message errors or successes + $('#status').slideUp('normal', function () { + $('#status').removeClass('error').removeClass('success').children('p.message').remove(); }); - $('#status a.close-button').click(function () { - $(this).parent().slideUp(function () { - $(this).removeClass('error').removeClass('success'); - $(this).children('p.message').remove(); + // Stop animations in the nav and page-content and scroll to the top of the page in a set amount of time + setTimeout(function () { + // Replace old page-content with new page-content + $('#page-content').html(dta); + + // Stop page loading + $('#page-content, #nav').removeClass('loading'); + + // Reload any new maths using MathJax + $('#page-content .math').each(function (math_elem) { + mj.Hub.Queue(["Typeset", mj.Hub, math_elem[0]]); }); - }); - // Callback for when the inital page has completely loaded (including images, etc..) - $.address.change(function (event) { - console.log("Change " + event.value); - router.runRouter(event.value); + // Rewrite new URLs within new content inserted into #page-content + $('#page-content a').each(function (i) { + var href = $(this).attr('href'), + external_url_regexp = /https?:\/\/.*/, + mailto_regexp = /mailto:.*/, + files_regexp = /files\/.*/, + images_regexp = /images\/.*/; + + if (!(external_url_regexp.test(href) || mailto_regexp.test(href) || files_regexp.test(href) || images_regexp.test(href))) { + $(this).attr('href', "/#" + href); + } + }); + + // Add fullscreen functionality to inline-images and figures + $('article.post p > img').click(function () { + $(this).get(0).toggleFullScreen(); + }); + $('figure').click(function () { + $(this).children('img').get(0).toggleFullScreen(); + }); + + // Run current handles onSuccess callback (if it exists) + if (handlerCallback.hasOwnProperty('onSuccess') && typeof handlerCallback.onSuccess === 'function') { + handlerCallback.onSuccess(); + } + + // Scroll to top of the page + if ($('body').scrollTop() > $('#nav').offset().top - 15) { + $('html, body').animate({ + scrollTop: $('#nav').offset().top - 15 + }, 'fast'); + } + }, 250); + } + }); + } + + function init(router) { + router.setCallback(loadPageContent); + + $(document).ready(function () { + $('#nav-menu a.menuitem').click(function () { + $(this).closest('ul').find('li.active').removeClass('active'); + $(this).closest('li').addClass('active'); + //$('.navbar-collapse').collapse('hide'); + }); + + $('#status a.close-button').click(function () { + $(this).parent().slideUp(function () { + $(this).removeClass('error').removeClass('success'); + $(this).children('p.message').remove(); }); }); - } - var spec = { - init: init - }; - return spec; - }()); + // Callback for when the inital page has completely loaded (including images, etc..) + $.address.change(function (event) { + console.log("Change " + event.value); + router.runRouter(event.value); + }); + }); + } + var spec = { + init: init + }; + return spec; + }()); + + // Start of execution page.init(router); }(jQuery, MathJax)); diff --git a/posts/computer-from-scratch.markdown b/posts/computer-from-scratch.markdown index d3fe494..6589a04 100644 --- a/posts/computer-from-scratch.markdown +++ b/posts/computer-from-scratch.markdown @@ -86,7 +86,7 @@ has run (using external tools). Hopefully at some point the developers of *GHDL* oversight. ![[GtkWave][] displaying a simulation dump from *computer_tb* running - *src/asm/Fib.hack*](files/images/gtkwave.png) + *src/asm/Fib.hack*](/files/images/gtkwave.png) Using a [generic property](http://www.doulos.com/knowhow/fpga/Setting_Generics_Parameters_for_Synthesis/) @@ -105,7 +105,7 @@ older version of *GHDL* then you must modify `src/computer_tb.vhdl` to specify t want to run in the simulation. See the [documentation][hack-docs] for details. ![[GtkWave][] zoomed in to view approximately *100 ns* of signal - output](files/images/gtkwave-closeup.png) + output](/files/images/gtkwave-closeup.png) So now that we've seen a quick rundown of how to use the simulator to run *Hack* programs, lets take a moment to review some of the deficiencies of the implementation. The most noticeable diff --git a/src/site.hs b/src/site.hs index fe868f7..30dea4d 100644 --- a/src/site.hs +++ b/src/site.hs @@ -120,13 +120,14 @@ main = do match "templates/**" $ compile $ getResourceBody >>= saveSnapshot "original" >> templateCompiler --- Default Version -------------------------------------------------------------------------------------- + -- Generate tags tags <- buildTags ("posts/**" .&&. hasNoVersion) (fromCapture "tags/*.html") + -- Generate paginate paginatedPosts <- buildPaginateWith (fmap (paginateEvery numPaginatePages) . sortRecentFirst) ("posts/**" .&&. hasNoVersion) - (\n -> fromCapture "pages/blog*.html" (show n)) + (\n -> fromCapture "blog*.html" (show n)) pageIds <- getMatches ("pages/**" .&&. complement "pages/blog.markdown") fontIds <- getMatches "fonts/**" @@ -190,154 +191,46 @@ main = do -- Generate tag pages paginateTagsRules "tags" tags - paginateRules paginatedPosts $ \pageNum pattern -> do - route idRoute - compile $ do - posts <- recentFirst =<< loadAllSnapshots pattern "content" - let ctx = taggedPostCtx tags <> - paginateContext paginatedPosts pageNum <> - virtualPaginateContext paginatedPosts pageNum <> - constField "weight" "0" <> - listField "posts" (taggedPostCtx tags) (return posts) - makeItem "" - >>= loadAndApplyTemplate "templates/pages/blog.html" ctx - - match "pages/*" $ do - route $ setExtension "html" - compile $ do - -- Get the current page name - pageName <- takeBaseName . toFilePath <$> getUnderlying - - posts <- recentFirst =<< loadAllSnapshots ("posts/**" .&&. hasNoVersion) "content" - - let recentPosts = take 5 posts - pageTemplate = "templates/pages/" ++ pageName ++ ".html" - masterCtx = listField "recentPosts" (taggedPostCtx tags) (return recentPosts) <> - listField "posts" (taggedPostCtx tags) (return posts) <> - tagCloudField "tagCloud" 65 135 tags <> - defaultContext - - sectionCtx <- getResourceBody >>= genSectionContext - pg <- loadSnapshot (fromFilePath pageTemplate) "original" - >>= applyAsTemplate (sectionCtx <> masterCtx) - - if pageName == "blog" - then makeItem "" - else makeItem . itemBody $ pg - - match "posts/**" $ do - route $ setExtension "html" - compile $ pandocCompilerWith pandocReaderOptions pandocWriterOptions - >>= saveSnapshot "content" - >>= loadAndApplyTemplate "templates/partials/post.html" (taggedPostCtx tags) - - create ["atom.xml"] $ do - route idRoute - compile $ do - let feedCtx = postCtx <> bodyField "description" - blogPosts <- loadAllSnapshots ("posts/**" .&&. hasNoVersion) "content" - >>= fmap (take 10) . recentFirst - renderAtom (feedConfiguration Nothing) feedCtx blogPosts - - forM_ [("js/**", idRoute), - ("lib/JQuery/*", gsubRoute "JQuery" $ const "js"), - ("lib/jquery-address/jquery.address.js", - customRoute $ const "lib/js/jquery.address.js")] $ \(p, r) -> - match p $ do - route r - compile $ getResourceString >>= withItemBody (unixFilter "jsmin" []) - - create ["index.html"] $ do - route idRoute - compile $ do - -- Generate nav-bar from pages/* ordered by metadata 'weight' - pages <- sortByM pageWeight =<< filterM (\i -> pageWeight i >>= return . (> 0)) =<< loadAll ("pages/*" .&&. hasNoVersion) - - let indexCtx = listField "pages" pagesCtx (return pages) <> defaultContext - - makeItem "loading" - >>= applyAsTemplate indexCtx - >>= loadAndApplyTemplate "templates/default.html" indexCtx - --- NOJS Version ----------------------------------------------------------------------------------------- - tagsNoJs <- buildTags ("posts/**" .&&. hasVersion "nojs") (fromCapture "nojs/tags/*.html") - - paginatedPostsNoJs <- buildPaginateWith - (fmap (paginateEvery numPaginatePages) . sortRecentFirst) - ("posts/**" .&&. hasVersion "nojs") - (\n -> fromCapture "nojs/blog*.html" (show n)) - - -- Generate nojs tag pages - paginateTagsRules "nojs/tags" tagsNoJs - - paginateRules paginatedPostsNoJs $ \pageNum pattern -> do - route idRoute - compile $ do - pages <- sortByM pageWeight =<< loadAll ("pages/*" .&&. hasVersion "nav-gen") - - posts <- recentFirst =<< loadAllSnapshots pattern "content" - let (pagesFirst, pagesLast') = flip span pages $ \x -> - (toFilePath . itemIdentifier $ x) /= "pages/blog.markdown" - pageMid = [head pagesLast'] - pagesLast = if not . null $ pagesLast' then tail pagesLast' else [] - ctx = taggedPostCtx tagsNoJs <> - paginateContext paginatedPostsNoJs pageNum <> - virtualPaginateContext paginatedPostsNoJs pageNum <> - constField "weight" "0" <> - listField "posts" (taggedPostCtx tagsNoJs) (return posts) - indexCtx = listField "pagesFirst" pagesCtx (return pagesFirst) <> - listField "pageMid" pagesCtx (return pageMid) <> - listField "pagesLast" pagesCtx (return pagesLast) <> - defaultContext - - makeItem "" - >>= loadAndApplyTemplate "templates/pages/blog.html" ctx - >>= loadAndApplyTemplate "templates/default-nojs.html" indexCtx - - create ["nojs/atom.xml"] $ do - route idRoute - compile $ do - let feedCtx = postCtx <> bodyField "description" - blogPosts <- loadAllSnapshots ("posts/**" .&&. hasVersion "nojs") "content" - >>= fmap (take 10) . recentFirst - renderAtom (feedConfiguration Nothing) feedCtx blogPosts - - match "posts/**" $ version "nojs" $ do - route $ customRoute (\r -> "nojs" toFilePath r) `composeRoutes` setExtension "html" - compile $ do - -- Generate nav-bar from pages/* - pages <- sortByM pageWeight =<< loadAll ("pages/*" .&&. hasVersion "nav-gen") - - let (pagesFirst, pagesLast') = flip span pages $ \x -> - (toFilePath . itemIdentifier $ x) /= "pages/blog.markdown" - pageMid = [head pagesLast'] - pagesLast = if not . null $ pagesLast' then tail pagesLast' else [] - postNojsCtx = - listField "pagesFirst" pagesCtx (return pagesFirst) <> - listField "pageMid" pagesCtx (return pageMid) <> - listField "pagesLast" pagesCtx (return pagesLast) <> - defaultContext - - pandocCompilerWith pandocReaderOptions pandocWriterOptions - >>= saveSnapshot "content" - >>= loadAndApplyTemplate "templates/partials/post.html" postCtx - >>= loadAndApplyTemplate "templates/default-nojs.html" postNojsCtx - >>= relativizeUrls - let navgenRoute = customRoute (\r -> if toFilePath r == "pages/home.markdown" then "pages/index.markdown" else toFilePath r) `composeRoutes` - gsubRoute "pages" (const "nojs") `composeRoutes` + gsubRoute "pages/" (const "") `composeRoutes` setExtension "html" match "pages/*" $ version "nav-gen" $ do route navgenRoute compile $ pandocCompiler - match "pages/*" $ version "nojs" $ do + paginateRules paginatedPosts $ \pageNum pattern -> do + route idRoute + compile $ do + pages <- sortByM pageWeight =<< loadAll ("pages/*" .&&. hasVersion "nav-gen") + posts <- recentFirst =<< loadAllSnapshots pattern "content" + + let (pagesFirst, pagesLast') = flip span pages $ \x -> + (toFilePath . itemIdentifier $ x) /= "pages/blog.markdown" + pageMid = [head pagesLast'] + pagesLast = if not . null $ pagesLast' then tail pagesLast' else [] + + indexCtx = listField "pagesFirst" pagesCtx (return pagesFirst) <> + listField "pageMid" pagesCtx (return pageMid) <> + listField "pagesLast" pagesCtx (return pagesLast) <> + defaultContext + + ctx = taggedPostCtx tags <> + paginateContext paginatedPosts pageNum <> + virtualPaginateContext paginatedPosts pageNum <> + constField "weight" "0" <> + listField "posts" (taggedPostCtx tags) (return posts) + makeItem "" + >>= loadAndApplyTemplate "templates/pages/blog.html" ctx + >>= loadAndApplyTemplate "templates/default.html" indexCtx + >>= relativizeUrls + + match "pages/*" $ do route navgenRoute compile $ do - posts <- recentFirst =<< loadAllSnapshots ("posts/**" .&&. hasVersion "nojs") "content" + posts <- recentFirst =<< loadAllSnapshots "posts/**" "content" -- Generate nav-bar from pages/* pages <- sortByM pageWeight =<< loadAll ("pages/*" .&&. hasVersion "nav-gen") @@ -356,10 +249,13 @@ main = do recentPosts = take 5 posts pageTemplate = "templates/pages/" ++ pageName ++ ".html" - pagesNojsCtx = - listField "recentPosts" (taggedPostCtx tagsNoJs) (return recentPosts) <> - listField "posts" (taggedPostCtx tagsNoJs) (return posts) <> - tagCloudField "tagCloud" 65 135 tagsNoJs <> + masterCtx = + listField "recentPosts" (taggedPostCtx tags) (return recentPosts) <> + listField "posts" (taggedPostCtx tags) (return posts) <> + tagCloudField "tagCloud" 65 135 tags <> + defaultContext + + indexCtx = listField "pagesFirst" pagesCtx (return pagesFirst) <> listField "pageMid" pagesCtx (return pageMid) <> listField "pagesLast" pagesCtx (return pagesLast) <> @@ -367,12 +263,50 @@ main = do sectionCtx <- getResourceBody >>= genSectionContext pg <- loadSnapshot (fromFilePath pageTemplate) "original" - >>= applyAsTemplate (sectionCtx <> pagesNojsCtx) + >>= applyAsTemplate (sectionCtx <> masterCtx) (makeItem . itemBody) pg - >>= loadAndApplyTemplate "templates/default-nojs.html" pagesNojsCtx + >>= loadAndApplyTemplate "templates/default.html" indexCtx >>= relativizeUrls + match "posts/**" $ do + route $ setExtension "html" + compile $ do + pages <- sortByM pageWeight =<< loadAll ("pages/*" .&&. hasVersion "nav-gen") + + let (pagesFirst, pagesLast') = flip span pages $ \x -> + (toFilePath . itemIdentifier $ x) /= "pages/blog.markdown" + pageMid = [head pagesLast'] + pagesLast = if not . null $ pagesLast' then tail pagesLast' else [] + + indexCtx = + listField "pagesFirst" pagesCtx (return pagesFirst) <> + listField "pageMid" pagesCtx (return pageMid) <> + listField "pagesLast" pagesCtx (return pagesLast) <> + defaultContext + + pandocCompilerWith pandocReaderOptions pandocWriterOptions + >>= saveSnapshot "content" + >>= loadAndApplyTemplate "templates/partials/post.html" (taggedPostCtx tags) + >>= loadAndApplyTemplate "templates/default.html" indexCtx + >>= relativizeUrls + + create ["atom.xml"] $ do + route idRoute + compile $ do + let feedCtx = postCtx <> bodyField "description" + blogPosts <- loadAllSnapshots ("posts/**" .&&. hasNoVersion) "content" + >>= fmap (take 10) . recentFirst + renderAtom (feedConfiguration Nothing) feedCtx blogPosts + + forM_ [("js/**", idRoute), + ("lib/JQuery/*", gsubRoute "JQuery" $ const "js"), + ("lib/jquery-address/jquery.address.js", + customRoute $ const "lib/js/jquery.address.js")] $ \(p, r) -> + match p $ do + route r + compile $ getResourceString >>= withItemBody (unixFilter "jsmin" []) + --------------------------------------------------------------------------------------------------------- -- Functions & Constants -------------------------------------------------------------------------------- feedConfiguration :: Maybe String -> FeedConfiguration @@ -399,13 +333,28 @@ paginateTagsRules loc tags = paginateRules paginatedTaggedPosts $ \pageNum pattern -> do route idRoute compile $ do + pages <- sortByM pageWeight =<< loadAll ("pages/*" .&&. hasVersion "nav-gen") posts <- recentFirst =<< loadAllSnapshots pattern "content" - let ctx = taggedPostCtx tags <> + + let (pagesFirst, pagesLast') = flip span pages $ \x -> + (toFilePath . itemIdentifier $ x) /= "pages/blog.markdown" + pageMid = [head pagesLast'] + pagesLast = if not . null $ pagesLast' then tail pagesLast' else [] + + indexCtx = listField "pagesFirst" pagesCtx (return pagesFirst) <> + listField "pageMid" pagesCtx (return pageMid) <> + listField "pagesLast" pagesCtx (return pagesLast) <> + defaultContext + + ctx = taggedPostCtx tags <> paginateContext paginatedTaggedPosts pageNum <> constField "tag" tag <> listField "posts" (taggedPostCtx tags) (return posts) + makeItem "" >>= loadAndApplyTemplate "templates/tag-page.html" ctx + >>= loadAndApplyTemplate "templates/default.html" indexCtx + >>= relativizeUrls rulesExtraDependencies [tagsDependency tags] $ do create [tagsMakeId tags tag] $ do @@ -428,7 +377,7 @@ taggedPostCtx :: Tags -> Context String taggedPostCtx tags = tagsField "tags" tags <> postCtx pagesCtx :: Context String -pagesCtx = field "virtualpath" (fmap (drop 6 . maybe "" toUrl) . getRoute . itemIdentifier) <> +pagesCtx = field "virtualpath" (fmap (maybe "" toUrl) . getRoute . itemIdentifier) <> defaultContext pageWeight :: (Functor f, MonadMetadata f) => Item a -> f Int @@ -468,7 +417,7 @@ virtualPaginateContext pag currentPage = mconcat url :: (Int, Identifier) -> Compiler String url (n, i) = getRoute i >>= \mbR -> case mbR of - Just r -> return $ drop 6 . toUrl $ r + Just r -> return . toUrl $ r Nothing -> fail $ "No URL for page: " ++ show n --------------------------------------------------------------------------------------------------------- diff --git a/templates/default-nojs.html b/templates/default-nojs.html deleted file mode 100644 index fc42564..0000000 --- a/templates/default-nojs.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - RekahSoft - - - - - - - - - - - - - - - - - - - - - - - $partial("templates/partials/logo-banner.html")$ - $partial("templates/partials/nav-nojs.html")$ - -
- $body$ -
- - $partial("templates/partials/footer.html")$ - - diff --git a/templates/default.html b/templates/default.html index 75e642f..cbb7511 100644 --- a/templates/default.html +++ b/templates/default.html @@ -1,5 +1,5 @@ - + @@ -13,11 +13,12 @@ - - + + - + + @@ -27,6 +28,7 @@ #page-content.init.loading { opacity: 1; height: 100%; + background-position: -100px -100px } #nav.loading { @@ -38,7 +40,7 @@ - + $partial("templates/partials/logo-banner.html")$ $partial("templates/partials/nav.html")$ @@ -58,15 +60,17 @@

+ + $body$ $partial("templates/partials/footer.html")$ - - + + - + diff --git a/templates/partials/nav-nojs.html b/templates/partials/nav-nojs.html deleted file mode 100644 index 94f02cd..0000000 --- a/templates/partials/nav-nojs.html +++ /dev/null @@ -1,20 +0,0 @@ - diff --git a/templates/partials/nav.html b/templates/partials/nav.html index c6541c0..e31dafe 100644 --- a/templates/partials/nav.html +++ b/templates/partials/nav.html @@ -1,8 +1,18 @@ -