为了解决从pdf等格式的中文文献中复制粘贴常会出现的一些问题:
- 数字、字母等非中文字符变成全角字符
- 产生多余的空格、换行
- 中、英文标点(全、半角)混乱
- 英文上下文中的标点后缺空格
已有一些现有思路,例如利用quicker和打包成GUI界面的软件。由于我使用MacOS和Vim编辑器,为了方便起见,可以利用现有的python脚本在改为vim的插件。
主要需要实现的点是python与vim的交互,可以使用vim.eval('@+')
读取寄存器作为参数,输出结果到当前buffer即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| python3 << EOF
""" 为了解决从pdf等格式的中文文献中复制粘贴常会出现的一些问题: - 数字、字母等非中文字符变成全角字符 - 产生多余的空格、换行 - 中、英文标点(全、半角)混乱 - 英文上下文中的标点后缺空格 未解决: - 括号等依赖上下文判断全、半角的标点未识别 - 仅支持中英文文献
@python version author: Mo Dabao @modified by Sam """
import vim
ENDSIGN = set(".:;!?。:;!?")
HALFPUNCTUATION = set(",:;!?")
SPACESIGN = set("abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ",.:;!?\"')]}")
HALFPUNCTUATIONSIGN = set("abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789\"')]}")
FULLPUNCTUATION = set(",。:;!?")
NUMBER = set("0123456789")
text_old = vim.eval('@+') def organize(): """整理从文献中复制出来的文本。
- 删除多余的空白符(换行、空格、制表等) - 英文、数字、部分标点符号的全角字符换成半角字符 - 修正误判为中文标点(,;:!?)的英文标点字符 - 英文标点后确保一个空格 注意:所有括号都处理为半角
Args: text_old: 从文献中复制出来的文本。
Returns: text_new: 整理之后的文本。 """ text_new = [] for char in text_old: char_unicode = ord(char) if char == '\n': if text_new and text_new[-1] in ENDSIGN: text_new.append(char) elif text_new and text_new[-1] in SPACESIGN: text_new.append(' ') elif char.isspace(): if text_new and text_new[-1] in SPACESIGN: text_new.append(' ') elif 65281 <= char_unicode <= 65374: if char == "~": text_new.append(char) elif char in FULLPUNCTUATION: if text_new and text_new[-1] in HALFPUNCTUATIONSIGN: text_new.append(chr(char_unicode - 65248)) text_new.append(' ') else: text_new.append(char) else: text_new.append(chr(char_unicode - 65248)) elif char in HALFPUNCTUATIONSIGN: text_new.append(char) elif char in HALFPUNCTUATION: if text_new and text_new[-1] not in HALFPUNCTUATIONSIGN: text_new.append(chr(char_unicode + 65248)) else: text_new.append(char) text_new.append(' ') else: if text_new and text_new[-1] == ' ': del text_new[-1] if text_new[-1] in HALFPUNCTUATION: text_new[-1] = chr(ord(text_new[-1]) + 65248) text_new.append(char) text_new = ''.join(text_new) vim.current.buffer.append(text_new) return text_new EOF
exec('py3 organize()')
|
在init.vim
中map该任务为PDF,使用:PDF
命令即可读取+
寄存器作为python脚本的参数,并将结果输入buffer了
1
| command! -nargs=0 PDF source ~/.vim/pack/pdf.vim
|