Sunday 9 February 2014

syntaxhighlighter な記法にお手軽変換

Syntaxhighlighter のページ みると,コード埋め込みには prescript タグ使え,と書いてある. script の方は RSS リーダが読み飛ばしたりするほかたまに閉じの判定を間違えるおそれがあり,pre の方は中身をエスケープしないといけない,とある.しかも記法は
<pre class="brush: js">
function foo()
{
}
</pre>
だという.

面倒だ.やってられない.
...というわけで,以前 pygments を使って コードをいいかんじにハイライトするコードを書いていたのを流用して,上のなら
<code class="js">
function foo()
{
}
</code>

で行けるようなのを書いた(雑ながら).


そして今の snippet を書こうとするにあたって <code> のネストに対応できないことが発覚した.
こんなかんじ
#!/usr/bin/env python3

import re
import cgi
import sys
import os


def snippethl(self, code, lang):
    pretag = '<pre class="brush: {}">\n'.format(lang)
    return pretag + cgi.escape(code) + "\n</pre>"

def highlighterise(source):
    codepattern = re.compile(
        r'<code class="([^>]+)">(.*?)</code>', re.DOTALL
    )
    compiled = codepattern.sub(
        lambda x: snippethl(x.group(2).strip(), x.group(1)),
        source)
    
    return compiled

def outputfilename(filename):
    F = re.search(r'(.*)\.(html)',filename)
    try:
        return F.groups()[0] + '.highlighterised.' + F.groups()[1]
    except AttributeError:  # I know I shouldn't be doing this!
        return str(filename) + '.highlighterised.html'

def main():
    filename = sys.argv[1]
    if os.path.isfile(filename):
        with open(filename, 'r') as f:
            source = f.read()
    else:
        print("file not found")
        return -1
    
    result = highlighterise(source)
    outname = outputfilename(filename)
    if os.path.isfile(outname):
        print("file exists. abort (for now).")
        print(enhanced)
        return 1
    else:
        with open(outname, 'a') as F:
            F.write(result)
    return 0

if __name__ == '__main__':
    main()

アッ叩かないで叩かないで
これで foo.html を処理すれば foo.highlighterised.html ができます.
加えて emmet (旧称 zen coding) 使えば
code.python>
のあとたとえば
<C-y>,
ですぐに書けますね. めでたし.

python3 で書いたけど python2 でも 2.7 くらいなら普通に動くんじゃないかな(適当)

No comments:

Post a Comment