2017-03-09 11 views
0

私はC#のHTMLテンプレートエンジンで作業しています。私は、Full-Outコンパイラではなく、基本的な文字列操作(find/replace)を使用することを除いて、Handlebars.Net(Handlebars.jsのC#実装)などのライブラリと同じ機能を実現したいと考えています。カスタムHTMLのような構造の開始タグと終了タグを見つける

構文のようなものになるだろう:私は正規表現で単純な文字列置換を行うために探していますが、私は正規表現は、このような例では、終了タグを見つけるなど、この地域では欠点を持っているでしょう実現

{{#each item in items}} 

    <li>{{item.Name}}</li> 

{{/each}} 

私は、任意の「タグ」の始まりと終わりを見つける必要が

{{#each item in items}} //while parsing this tag... 

    <p>{{item.Name}}'s Hobbies:</p> 

    <ul> 
    {{#each hobby in item}} 

     <li>{{hobby.Name}}</li> 

    {{/each}} //this end tag would be found first 
    </ul> 

{{/each}} //rather than this one 

(例えば{として:(最初のタグを解析するとき、それはむしろ最後より{{/各}}埋め込まれた第1のを見つけるであろう)以下{#each}} ... {{/ each}})、それを解析してDOM風の構造を作ります各タグの内容"DOM"には複数のタグが埋め込まれていてもかまいません(埋め込まれたforeachループx4と考える)。これを達成するための良い方法は何ですか?

+1

あなたはいくつかの異なる方法でそれを実装しようとする必要があります - それはあなたが学ぶ方法です、あなたはそれを行うことができます!あなたが何かにこだわって***特定の***戻って来て、その助けを求める。 – caesay

+1

本当に "正しい"ことをするには、あなたがしたくないと言ったことを、かなりレキシング/解析する必要があります。これを行うには、文字列をそれぞれ{{#each}}ですばやく検索し、{{/ each}}まで読み上げます。この関数は再帰的になり、ネストされたエントリをサポートします。異なるタグがたくさんある場合、そのすべてを処理する必要があります。そのようなパーサーを書くことは大きな仕事です。あなたが試したことを見せたいなら、私は助けてくれるとうれしいですが、これは非常に大きな仕事であり、あなたはそれをする人を見つけるつもりはないここにいる。 SOは助けになり、コーダー4は無料になりません。 – dman2306

+0

「良い」方法は、正規表現の文字列置換ではなく、状態やネストされた要素などを認識するパーサーを作成することです。なぜあなたはパーサを書こうとしませんか(私はあなたが 'フルアウトコンパイラ'によって意味すると思います)? – Tim

答えて

0

私の意見では、構文解析は物事を非常に機能的に見ています:正規表現のいくつかの文字<>タグとして解析し、正規表現次の<>を取得します。

私の意見では、この機能的、構文解析的なアプローチは、タグの認識、構文の強調表示などの作業をテキストエディタに依頼する副産物です。単純に言えば、テキストエディタの「目的」は、「モデル」オブジェクトがユニコード文字でいっぱいのパネルになることを期待することでした。オブジェクトモデルに関しては、それが「インテリジェント」になるように強制されました。

私はMonarchエディタ(おそらく、私たちが2017年と2月に行うことができる最高のものです)の中で "タグをつけた" HTMLを使って遊んだ後に、自分が作っているものをデザインしています。

私が近づいているのは、テキストエディタではなく、表面的にテキスト編集面であるMVCの意味でのビューですが、実際にはユーザーの行動に反応するテンプレート化された順序付けされたモデルです。

+0

バージョン内でブロック(開始タグと終了タグの間にコンテンツを含む)を見つける方法はありますか? –

+0

タグやコンテンツが見つかりません、 'var nodes = context.Where(n => n.ElementText =" h1 ")のようなモデルオブジェクトを取得します。ToList ();' – NWoodsman

関連する問題