Plim-Pythonの最も包括的なスリムテンプレートポート

確かに、 HamlSlimの最初の実装はPythonに登場するはずでした。 または、少なくともそれはより公正です。

これらの言語でかつて提案されたものよりも、HTMLマークアップを記述するためのより「Python的な」アプローチを想像することは困難です。 インデントされた構文、閉じ文字の欠如、一般的な簡潔さ-これらの単語は、Pythonについて初めて誰かに話す平均的なプログラマーの唇から聞こえませんか?



しかし、現実は異なることが判明し、スリムとの最初の知り合いは、自分のプロジェクトの1つでChefを使い始め、そのことについてRubyの勉強を始めた瞬間に起こりました。 それ以来、ごく最近まで、少なくとも現在のSlim実装に品質が近いものがPythonの世界に現れるのを待ちました。 しかし、待つことなく、彼は自分で書き始めました。



やる気



Pythonについては、すでにHamlのようなマークアップ言語を実装するかなり多数のパッケージがあります。 それらのほんの一部を次に示します。





いずれにしても、これらのプロジェクトはすべて、精巧さの点で元のスリムよりも劣っています。



-プロジェクトには大規模なコードベースを持つ定評のあるオーディエンスがいるため、修正できない固有の構文欠陥があります。

-他のすべての既存の「大規模な」Pythonテンプレートエンジンのクロスコンパイラを作成しようとしていますが、その結果、それぞれの構文のサポートも同様に不十分です。

-他の誰もが素朴な実装をしています。 slimish-jinja2(理論的にはSlim構文全体をサポートするはずです)でさえ、 非常に控えめに実装されています。 タグの属性の解析には非常に単純な正規表現が使用されることに注意してください。これは、「=」文字を含むほとんどすべてのPython文字列で正しく動作しません。 これは明らかに、合理化された開発プロセスで今日実装できるプロジェクトではありません。



そのような膨大なパッケージのリストがあっても、実稼働システムに関しては何も選択できないことが判明しました。 この残念な結論の結果として、オリジナルのスリムテンプレートエンジンの本番用の独自のポートを作成することが決定されました。



実装



Plimは、 Makoテンプレートエンジンの上に構築されたPythonの最も包括的なSlim構文実装です。 基本的に、Plimはランタイムコンテキストについては何も知らない単純なプリプロセッサですが、スリムマークアップを正しいmakoテンプレートに正しく変換し、PythonモジュールにコンパイルしてMakoエンジンでキャッシュできます。



「最も完全な実装」とは、ほとんどのスリム制御構造をサポートすることを意味します。 ただし、Plimは言語の正確なポートでないことをすぐに明確にする必要があります ! 構文の一部の要素が削除され、他の要素が大幅に補足され、一部の構造に明確さと一意性が導入されました。 ただし、それでも、ほとんどの構文は変更されていないため、Plimを使用する場合は、 既存のプラグインを使用してスリムな構文を強調表示できます



最後に状況を明確にするために、構文に対するすべての変更のリストを以下に示します。



  1. Slimは、「 '」、「='」、および「== '」の行インジケータをサポートしています。 Plimでは、アポストロフィ(単一引用符)がコンマに置き換えられました。

    , value =, value ==, value
          
          





    この変更は、単一引用符が任意のPython式の先頭の有効な文字であるという事実によって決定されました。 そのため、次のプリム式の解釈はあいまいになります(自動コード変換に関しては常に悪いです):

     /      python-,       ,     ? ='' /     python-    ('u''' -   python-)       ,       ? ='u'''
          
          







    同時に、正しいPython文字列の先頭にコンマ文字を使用することは許可されていないため、コンマ文字を使用すると、式の明確な解釈が得られます。

     /    runtime,    mako- ${'} -   .   . =,' /    .  mako-   -,      . =,u''
          
          





  2. Slimとは異なり、Plimはタグ属性を強調するための角括弧と中括弧をサポートしていません。 括弧のみを使用できます。

    この制限により、一部のパーサーコンポーネントのアルゴリズムのロジックが簡素化され、構文に特定のレベルの標準化が導入されますが、機能は絶対に低下しません。

     /         . p(title="Link Title") h1 class=(item.id == 1 and 'one' or 'unknown') Title /         mako-  python- a#idx-${item.id} href=item.get_link( **{'argument': 'value'}) = item.attrs['title']
          
          





  3. 前の例でわかるように、Plimは短いタグ形式(#id.class)の動的式をサポートしています。 かっこ内の式を別の行に転送することもできます。

     /       #m${ c.message.id }.msg${ ( "test" ) } = do_something_real( 'with', 'the', real, arguments)
          
          





  4. Plimでは、すべてのタグで小文字を使用する必要があります。 この制限は、リストの次の段落で説明する「暗黙的な」リテラル文字列の言語サポートに含めることができるようにするために導入されました。 ただし、次の例からそれが何であるかを推測できます。

     doctype 5 html head title Page Title body p | !  -   ,    . p !  -   ,      .
          
          





  5. Slimとは異なり、Plimは暗黙的なテキストブロックをサポートしています。 テキストブロックは、最初の行が次の文字シーケンスのいずれかで始まる場合、「暗黙のリテラル」と見なされます。

    • ラテン大文字
    • ASCII文字テーブルに含まれていない範囲の文字。
    • その前に予約されている「+」または「-」文字がない数字。
    • 任意の&-formエンコードされたHTML文字。 たとえば、 
    • 文字シーケンス「$ {」で始まるmako式。
    • 角括弧「[」;
    • 開き括弧 "(";
    • コードU0021-U007Eの範囲にないUnicode文字(つまり、予約されたパーサーであるASCII範囲33-126の外)。


    暗黙的なテキストブロックの使用例を次に示します。

     p | pipe is the explicit literal indicator. It is required if your line starts with the non-literal character. p I'm the implicit literal, because my first letter is in uppercase. p 1. Digits 2. are 3. the 4. implicit 5. literals 6. too. p ${raw_mako_expression} indicates the implicit literal line. p If subsequent lines do not start with implicit literal indicator, you must indent them | or you can use the "explicit" pipe. p       ,    ,     ASCII-,           .
          
          





  6. 文字「|」を使用する必要はありません (パイプ-明示的なリテラルのインジケータ)スタイルおよびスクリプトタグ。
  7. Plimは、制御構造とフィルターを区別しません。

    たとえば、Slimでは、コントロール構造に対して「-if」、「-for」などを記述する必要がありますが、コーヒー:(先頭にマイナス記号はなく、末尾に二重記号が付いています)-利用可能なフィルターに対して。 Plimでは、同じ構文「-if」、「-for」、および「-coffee」を使用します。
  8. PlimはHTMLタグをサポートしています! 忘れずに閉じてください。 タグ内では、「クリーンな」プリムマークアップと同じ解析ルールが機能します。 この機能は、次の例のようなものを実装しようとする場合に特に役立ちます。

     - if edit_profile /       <div id="edit-profile"> - include new_or_edit_interface.html - if edit_profile /     </div>
          
          





    HTMLタグのサポートにより、Plimは、SlimがHTMLコメントを生成するための「/!」命令に相当するものを実装しませんでした。 Plimでのそのような設計の無益さについての決定は、HTMLコメントが現在Internet Explorerの条件付きハッキングにほぼ排他的に使用されているという事実のために行われました。 この重要でないスコープは、マークアップ言語に追加の構文構造を導入することを正当化するものではありません。マークアップ言語には、「ネイティブ」HTMLコメントの組み込みサポートがあります。





ご覧のとおり、変更は元の言語に関して可能な限り慎重に行われ、不必要な規則の「厳格」があったと思われる場所でのみ行われました。



ボーナス



基本的な構文に加えて、Plimは以下を実装します。





メタ情報



ReadTheDocs.orgプラットフォーム上の言語のすべての制御構造に関する詳細で最新のドキュメントを見つけることができます(英語版、 pdfおよびepubがあります )。



GitHubのトラッカーでは、すべての提案とエラーメッセージを歓迎します



PS現在のバージョンはブランチ2.7でのみテストされています。 私にはわかりません(テストに必要な環境はありません)が、2.6でもすべて正常に動作するはずです。 しかし、現在3.xは確かにサポートされていません。 しかし、これは、Py3Kの標準ライブラリの一部のパッケージが場所を変更したという事実のみに起因しています。



All Articles