소스 검색

Merge branch 'j433866-render-markdown'

n1474335 6 년 전
부모
커밋
52f88ee32d
4개의 변경된 파일108개의 추가작업 그리고 4개의 파일을 삭제
  1. 36 3
      package-lock.json
  2. 1 0
      package.json
  3. 2 1
      src/core/config/Categories.json
  4. 69 0
      src/core/operations/RenderMarkdown.mjs

+ 36 - 3
package-lock.json

@@ -2068,7 +2068,6 @@
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
       "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
       "requires": {
         "sprintf-js": "~1.0.2"
       }
@@ -4786,6 +4785,11 @@
         "tapable": "^1.0.0"
       }
     },
+    "entities": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+    },
     "errno": {
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
@@ -8786,6 +8790,14 @@
       "resolved": "https://registry.npmjs.org/libyara-wasm/-/libyara-wasm-0.0.12.tgz",
       "integrity": "sha512-AjTe4FiBuH4F7HwGT/3UxoRenczXtrbM6oWGrifxb44LrkDh5VxRNg9zwfPpDA5Fcc1iYcXS0WVA/b3DGtD8cQ=="
     },
+    "linkify-it": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
+      "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
+      "requires": {
+        "uc.micro": "^1.0.1"
+      }
+    },
     "livereload-js": {
       "version": "2.4.0",
       "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz",
@@ -9141,6 +9153,18 @@
         "object-visit": "^1.0.0"
       }
     },
+    "markdown-it": {
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-9.1.0.tgz",
+      "integrity": "sha512-xHKG4C8iPriyfu/jc2hsCC045fKrMQ0VexX2F1FGYiRxDxqMB2aAhF8WauJ3fltn2kb90moGBkiiEdooGIg55w==",
+      "requires": {
+        "argparse": "^1.0.7",
+        "entities": "~1.1.1",
+        "linkify-it": "^2.0.0",
+        "mdurl": "^1.0.1",
+        "uc.micro": "^1.0.5"
+      }
+    },
     "md5.js": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
@@ -9152,6 +9176,11 @@
         "safe-buffer": "^5.1.2"
       }
     },
+    "mdurl": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+      "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
+    },
     "media-typer": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -12677,8 +12706,7 @@
     "sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
     },
     "ssdeep.js": {
       "version": "0.0.2",
@@ -13596,6 +13624,11 @@
       "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz",
       "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw=="
     },
+    "uc.micro": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+      "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
+    },
     "uglify-js": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz",

+ 1 - 0
package.json

@@ -126,6 +126,7 @@
     "lodash": "^4.17.15",
     "loglevel": "^1.6.3",
     "loglevel-message-prefix": "^3.0.0",
+    "markdown-it": "^9.0.0",
     "moment": "^2.24.0",
     "moment-timezone": "^0.5.25",
     "ngeohash": "^0.6.3",

+ 2 - 1
src/core/config/Categories.json

@@ -358,7 +358,8 @@
             "BSON serialise",
             "BSON deserialise",
             "To MessagePack",
-            "From MessagePack"
+            "From MessagePack",
+            "Render Markdown"
         ]
     },
     {

+ 69 - 0
src/core/operations/RenderMarkdown.mjs

@@ -0,0 +1,69 @@
+/**
+ * @author j433866 [j433866@gmail.com]
+ * @copyright Crown Copyright 2019
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+import MarkdownIt from "markdown-it";
+import hljs from "highlight.js";
+
+/**
+ * Render Markdown operation
+ */
+class RenderMarkdown extends Operation {
+
+    /**
+     * RenderMarkdown constructor
+     */
+    constructor() {
+        super();
+
+        this.name = "Render Markdown";
+        this.module = "Code";
+        this.description = "Renders input Markdown as HTML. HTML rendering is disabled to avoid XSS.";
+        this.infoURL = "https://wikipedia.org/wiki/Markdown";
+        this.inputType = "string";
+        this.outputType = "html";
+        this.args = [
+            {
+                name: "Autoconvert URLs to links",
+                type: "boolean",
+                value: false
+            },
+            {
+                name: "Enable syntax highlighting",
+                type: "boolean",
+                value: true
+            }
+        ];
+    }
+
+    /**
+     * @param {string} input
+     * @param {Object[]} args
+     * @returns {html}
+     */
+    run(input, args) {
+        const [convertLinks, enableHighlighting] = args,
+            md = new MarkdownIt({
+                linkify: convertLinks,
+                html: false, // Explicitly disable HTML rendering
+                highlight: function(str, lang) {
+                    if (lang && hljs.getLanguage(lang) && enableHighlighting) {
+                        try {
+                            return hljs.highlight(lang, str).value;
+                        } catch (__) {}
+                    }
+
+                    return "";
+                }
+            }),
+            rendered = md.render(input);
+
+        return `<div style="font-family: var(--primary-font-family)">${rendered}</div>`;
+    }
+
+}
+
+export default RenderMarkdown;