| const { visit } = require('unist-util-visit'); |
| |
| function getFirstBoldContent(str, startIdx = 0) { |
| const strArr = str.split(''); |
| for (let i = startIdx; i < strArr.length; i++) { |
| if (strArr[i - 1] !== '*' && strArr[i] === '*' && strArr[i + 1] === '*' && strArr[i + 2] !== '*') { |
| // start with ** |
| let j; |
| for (j = i + 2; j < strArr.length; j++) { |
| if (strArr[j - 1] !== '*' && strArr[j] === '*' && strArr[j + 1] === '*' && strArr[j + 2] !== '*') { |
| // end with ** |
| return { |
| start: i, |
| end: j, |
| }; |
| } |
| } |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * @description |
| * |
| * A plugin to handle the problem that bold formatting is not effective |
| * |
| * Tip: if the plugin source code does not take effect after modification, it may need to be rebuilt. |
| */ |
| const plugin = options => { |
| const transformer = async (ast, file) => { |
| visit(ast, 'text', (node, index, parent) => { |
| if (getFirstBoldContent(node.value)) { |
| const { start, end } = getFirstBoldContent(node.value); |
| const value = node.value.slice(start + 2, end); |
| parent.children[index] = { |
| type: 'strong', |
| children: [ |
| { |
| value: value, |
| type: 'text', |
| }, |
| ], |
| }; |
| const [boldBefore, , boldAfter] = node.value.split('**'); |
| let hasBoldBefore = !!boldBefore; |
| if (boldBefore) { |
| parent.children.splice(index, 0, { |
| type: 'text', |
| value: boldBefore, |
| }); |
| } |
| if (boldAfter) { |
| parent.children.splice(hasBoldBefore ? index + 2 : index + 1, 0, { |
| type: 'text', |
| value: boldAfter, |
| }); |
| } |
| console.warn( |
| `[WARNING] The bold syntax of "${value}" in "${file.path}" is invalid and is being automatically optimized`, |
| ); |
| } else if (/(?<!\*)\*\*(?!\*)/.test(node.value)) { |
| // When there are multiple bold syntax in the text that does not take effect, you need to modify it manually |
| // For example: aa**test1:**bb**test2:**cc will be rendered as aa**test1:<strong>bb</strong>test2:**cc |
| console.warn( |
| `[WARNING] markdownBoldPlugin found a ** in the text node (${node.value}) of the file ${file.path}, which may cause the document to not render as expected`, |
| ); |
| } |
| }); |
| }; |
| return transformer; |
| }; |
| |
| module.exports = { |
| markdownBoldPlugin: plugin, |
| }; |