根据CSV文件自动形成表格的MoinMoin插件——InsertCSV

文章分类:Java编程 关键字: python moinmoin wiki plugin
MoinMoin本身的制表语法很简单,但是如果其他软件制作好的表格又重新录入一边,就不合算了。而这些软件大都可以导出CSV格式文件,所以如果能直接上传CSV文件,自动形成表格,将会非常方便省事。
本来想自己写一个这样的插件,结果不小心发现MacroMarket上已经有了,是一个叫ShowCSV宏插件。但是这个有点“土”,我稍微改进了一下,加入了一点背景色功能,使用语法也变了,所以干脆就叫InsertCSV(所有测试都在MoinMoin1.5.8中通过)。

Python代码
  1. """ 
  2.     MoinMoin - InsertCSV 
  3.  
  4.     This macro is used to insert csv data as wiki table 
  5.     @license: GNU GPL 
  6. """  
  7.   
  8. Dependencies = ['time'# do not cache  
  9.   
  10. import os, codecs, csv  
  11. from MoinMoin import config, wikiutil  
  12. from MoinMoin.action import AttachFile  
  13. # from MoinMoin.parser.text_moin_wiki import Parser  
  14. from MoinMoin.parser.wiki import Parser  
  15.   
  16. def utf_8_encoder(unicode_csv_data):  
  17.     for line in unicode_csv_data:  
  18.         yield line.encode('utf-8')  
  19.   
  20. def execute(macro, args):  
  21.     request = macro.request  
  22.     formatter = macro.formatter  
  23.   
  24.     if args:  
  25.         args = args.split(',')  
  26.         args = [arg.strip() for arg in args]  
  27.     else:  
  28.         args = []  
  29.   
  30.     argc = len(args)  
  31.     if argc == 0:  
  32.         csvfile = 'default.csv'  
  33.     else:  
  34.         csvfile = args[0]  
  35.   
  36.     if argc > 1:  
  37.         tcolor = str(args[1])  
  38.         title_bgcolor = '<%s>' % str(args[1])  
  39.     else:  
  40.         tcolor = ""  
  41.         title_bgcolor = ""  
  42.   
  43.     if argc > 2:  
  44.         ccolor = str(args[2])  
  45.         content_bgcolor = '<%s>' % str(args[2])  
  46.     else:  
  47.         ccolor = ""  
  48.         content_bgcolor = ""  
  49.   
  50.   
  51.     pagename = formatter.page.page_name  
  52.     attach_dir = AttachFile.getAttachDir(request, pagename)  
  53.     files = AttachFile._get_files(request, pagename)  
  54.   
  55.     if csvfile in files:  
  56.         if csvfile.lower().endswith('.csv'):  
  57.             file_id = codecs.open(os.path.join(attach_dir, csvfile), 'rb', config.charset)  
  58.             reader = csv.reader(utf_8_encoder(file_id))  
  59.             index = 0  
  60.             result = ""  
  61.             for row in reader:  
  62.                 if index == 0:  
  63.                     result += "||%s '''" % title_bgcolor  
  64.                     result += ("''' ||%s '''" % title_bgcolor).join(row)  
  65.                     result += "''' ||\n"  
  66.                 else:  
  67.                     result += '||%s ' % content_bgcolor  
  68.                     result += ('||%s ' % content_bgcolor).join(row)  
  69.                     result += ' ||\n'  
  70.                 index += 1  
  71.   
  72.             result += ' . \n'  
  73.             result = wikiutil.url_unquote(result)  
  74.             # result += '[[attachment:%s]]' % file  
  75.             result += 'attachment:%s' % csvfile  
  76.   
  77.             result = wikiutil.escape(result).replace('&lt;%s&gt;' % tcolor, title_bgcolor)  
  78.             result = result.replace('&lt;%s&gt;' % ccolor, content_bgcolor)  
  79.     else:  
  80.         result = 'attachment:%s' % csvfile  
  81.   
  82.     p = Parser(result, request)  
  83.     p.format(request.formatter)  
  84.   
  85.     return ""  


把上面的代码保存在$WIKI/data/plugin/macro/InsertCSV.py后,重启服务器即可。具体使用宏语法如下:
[[InsertCSV(Projects.csv, #3a88aa, #f2f2f2)]]
第一个参数 Projects.csv 就是你上传的文件;
第二个参数 #3a88aa 表示标题栏的背景色,可以省略;
第三个参数 #f2f2f2 表示内容格的背景色,可以省略。

页面效果如下图(有些敏感内容被我涂抹掉了,呵呵):

  • 大小: 27.3 KB