Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Navmap feature for nested navigation #81

Closed
wants to merge 31 commits into from
Closed
Show file tree
Hide file tree
Changes from 29 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
78e4a6d
fixed navbar-pages bug
jerger Jan 2, 2017
3c415f4
Added navmap feature.
jerger Jan 4, 2017
b6b8ebf
undo project renaming
jerger Jan 4, 2017
0d4a9c9
Merge branch 'master' into master
jerger Jan 4, 2017
1ea38c5
respect :page-index order for navmap
jerger Jan 5, 2017
6a4ede6
gitgnore ...
jerger Jan 5, 2017
65cd1f5
adjust project name
jerger Jan 5, 2017
67d91b4
format
jerger Feb 8, 2017
d36acf2
Merge branch 'master' into master
jerger Feb 8, 2017
2570dc4
Merge branch 'master' into development
jerger Feb 8, 2017
2e6723d
readded missing debug? configuration
jerger Feb 8, 2017
28cb312
Merge branch 'master' into development
jerger Feb 8, 2017
e9d1c1e
refactored navbar-model out of compiler & introduced new :navbar-model
jerger Feb 8, 2017
439ae6f
all things implemented - probably works
jerger Feb 8, 2017
d8f86e0
fixed read-config
jerger Feb 8, 2017
4f9ac91
added hierarchic sidbar-pages & refactored namesspace.
jerger Feb 9, 2017
f758b57
tested in real live -works now
jerger Feb 10, 2017
b781b8b
renamed navpage-model to page-model
jerger Feb 10, 2017
39ca87f
fixed project name
jerger Feb 10, 2017
a7f5f3a
made sidebar-pages flat again.
jerger Feb 12, 2017
d772f95
refactored name of configuration parameter.
jerger Feb 13, 2017
82abae1
Merge branch 'development'
jerger Feb 13, 2017
da84c94
reflect refactoring page-model -> navbar-mode
jerger Feb 17, 2017
30f299c
Merge branch 'development'
jerger Feb 17, 2017
593766a
refactoring: replace navbar-pages & sidebar-pages by pages
jerger Mar 11, 2017
6cf7b1a
renamed config to page-model
jerger Mar 12, 2017
e8d7069
compile hierarchic pages
jerger Mar 12, 2017
feb973f
add changelog
jerger Mar 12, 2017
9e548cc
Merge branch 'development'
jerger Mar 12, 2017
805e369
fixed not recognized :page-root-uri configuration
jerger Mar 22, 2017
c9ea1ad
Merge branch 'development'
jerger Mar 22, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ pom.xml.asc
/bin/
/.classpath
/.project
/.settings/
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Changelog

## Version 0.1.53.1-SNAPSHOT
### New Features

Support of hierarchic menus & page structures:
1. on configuration scope an additional parameter {:page-model [:flat | :hierarchic]} - flat will be the default. Flat mode is backward compatible.
2. on page scope we respect {:navbar? [true|false]} in flat & hierarchic mode also.
3. params now contain hierarchic pages. Pages is replacing no longer supported navbar-pages / sidebar-pages. Hierarchic pages may contain a sequence of children `{:children ({:title "child-page", :layout "page.html", :content " <p>child</p>"}) }

### Breaking Changes
Pages is replacing no longer supported navbar-pages / sidebar-pages. In order to realice navbar / sidebar functionality, you've now to write filters.
38 changes: 19 additions & 19 deletions project.clj
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
(defproject cryogen-core "0.1.52"
:description "Cryogen's compiler"
:url "https://github.com/cryogen-project/cryogen-core"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.8.0"]
[camel-snake-kebab "0.4.0"]
[cheshire "5.7.0"]
[clj-rss "0.2.3"]
[clj-text-decoration "0.0.3"]
[enlive "1.1.6"]
[hawk "0.2.11"]
[hiccup "1.0.5"]
[io.aviso/pretty "0.1.33"]
[me.raynes/fs "1.4.6"]
[pandect "0.6.1"]
[selmer "1.10.6"]]
:deploy-repositories [["snapshots" :clojars]
["releases" :clojars]])
(defproject cryogen-core "0.1.53-SNAPSHOT"
:description "Cryogen's compiler"
:url "https://github.com/cryogen-project/cryogen-core"
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.8.0"]
[camel-snake-kebab "0.4.0"]
[cheshire "5.7.0"]
[clj-rss "0.2.3"]
[clj-text-decoration "0.0.3"]
[enlive "1.1.6"]
[hawk "0.2.11"]
[hiccup "1.0.5"]
[io.aviso/pretty "0.1.33"]
[me.raynes/fs "1.4.6"]
[pandect "0.6.1"]
[selmer "1.10.6"]]
:deploy-repositories [["snapshots" :clojars]
["releases" :clojars]])
84 changes: 48 additions & 36 deletions src/cryogen_core/compiler.clj
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
[cryogen-core.rss :as rss]
[cryogen-core.sass :as sass]
[cryogen-core.sitemap :as sitemap]
[cryogen-core.toc :as toc])
[clojure.inspector :as inspector]
[cryogen-core.toc :as toc]
[cryogen-core.hierarchic :as hierarchic])
(:import java.util.Locale))

(cache-off!)
Expand Down Expand Up @@ -249,7 +251,9 @@
:home false
:servlet-context (cryogen-io/path "/" blog-prefix "/")
:page page
:uri uri}))))))
:uri uri})))
(compile-pages params (:children page)))
))

(defn compile-posts
"Compiles all the posts into html and spits them out into the public folder"
Expand Down Expand Up @@ -463,7 +467,9 @@
(update-in [:compass-path] (fnil str "compass"))
(update-in [:post-date-format] (fnil str "yyyy-MM-dd"))
(update-in [:keep-files] (fnil seq []))
(update-in [:ignored-files] (fnil seq [#"^\.#.*" #".*\.swp$"])))]
(update-in [:ignored-files] (fnil seq [#"^\.#.*" #".*\.swp$"]))
(update-in [:page-model] (fnil keyword :flat))
)]
(merge
config
{:page-root-uri (root-uri :page-root-uri config)
Expand All @@ -484,47 +490,53 @@
"Generates all the html and copies over resources specified in the config"
[]
(println (green "compiling assets..."))
(let [{:keys [^String site-url blog-prefix rss-name recent-posts sass-dest keep-files ignored-files previews? author-root-uri theme]
:as config} (read-config)
posts (map klipsify (add-prev-next (read-posts config)))
posts-by-tag (group-by-tags posts)
posts (tag-posts posts config)
latest-posts (->> posts (take recent-posts) vec)
pages (map klipsify (read-pages config))
home-page (->> pages
(filter #(boolean (:home? %)))
(first))
other-pages (->> pages
(remove #{home-page})
(add-prev-next))
[navbar-pages
sidebar-pages] (group-pages other-pages)
params (merge
config
{:today (java.util.Date.)
:title (:site-title config)
:active-page "home"
:tags (map (partial tag-info config) (keys posts-by-tag))
:latest-posts latest-posts
:navbar-pages navbar-pages
:sidebar-pages sidebar-pages
:home-page (if home-page
(let [{:keys [^String site-url blog-prefix rss-name recent-posts sass-dest keep-files ignored-files previews?
author-root-uri theme debug? page-model]
:as config} (read-config)
posts (map klipsify (add-prev-next (read-posts config)))
posts-by-tag (group-by-tags posts)
posts (tag-posts posts config)
latest-posts (->> posts (take recent-posts) vec)
klipsified-pages (map klipsify (read-pages config))
modelled-pages (cond
(= page-model :flat) klipsified-pages
(= page-model :hierarchic) (hierarchic/build-hierarchic-map klipsified-pages)
)
home-page (->> modelled-pages
(filter #(boolean (:home? %)))
(first))
other-pages (->> modelled-pages
(remove #{home-page})
(add-prev-next))
params (merge config
{:today (java.util.Date.)
:title (:site-title config)
:active-page "home"
:tags (map (partial tag-info config) (keys posts-by-tag))
:latest-posts latest-posts
:pages other-pages
:home-page (if home-page
home-page
(assoc (first latest-posts) :layout "home.html"))
:archives-uri (page-uri "archives.html" config)
:index-uri (page-uri "index.html" config)
:tags-uri (page-uri "tags.html" config)
:rss-uri (cryogen-io/path "/" blog-prefix rss-name)
:site-url (if (.endsWith site-url "/") (.substring site-url 0 (dec (count site-url))) site-url)})]

(assoc (first latest-posts) :layout "home.html"))
:archives-uri (page-uri "archives.html" config)
:index-uri (page-uri "index.html" config)
:tags-uri (page-uri "tags.html" config)
:rss-uri (cryogen-io/path "/" blog-prefix rss-name)
:site-url (if (.endsWith site-url "/") (.substring site-url 0 (dec (count site-url))) site-url)})]
(when debug?
(println (blue "debug: page-model:"))
(println "\t-->" (cyan page-model))
(println (blue "debug: home-page:"))
(println "\t-->" (cyan (-> params :home-page)))
)
(set-custom-resource-path! (str "file:resources/templates/themes/" theme))
(cryogen-io/wipe-public-folder keep-files)
(println (blue "copying theme resources"))
(cryogen-io/copy-resources-from-theme config)
(println (blue "copying resources"))
(cryogen-io/copy-resources config)
(copy-resources-from-markup-folders config)
(compile-pages params other-pages)
(compile-pages params modelled-pages)
(compile-posts params posts)
(compile-tags params posts-by-tag)
(compile-tags-page params)
Expand Down
43 changes: 43 additions & 0 deletions src/cryogen_core/hierarchic.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
(ns cryogen-core.hierarchic
(:require
[clojure.string :as s]))

(defn uri-level [uri]
(- (count
(s/split uri #"/"))
1)
)

(defn filter-pages-for-uri [uri pages]
(let [html? (s/ends-with? uri ".html")
clean? (s/ends-with? uri "/")
clean-uri (cond
html? (subs uri 0 (- (count uri) 5))
clean? (subs uri 0 (- (count uri) 1))
:default uri)]
(filter #(s/starts-with? (:uri %) clean-uri) pages))
)

(defn build-hierarchic-level
"builds one level of hierarchic tree recurs to next level."
[parent-uri pages]
(let [current-level (+ 1 (uri-level parent-uri))
pages-of-parent (filter-pages-for-uri parent-uri pages)
pages-on-level (filter #(= current-level (uri-level (:uri %))) pages-of-parent)
pages-on-child-level (filter #(< current-level (uri-level (:uri %))) pages-of-parent)
]
(sort-by :page-index
(map #(let [page-on-level %
child-pages (filter-pages-for-uri (:uri page-on-level) pages-on-child-level)]
(if (empty? child-pages)
page-on-level
(merge page-on-level
{:children (build-hierarchic-level (:uri page-on-level) child-pages)}))) pages-on-level))
))

(defn build-hierarchic-map
"builds a hierarchic tree from pages"
[pages]
(let [sorted-pages (sort-by :uri pages)]
(build-hierarchic-level "/pages/" sorted-pages)
))
72 changes: 72 additions & 0 deletions test/cryogen_core/hierarchic_test.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
(ns cryogen-core.hierarchic-test
(:require
[clojure.test :refer :all]
[cryogen-core.hierarchic :as sut]))

(defn- page [uri page-index]
{:uri uri
:content uri
:page-index page-index})

(defn- enhanced-page [uri page-index children]
{:uri uri
:content uri
:page-index page-index
:children children})

(def pages-clean [(page "/pages/nav1/" 0)
(page "/pages/nav1/nav11/" 1)
(page "/pages/nav1/nav13/" 3)
(page "/pages/nav1/nav11/nav112/" 2)
(page "/pages/nav1/nav12/" 2)
(page "/pages/nav1/nav11/xnav111/" 1)
])

(def pages-dirty [(page "/pages/nav1.html" 0)
(page "/pages/nav1/nav11.html" 1)
(page "/pages/nav1/nav13.html" 3)
(page "/pages/nav1/nav11/nav112.html" 2)
(page "/pages/nav1/nav12.html" 2)
(page "/pages/nav1/nav11/xnav111.html" 1)
])

(deftest test-uri-level
(testing
(is (= 2 (sut/uri-level "/pages/nav1/")))
(is (= 2 (sut/uri-level "/pages/nav1.html")))
))

(deftest test-filter-pages-for-uri
(testing
(is (= 6 (count (sut/filter-pages-for-uri "/pages/nav1/" pages-clean))))
(is (= 6 (count (sut/filter-pages-for-uri "/pages/nav1.html" pages-dirty))))
))

(deftest test-hierarchic-pages
(testing
"No pages or posts nothing to copy"
(let [expected-clean [(enhanced-page
"/pages/nav1/" 0
[(enhanced-page
"/pages/nav1/nav11/" 1
[(page "/pages/nav1/nav11/xnav111/" 1)
(page "/pages/nav1/nav11/nav112/" 2)])
(page "/pages/nav1/nav12/" 2)
(page "/pages/nav1/nav13/" 3)]
)]
expected-dirty [(enhanced-page
"/pages/nav1.html" 0
[(enhanced-page
"/pages/nav1/nav11.html" 1
[(page "/pages/nav1/nav11/xnav111.html" 1)
(page "/pages/nav1/nav11/nav112.html" 2)])
(page "/pages/nav1/nav12.html" 2)
(page "/pages/nav1/nav13.html" 3)]
)]
]
(is (= expected-clean
(sut/build-hierarchic-map pages-clean)))
(is (= expected-dirty
(sut/build-hierarchic-map pages-dirty)))
)
))