经常用文本格式来看文章的人都会遇到这样一件事情, 就是把外部的表格复制过来后, 一般都不能很好的对齐. 一直以来, 我都是手动一行行一列列地把它们理整齐, 虽然费力, 但经手一遍后, 也算颇有收获. 但有时任务量实在是太大了, 总是在重复性的劳动, 让人不免大为光火. 今天终于灵机一动, 觉得用脚本应该也可以实现, 即使不能完全替代人工, 总可以省几分人力. 结果居然让我做成了, 虽然代码不复杂, 但成就感确实是满满的…
先展示一下效果吧:
具体使用方法如下:
我的编辑器用的是 editplus 软件, 它可以通过配置用户工具来加载外部的脚本, 可完成一些常见的任务, 这一块我就不再描述了, 有需要可以自己摸索一下.
下面贴一下我的处理脚本吧, 比较简单, 只是对常规的英文字符宽度计1, 然后其他字符宽度计2, 然后增加空格到指定位置就行了. 代码如下:
'''
将读取的表格内容格式化.
通过filter, 读取选择内容然后取代
'''
from sys import argv # 获取参数字符串
import sys # 标准输入输出
import re # 正则判断
def getUniWid(s):
"""获取unicode字符串的宽度"""
wid = 0
for ch in s:
if ord(ch) < 256:
wid += 1
else:
wid += 2
return wid
if __name__ == "__main__": # 主程序
if not argv[1]: # 没有选择块
exit()
else: # 有选择块时
with open(sys.stdin.fileno(), "rb", closefd=False) as fin:
with open(sys.stdout.fileno(), "wb", closefd=False) as fout:
while True:
line = fin.readline()
if not line: # 当没有输入时读入的是空字符串
break
sIn = line.decode('utf-8') # 固定采用uft8进行解码
sOut = ""
pos = 0
pattern = re.compile(r"\S {2,}\S")
while True:
m = pattern.search(sIn)
if m:
pos += 1
sOut += sIn[:m.start()+1]
sIn = sIn[m.end()-1:]
wid = (32*pos)-getUniWid(sOut)
if wid < 1:
wid = 4
sOut += " " * wid
else:
sOut += sIn
fout.write(sOut.encode(encoding="utf8"))
break