diff --git a/src/printer-markdown.js b/src/printer-markdown.js index 66e441452..e79228d46 100644 --- a/src/printer-markdown.js +++ b/src/printer-markdown.js @@ -11,14 +11,9 @@ const fill = docBuilders.fill; const align = docBuilders.align; const docPrinter = require("./doc-printer"); const printDocToString = docPrinter.printDocToString; -const escapeStringRegexp = require("escape-string-regexp"); +const asciiPunctuationPattern = util.asciiPunctuationPattern; const getCjkRegex = require("cjk-regex"); -// http://spec.commonmark.org/0.25/#ascii-punctuation-character -const asciiPunctuationPattern = escapeStringRegexp( - "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" -); - const punctuationPattern = `(?:${[ getCjkRegex.punctuations().source, `[${asciiPunctuationPattern}]` diff --git a/src/util.js b/src/util.js index e3558cb67..7764e1b63 100644 --- a/src/util.js +++ b/src/util.js @@ -11,6 +11,11 @@ const cjkRegex = getCjkRegex(); // https://stackoverflow.com/a/21373261 const cjkPunctuationRegex = new RegExp(getCjkRegex.punctuations().source, ""); +// http://spec.commonmark.org/0.25/#ascii-punctuation-character +const asciiPunctuationPattern = escapeStringRegexp( + "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~" +); + function isExportDeclaration(node) { if (node) { switch (node.type) { @@ -721,7 +726,14 @@ function splitText(text) { function appendNode(node) { const lastNode = nodes[nodes.length - 1]; if (lastNode && lastNode.type === "word") { - if (isBetween(KIND_NON_CJK, KIND_CJK_CHARACTER)) { + if ( + (lastNode.kind === KIND_NON_CJK && + node.kind === KIND_CJK_CHARACTER && + !new RegExp(`[${asciiPunctuationPattern}]$`).test(lastNode.value)) || + (lastNode.kind === KIND_CJK_CHARACTER && + node.kind === KIND_NON_CJK && + !new RegExp(`^[${asciiPunctuationPattern}]`).test(node.value)) + ) { nodes.push({ type: "whitespace", value: " " }); } else if ( !isBetween(KIND_NON_CJK, KIND_CJK_PUNCTUATION) && @@ -754,6 +766,7 @@ function getStringWidth(text) { } module.exports = { + asciiPunctuationPattern, getStringWidth, splitText, mapDoc, diff --git a/tests/markdown_paragraph/__snapshots__/jsfmt.spec.js.snap b/tests/markdown_paragraph/__snapshots__/jsfmt.spec.js.snap index 7de9c9d16..c5bf39b43 100644 --- a/tests/markdown_paragraph/__snapshots__/jsfmt.spec.js.snap +++ b/tests/markdown_paragraph/__snapshots__/jsfmt.spec.js.snap @@ -7,6 +7,8 @@ exports[`cjk.md 1`] = ` 全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白 +This ia an english paragraph with a CJK quote "中文". + 扩展运算符(spread)是三个点(\`...\`)。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 這是一段很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長 @@ -26,6 +28,8 @@ English 混合著中文的一段 Paragraph! 全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白 全  形 空白全  形 空白全  形 空白 +This ia an english paragraph with a CJK quote "中文". + 扩展运算符(spread)是三个点(\`...\`)。 `; @@ -37,6 +41,8 @@ exports[`cjk.md 2`] = ` 全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白 +This ia an english paragraph with a CJK quote "中文". + 扩展运算符(spread)是三个点(\`...\`)。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 這是一段很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長的段落 @@ -45,6 +51,8 @@ exports[`cjk.md 2`] = ` 全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白 +This ia an english paragraph with a CJK quote "中文". + 扩展运算符(spread)是三个点(\`...\`)。 `; diff --git a/tests/markdown_paragraph/cjk.md b/tests/markdown_paragraph/cjk.md index 290d0f299..2cc6927ea 100644 --- a/tests/markdown_paragraph/cjk.md +++ b/tests/markdown_paragraph/cjk.md @@ -4,4 +4,6 @@ 全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白全  形 空白 +This ia an english paragraph with a CJK quote "中文". + 扩展运算符(spread)是三个点(`...`)。 diff --git a/tests/markdown_word/__snapshots__/jsfmt.spec.js.snap b/tests/markdown_word/__snapshots__/jsfmt.spec.js.snap index a9d669bfd..9844cd1f5 100644 --- a/tests/markdown_word/__snapshots__/jsfmt.spec.js.snap +++ b/tests/markdown_word/__snapshots__/jsfmt.spec.js.snap @@ -35,6 +35,6 @@ asd & asd „ 123 123 _ 123 _ 123 -## 类的 prototype 属性和 \\_\\_proto\\_\\_ 属性 +## 类的 prototype 属性和\\_\\_proto\\_\\_属性 `;