From da3f0bb180a8bcf599c47585a95c130b000f8b43 Mon Sep 17 00:00:00 2001
From: Crphang
Date: Wed, 1 Jan 2020 16:22:55 +0800
Subject: [PATCH 1/2] Add suport for Inline PUML and fix PUML subsite problem
---
docs/userGuide/puml.md | 25 +++-
package-lock.json | 46 +++----
package.json | 1 +
src/Page.js | 1 +
src/lib/markbind/src/constants.js | 1 +
src/lib/markbind/src/lib/markdown-it/index.js | 25 ++++
src/lib/markbind/src/parser.js | 60 +++++++++
.../default/markbind-plugin-plantuml.js | 116 ------------------
src/{plugins/default => widgets}/plantuml.jar | Bin
src/widgets/puml.js | 100 +++++++++++++++
.../b169e11db4f52a01eb352071b156c59b.png | Bin 0 -> 21785 bytes
test/functional/test_site/expected/index.html | 47 ++++---
.../test_site/expected/inline-output.png | Bin 0 -> 17943 bytes
.../test_site/expected/testPlantUML.html | 42 ++++---
test/functional/test_site/testPlantUML.md | 42 +++++++
test/unit/parser.test.js | 1 +
16 files changed, 328 insertions(+), 179 deletions(-)
delete mode 100644 src/plugins/default/markbind-plugin-plantuml.js
rename src/{plugins/default => widgets}/plantuml.jar (100%)
create mode 100644 src/widgets/puml.js
create mode 100644 test/functional/test_site/expected/b169e11db4f52a01eb352071b156c59b.png
create mode 100644 test/functional/test_site/expected/inline-output.png
diff --git a/docs/userGuide/puml.md b/docs/userGuide/puml.md
index d46a132c3f..99c44a5e70 100644
--- a/docs/userGuide/puml.md
+++ b/docs/userGuide/puml.md
@@ -34,12 +34,15 @@ Name | Type | Default | Description
--- | --- | --- | ---
alt | `string` | | **This must be specified.**
The alternative text of the diagram.
height | `string` | | The height of the diagram in pixels.
-src | `string` | | **This must be specified.**
The URL of the diagram.
The URL can be specified as absolute or relative references. More info in: _[Intra-Site Links]({{baseUrl}}/userGuide/formattingContents.html#intraSiteLinks)_
+src | `string` | |
The URL of the diagram if your PUML input is in another file.
The URL can be specified as absolute or relative references. More info in: _[Intra-Site Links]({{baseUrl}}/userGuide/formattingContents.html#intraSiteLinks)_
+name | `string` | | The name of the output file.
width | `string` | | The width of the diagram in pixels.
If both width and height are specified, width takes priority over height. It is to maintain the diagram's aspect ratio.
### Example
+You could have your PUML be written in a separate file or inline.
+
@@ -57,17 +60,33 @@ return success
@enduml
```
-_Markbind page_:
+_Markbind page separate file_:
```
```
+_Markbind page inline_:
+`````
+
+
+```puml
+@startuml
+alice -> bob ++ : hello
+bob -> bob ++ : self call
+bob -> bib ++ #005500 : hello
+bob -> george ** : create
+return done
+return rc
+bob -> george !! : delete
+return success
+@enduml
+```
+`````
-
diff --git a/package-lock.json b/package-lock.json
index 9bc479320c..1917a44816 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1933,6 +1933,11 @@
"which": "^1.2.9"
}
},
+ "crypto-js": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz",
+ "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU="
+ },
"css-select": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
@@ -3226,8 +3231,7 @@
},
"ansi-regex": {
"version": "2.1.1",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"aproba": {
"version": "1.2.0",
@@ -3245,13 +3249,11 @@
},
"balanced-match": {
"version": "1.0.0",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
- "optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -3264,18 +3266,15 @@
},
"code-point-at": {
"version": "1.1.0",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"concat-map": {
"version": "0.0.1",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"console-control-strings": {
"version": "1.1.0",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"core-util-is": {
"version": "1.0.2",
@@ -3378,8 +3377,7 @@
},
"inherits": {
"version": "2.0.3",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"ini": {
"version": "1.3.5",
@@ -3389,7 +3387,6 @@
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
- "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -3402,20 +3399,17 @@
"minimatch": {
"version": "3.0.4",
"bundled": true,
- "optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"minipass": {
"version": "2.3.5",
"bundled": true,
- "optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@@ -3432,7 +3426,6 @@
"mkdirp": {
"version": "0.5.1",
"bundled": true,
- "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -3505,8 +3498,7 @@
},
"number-is-nan": {
"version": "1.0.1",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"object-assign": {
"version": "4.1.1",
@@ -3516,7 +3508,6 @@
"once": {
"version": "1.4.0",
"bundled": true,
- "optional": true,
"requires": {
"wrappy": "1"
}
@@ -3592,8 +3583,7 @@
},
"safe-buffer": {
"version": "5.1.2",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"safer-buffer": {
"version": "2.1.2",
@@ -3623,7 +3613,6 @@
"string-width": {
"version": "1.0.2",
"bundled": true,
- "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -3641,7 +3630,6 @@
"strip-ansi": {
"version": "3.0.1",
"bundled": true,
- "optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -3680,13 +3668,11 @@
},
"wrappy": {
"version": "1.0.2",
- "bundled": true,
- "optional": true
+ "bundled": true
},
"yallist": {
"version": "3.0.3",
- "bundled": true,
- "optional": true
+ "bundled": true
}
}
},
diff --git a/package.json b/package.json
index fb90a2a33c..26764464d9 100644
--- a/package.json
+++ b/package.json
@@ -26,6 +26,7 @@
"cheerio": "^0.22.0",
"chokidar": "^3.3.0",
"commander": "^3.0.2",
+ "crypto-js": "^3.1.0",
"fastmatter": "^2.1.1",
"figlet": "^1.2.4",
"find-up": "^4.1.0",
diff --git a/src/Page.js b/src/Page.js
index 7dc91c9a70..23e4b75aef 100644
--- a/src/Page.js
+++ b/src/Page.js
@@ -761,6 +761,7 @@ class Page {
rootPath: this.rootPath,
userDefinedVariablesMap: this.userDefinedVariablesMap,
headerIdMap: this.headerIdMap,
+ resultPath: this.resultPath,
};
return new Promise((resolve, reject) => {
markbinder.includeFile(this.sourcePath, fileConfig)
diff --git a/src/lib/markbind/src/constants.js b/src/lib/markbind/src/constants.js
index 758777b634..203ec89ff9 100644
--- a/src/lib/markbind/src/constants.js
+++ b/src/lib/markbind/src/constants.js
@@ -2,6 +2,7 @@ module.exports = {
// src/lib/markbind/src/parser.js
ATTRIB_INCLUDE_PATH: 'include-path',
ATTRIB_CWF: 'cwf',
+ ATTRIB_RESULT_PATH: 'resultPath',
BOILERPLATE_FOLDER_NAME: '_markbind/boilerplates',
diff --git a/src/lib/markbind/src/lib/markdown-it/index.js b/src/lib/markbind/src/lib/markdown-it/index.js
index 4d7c4d7cf4..75875c6d30 100644
--- a/src/lib/markbind/src/lib/markdown-it/index.js
+++ b/src/lib/markbind/src/lib/markdown-it/index.js
@@ -42,6 +42,31 @@ markdownIt.renderer.rules.table_close = (tokens, idx) => {
return '';
};
+// rewritten markdown-it renderer.js rule to add a div containing the language of the code block
+markdownIt.renderer.rules.fence = (tokens, idx, options, env, slf) => {
+ var token = tokens[idx],
+ info = token.info ? markdownIt.utils.unescapeAll(token.info).trim() : '',
+ langName = '',
+ highlighted;
+
+ if (info) {
+ langName = info.split(/\s+/g)[0];
+ }
+
+ const widgetHandler = env[langName];
+ if (widgetHandler !== undefined) {
+ return widgetHandler(token.content);
+ }
+
+ if (options.highlight) {
+ highlighted = options.highlight(token.content, langName) || escapeHtml(token.content);
+ } else {
+ highlighted = escapeHtml(token.content);
+ }
+
+ return highlighted + '\n';
+}
+
// highlight inline code
markdownIt.renderer.rules.code_inline = (tokens, idx, options, env, slf) => {
const token = tokens[idx];
diff --git a/src/lib/markbind/src/parser.js b/src/lib/markbind/src/parser.js
index 7a8fc3a11c..6b85682e67 100644
--- a/src/lib/markbind/src/parser.js
+++ b/src/lib/markbind/src/parser.js
@@ -20,6 +20,7 @@ _.pick = require('lodash/pick');
const CyclicReferenceError = require('./handlers/cyclicReferenceError.js');
const md = require('./lib/markdown-it');
const utils = require('./utils');
+const puml = require('../../../widgets/puml');
cheerio.prototype.options.xmlMode = true; // Enable xml mode for self-closing tag
cheerio.prototype.options.decodeEntities = false; // Don't escape HTML entities
@@ -374,6 +375,28 @@ class Parser {
return element;
} else if (element.name === 'variable' || element.name === 'import') {
return Parser.createEmptyNode();
+ } else if (element.name === 'puml') {
+ if (!_.hasIn(element.attribs, 'src')) {
+ return element;
+ }
+ const resultPath = path.resolve(path.dirname(config.resultPath), element.attribs.src);
+ const pumlContext = {
+ resultPath,
+ ...element.attribs,
+ };
+
+ // Path of the .puml file
+ const rawDiagramPath = path.resolve(path.dirname(context.cwf), pumlContext.src);
+ const pumlContent = fs.readFileSync(rawDiagramPath, 'utf8');
+ const parseAndRenderPUML = puml.parseAndRender(pumlContext);
+
+ const childrenDOM = parseAndRenderPUML(pumlContent);
+ element.name = 'div';
+ element.attribs = {};
+
+ element.children = cheerio.parseHTML(childrenDOM);
+ element.children.cwf = context.cwf;
+ return element;
} else {
if (element.name === 'body') {
// eslint-disable-next-line no-console
@@ -508,6 +531,26 @@ class Parser {
delete element.attribs.boilerplate;
break;
}
+ case 'puml': {
+ const pumlContext = {
+ resultPath: config.resultPath,
+ ...element.attribs,
+ };
+
+ element.name = 'div';
+ element.attribs = {};
+ cheerio.prototype.options.xmlMode = false;
+ const parseAndRenderPUML = puml.parseAndRender(pumlContext);
+ const widgetHandler = {
+ puml: parseAndRenderPUML,
+ };
+
+ const pumlContent = Parser.extractAndGenerateCodeBlock(element, 'puml');
+
+ element.children = cheerio.parseHTML(md.render(cheerio.html(pumlContent), widgetHandler), true);
+ cheerio.prototype.options.xmlMode = true;
+ break;
+ }
default:
break;
}
@@ -568,6 +611,7 @@ class Parser {
}
return processed;
});
+
resolve(cheerio.html(nodes));
});
@@ -910,6 +954,22 @@ class Parser {
return emptyElement;
}
+ static extractAndGenerateCodeBlock(element, codeLanguage = '') {
+ let codeBlockElement = this.createEmptyNode();
+ element.children.forEach((child) => {
+ if (child.name === 'pre' && child.children.length >= 1) {
+ const [nestedChild] = child.children;
+ if (nestedChild.name !== 'code') {
+ return;
+ }
+ [codeBlockElement] = nestedChild.children;
+ codeBlockElement.data = `\`\`\`${codeLanguage}\n${codeBlockElement.data}\n\`\`\``;
+ }
+ });
+
+ return codeBlockElement;
+ }
+
static isText(element) {
return element.type === 'text' || element.type === 'comment';
}
diff --git a/src/plugins/default/markbind-plugin-plantuml.js b/src/plugins/default/markbind-plugin-plantuml.js
deleted file mode 100644
index a7d87b7a1f..0000000000
--- a/src/plugins/default/markbind-plugin-plantuml.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/**
- * Parses PlantUML diagrams
- * Replaces tags with tags with the appropriate src attribute and generates the diagrams
- * by running the JAR executable
- */
-const cheerio = module.parent.require('cheerio');
-const fs = require('fs');
-const path = require('path');
-const { exec } = require('child_process');
-const logger = require('../../util/logger');
-
-const JAR_PATH = path.resolve(__dirname, 'plantuml.jar');
-
-const {
- ERR_PROCESSING,
- ERR_READING,
-} = require('../../constants');
-
-// Tracks diagrams that have already been processed
-const processedDiagrams = new Set();
-
-/**
- * Generates diagram and replaces src attribute of puml tag
- * @param src src attribute of the puml tag
- * @param cwf original file that contains the puml tag, we resolve relative src to this file
- * @param config sourcePath and resultPath from parser context
- * @returns {string} resolved src attribute
- */
-function generateDiagram(src, cwf, config) {
- const { sourcePath, resultPath } = config;
- const _cwf = cwf || sourcePath;
-
- // For replacing img.src
- const diagramSrc = src.replace('.puml', '.png');
- // Path of the .puml file
- const rawDiagramPath = path.resolve(path.dirname(_cwf), src);
- // Path of the .png to be generated
- const outputFilePath = path.resolve(resultPath, path.relative(sourcePath, rawDiagramPath)
- .replace('.puml', '.png'));
- // Output dir for the png file
- const outputDir = path.dirname(outputFilePath);
-
- // Tracks built files to avoid accessing twice
- if (processedDiagrams.has(outputFilePath)) { return diagramSrc; }
- processedDiagrams.add(outputFilePath);
-
- // Creates output dir if it doesn't exist
- if (!fs.existsSync(outputDir)) {
- fs.mkdirSync(outputDir, { recursive: true });
- }
-
- // Read diagram file, launch PlantUML jar
- fs.readFile(rawDiagramPath, (err, data) => {
- if (err) {
- logger.debug(err);
- logger.error(`${ERR_READING} ${rawDiagramPath}`);
- return;
- }
-
- const umlCode = data.toString();
-
- // Java command to launch PlantUML jar
- const cmd = `java -jar "${JAR_PATH}" -pipe > "${outputFilePath}"`;
- const childProcess = exec(cmd);
-
- let errorLog = '';
-
- childProcess.stdin.write(
- umlCode,
- (e) => {
- if (e) {
- logger.debug(e);
- logger.error(`${ERR_PROCESSING} ${rawDiagramPath}`);
- }
- childProcess.stdin.end();
- },
- );
-
- childProcess.on('error', (error) => {
- logger.debug(error);
- logger.error(`${ERR_PROCESSING} ${rawDiagramPath}`);
- });
-
- childProcess.stderr.on('data', (errorMsg) => {
- errorLog += errorMsg;
- });
-
- childProcess.on('exit', () => {
- // This goes to the log file, but not shown on the console
- logger.debug(errorLog);
- });
- });
-
- return diagramSrc;
-}
-
-module.exports = {
- preRender: (content, pluginContext, frontmatter, config) => {
- // Clear tags processed before for live reload
- processedDiagrams.clear();
- // Processes all tags
- const $ = cheerio.load(content, { xmlMode: true });
- $('puml').each((i, tag) => {
- // eslint-disable-next-line no-param-reassign
- tag.name = 'pic';
- const { src, cwf } = tag.attribs;
- // eslint-disable-next-line no-param-reassign
- tag.attribs.src = generateDiagram(src, cwf, config);
- });
-
- return $.html();
- },
- getSources: () => ({
- tagMap: [['puml', 'src']],
- }),
-};
diff --git a/src/plugins/default/plantuml.jar b/src/widgets/plantuml.jar
similarity index 100%
rename from src/plugins/default/plantuml.jar
rename to src/widgets/plantuml.jar
diff --git a/src/widgets/puml.js b/src/widgets/puml.js
new file mode 100644
index 0000000000..055bb6dd86
--- /dev/null
+++ b/src/widgets/puml.js
@@ -0,0 +1,100 @@
+const path = require('path');
+const cheerio = require('cheerio');
+const cryptoJS = require('crypto-js');
+const fs = require('fs');
+const { exec } = require('child_process');
+const logger = require('../util/logger');
+const fsUtil = require('../util/fsUtil');
+
+const PLANTUML_JAR_NAME = 'plantuml.jar';
+
+const {
+ ATTRIB_RESULT_PATH,
+} = require('../lib/markbind/src/constants');
+
+function getFileName(context, content) {
+ if (context.name !== undefined) {
+ return `${context.name}.png`;
+ }
+
+ if (context.src !== undefined) {
+ const fileName = fsUtil.removeExtension(context.src);
+ return `${fileName}.png`;
+ }
+
+ const hashedContent = cryptoJS.MD5(content).toString();
+ return `${hashedContent}.png`;
+}
+
+function generateElement(context) {
+ const element = cheerio.parseHTML('')[0];
+ const entries = Object.entries(context);
+ entries.forEach(([key, val]) => {
+ if (key === ATTRIB_RESULT_PATH) {
+ return;
+ }
+ element.attribs[key] = val;
+ });
+
+ return element;
+}
+
+/*
+* Curry function takes in context returning a widgetHandler function
+* PUML widgetHandler takes in raw PUML contents and returns img with puml
+*/
+function parseAndRenderPUML(context) {
+ return function (content) {
+ const outputDir = path.dirname(context.resultPath);
+ const fileName = getFileName(context, content);
+ // Path of the .puml file
+ const outputPath = path.join(outputDir, path.basename(fileName));
+ const JAR_PATH = path.resolve(__dirname, PLANTUML_JAR_NAME);
+
+ // Creates output dir if it doesn't exist
+ if (!fs.existsSync(outputDir)) {
+ fs.mkdirSync(outputDir, { recursive: true });
+ }
+
+ // Java command to launch PlantUML jar
+ const cmd = `java -jar "${JAR_PATH}" -pipe > "${outputPath}"`;
+ const childProcess = exec(cmd);
+
+ let errorLog = '';
+ childProcess.stdin.write(
+ content,
+ (e) => {
+ if (e) {
+ logger.debug(e);
+ }
+ childProcess.stdin.end();
+ },
+ );
+
+ childProcess.on('error', (error) => {
+ logger.debug(error);
+ });
+
+ childProcess.stderr.on('data', (errorMsg) => {
+ errorLog += errorMsg;
+ });
+
+ childProcess.on('exit', () => {
+ // This goes to the log file, but not shown on the console
+ logger.debug(errorLog);
+ });
+
+ const elementContext = context;
+ elementContext.src = fileName;
+ const element = generateElement(elementContext);
+
+ return cheerio.html(element);
+ };
+}
+
+/*
+* Parse and render PUML widget
+*/
+module.exports = {
+ parseAndRender: parseAndRenderPUML,
+};
diff --git a/test/functional/test_site/expected/b169e11db4f52a01eb352071b156c59b.png b/test/functional/test_site/expected/b169e11db4f52a01eb352071b156c59b.png
new file mode 100644
index 0000000000000000000000000000000000000000..e6e95dbbe905cd68f1256bb6952f54d0a3f5dfa9
GIT binary patch
literal 21785
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
literal 0
HcmV?d00001
diff --git a/test/functional/test_site/expected/index.html b/test/functional/test_site/expected/index.html
index dc18a1dd28..b9598c2667 100644
--- a/test/functional/test_site/expected/index.html
+++ b/test/functional/test_site/expected/index.html
@@ -469,33 +469,48 @@ Markbind Plugin Pre-render
-
+
Test PlantUML live reload with include
PlantUML Test
-
Sequence Diagram
+
Sequence Diagram
+
+
Use Case Diagram
+
+
Class Diagram
+
+
Activity Diagram
+
+
Component Diagram
+
+
State Diagram
+
+
Object Diagram
+
+
PlantUML Inline Test
+
+
diff --git a/test/functional/test_site/expected/inline-output.png b/test/functional/test_site/expected/inline-output.png
new file mode 100644
index 0000000000000000000000000000000000000000..32a71b61dc2e0e5548cf04df55d0cf5ef36bc85e
GIT binary patch
literal 17943
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
Kynp?6@BaXD=N+j4
literal 0
HcmV?d00001
diff --git a/test/functional/test_site/expected/testPlantUML.html b/test/functional/test_site/expected/testPlantUML.html
index f766091d47..859cb60bfd 100644
--- a/test/functional/test_site/expected/testPlantUML.html
+++ b/test/functional/test_site/expected/testPlantUML.html
@@ -26,27 +26,41 @@
PlantUML Test
-
Sequence Diagram
+
Sequence Diagram
+
+
Use Case Diagram
+
+
Class Diagram
+
+
Activity Diagram
+
+
Component Diagram
+
+
State Diagram
+
+
Object Diagram
+
+
PlantUML Inline Test
+
+