This is an automated email from the ASF dual-hosted git repository. urfree pushed a commit to branch refactor/migrate-scripts in repository https://gitbox.apache.org/repos/asf/pulsar-site.git
commit e024f06957d640937f328450da5b8c2581424da6 Author: LiLi <[email protected]> AuthorDate: Fri Feb 11 13:48:29 2022 +0800 migrate script: find-docs.js Signed-off-by: LiLi <[email protected]> --- site2/website-next/migrate/.gitignore | 3 + site2/website-next/migrate/README.md | 3 + site2/website-next/migrate/migrate-change.js | 0 site2/website-next/migrate/migrate-chapter.js | 0 site2/website-next/migrate/migrate-docs.js | 50 ++++++++++ site2/website-next/migrate/migrate-full.js | 0 site2/website-next/migrate/migrate-version.js | 0 site2/website-next/migrate/tool/find-docs.js | 106 +++++++++++++++++++++ site2/website-next/migrate/tool/fix-code.js | 41 ++++++++ site2/website-next/migrate/tool/fix-jsx.js | 7 ++ site2/website-next/migrate/tool/fix-md.js | 54 +++++++++++ site2/website-next/migrate/tool/fix-miss.js | 59 ++++++++++++ site2/website-next/migrate/tool/fix-space.js | 54 +++++++++++ site2/website-next/migrate/tool/fix-tab.js | 97 +++++++++++++++++++ site2/website-next/migrate/tool/fix-table.js | 72 ++++++++++++++ .../migrate/tool/fix-tip-note-in-list.js | 27 ++++++ site2/website-next/migrate/tool/fix-tip-note.js | 81 ++++++++++++++++ 17 files changed, 654 insertions(+) diff --git a/site2/website-next/migrate/.gitignore b/site2/website-next/migrate/.gitignore new file mode 100644 index 0000000..074d008 --- /dev/null +++ b/site2/website-next/migrate/.gitignore @@ -0,0 +1,3 @@ +.cache +/node_modules +/log \ No newline at end of file diff --git a/site2/website-next/migrate/README.md b/site2/website-next/migrate/README.md new file mode 100644 index 0000000..1199cb3 --- /dev/null +++ b/site2/website-next/migrate/README.md @@ -0,0 +1,3 @@ +1. fix docs md +2. fix missing docs +3. fix duplicate docs \ No newline at end of file diff --git a/site2/website-next/migrate/migrate-change.js b/site2/website-next/migrate/migrate-change.js new file mode 100644 index 0000000..e69de29 diff --git a/site2/website-next/migrate/migrate-chapter.js b/site2/website-next/migrate/migrate-chapter.js new file mode 100644 index 0000000..e69de29 diff --git a/site2/website-next/migrate/migrate-docs.js b/site2/website-next/migrate/migrate-docs.js new file mode 100644 index 0000000..0690a40 --- /dev/null +++ b/site2/website-next/migrate/migrate-docs.js @@ -0,0 +1,50 @@ +const fs = require("fs"); +const path = require("path"); +const _ = require("lodash"); +const fixMd = require("./tool/fix-md"); +import { fileURLToPath } from "url"; + +function travel(dir, callback) { + fs.readdirSync(dir).forEach((file) => { + callback(path.join(dir, file)); + }); +} + +function fix(version, docsId) { + let version_full = "version-" + version; + let src = "../../website/versioned_docs/" + version_full; + let dest = "../../website-next/versioned_docs/" + version_full; + if (version == "next") { + src = "../../docs"; + dest = "../../website-next/docs"; + } + src = path.join(__dirname, src); + + //find docs with id docsId + + let reg = new RegExp("^id:\\s*version-" + version + "-(incubating-)?"); + + // dest = path.join(__dirname, dest); + + // travel(src, function (pathname) { + // let filename = path.basename(pathname); + // try { + // fs.statSync(dest); + // } catch { + // fs.mkdirSync(dest); + // } + // console.log(filename); + // let data = fs.readFileSync(pathname, "utf8"); + // data = fixMd(data, version); + // // filename = filename == "deploy-dcos.md" ? "deploy-docs.md" : filename; + // fs.writeFileSync(path.join(dest, filename), data); + // }); +} + +module.exports = fix; + +// if (process.argv[1] === fileURLToPath(import.meta.url)) { +// const args = process.argv.slice(2); +// const version = args[0]; +// const docsId = args[1]; +// } diff --git a/site2/website-next/migrate/migrate-full.js b/site2/website-next/migrate/migrate-full.js new file mode 100644 index 0000000..e69de29 diff --git a/site2/website-next/migrate/migrate-version.js b/site2/website-next/migrate/migrate-version.js new file mode 100644 index 0000000..e69de29 diff --git a/site2/website-next/migrate/tool/find-docs.js b/site2/website-next/migrate/tool/find-docs.js new file mode 100644 index 0000000..8012b26 --- /dev/null +++ b/site2/website-next/migrate/tool/find-docs.js @@ -0,0 +1,106 @@ +const fs = require("fs"); +const path = require("path"); + +function _log(msg) { + if (typeof require !== "undefined" && require.main === module) { + console.log(msg); + } +} + +const _search = (dir, version, docsId, reg) => { + let pathname = path.join(dir, docsId + ".md"); + if (fs.existsSync(pathname)) { + let data = fs.readFileSync(pathname, "utf8"); + if (reg.test(data)) { + _log("[" + version + ":" + docsId + "]fund: " + pathname); + return pathname; + } + } + let docsList = fs.readdirSync(dir); + for (let filename of docsList) { + let pathname = path.join(dir, filename); + if (fs.statSync(pathname).isDirectory()) { + continue; + } + if (!pathname.endsWith(".md")) { + continue; + } + let data = fs.readFileSync(pathname, "utf8"); + if (reg.test(data)) { + _log("[" + version + ":" + docsId + "]fund: " + pathname); + return pathname; + } + } + return null; +}; + +const find = (version, docsId) => { + let vReg = new RegExp("id:\\s*version-(\\d\\.?)+-(incubating-)?" + docsId); + let nextReg = new RegExp("id:\\s*" + docsId); + + let version_full = "version-" + version; + let src = "../../../website/versioned_docs/" + version_full; + if (version == "next") { + src = "../../../docs"; + } + src = path.join(__dirname, src); + nextDir = path.join(__dirname, "../../../docs"); + vDocsDir = path.join(__dirname, "../../../website/versioned_docs"); + + let pathname = _search( + src, + version, + docsId, + version == "next" ? nextReg : vReg + ); + if (pathname || version == "next") { + return pathname; + } + + if (!pathname) { + _log("[" + version + ":" + docsId + "]not fund, will auto fix missing"); + pathname = _search(nextDir, version, docsId, nextReg); + if (!pathname) { + let vDocsDirList = fs.readdirSync(vDocsDir); + vDocsDirList = vDocsDirList.sort((a, b) => { + let aVersion = /((\d\.?)+)/.exec(a)[1]; + let bVersion = /((\d\.?)+)/.exec(b)[1]; + aVersion = parseInt(aVersion.replace(/\./g, "")); + bVersion = parseInt(bVersion.replace(/\./g, "")); + return bVersion - aVersion; + }); + for (let vDir of vDocsDirList) { + pathname = _search(path.join(vDocsDir, vDir), version, docsId, vReg); + if (pathname) { + break; + } + } + } + } + + let log = "{}"; + let logdir = path.join(__dirname, "../log"); + let logpath = path.join(__dirname, "../log", version + ".missing"); + if (!fs.existsSync(logdir)) { + fs.mkdirSync(logdir); + } + if (fs.existsSync(logpath)) { + log = fs.readFileSync(logpath, "utf8"); + } + log = JSON.parse(log); + log[docsId] = pathname ? pathname : ""; + fs.writeFileSync(path.join(logpath), JSON.stringify(log)); + + if (!pathname) { + _log("[" + version + ":" + docsId + "]not fund and fix missing fail"); + } + + return pathname; +}; + +module.exports = find; + +//Test +if (typeof require !== "undefined" && require.main === module) { + find("2.6.0", "adaptors-kafka"); +} diff --git a/site2/website-next/migrate/tool/fix-code.js b/site2/website-next/migrate/tool/fix-code.js new file mode 100644 index 0000000..b297473 --- /dev/null +++ b/site2/website-next/migrate/tool/fix-code.js @@ -0,0 +1,41 @@ +module.exports = (data) => { + let nData = data; + + let reg = /^([\t ]*)(>*)([\t ]*)(```.*)((((?!```).)*\n*)+)```/gm; //代码块 + while ((codeGroup = reg.exec(data))) { + let _match = codeGroup[0]; + let space1 = codeGroup[1]; + let arrow = codeGroup[2]; + let space2 = codeGroup[3]; + let begin = codeGroup[4]; + let code = codeGroup[5]; + let prefix = space1 + arrow + space2; + if ((code = /[\t ]*(.+\n*)*\S/.exec(code))) { + code = code[0]; //剔除纯空白的行首和行尾, 得到纯代码 + if (code.substr(0, prefix.length) != prefix) { + code = prefix + code.replace(/\n(.*)/g, "\n" + prefix + "$1"); //行对齐 + } + } + let newCodeBlock = + "\n" + + prefix + + begin + + "\n" + + prefix + + "\n" + + code + + "\n" + + prefix + + "\n" + + prefix + + "```" + + "\n"; + nData = nData.replace(_match, newCodeBlock); + } + return nData + .replace( + /(.*)(\s*\n){3,}(\s*```.*)((((?!```).)*\n*)+)```.*(\s*\n)+/g, + "$1\n\n$3$4```\n\n" + ) //解决多个空行 + .replace(/^(\s*```.*(((?!```).)*\n*)+)```.*\n+/gm, "$1```\n\n"); //解决多个空行 //解决代码块结束标识符后无空行 +}; diff --git a/site2/website-next/migrate/tool/fix-jsx.js b/site2/website-next/migrate/tool/fix-jsx.js new file mode 100644 index 0000000..48bce1c --- /dev/null +++ b/site2/website-next/migrate/tool/fix-jsx.js @@ -0,0 +1,7 @@ +module.exports = (data) => { + return data + .replace(/(import Tabs from '@theme\/Tabs';)/g, "````mdx-code-block\n$1") + .replace(/(import TabItem from '@theme\/TabItem';)/g, "$1\n````") + .replace(/(<Tabs>?)/g, "````mdx-code-block\n$1") + .replace(/(<\/Tabs>)/g, "$1\n````"); +}; diff --git a/site2/website-next/migrate/tool/fix-md.js b/site2/website-next/migrate/tool/fix-md.js new file mode 100644 index 0000000..14f15bc --- /dev/null +++ b/site2/website-next/migrate/tool/fix-md.js @@ -0,0 +1,54 @@ +const fixTab = require("./fix-tab"); +const fixTipNote = require("./fix-tip-note"); +const fixTable = require("./fix-table"); +const fixCode = require("./fix-code"); +const fixTipNoteInList = require("./fix-tip-note-in-list"); +const fixJSX = require("./fix-jsx"); + +function fix(data, version) { + let reg = new RegExp("id:\\s*version-" + version + "-(incubating-)?"); + data = fixTable(data); + data = fixTab(data); + data = data.replace(/(<TabItem.*)\n(.*{@inject:\s*.+?})/g, "$1\n\n$2"); + data = data.replace(/^(>\s*```\w*)(\s*\n){2,}>/gm, "$1\n>\n>"); + data = fixTipNote(data); + data = fixTipNoteInList(data); + data = fixCode(data); + + data = data + .replace(reg, "id: ") + .replace("id: deploy-docs", "id: deploy-dcos") + .replace(/`{4,}/g, "```") + .replace(/^(id:\sstandalone)\s*$/gm, "slug: /\n$1") + .replace(/<style[\s\S]*?<\/style>/g, "") + .replace(/\[(.*)\]\s*\((.*)\.md\)/g, "[$1]($2)") + .replace(/\*\*(((?!\*).)+)\*/g, "**$1**") //**macOS* => **macOS** + .replace(/\*\*(((?!\*).)+)\*{3}/g, "**$1**") //**macOS*** => **macOS** + .replace(/(\w)[\t ]*\n\[/g, "$1 [") + .replace(/sidebar_label:\s*(.*)/, 'sidebar_label: "$1"') + .replace(/""(.*)""/, '"$1"') + .replace(/\[\[pulsar:version_number\]\]/g, "@pulsar:version_number@") + .replace(/{{(pulsar:.*?)}}/g, "@$1@") + .replace(/(@inject:\s*\w+:)`(\w+)`/g, "$1$2") + .replace(/<empty string>/g, "|") + .replace(/<li>(((?!<\/?li>|\|).)+)/g, "<li>$1</li>") + .replace(/<\/li>\s*<\/li>/g, "</li>") + .replace(/\|(((?!<\/?li>|\|).)+)<\/li>/g, "|<li>$1</li>") + .replace(/<\/li>\s*<\/li>/g, "</li>") //sometimes needed, no idea for now... + .replace(/<\/br>/g, "@AAA@") + .replace(/<br>/g, "@AAA@") + .replace(/<br\/>/g, "@AAA@") + .replace(/<>/g, "") + .replace(/@AAA@/g, "<br />") + .replace( + /<span style="(((?!:).)+):(((?!>).)+);"/g, + '<span style={{color: "$3"}}' + ) + .replace(/\s?style=".*?"/g, "") + .replace(/\]\(assets\//g, "](/assets/"); + + return data; + // return fixJSX(data); +} + +module.exports = fix; diff --git a/site2/website-next/migrate/tool/fix-miss.js b/site2/website-next/migrate/tool/fix-miss.js new file mode 100644 index 0000000..f20574b --- /dev/null +++ b/site2/website-next/migrate/tool/fix-miss.js @@ -0,0 +1,59 @@ +const fs = require("fs"); +const path = require("path"); + +function fix(docId, versions) { + console.log("Fix missing for: ", docId, versions); + + let fixed = false; + + function travel(dir, callback) { + fs.readdirSync(dir) + .sort(() => -1) + .forEach((file) => { + var pathname = path.join(dir, file); + if (fs.statSync(pathname).isDirectory()) { + if (!fixed) { + travel(pathname, callback); + } + } else { + if (!fixed) { + fixed = callback(pathname); + } + } + }); + } + + const vdocs = path.join(__dirname, "../../website/versioned_docs"); + travel(vdocs, (pathname) => { + let data = fs.readFileSync(pathname, "utf8"); + let _match = /^id:\s*version-[\d\.]+-(incubating-)?(.*)/gm.exec(data); + // if (_match[1].indexOf(docId) > -1) { + if (_match && _match[2] == docId) { + console.log(pathname, _match[0]); + + let vs = versions.split(","); + vs.forEach((v) => { + if (v == "next") { + fs.writeFileSync( + path.join(vdocs, "../../docs/", docId + ".md"), + data.replace(/^id:\s*version-[\d\.]+-(.*)/gm, "id: " + docId), + "utf8" + ); + } else { + fs.writeFileSync( + path.join(vdocs, "version-" + v, docId + ".md"), + data.replace( + /^id:\s*version-[\d\.]+-(.*)/gm, + "id: version-" + v + "-" + docId + ), + "utf8" + ); + } + }); + return true; + } + return false; + }); +} + +module.exports = fix; diff --git a/site2/website-next/migrate/tool/fix-space.js b/site2/website-next/migrate/tool/fix-space.js new file mode 100644 index 0000000..56dfd99 --- /dev/null +++ b/site2/website-next/migrate/tool/fix-space.js @@ -0,0 +1,54 @@ +const fs = require("fs"); +const path = require("path"); + +const code_map = {}; +let index = 0; + +function fixSpace(data) { + const code_reg = /(```\w*)((((?!```).)*\n*)+)```/; + const _match = code_reg.exec(data); + if (_match) { + const code = _match[0]; + const TMP_KEY = "_TMP_CODE_KEY_" + index + "_"; + code_map[TMP_KEY] = code; + index++; + data = data.replace(code_reg, TMP_KEY); + return fixSpace(data); + } else { + return data; + } +} + +function fixTmp(data) { + const tmp_reg = /_TMP_CODE_KEY_(\d+)_/; + const _match = tmp_reg.exec(data); + if (_match) { + data = data.replace(tmp_reg, code_map[_match[0]]); + return fixTmp(data); + } else { + return data; + } +} + +function fix(data) { + data = fixSpace(data); + data = data.replace(/^[\t ]+/gm, ""); + data = fixTmp(data); + return data; +} + +function test() { + let data = fs.readFileSync( + path.join(__dirname, "../bak/io-quickstart.md"), + "utf8" + ); + data = fixSpace(data); + data = data.replace(/^[\t ]+/gm, ""); + data = fixTmp(data); + // console.log(data); + fs.writeFileSync(path.join(__dirname, "../bak/io-quickstart-fixed.md"), data); +} + +// test(); + +module.exports = fix; diff --git a/site2/website-next/migrate/tool/fix-tab.js b/site2/website-next/migrate/tool/fix-tab.js new file mode 100644 index 0000000..3dd751a --- /dev/null +++ b/site2/website-next/migrate/tool/fix-tab.js @@ -0,0 +1,97 @@ +const fs = require("fs"); +const path = require("path"); +const lodash = require("lodash"); +const TAB_REG = + /([\t ]*)<!--DOCUSAURUS_CODE_TABS-->(((?!<!--END_DOCUSAURUS_CODE_TABS-->).)*\n*)*<!--END_DOCUSAURUS_CODE_TABS-->/; + +function removeTabTag(tab) { + return tab + .replace(/<!--DOCUSAURUS_CODE_TABS-->/, "") + .replace(/<!--END_DOCUSAURUS_CODE_TABS-->/, ""); +} + +function findTabItemNameList(tab) { + const _match = tab.match(/<!--(.*)-->/g); + return _match.map((item) => { + return item.replace("<!--", "").replace("-->", ""); + }); +} + +function replaceTabItemTag(tab) { + const tab_item_reg = /([\t ]*)<!--(.*)-->((((?![\t ]*<!--).)*\n*)*)/; + const _match = tab_item_reg.exec(tab); + if (_match) { + const space = _match[1]; + const tab_item_name = _match[2]; + const tab_item_content = lodash.trimEnd(_match[3]); + let tab_item_str = space + '<TabItem value="'; + tab_item_str += + tab_item_name + '">' + tab_item_content + "\n\n" + space + "</TabItem>\n"; + tab = tab.replace(tab_item_reg, tab_item_str); + return replaceTabItemTag(tab); + } else { + return tab; + } +} + +function importTabComponent(data) { + if (!/import Tabs from '@theme\/Tabs';/g.exec(data)) { + return data.replace( + /---((((?!---).)*\n*)*)---/, + "---$1---" + + "\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n" + ); + } + return data; +} + +function fixTab(data) { + const _match = TAB_REG.exec(data); + if (_match) { + data = importTabComponent(data); + let tab = _match[0]; + tab = removeTabTag(tab); + const names = findTabItemNameList(tab); + tab = replaceTabItemTag(tab); + const names_map = names.map((item) => { + return { + label: item, + value: item, + }; + }); + + const space = _match[1]; + const tab_tag_begin = + space + + "<Tabs \n" + + space + + ' defaultValue="' + + names[0] + + '"\n' + + space + + " values={" + + JSON.stringify(names_map) + + "}>"; + + const tab_tag_end = "\n" + space + "</Tabs>"; + tab = tab_tag_begin + tab + tab_tag_end; + return fixTab(data.replace(TAB_REG, tab)); + } else { + return data + .replace(/(<TabItem.*)\n[\t ]*\n/g, "$1\n") + .replace(/(<TabItem.*)/g, "$1\n"); + } +} + +function test() { + let data = fs.readFileSync( + path.join(__dirname, "../bak/schema-manage.md"), + "utf8" + ); + data = fixTab(data); + console.log(data); +} + +// test() + +module.exports = fixTab; diff --git a/site2/website-next/migrate/tool/fix-table.js b/site2/website-next/migrate/tool/fix-table.js new file mode 100644 index 0000000..ef629f8 --- /dev/null +++ b/site2/website-next/migrate/tool/fix-table.js @@ -0,0 +1,72 @@ +const fs = require("fs"); +const path = require("path"); +const NL = "\n"; + +//Convert HTML table to markdown table +function convertTableElementToMarkdown(table) { + let rows = []; + let trEls = table.match(/[<]tr[\s\S]*?[/]tr[>]/g); + for (let i = 0; i < trEls.length; i++) { + let tableRow = trEls[i]; + let markdownRow = convertTableRowElementToMarkdown(tableRow, i); + rows.push(markdownRow); + } + return rows.join(NL); +} + +//Convert the rows of the HTML table to the rows of the markdown table +function convertTableRowElementToMarkdown(tableRow, rowNumber) { + let cells = []; + let cellEls = []; + cellEls = tableRow.match(/[<]th[\s\S]*?[/]th[>]/g); + if (!cellEls || cellEls.length == 0) { + cellEls = tableRow.match(/[<]td[\s\S]*?[/]td[>]/g); + } + let dividerCells = []; + if (rowNumber == 0) { + for (i = 0; i < cellEls.length; i++) { + dividerCells.push("---" + " |"); + } + dividerCells = "| " + dividerCells.join(" "); + } + for (let i = 0; i < cellEls.length; i++) { + let cell = cellEls[i]; + cell.indexOf(">") + 1; + + cells.push( + cell + .substring(cell.indexOf(">") + 1, cell.indexOf("<", cell.indexOf(">"))) + .replace(/\*\s+([^\|\*]*)/g, "<li>$1</li>") + " | " + ); + } + let row = "| " + cells.join(" "); + if (rowNumber == 0) { + row = row + NL + dividerCells; + } + + return row; +} + +function fix(data) { + let content = data; + let patt1 = /[<]table[\s\S]*?[/]table[>]/g; + let tables = content.match(patt1); + if (tables) { + for (let e of tables) { + let et = e.replace(/\s+/g, " "); + let markdownTable = convertTableElementToMarkdown(et); + content = content.replace(e, markdownTable); + } + } + return content; +} + +function test() { + let data = fs.readFileSync(path.join(__dirname, "../bak/txn-how.md"), "utf8"); + data = fix(data); + fs.writeFileSync(path.join(__dirname, "../bak/txn-how-fixed.md"), data); +} + +// test(); + +module.exports = fix; diff --git a/site2/website-next/migrate/tool/fix-tip-note-in-list.js b/site2/website-next/migrate/tool/fix-tip-note-in-list.js new file mode 100644 index 0000000..81a3cba --- /dev/null +++ b/site2/website-next/migrate/tool/fix-tip-note-in-list.js @@ -0,0 +1,27 @@ +module.exports = (data) => { + let nData = data; + let block = null; + + let uListReg = /^([\*-][\t ]+.*)\n+((\n*[\t ]+.*)*)*/gm; + + while ((block = uListReg.exec(data))) { + let content = block[2]; + if (!content) { + continue; + } + let nContent = content.replace(/^ (?= *)/gm, " "); + nData = nData.replace(content, nContent); + } + + let listReg = /^(\d+\.[\t ]+.*)\n+((\n*[\t ]+.*)*)*/gm; + while ((block = listReg.exec(data))) { + let content = block[2]; + if (!content) { + continue; + } + let nContent = content.replace(/^ (?= *)/gm, " "); + nData = nData.replace(content, nContent); + } + + return nData; +}; diff --git a/site2/website-next/migrate/tool/fix-tip-note.js b/site2/website-next/migrate/tool/fix-tip-note.js new file mode 100644 index 0000000..6becf1a --- /dev/null +++ b/site2/website-next/migrate/tool/fix-tip-note.js @@ -0,0 +1,81 @@ +const fs = require("fs"); +const path = require("path"); + +function fixTip(data) { + const _reg = + /^([\t ]*)>[\t ]*#*[\t ]*\**(Note|Tip)+s?:?\**[\t ]*\n(([\t ]*)>[\t ]*[^><].*\n)+/gm; + const _type_reg = /#*[\t ]*\**(Note|Tip)+s?:?\**[\t ]*/i; + + let type = "note"; + let _tips = data.match(_reg); + if (!_tips) { + return data; + } + for (let _tip of _tips) { + let tip = _tip.replace(/^[ ]>/gm, ">").replace(/^([\t ]*>)[\t ]*/gm, "$1"); + let type_match = _type_reg.exec(tip); + if (type_match) { + type = type_match[1] + ""; + type = type.toLowerCase(); + } + let space = /^([\t ]*)>/.exec(tip)[1]; + // if (space.length % 2 == 1) { + // space = space.substr(1); + // } + tip = tip + .replace(_type_reg, "") + .replace(/^([\t ]*)>[\t ]*/gm, space) + .replace(/^\s*\n/gm, ""); + tip = space + ":::" + type + "\n\n" + tip + "\n" + space + ":::\n"; + data = data.replace(_tip, tip); + } + return data + .replace( + /(.*)(\s*\n){3,}(\s*:::.*)((((?!:::).)*\n*)+):::.*(\s*\n)+/g, + "$1\n\n$3$4:::\n\n" + ) //解决多个空行 + .replace(/(\s*:::.*(((?!:::).)*\n*)+):::.*\n+/g, "$1:::\n\n"); //解决多个空行 //解决代码块结束标识符后无空行 +} + +// function fixListWithTip(data) { +// const _reg = /^([*-]\s+.*)([\s\S]*?)(:::[\s\S]*?:::)/gm; +// let _match = data.match(_reg); +// if (!_match) { +// return data; +// } +// for (let _m of _match) { +// let __m = _m.match(/^([*-]\s+.*)([\s\S]*?)(:::[\s\S]*?:::)/m); +// let top = __m[1]; +// let seconds = __m[2]; +// let tip = __m[3]; +// // seconds = seconds.replace(/^([\t ]*)(\w+)/gm, "$1* $2"); +// tip = tip.replace(/^[\t ]+/gm, ""); +// data = data +// .replace(_m, top + seconds + "\n" + tip) +// .replace(/(\s*\n){3,}:::/g, "\n\n:::") +// .replace(/:::(\s*\n){3,}/g, ":::\n\n"); +// } +// return data; +// } + +function fix(data) { + data = fixTip(data); + // data = fixListWithTip(data); + return data; +} + +function test() { + let data = fs.readFileSync( + path.join(__dirname, "../bak/tiered-storage-overview.md"), + "utf8" + ); + data = fix(data); + fs.writeFileSync( + path.join(__dirname, "../bak/tiered-storage-overview-fixed.md"), + data + ); +} + +// test(); + +module.exports = fix;
