Skip to content

Instantly share code, notes, and snippets.

@isann
Created March 5, 2012 10:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save isann/1977836 to your computer and use it in GitHub Desktop.
Save isann/1977836 to your computer and use it in GitHub Desktop.
(sphinx用)create_table.py
#! 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