#!/usr/bin/env python3 import sys, os, argparse # 古书竖排文字转换器 def convert(fname, width, height, tblTemplet, zh): with open(fname, 'r') as f: s = '\n'.join([x.rstrip() for x in f.readlines()]) if len(s) == 0: sys.exit("请首先输入要转换格式的文字。") if zh: [dic_TW,dic_HK,dic_CN] = mdic() if zh == 1: s = conv(s,dic_TW) elif zh == 2: s = conv(s,dic_HK) else: s = conv(s,dic_CN) ary = [['' for j in range(height + 2)] for i in range(width * 2 + 1)] index = 0 t = '' while (index < len(s)): for i in range(width * 2, -1, -1): for j in range(0, height + 2): if i == (width * 2): if j == 0: ary[i][j] = tblChars[tblTemplet][1] elif j == (height + 1): ary[i][j] = tblChars[tblTemplet][3] else: ary[i][j] = tblChars[tblTemplet][6] elif i == 0: if j == 0: ary[i][j] = tblChars[tblTemplet][0] elif j == (height + 1): ary[i][j] = tblChars[tblTemplet][2] else: ary[i][j] = tblChars[tblTemplet][6] elif i % 2 == 0: if j == 0: ary[i][j] = tblChars[tblTemplet][4] elif j == (height + 1): ary[i][j] = tblChars[tblTemplet][5] else: ary[i][j] = tblChars[tblTemplet][7] elif j == 0 or j == (height + 1): ary[i][j] = tblChars[tblTemplet][8] else: c = getChar(s, index) if c == '\n': # if j == 1: # j = 0 # continue while j < (height + 1): ary[i][j] = blankChar j += 1 j = height else: ary[i][j] = c index += 1 for j in range(0, height + 2): for i in range(0, width * 2 + 1): t += ary[i][j] t += "\r\n" t += "\r\n" # return t blankChar = ' ' tblChars = [['┏','┓','┗','┛','┯','┷','┃','│', '━'], ['╔','╗','╚','╝','╤','╧','║','│', '═'], ['┌','┐','└','┘','┬','┴','│','┆', '─'], [' ',' ',' ',' ',' ',' ',' ',' ', ' ']] half = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','(',')','[',']','{','}','<','>','*','&','^','%','$','#','@','!','~','`','+','-','=','_','|','\\','\'','"',';',':','.',',','?','/',' ','(',')','【','】','《','》', '…', '—'] full = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','︵','︶','︻','︼','︷','︸','︽','︾','*','&','︿','%','$','#','@','!','~','`','+','-','=','_','|','\',''','"',';',':','。',',','?','/', blankChar,'︵','︶','︻','︼','︽','︾', '┇', '│'] def getChar(s, index): if index >= len(s): return blankChar c = s[index] for i in range(len(half)): if c == half[i]: c = full[i] return c # 繁简中文转换 # 最大正向匹配 def conv(string,dic): i = 0 while i < len(string): for j in range(len(string) - i, 0, -1): if string[i:][:j] in dic: t = dic[string[i:][:j]] string = string[:i] + t + string[i:][j:] i += len(t) - 1 break i += 1 return string # 繁简中文转换 # 生成转换字典 def mdic(): if not os.path.exists('ZhConversion.php'): try: download("http://svn.wikimedia.org/svnroot/mediawiki/trunk/phase3/includes/ZhConversion.php") except Exception as e: sys.exit('Cannot find or download "ZhConversion.php" :' + e) with open('ZhConversion.php','r') as f: table = f.readlines() dic = dict() name = [] for line in table: if line[0] == '$': #print line.split()[0][1:] name.append(dic) dic = dict() if line[0] == "'": word = line.split("'") dic[word[1]] = word[3] name[3].update(name[1]) # 简繁通用转换规则(zh2Hant)加上台湾区域用法(zh2TW) name[4].update(name[1]) # 简繁通用转换规则(zh2Hant)加上香港区域用法(zh2HK) name[5].update(name[2]) # 繁简通用转换规则(zh2Hans)加上大陆区域用法(zh2CN) return name[3],name[4],name[5] # 下载 def download(URL, dest_dir = None): import urllib.parse import urllib.request filename = os.path.split(urllib.parse.urlsplit(URL).path)[-1] dest = os.path.join(dest_dir if dest_dir else './', filename) sys.stderr.write('Downloading ' + filename + ' ...\n') try: urllib.request.URLopener().open(URL) except IOError as error_code: if error_code[1] == 404: raise RuntimeError('ERROR 404: URL Not Found.') else: raise RuntimeError('Unknown error has happend: {}'.format(error_code[1])) else: urllib.request.urlretrieve(URL, dest, reporthook=None) if os.path.isfile(dest): sys.stderr.write('Download completed.\n') return dest else: raise RuntimeError('Failed to download {}'.format(URL)) if __name__ == '__main__': master_parser = argparse.ArgumentParser( description = '''此工具可以把普通横排文字转换为古典的竖排由右至左的方式显示,并且增加适当的线标,方便读者阅读。您可以在论坛、博客发言之前用这个工具把要发表的文章转化,然后再粘贴到要发表的论坛、博客上去。这样还可以有效的防止网站程序对某些词语的检索过滤,且不妨碍阅读。即弘扬中华古典文化,又增加趣味性。还不快试试。''', prog = 'oldstyle.py', fromfile_prefix_chars = '@', epilog = '''古书竖排文字转换器 http://www.u148.net/tool/oldstyle/ Python简繁转换 http://gerry.lamost.org/blog/?p=603''') master_parser.add_argument('filename', metavar = 'FILENAME', help='''您要转换的文章.txt''') master_parser.add_argument('-W','--width', type=int, default=18, help='''每页?竖行''') master_parser.add_argument('-H','--height', type=int, default=10, help='''每竖行?个字''') master_parser.add_argument('-T','--template', type=int, default=4, help='''1.粗实线+细实线;2.双实线+细实线;3.细实线+细虚线;4.无线框''') master_parser.add_argument('-Z','--zh_lang', type=int, default=0, help='''1.简繁通用转换规则(zh2Hant)加上台湾区域用法(zh2TW); 2.简繁通用转换规则(zh2Hant)加上香港区域用法(zh2HK); 3.繁简通用转换规则(zh2Hans)加上大陆区域用法(zh2CN)''') args = master_parser.parse_args() result = convert(args.filename, args.width, args.height, args.template-1, args.zh_lang) print(result)