From 686ed18dacd39dade54d6ad9175919ca929648d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=92=83=E7=99=BD?= <18511759309@163.com> Date: Thu, 1 Jul 2021 18:54:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BC=98=E5=8C=96=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E6=8C=89=E9=92=AE=E5=90=8E=E7=9A=84=E5=85=89?= =?UTF-8?q?=E6=A0=87=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 5 +++-- src/assets/js/utils.js | 5 +++++ src/components/content/md-preview.vue | 2 +- src/components/content/md-textarea.vue | 20 +++++++++++++++++++- src/components/header/md-header.vue | 18 +++++++++++------- src/components/header/tool-button.vue | 7 ++++--- 6 files changed, 43 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index b7ff65b..762aa91 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "markdown-editor", "description": " A open source markdown editor of csdn codechina team contributed", - "version": "0.4.1", + "version": "0.5.2", "publisher": "guoweijia", "scripts": { "start": "webpack serve --mode=development", "build": "webpack --mode=production", - "p": "npm run build && ssh -t root@45.76.193.214 rm -rf /test/* exit && scp -r dist/* root@45.76.193.214:/test/" + "p": "rm -rf dist/*.js && npm run build && ssh -t root@45.76.193.214 rm -rf /test/* exit && scp -r dist/* root@45.76.193.214:/test/" }, "devDependencies": { "chalk": "^4.1.1", @@ -22,6 +22,7 @@ "webpack-dev-server": "^3.11.2" }, "dependencies": { + "dompurify": "^0.8.2", "highlight.js": "^11.0.1", "marked": "^2.0.6", "vtip": "^1.0.6", diff --git a/src/assets/js/utils.js b/src/assets/js/utils.js index 255b7de..a42aeb3 100644 --- a/src/assets/js/utils.js +++ b/src/assets/js/utils.js @@ -173,3 +173,8 @@ export function checkBoswer() { ); return agent !== null; } + +export function removeBlankLine(val) { + if (!val) return ""; + return val.replace(/^\n/, ""); +} diff --git a/src/components/content/md-preview.vue b/src/components/content/md-preview.vue index 8aecc57..8f71927 100644 --- a/src/components/content/md-preview.vue +++ b/src/components/content/md-preview.vue @@ -42,7 +42,7 @@ export default { const previewDomList = document.querySelectorAll(".md_preview code"); if (!previewDomList.length) return; previewDomList.forEach(item => { - item.className = "md_hljs"; + item.className += " md_hljs"; }); }, 0); } diff --git a/src/components/content/md-textarea.vue b/src/components/content/md-textarea.vue index 61be8ec..6f4ff86 100644 --- a/src/components/content/md-textarea.vue +++ b/src/components/content/md-textarea.vue @@ -155,15 +155,33 @@ export default { }, transferMarkdown(val) { marked.setOptions({ + breaks: true, + gfm: true, + langPrefix: "language-", highlight: function(code, lang, callback) { const html = require("highlight.js").highlightAuto(code).value; + + // const html = require("highlight.js").highlight(code, { + // language: lang || "xml" + // }).value; return html; } }); const str = val + ""; // if (!str.trim()) return; const html = marked(str); - this.$emit("update:html", html); + const virtualDom = document.createElement("div"); + virtualDom.innerHTML = html; + virtualDom.querySelectorAll("code").forEach(item => { + if (!/language-/.test(item.className)) { + item.className = "language-xml"; + } + }); + const DOMPurify = require("dompurify"); + const cleanHtml = DOMPurify.sanitize(virtualDom.innerHTML, { + FORBID_TAGS: ["style", "script"] + }); + this.$emit("update:html", cleanHtml); }, input() { this.$emit("update:textLength", this.textContent.length); diff --git a/src/components/header/md-header.vue b/src/components/header/md-header.vue index 57ebb1e..7865085 100644 --- a/src/components/header/md-header.vue +++ b/src/components/header/md-header.vue @@ -35,7 +35,12 @@