`
willzh
  • 浏览: 296755 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

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

"""
    MoinMoin - InsertCSV

    This macro is used to insert csv data as wiki table
    @license: GNU GPL
"""

Dependencies = ['time'] # do not cache

import os, codecs, csv
from MoinMoin import config, wikiutil
from MoinMoin.action import AttachFile
# from MoinMoin.parser.text_moin_wiki import Parser
from MoinMoin.parser.wiki import Parser

def utf_8_encoder(unicode_csv_data):
    for line in unicode_csv_data:
        yield line.encode('utf-8')

def execute(macro, args):
    request = macro.request
    formatter = macro.formatter

    if args:
        args = args.split(',')
        args = [arg.strip() for arg in args]
    else:
        args = []

    argc = len(args)
    if argc == 0:
        csvfile = 'default.csv'
    else:
        csvfile = args[0]

    if argc > 1:
        tcolor = str(args[1])
        title_bgcolor = '<%s>' % str(args[1])
    else:
        tcolor = ""
        title_bgcolor = ""

    if argc > 2:
        ccolor = str(args[2])
        content_bgcolor = '<%s>' % str(args[2])
    else:
        ccolor = ""
        content_bgcolor = ""


    pagename = formatter.page.page_name
    attach_dir = AttachFile.getAttachDir(request, pagename)
    files = AttachFile._get_files(request, pagename)

    if csvfile in files:
        if csvfile.lower().endswith('.csv'):
            file_id = codecs.open(os.path.join(attach_dir, csvfile), 'rb', config.charset)
            reader = csv.reader(utf_8_encoder(file_id))
            index = 0
            result = ""
            for row in reader:
                if index == 0:
                    result += "||%s '''" % title_bgcolor
                    result += ("''' ||%s '''" % title_bgcolor).join(row)
                    result += "''' ||\n"
                else:
                    result += '||%s ' % content_bgcolor
                    result += ('||%s ' % content_bgcolor).join(row)
                    result += ' ||\n'
                index += 1

            result += ' . \n'
            result = wikiutil.url_unquote(result)
            # result += '[[attachment:%s]]' % file
            result += 'attachment:%s' % csvfile

            result = wikiutil.escape(result).replace('&lt;%s&gt;' % tcolor, title_bgcolor)
            result = result.replace('&lt;%s&gt;' % ccolor, content_bgcolor)
    else:
        result = 'attachment:%s' % csvfile

    p = Parser(result, request)
    p.format(request.formatter)

    return ""


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

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

  • 大小: 27.3 KB
3
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics