diff --git a/project.clj b/project.clj index dba11fb..7ae8b81 100644 --- a/project.clj +++ b/project.clj @@ -36,7 +36,8 @@ :bower-dependencies [[simplemde "1.11.2"] ;; [vega-embed "3.0.0-beta.19"] vega-embed currently not loaded from Bower because of ;; dependency conflict which will hopefully be resolved soon. - [vega-lite "2.0.0-beta.10"]] + [vega-lite "2.0.0-beta.10"] + [mermaid "6.0.0"]] :ring {:handler smeagol.handler/app :init smeagol.handler/init :destroy smeagol.handler/destroy} diff --git a/resources/public/content/Introduction.md b/resources/public/content/Introduction.md index 068a5f3..b72c49b 100644 --- a/resources/public/content/Introduction.md +++ b/resources/public/content/Introduction.md @@ -57,6 +57,33 @@ Note that this visualisation will not be rendered in the GitHub wiki, as it does ![Example visualisation](https://github.com/simon-brooke/smeagol/blob/develop/resources/public/data/london.png?raw=true) +## Now with embedded graphs + +Graphs can now be embedded in a page using the [Mermaid](http://knsv.github.io/mermaid/index.html) graph description language. The graph description should start with a line comprising three back-ticks and then the +word 'mermaid', and end with a line comprising just three backticks. + +Here's an example culled from the Mermaid documentation. + +### GANTT Chart + +```mermaid +gantt + dateFormat YYYY-MM-DD + title Adding GANTT diagram functionality to mermaid + section A section + Completed task :done, des1, 2014-01-06,2014-01-08 + Active task :active, des2, 2014-01-09, 3d + Future task : des3, after des2, 5d + Future task2 : des4, after des3, 5d + section Critical tasks + Completed task in the critical line :crit, done, 2014-01-06,24h + Implement parser and jison :crit, done, after des1, 2d + Create tests for parser :crit, active, 3d + Future task in critical line :crit, 5d + Create tests for renderer :2d + Add to mermaid :1d +``` + ## Advertisement If you like what you see here, I am available for work on open source Clojure projects. diff --git a/resources/templates/wiki.html b/resources/templates/wiki.html index 97d0228..e87096c 100644 --- a/resources/templates/wiki.html +++ b/resources/templates/wiki.html @@ -1,18 +1,24 @@ {% extends "templates/base.html" %} {% block extra-headers %} + - {% script "/vendor/vega-lite/build/vega-lite.js" %} - + + + {% style "vendor/mermaid/dist/mermaid.css" %} + {% script "vendor/mermaid/dist/mermaid.js" %} {% endblock %} {% block content %} @@ -25,4 +31,14 @@ package for vega-embed, so we're currently not installing either it or Vega loca {% endif %} {{content|safe}} + + {% endblock %} diff --git a/src/smeagol/formatting.clj b/src/smeagol/formatting.clj index 8acd922..e245749 100644 --- a/src/smeagol/formatting.clj +++ b/src/smeagol/formatting.clj @@ -73,6 +73,12 @@ (assoc (yaml/parse-string yaml-src) (keyword "$schema") "https://vega.github.io/schema/vega-lite/v2.json")) ";\nvega.embed('#vis" index "', vl" index ");\n//]]\n")) +(defn process-mermaid + "Lightly mung the mermaid specification." + [^String graph-spec ^Integer index] + (str "
\n" + graph-spec + "\n
")) (defn process-text "Process this `text`, assumed to be markdown potentially containing both local links @@ -92,6 +98,7 @@ (md/md-to-html-string (cs/join "\n\n" (reverse processed)) :heading-anchors true))) + ;;; TODO: refactor; generalise extension architecture (clojure.string/starts-with? (first fragments) "vis") (let [kw (keyword (str "visualisation-" index))] (process-text @@ -107,6 +114,21 @@ index))) (rest fragments) (cons kw processed))) + (clojure.string/starts-with? (first fragments) "mermaid") + (let [kw (keyword (str "visualisation-" index))] + (process-text + (+ index 1) + (assoc + result + :visualisations + (assoc + (:visualisations result) + kw + (process-mermaid + (subs (first fragments) 7) + index))) + (rest fragments) + (cons kw processed))) true (process-text (+ index 1) result (rest fragments) (cons (first fragments) processed))))) diff --git a/test/smeagol/test/util.clj b/test/smeagol/test/util.clj index d5e94f9..b1f21f8 100644 --- a/test/smeagol/test/util.clj +++ b/test/smeagol/test/util.clj @@ -1,7 +1,7 @@ (ns smeagol.test.util (:use clojure.test ring.mock.request - smeagol.util)) + smeagol.formatting)) (deftest test-local-links (testing "Rewriting of local links"