Habra-colorer-即興手段からhabracodeを着色するためのスクリプト

TeXでの私の倒錯についてのトピックを書き始めて、私は通常の構文の強調表示が不足していることに気付きました。 Habrとその周辺をぐるぐる回ってみると、私のために働いていない編集者が2人と、 Piggmentsの チャート化されたフォーマッターの説明につながりました

「なぜ私が悪いのか」を決めて、私は「私の膝の上に」「python」スクリプトをスケッチしました。



検死は、 患者が検死死亡したことを示しました、修正なしでHabréで見つけられたコードを使用することは動作しません-それは古いバージョンの色素で投獄されるか、何か他のものです。 一般に、私はドキュメンテーションに入り、最初の例で、以前に見つけたものと非常によく似たHTML 3.2 Formatterに出会いました。



比較の結果、双子ではなく、兄弟の両方のフォーマッターが新しいルールに従って、尊敬されている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 ' ) # &nbsp;

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で入手できます。



藤堂


すでにいくつかの開発分野があります:





使用材料


  1. ハブラハブル
  2. Habrauzer barbuza ブログアイデアとHTML文字エスケープ機能
  3. SoftCoderの HabraEditor
  4. Python 2.6
  5. 苦悩
  6. Sc.meソースコードカラーリングサイト
  7. Dumpz.orgダンプ共有サイト




PS:このテキストはGEditで準備され、デフォルトのスタイルでhabra-colorerを使用して色付けされました

ZYY:執筆の過程で、Habrはフォントタグ内の1桁の「0」を「気に入らない」ことがわかりました。 私はコードでトリッキーなスペースを追加することでカンニングをしなければなりませんでした&#8204;。



All Articles