diff --git a/formatUtil.ts b/formatUtil.ts index eb620b9..64d098a 100644 --- a/formatUtil.ts +++ b/formatUtil.ts @@ -1,208 +1,247 @@ export default { - condenseContent(content: string): string { - // 将 制表符 改成 四个空格 - content = content.replace(/\t/g, " "); - - // 删除超过2个的回车 - // Unix 的只有 LF,Windows 的需要 CR LF - content = content.replace(/(\n){3,}/g, "$1$1"); - content = content.replace(/(\r\n){3,}/g, "$1$1"); - return content; - }, - deleteSpaces(content: string): string { - // 去掉「`()[]{}<>'"`」: 前后多余的空格 - content = content.replace(/\s+([\(\)\[\]\{\}<>'":])\s+/g, ' $1 '); - - // 去掉连续括号增加的空格,例如:「` ( [ { < > } ] ) `」 - content = content.replace(/([<\(\{\[])\s([<\(\{\[])\s/g, "$1$2 "); - content = content.replace(/([<\(\{\[])\s([<\(\{\[])\s/g, "$1$2 "); - content = content.replace(/([<\(\{\[])\s([<\(\{\[])\s/g, "$1$2 "); - content = content.replace(/([<\(\{\[])\s([<\(\{\[])\s/g, "$1$2 "); - content = content.replace(/\s([>\)\]\}])\s([>\)\]\}])/g, " $1$2"); - content = content.replace(/\s([>\)\]\}])\s([>\)\]\}])/g, " $1$2"); - content = content.replace(/\s([>\)\]\}])\s([>\)\]\}])/g, " $1$2"); - content = content.replace(/\s([>\)\]\}])\s([>\)\]\}])/g, " $1$2"); - - // 去掉 「`$ () $`」, 「`$ [] $`」, 「`$ {} $`」 里面增加的空格 - // 去掉开始 $ 后面增加的空格,结束 $ 前面增加的空格 - // 去掉包裹代码的符号里面增加的空格 - // 去掉开始 ` 后面增加的空格,结束 ` 前面增加的空格 - content = content.replace(/([`\$])\s*([<\(\[\{])([^\$]*)\s*([`\$])/g, "$1$2$3$4"); - content = content.replace(/([`\$])\s*([^\$]*)([>\)\]\}])\s*([`\$])/g, "$1$2$3$4"); - - // 去掉「`) _`」、「`) ^`」增加的空格 - content = content.replace(/\)\s([_\^])/g, ")$1"); - - // 去掉 [^footnote,2002] 中的空格 - content = content.replace(/\[\s*\^([^\]\s]*)\s*\]/g, "[^$1]"); - - // 将链接的格式中文括号“[]()”改成英文括号“[]()”,去掉增加的空格 - content = content.replace(/\s*\[\s*([^\]]+)\s*\]\s*[((]\s*([^\s\)]*)\s*[))]\s*/g, " [$1]($2) "); - - // 将图片链接的格式中的多余空格“! []()”去掉,变成“![]()” - content = content.replace(/!\s*\[\s*([^\]]+)\s*\]\s*[((]\s*([^\s\)]*)\s*[))]\s*/g, "![$1]($2) "); - - // 将网络地址中“ : // ”符号改成“://” - content = content.replace(/\s*:\s*\/\s*\/\s*/g, "://"); - - // 去掉行末空格 - content = content.replace(/(\S*)\s*$/g, '$1'); - - // 去掉「123 °」和 「15 %」中的空格 - content = content.replace(/([0-9])\s*([°%])/g, '$1$2'); - - // 去掉 2020 - 04 - 20, 08 : 00 : 00 这种日期时间表示的数字内的空格 - content = content.replace(/([0-9])\s*-\s*([0-9])/g, "$1-$2"); - content = content.replace(/([0-9])\s*:\s*([0-9])/g, "$1:$2"); - - // 去掉 1 , 234 , 567 这种千分位表示的数字内的空格 - content = content.replace(/([0-9])\s*,\s*([0-9])/g, "$1,$2"); - - // 全角標點與其他字符之間不加空格 - // 将无序列表的-后面的空格保留 - // 将有序列表的-后面的空格保留 - content = content.replace(/^(?'"`」: 前后多余的空格 + content = content.replace(/\s+([\(\)\[\]\{\}<>'":])\s+/g, ' $1 '); + + // 去掉连续括号增加的空格,例如:「` ( [ { < > } ] ) `」 + content = content.replace(/([<\(\{\[])\s([<\(\{\[])\s/g, '$1$2 '); + content = content.replace(/([<\(\{\[])\s([<\(\{\[])\s/g, '$1$2 '); + content = content.replace(/([<\(\{\[])\s([<\(\{\[])\s/g, '$1$2 '); + content = content.replace(/([<\(\{\[])\s([<\(\{\[])\s/g, '$1$2 '); + content = content.replace(/\s([>\)\]\}])\s([>\)\]\}])/g, ' $1$2'); + content = content.replace(/\s([>\)\]\}])\s([>\)\]\}])/g, ' $1$2'); + content = content.replace(/\s([>\)\]\}])\s([>\)\]\}])/g, ' $1$2'); + content = content.replace(/\s([>\)\]\}])\s([>\)\]\}])/g, ' $1$2'); + + // 去掉 「`$ () $`」, 「`$ [] $`」, 「`$ {} $`」 里面增加的空格 + // 去掉开始 $ 后面增加的空格,结束 $ 前面增加的空格 + // 去掉包裹代码的符号里面增加的空格 + // 去掉开始 ` 后面增加的空格,结束 ` 前面增加的空格 + content = content.replace(/([`\$])\s*([<\(\[\{])([^\$]*)\s*([`\$])/g, '$1$2$3$4'); + content = content.replace(/([`\$])\s*([^\$]*)([>\)\]\}])\s*([`\$])/g, '$1$2$3$4'); + + // 去掉「`) _`」、「`) ^`」增加的空格 + content = content.replace(/\)\s([_\^])/g, ')$1'); + + // 去掉 [^footnote,2002] 中的空格 + content = content.replace(/\[\s*\^([^\]\s]*)\s*\]/g, '[^$1]'); + + // 将链接的格式中文括号“[]()”改成英文括号“[]()”,去掉增加的空格 + content = content.replace(/\s*\[\s*([^\]]+)\s*\]\s*[((]\s*([^\s\)]*)\s*[))]\s*/g, ' [$1]($2) '); + + // 将图片链接的格式中的多余空格“! []()”去掉,变成“![]()” + content = content.replace(/!\s*\[\s*([^\]]+)\s*\]\s*[((]\s*([^\s\)]*)\s*[))]\s*/g, '![$1]($2) '); + + // 将网络地址中“ : // ”符号改成“://” + content = content.replace(/\s*:\s*\/\s*\/\s*/g, '://'); + + // 去掉行末空格 + content = content.replace(/(\S*)\s*$/g, '$1'); + + // 去掉「123 °」和 「15 %」中的空格 + content = content.replace(/([0-9])\s*([°%])/g, '$1$2'); + + // 去掉 2020 - 04 - 20, 08 : 00 : 00 这种日期时间表示的数字内的空格 + content = content.replace(/([0-9])\s*-\s*([0-9])/g, '$1-$2'); + content = content.replace(/([0-9])\s*:\s*([0-9])/g, '$1:$2'); + + // 去掉 1 , 234 , 567 这种千分位表示的数字内的空格 + content = content.replace(/([0-9])\s*,\s*([0-9])/g, '$1,$2'); + + // 全角標點與其他字符之間不加空格 + // 将无序列表的-后面的空格保留 + // 将有序列表的-后面的空格保留 + content = content.replace(/^(? { + // 中文内部使用全角标点 + // line = formatUtil.replacePunctuations(line); + + // 删除多余的空格 + line = this.deleteSpaces(line); + + // 插入必要的空格 + line = this.insertSpace(line); + + // 将有编号列表的“1. ”改成 “1. ” + line = line.replace(/^(\s*)(\d\.)\s+(\S)/, '$1$2 $3'); + + // 将无编号列表的“* ”改成 “- ” + // 将无编号列表的“- ”改成 “- ” + line = line.replace(/^(\s*)[-\*]\s+(\S)/, '$1- $2'); + + return line; + }) + .join('\n'); + + // 结束文档整理前再删除最后一个回车 + content = content.replace(/(\n){2,}$/g, '$1'); + content = content.replace(/(\r\n){2,}$/g, '$1'); + return content; + }, +}; diff --git a/main.ts b/main.ts index 92084f1..f581e85 100644 --- a/main.ts +++ b/main.ts @@ -13,49 +13,23 @@ export default class MyPlugin extends Plugin { settings: MyPluginSettings; format(cm: CodeMirror.Editor): void { - const cursor = cm.getCursor(); - let content = cm.getValue().trim(); - - content = content + '\n\n'; - - // 替换所有的全角数字为半角数字 - content = formatUtil.replaceFullNumbers(content); - - // 替换所有的全角英文和@标点 为 半角的英文和@标点 - content = formatUtil.replaceFullChars(content); - - // 删除多余的内容(回车) - content = formatUtil.condenseContent(content); - - // 每行操作 - content = content - .split('\n') - .map((line: string) => { - // 中文内部使用全角标点 - // line = formatUtil.replacePunctuations(line); + let cursor = cm.getCursor(); + let cursorContent = cm.getRange({ ...cursor, ch: 0 }, cursor); - // 删除多余的空格 - line = formatUtil.deleteSpaces(line); + cursorContent = formatUtil.formatContent(cursorContent); - // 插入必要的空格 - line = formatUtil.insertSpace(line); - - // 将有编号列表的“1. ”改成 “1. ” - line = line.replace(/^(\s*)(\d\.)\s+(\S)/, '$1$2 $3'); - - // 将无编号列表的“* ”改成 “- ” - // 将无编号列表的“- ”改成 “- ” - line = line.replace(/^(\s*)[-\*]\s+(\S)/, '$1- $2'); + let content = cm.getValue().trim(); + content = content + '\n\n'; + content = formatUtil.formatContent(content); - return line; - }) - .join('\n'); + cm.setValue(content); - // 结束文档整理前再删除最后一个回车 - content = content.replace(/(\n){2,}$/g, '$1'); - content = content.replace(/(\r\n){2,}$/g, '$1'); + // 保持光标格式化后不变 + const newDocLine = cm.getLine(cursor.line); + try { + cursor = { ...cursor, ch: newDocLine.indexOf(cursorContent) + cursorContent.length }; + } catch (error) {} - cm.setValue(content); cm.setCursor(cursor); } diff --git a/package.json b/package.json index 79b3969..ad2edf4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-pangu", - "version": "1.2.0", + "version": "1.2.1", "description": "A small plugin aims to add space between Chinese Characters and English Alphabet, and it is a boon for typographically compulsive people. ", "main": "main.js", "scripts": {