Created
March 5, 2012 10:45
-
-
Save isann/1977836 to your computer and use it in GitHub Desktop.
(sphinx用)create_table.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! c:/Python27/python.exe | |
# -*- coding: utf-8 -*- | |
""" | |
未完成 | |
2012.03.05 セル内改行に対応しましたが、sphinxがあまり長いテーブルに対応していないっぽいorz | |
2012.03.05 各列の長さによって長さを可変するようにした | |
2012.03.07 ダブルクォーテーション周りでエラーになっていたのを修正。 | |
2012.06.19 wxPythonやめてcsvモジュールを使用するよう処理を修正。 | |
""" | |
from StringIO import StringIO | |
import codecs | |
import csv | |
import win32clipboard | |
import win32con | |
__author__ = 'isann' | |
def conv_decoding(data): | |
""" | |
stringをunicodeへ変換する | |
@param ``data'' str object. | |
@return unicode object. | |
@return encoding. | |
""" | |
lookup = ('utf_8', 'euc_jp', 'euc_jis_2004', 'euc_jisx0213', | |
'shift_jis', 'shift_jis_2004', 'shift_jisx0213', | |
'iso2022jp', 'iso2022_jp_1', 'iso2022_jp_2', 'iso2022_jp_3', | |
'iso2022_jp_ext', 'latin_1', 'ascii') | |
encoding = '' | |
for encoding in lookup: | |
try: | |
data = data.decode(encoding) | |
break | |
except: | |
pass | |
return data | |
def multi_byte_count(moji): | |
u = u'' | |
for c in conv_decoding(moji): | |
if ord(c) > 255: | |
u += c | |
return len(u) | |
def filler(moji, fill, maxsize, start, end): | |
""" | |
引数mojiをfillでmaxsizeまで埋めます。 | |
startとendが指定されている場合、それぞれ最初と最後の文字になります。 | |
@param moji str object. | |
@param fill str object. only ascii char. | |
@param maxsize int object. | |
@param start str object. only ascii char. | |
@param end str object. only ascii char. | |
@return str object. | |
""" | |
mbc = multi_byte_count(moji) | |
abc = len(conv_decoding(moji)) - mbc | |
ret = start + moji | |
char_count = len(conv_decoding(start)) | |
char_count += (mbc * 2) + abc | |
loopcnt = 1 | |
while char_count < maxsize: | |
if char_count == maxsize - 1: | |
if end == '': | |
ret = ret + fill | |
else: | |
ret = ret + end | |
char_count += 1 | |
else: | |
ret = ret + fill | |
char_count += len(conv_decoding(fill)) | |
loopcnt += 1 | |
return ret | |
def text_analyze(s): | |
maxsize_list = [] | |
column_size = 0 | |
space = 10 | |
csv_reader = csv.reader(StringIO(s), delimiter='\t', quotechar='"') | |
loop_count = 0 | |
for row in csv_reader: | |
# 列数 | |
if loop_count is 0: | |
for elem in row: | |
maxsize_list.append(0) | |
column_size += 1 | |
# カラム内の文字数 | |
column_number = 0 | |
for elem in row: | |
mbc = multi_byte_count(elem) | |
abc = len(conv_decoding(elem)) - mbc | |
if (mbc * 2) + abc + space > maxsize_list[column_number]: | |
maxsize_list[column_number] = (mbc * 2) + abc + space | |
column_number += 1 | |
loop_count += 1 | |
return maxsize_list | |
def create(maxsize_list, s): | |
csv_reader = csv.reader(StringIO(s), delimiter='\t', quotechar='"') | |
ret = '' | |
loop_count = 0 | |
for row in csv_reader: | |
if loop_count is 0: | |
for i in range(0, len(maxsize_list)): | |
# 1行目 | |
if i == len(maxsize_list) - 1: | |
ret += filler('', '-', maxsize_list[i], '+', '+') | |
else: | |
ret += filler('', '-', maxsize_list[i], '+', '') | |
ret += '\n' | |
for i in range(0, len(maxsize_list)): | |
# 2行目 | |
if i == len(maxsize_list) - 1: | |
ret += filler(row[i].replace('\n', '').replace('\r', ''), ' ', maxsize_list[i], '|', '|') | |
else: | |
ret += filler(row[i].replace('\n', '').replace('\r', ''), ' ', maxsize_list[i], '|', '') | |
ret += '\n' | |
for i in range(0, len(maxsize_list)): | |
# 3行目 | |
if i == len(maxsize_list) - 1: | |
ret += filler('', '=', maxsize_list[i], '+', '+') | |
else: | |
ret += filler('', '=', maxsize_list[i], '+', '') | |
ret += '\n' | |
else: | |
for i in range(0, len(maxsize_list)): | |
# N行目(3 < N) | |
if i == len(maxsize_list) - 1: | |
ret += filler(row[i].replace('\n', '').replace('\r', ''), ' ', maxsize_list[i], '|', '|') | |
else: | |
ret += filler(row[i].replace('\n', '').replace('\r', ''), ' ', maxsize_list[i], '|', '') | |
ret += '\n' | |
for i in range(0, len(maxsize_list)): | |
# N+1行目(3 < N) | |
if i == len(maxsize_list) - 1: | |
ret += filler('', '-', maxsize_list[i], '+', '+') | |
else: | |
ret += filler('', '-', maxsize_list[i], '+', '') | |
ret += '\n' | |
loop_count += 1 | |
return ret | |
def main(u): | |
""" | |
input.txtはexcelそのままのタブ区切り文字列。 | |
utf-8, LFのTSVフォーマット。 | |
""" | |
maxsize_list = text_analyze(u.encode('utf_8')) | |
renketu = create(maxsize_list, u.encode('utf_8')) | |
return renketu | |
def get_text_clipboard(): | |
win32clipboard.OpenClipboard() | |
text = win32clipboard.GetClipboardData(win32con.CF_UNICODETEXT) | |
win32clipboard.CloseClipboard() | |
return text | |
def set_text_clipboard(text): | |
win32clipboard.OpenClipboard() | |
win32clipboard.SetClipboardText(text) | |
win32clipboard.CloseClipboard() | |
if __name__ == "__main__": | |
text = get_text_clipboard() | |
text = main(text) | |
text = codecs.encode(conv_decoding(text), "sjis") # Windows7のクリップボードはSHIFT-JISじゃないと文字化けしちゃう | |
set_text_clipboard(text) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment