royone
1
ocr一本pdf书籍到obsidian里,标点之类的错误很多,空格也特别多,想要批量替换这些标点,和去除空格。
- 目前去除空格依靠 增强编辑插件 完成了。该插件有一键去除空格的命令。但是替换标点却不行。虽然该插件说明里有替换英文标点为中文标点的命令,但没有效果。
- Text format插件也有替换标点的命令,运行后一样没有效果。
- 然后也问了deepseek,ds反反复复让用quickadd加宏和js脚本来处理,但是最新版的quickadd 的宏不知道怎么用,老教程不管用。再次失败。
- 此后又使用了Regex pipeline,Regex regex-replace插件来定义批量替换,依旧失败。
- 到此已经没有办法了,求助有没有正确可用的替换标点的一键操作的方法,最好是替换的标点可自定义。
royone
4
linter用完了替换是不是就要关掉设置好的自定义替换,不然会误操作无需修改的文件。
啊,Easy Typing 记得可以全文格式化来着,可以删除/添加文字间的空格;
标点的话,如果是中英文标点区别直接 Ctrl+H 就可以批量替换吧。
royone
6
研究了两个晚上,ds写的代码不管用,用豆包写的代码,添加到quickadd里基本实现批量替换了,现在研究怎么快速执行该命令,老是调用命令窗口很费事
royone
8
这是转换英文标点为中文标点的脚本,在quickadd里添加一个marco,在user script 里载入这个js脚本就行了。对选中文本或整个文档都能执行该命令。对 ,;:()""--{}'' 这几种标点进行替换。没有对英文 .转换,怕出现差错。英文的双引号和单引号都只能成对替换,如果是单个 " 引号,替换不了,因为英文没有左右引号的区别,它无法智能的替换。如果有其他想替换的标点自己加进去就行了,照猫画虎,我都是这么干的。
让豆包改进了脚本,整体应用对表格会有影响,为免误操作,所以改成只对选中的文本有效,
仅对选中的文本进行转换标点
module.exports = async (params) => {
const { app, QuickAdd } = params;
const editor = app.workspace.activeEditor?.editor;
if (!editor) {
new Notice("请打开一个文档");
return;
}
// 只处理选中的文本,未选中则提示
const selection = editor.getSelection();
if (!selection) {
new Notice("请先选中需要处理的文本");
return;
}
// 定义替换规则:英文标点→中文标点(按顺序替换)
const replaceRules = [
[/,/g, ","], // 英文逗号→中文逗号
[/!/g, "!"], // 英文感叹号→中文感叹号
[/\?/g, "?"], // 英文问号→中文问号
[/:/g, ":"], // 英文冒号→中文冒号
[/;/g, ";"], // 英文分号→中文分号
[/\(/g, "("], // 英文左括号→中文左括号
[/\)/g, ")"], // 英文右括号→中文右括号
[/--/g, "——"], // 英文破折号→中文破折号
[/\{/g, "{"], // 英文左大括号→中文左大括号
[/\}/g, "}"], // 英文右大括号→中文右大括号
[/"([^"]*)"/g, "“$1”"], // 英文双引号→中文双引号(成对)
[/'([^']*)'/g, "‘$1’"], // 英文单引号→中文单引号(成对)
];
// 执行替换(仅处理选中的文本)
let result = selection;
replaceRules.forEach(([regex, replacement]) => {
result = result.replace(regex, replacement);
});
// 将处理后的文本替换回选中区域
editor.replaceSelection(result);
new Notice("标点转换完成!");
};
1 个赞
royone
9
这里是删除文本中的所有半角空格和不连续空格脚本。不连续空格是ocr的文本里出现的奇怪空格,好在豆包竟然知道怎么处理,但我放过了全角空格,全角空格我用在名人名言的引用处,所以选择不删除,如果想要全角空格也清除,可以让豆包给你加上。
因为会影响表格,导致有点不太正常,让豆包把代码改成只对选中的文本生效,避免误操作。
仅对选中的文本进行操作。
module.exports = async (params) => {
const { app } = params;
const editor = app.workspace.activeEditor?.editor;
if (!editor) {
new Notice("请打开一个文档");
return;
}
// 只处理选中的文本,未选中则提示
const selection = editor.getSelection();
if (!selection) {
new Notice("请先选中需要处理的文本");
return;
}
// 处理空格问题:
let result = selection
// 删除各种不间断空格
.replace(/[\u00A0\u202F\u2007\u2002\u2003\u2004\u2005\u2006\u2008\u2009\u200A]/g, '')
// 移除非英文单词之间的半角空格(仅保留英文单词间的空格)
.replace(/(?<![a-zA-Z]) (?![a-zA-Z])/g, '')
// 压缩英文单词间的连续空格为单个空格
.replace(/(?<=[a-zA-Z]) +(?=[a-zA-Z])/g, ' ');
// 将处理后的文本替换回选中区域
editor.replaceSelection(result);
new Notice("空格清理完成!");
};
2 个赞
royone
10
这个是转换1. 2. 3. 这样的数字列表为有序列表和 前面有一个圆点点的列表为无序列表脚本。
这个也改成了只对选中文本进行应用,以免误操作。
module.exports = async (params) => {
const { app } = params;
const editor = app.workspace.activeEditor?.editor;
if (!editor) {
new Notice("没有活跃的编辑器");
return;
}
// 只处理选中的文本,未选中则提示
const selection = editor.getSelection();
if (!selection) {
new Notice("请先选中需要处理的文本");
return;
}
// 处理选中文本
let content = selection
// 1. 处理有序列表(数字+点 → 保持数字. 格式)
.replace(/^(\d+)\.([^\s])/gm, '$1. $2') // 1.内容 → 1. 内容
.replace(/^(\d+)\s+\.([^\s])/gm, '$1. $2') // 1 .内容 → 1. 内容
.replace(/^(\d+)\.\s+/gm, '$1. '); // 1. 内容 → 1. 内容
// 2. 处理无序列表(各种圆点 → 转换为 - 格式)
content = content
// 匹配•、●、○等圆点,替换为-,并确保后面有空格
.replace(/^(•|●|○|▪|▫)\s*([^\s])/gm, '- $2') // •内容 → - 内容;● 内容 → - 内容
.replace(/^(•|●|○|▪|▫)\s+/gm, '- '); // • 内容 → - 内容
// 替换选中内容
editor.replaceSelection(content);
new Notice("已将选中文本转换为标准列表格式");
};
1 个赞
royone
11
豆包写的脚本,原本有一句 const { Notice } = window.obsidian;,运行后老是提示错误,我就删除了这句,似乎没有影响。 顺便请懂代码的大佬给看看,这三个脚本有没有错误的地方或可以改善规则的地方。