
「なぜ私が悪いのか」を決めて、私は「私の膝の上に」「python」スクリプトをスケッチしました。
検死は、
比較の結果、双子ではなく、兄弟の両方のフォーマッターが新しいルールに従って、尊敬されているbarbuzaでは使用されなかったフォーマット方法を定義することが必須であるため、Habra固有のタグを修正する必要がありました。
コードを処理します
次に、正規表現を使用したPythonで武装して、テキストを処理し、ブロックをその中のコードに置き換えます。これは、 HabrRedactorとの類推による色分けされたコードに似ています。
-
<code class= "python" > <!-- , -->
#!/usr/bin/env python
import sys
</code> <!-- , -->
つまり 単一のクラス属性を持つコードによって制限されたブロック内のすべては、適切なレクサーピグメントを介して実行されます 。
def preparse_text(text, linenos = False , style = None ):
"""Extract code blocks from raw text, render via pygments and return as unicode string"""
R = re . compile( ur'^\s*<code class="(?P<class>.*?)">\s*$(?P<code>.*?)^\s*</code>\s*$' , re . I | re . U | re . S | re . M)
out = []
prev = 0
ar = { 'linenos' : False }
if linenos:
ar[ 'linenos' ] = 'inline'
if style:
ar[ 'style' ] = style
for s in R . finditer(text):
fmt = OldHtmlFormatter( ** ar)
out . append(text[prev:s . start()])
lx = get_lexer_by_name(s . group( 'class' ))
if not lx:
lx = guess_lexer(s . group( 'code' ))
if lx:
s0 = s . group( 'code' )
s0 = s0 . replace( u' ' , u' \u00a0 ' ) #
src = highlight(s0, lx, fmt) # .replace(u'\n', '<br/>\n') # for preview
else :
src = u'<code> %s </code>' % s . group( 'code' )
out . append(src)
prev = s . end()
del lx
del fmt
lx = None
out . append(text[prev:])
return u'' . join(out)
出力では、このようなすべてのブロックが選択したピグメントスタイルに従って色付けされたテキストを取得します。
フォーマッタの修正は3つの部分で構成されました。通常のUnicode文字列の置換、少し編集してbarbuzaブログからHTML文字をエスケープする機能の追加、色が許せば6文字のカラーコードを3にパックする「ダム」機能の追加です。
コンソールユーティリティ
フォーマッタが呼び出して追加のパラメータを設定するピースを書くことは残っています。
ここでは、 作業を簡単にするために、コマンドラインパラメーターを解析するoptparseモジュールが必要です。
#
p = OptionParser(usage = 'usage: %prog [options] input_file' )
p . add_option( '-f' , '--file' , metavar = "FILE" , help = "Write output to FILE" )
p . add_option( '-s' , '--style' , metavar = "STYLE" ,help = "Use color STYLE for formatting" )
p . add_option( '--htm' , '--html' , action = "store_true" , help = "Add extra html headers in output" )
p . add_option( '--list-styles' , action = "store_true" , help = "Show list of supported styles" )
p . add_option( '--list-languages' , action = "store_true" , help = "Show list of supported languages" )
# , 'op', 'a[0]'
op,a = p . parse_args()
# - ,
if op . list_styles:
from pygments . styles import get_all_styles
print "Supported color styles:"
for s in get_all_styles():
print u" \t %s " % (s,)
sys . exit( 0 )
# - :)
if op . list_languages:
from pygments . lexers import get_all_lexers
print "Supported languages and aliases:"
ss = list (get_all_lexers())
ss . sort(key = lambda x:x[ 0 ] . lower())
for s in ss:
print s[ 0 ]
if s[ 1 ]:
print " \t " , ", " . join(s[ 1 ])
sys . exit( 0 )
# ,
if len (a) != 1 :
print "No input file specified!"
sys . exit( 1 )
実際、それがすべてです。 指定されたファイルを読み取り、コードの色付けのために処理し、指定されたファイルまたは出力ファイルが指定されていない場合は画面に書き込むために残ります。 バイコードの匂いがしますが、基本的な怠elementaryは最適化されています。 この不名誉をすべて改善することについてはすでに考えられているので、リファクタリングは後ほど延期します。
srcfile = a[ 0 ]
dstfile = op . file
f = unicode ( open (srcfile, 'rb' ) . read(), 'utf-8' , 'replace' ) # , utf8 ^)
s = preparse_text(f, False , op . style) . encode( 'utf-8' ) #
if dstfile:
fn = open (dstfile, 'wb' )
else :
fn = sys . stdout
# HTML --
if op . htm:
fn . write( '<html><head><meta http-equiv="content-type" content="text/html; charset= \' utf8 \' "/></head><body> \n ' )
fn . write(s)
if op . htm:
fn . write( '</body></html> \n ' )
try :
close(fn) # stdout close,
except :
pass
まとめ
その結果、Far-e、GEdit-e、またはMidnight Commandereで入力された記事のソースコードを「フリック」で「色付け」できるようにする実用的なコンソールユーティリティが手に入りました。
ソースコード全体(「ゴミ」を含む)はdumpz.org/17521で入手できます。
藤堂
すでにいくつかの開発分野があります:
- 着色部分を「くし」にするには-行番号を表示する機能と埋め込みコードの自動スクリーニングを追加します(最初の例のコードタグの後にコメントを追加する必要がありました)
- プレビューa'la HabrでPyQtにGUIを作成するというアイデアがあります
- 独自のスタイルをいくつか描くことができ、その利点は非常に簡単です。
使用材料
- ハブラハブル
- Habrauzer barbuza ブログのアイデアとHTML文字エスケープ機能
- SoftCoderの HabraEditor
- Python 2.6
- 苦悩
- Sc.meソースコードカラーリングサイト
- Dumpz.orgダンプ共有サイト
PS:このテキストはGEditで準備され、デフォルトのスタイルでhabra-colorerを使用して色付けされました
ZYY:執筆の過程で、Habrはフォントタグ内の1桁の「0」を「気に入らない」ことがわかりました。 私はコードでトリッキーなスペースを追加することでカンニングをしなければなりませんでした&#8204;。