2017-06-24 4 views
0

私はHTMLishマークアップをトークン化するためのリソースを探しています。私はマークアップ言語を作成していますが、これはHTMLによく似ていますが(しかしそうではありません)。私が望むのは、タグ、テキスト、コメントなどに解析できるものです。トークンをツリー構造に配置する必要はありません。タグが有効なタグなのかどうかを確認する必要はありません。 。Ruby HTMLish tokenizer

ので、例えば、この文字列を指定した場合:それはまたそれらの文字列を表すオブジェクトを返すことができ

hello 
<x> 
dude 
<whatever> 
</x> 

hello <x> dude <whatever></x> 

それは、このような配列のものを返します。いずれかはクールだろう。

NokogiriとOgaを調べましたが、HTMLを解析してツリー化したいと思うようです。提案?

答えて

0

多くの検証を自分で行う場合は、正規表現を使用できますか?何かが好きです:

html = 'hello <x> dude <whatever></x>' 
html.split(/(<[^<>]+>)/) 
#=> ["hello ", "<x>", " dude ", "<whatever>", "", "</x>"] 

そうでなければ、あなたのマークアップはHTMLishではなくXMLishですか?たとえば、<whatever>のような空白要素をサポートする必要がありますか、<whatever />のような自己閉じタグをサポートすれば十分でしょうか?つまり、hello <x> dude <whatever></x>のようなマークアップをサポートすることを約束しているか、hello <x> dude <whatever /></x>(セルフクローズ<whatever />)をサポートすれば十分でしょうか?

セルフクローズタグで十分なら、XMLパーサーがそのトリックを行うことができるように思えます。パーサーがツリーを構築したとしても、通常、それを配列にまとめることができます。

カスタムvoid要素が必要な場合は、それらをサポートするHTMLパーサーを見つける必要があります。私はどんな手も知らないが、それをするためにOgaを修正することは可能でなければならない。 Ogaを変更して、ツリーを配列にフラット化することもできます。次のようなもの:

module Oga 
    module XML 
    # Redefine the list of void elements. 
    remove_const :HTML_VOID_ELEMENTS 
    const_set :HTML_VOID_ELEMENTS, Whitelist.new(%w{ 
     whatever 
    }) 

    class TokenGenerator < Generator 
     def initialize(*args) 
     super 
     @tokens = [] 
     end 

     %i[ 
     on_element on_text on_cdata on_comment on_xml_declaration 
     on_processing_instruction on_doctype on_document 
     after_element 
     ].each do |method| 
     define_method method do |content, output| 
      token = super(content, '') 
      @tokens << token if token 
      super(content, output) 
     end 
     end 

     def to_tokens 
     @tokens = [] 
     to_xml 
     @tokens 
     end 
    end 
    end 
end 

html = Oga.parse_html('hello <x> dude <whatever></x>') 
Oga::XML::TokenGenerator.new(html).to_tokens 
=> ["hello ", "<x>", " dude ", "<whatever>", "</x>"] 
関連する問題