Просмотр исходного кода

render UML diagrams with markdown-it-plantuml

Yuki Takei 8 лет назад
Родитель
Сommit
6614ae76bf

+ 2 - 1
package.json

@@ -95,6 +95,7 @@
     "markdown-it": "^8.4.0",
     "markdown-it": "^8.4.0",
     "markdown-it-emoji": "^1.4.0",
     "markdown-it-emoji": "^1.4.0",
     "markdown-it-mathjax": "^2.0.0",
     "markdown-it-mathjax": "^2.0.0",
+    "markdown-it-plantuml": "^0.3.1",
     "md5": "^2.2.1",
     "md5": "^2.2.1",
     "method-override": "^2.3.10",
     "method-override": "^2.3.10",
     "mkdirp": "~0.5.1",
     "mkdirp": "~0.5.1",
@@ -111,7 +112,6 @@
     "passport-ldapauth": "^2.0.0",
     "passport-ldapauth": "^2.0.0",
     "passport-local": "^1.0.0",
     "passport-local": "^1.0.0",
     "pino-clf": "^1.0.2",
     "pino-clf": "^1.0.2",
-    "plantuml-encoder": "^1.2.4",
     "react": "^16.0.0",
     "react": "^16.0.0",
     "react-bootstrap": "^0.32.0",
     "react-bootstrap": "^0.32.0",
     "react-bootstrap-typeahead": "^2.0.2",
     "react-bootstrap-typeahead": "^2.0.2",
@@ -130,6 +130,7 @@
     "throttle-debounce": "^1.0.1",
     "throttle-debounce": "^1.0.1",
     "toastr": "^2.1.2",
     "toastr": "^2.1.2",
     "uglifycss": "^0.0.27",
     "uglifycss": "^0.0.27",
+    "url-join": "^3.0.0",
     "webpack": "^3.1.0",
     "webpack": "^3.1.0",
     "webpack-bundle-analyzer": "^2.9.0",
     "webpack-bundle-analyzer": "^2.9.0",
     "webpack-merge": "~4.1.0",
     "webpack-merge": "~4.1.0",

+ 4 - 0
resource/css/_wiki.scss

@@ -135,14 +135,18 @@ div.body {
 
 
   img {
   img {
     margin: 5px 0;
     margin: 5px 0;
+/* ensure to disable in crowi-plus system
     box-shadow: 0 0 5px 0px rgba(0,0,0,.2);
     box-shadow: 0 0 5px 0px rgba(0,0,0,.2);
     border: solid 1px #ccc;
     border: solid 1px #ccc;
+*/
     max-width: 100%;
     max-width: 100%;
   }
   }
+/* ensure to disable in crowi-plus system
   .noborder img, .img.noborder {
   .noborder img, .img.noborder {
     box-shadow: none;
     box-shadow: none;
     border: none;
     border: none;
   }
   }
+*/
 
 
   img.emojione {
   img.emojione {
     margin-top: -0.3em !important;
     margin-top: -0.3em !important;

+ 2 - 2
resource/js/util/GrowiRenderer.js

@@ -6,10 +6,10 @@ import CsvToTable    from './PreProcessor/CsvToTable';
 import XssFilter     from './PreProcessor/XssFilter';
 import XssFilter     from './PreProcessor/XssFilter';
 
 
 import Template from './LangProcessor/Template';
 import Template from './LangProcessor/Template';
-import PlantUML from './LangProcessor/PlantUML';
 
 
 import EmojiConfigurer from './markdown-it/emoji';
 import EmojiConfigurer from './markdown-it/emoji';
 import MathJaxConfigurer from './markdown-it/mathjax';
 import MathJaxConfigurer from './markdown-it/mathjax';
+import PlantUMLConfigurer from './markdown-it/plantuml';
 
 
 export default class GrowiRenderer {
 export default class GrowiRenderer {
 
 
@@ -27,10 +27,10 @@ export default class GrowiRenderer {
     this.markdownItConfigurers = [
     this.markdownItConfigurers = [
       new EmojiConfigurer(crowi),
       new EmojiConfigurer(crowi),
       new MathJaxConfigurer(crowi),
       new MathJaxConfigurer(crowi),
+      new PlantUMLConfigurer(crowi),
     ];
     ];
     this.langProcessors = {
     this.langProcessors = {
       'template': new Template(crowi),
       'template': new Template(crowi),
-      'plantuml': new PlantUML(crowi),
     };
     };
 
 
     this.configure = this.configure.bind(this);
     this.configure = this.configure.bind(this);

+ 0 - 43
resource/js/util/LangProcessor/PlantUML.js

@@ -1,43 +0,0 @@
-import plantuml from 'plantuml-encoder';
-import crypto from 'crypto';
-import * as entities from 'entities';
-
-export default class PlantUML {
-
-  constructor(crowi) {
-    this.crowi = crowi;
-
-  }
-
-  generateId(token) {
-    const hasher = require('crypto').createHash('md5');
-    hasher.update(token);
-    return hasher.digest('hex');
-  }
-
-  process(code, lang) {
-    const config = crowi.getConfig();
-    if (!config.env.PLANTUML_URI) {
-      return `<pre class="wiki-code"><code>${entities.encodeHTML(code)}\n</code></pre>`;
-    }
-
-    let plantumlUri = config.env.PLANTUML_URI;
-    if (plantumlUri.substr(-1) !== '/') {
-      plantumlUri += '/';
-    }
-    const id = this.generateId(code + lang);
-    const encoded = plantuml.encode(`@startuml
-
-skinparam monochrome true
-
-${code}
-@enduml`);
-
-    return `
-      <div id="${id}" class="plantuml noborder">
-        <img src="${plantumlUri}svg/${encoded}">
-      </div>
-    `;
-  }
-}
-

+ 25 - 0
resource/js/util/markdown-it/plantuml.js

@@ -0,0 +1,25 @@
+import urljoin from 'url-join';
+
+export default class PlantUMLConfigurer {
+
+  constructor(crowi) {
+    this.crowi = crowi;
+    const config = crowi.getConfig();
+    this.serverUrl = config.env.PLANTUML_URI || 'http://plantuml.com';
+
+    this.generateSource = this.generateSource.bind(this);
+  }
+
+  configure(md) {
+    md.use(require('markdown-it-plantuml'), 'name', {
+      generateSource: this.generateSource,
+    });
+  }
+
+  generateSource(umlCode) {
+    var deflate = require('markdown-it-plantuml/lib/deflate.js');
+    var zippedCode =
+      deflate.encode64(deflate.zip_deflate('@startuml\n' + umlCode + '\n@enduml', 9));
+    return urljoin(this.serverUrl, 'plantuml', 'svg' , zippedCode);
+  }
+}

+ 8 - 15
yarn.lock

@@ -3675,6 +3675,10 @@ markdown-it-mathjax@^2.0.0:
   version "2.0.0"
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/markdown-it-mathjax/-/markdown-it-mathjax-2.0.0.tgz#ae2b4f4c5c719a03f9e475c664f7b2685231d9e9"
   resolved "https://registry.yarnpkg.com/markdown-it-mathjax/-/markdown-it-mathjax-2.0.0.tgz#ae2b4f4c5c719a03f9e475c664f7b2685231d9e9"
 
 
+markdown-it-plantuml@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/markdown-it-plantuml/-/markdown-it-plantuml-0.3.1.tgz#f338df4d691a5561364e65809b6812bcb3d8b047"
+
 markdown-it@^8.4.0:
 markdown-it@^8.4.0:
   version "8.4.0"
   version "8.4.0"
   resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d"
   resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.0.tgz#e2400881bf171f7018ed1bd9da441dac8af6306d"
@@ -4372,10 +4376,6 @@ p-try@^1.0.0:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
   resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
 
 
-pako@1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.3.tgz#5f515b0c6722e1982920ae8005eacb0b7ca73ccf"
-
 pako@~1.0.5:
 pako@~1.0.5:
   version "1.0.6"
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
   resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
@@ -4590,13 +4590,6 @@ pkginfo@^0.4.0:
   version "0.4.1"
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff"
   resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff"
 
 
-plantuml-encoder@^1.2.4:
-  version "1.2.4"
-  resolved "https://registry.yarnpkg.com/plantuml-encoder/-/plantuml-encoder-1.2.4.tgz#5f0056f7c04bd76aeef420bfcddef339e9f44081"
-  dependencies:
-    pako "1.0.3"
-    utf8-bytes "0.0.1"
-
 postcss-calc@^5.2.0:
 postcss-calc@^5.2.0:
   version "5.3.1"
   version "5.3.1"
   resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
   resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
@@ -6164,6 +6157,10 @@ url-join@0.0.1:
   version "0.0.1"
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/url-join/-/url-join-0.0.1.tgz#1db48ad422d3402469a87f7d97bdebfe4fb1e3c8"
   resolved "https://registry.yarnpkg.com/url-join/-/url-join-0.0.1.tgz#1db48ad422d3402469a87f7d97bdebfe4fb1e3c8"
 
 
+url-join@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/url-join/-/url-join-3.0.0.tgz#26e8113ace195ea30d0fc38186e45400f9cea672"
+
 url@0.10.3:
 url@0.10.3:
   version "0.10.3"
   version "0.10.3"
   resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64"
   resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64"
@@ -6178,10 +6175,6 @@ url@^0.11.0:
     punycode "1.3.2"
     punycode "1.3.2"
     querystring "0.2.0"
     querystring "0.2.0"
 
 
-utf8-bytes@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/utf8-bytes/-/utf8-bytes-0.0.1.tgz#116b025448c9b500081cdfbf1f4d6c6c37d8837d"
-
 util-deprecate@~1.0.1:
 util-deprecate@~1.0.1:
   version "1.0.2"
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"