多くの検証を自分で行う場合は、正規表現を使用できますか?何かが好きです:
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>"]