2017-06-24 6 views
0

Ich bin auf der Suche nach einer Ressource für Tokenizing HTMLish Markup. Ich erstelle eine Auszeichnungssprache, die HTML sehr ähnlich ist (aber nicht ist). Alles, was ich will, ist etwas, das es in Tags, Text, Kommentare usw. aufteilen kann. Ich brauche die Token nicht in einer Baumstruktur anzuordnen oder zu überprüfen, ob sie gültige Tags sind oder was auch immer - ich mache das selbst .Ruby HTMLish tokenizer

So zum Beispiel gegeben, wenn diese Zeichenfolge:

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

wäre es ein Array so etwas wie dies zurück:

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

Es ist auch diese Zeichenfolge repräsentieren Objekte zurückkehren kann. Entweder wäre cool.

Ich habe in Nokogiri und Oga untersucht, aber sie scheinen nur HTML zu parsen und zu strukturieren. Vorschläge?

Antwort

0

Wenn Sie bereit sind, einen Großteil der Validierung selbst durchzuführen, könnte ein regulärer Ausdruck funktionieren? Etwas wie:

Ansonsten frage ich mich: könnte Ihr Markup XMLish statt HTMLish sein? Müssen Sie beispielsweise Void-Elemente wie <whatever> unterstützen, oder reicht es aus, selbstschließende Tags wie <whatever /> zu unterstützen? Das heißt, sind Sie verpflichtet, Markup wie hello <x> dude <whatever></x> zu unterstützen, oder würde Unterstützung hello <x> dude <whatever /></x> (mit der selbstschließenden <whatever />) genug sein?

Wenn selbstschließende Tags ausreichen, klingt es wie ein XML-Parser. Selbst wenn der Parser einen Baum erstellt, können Sie ihn normalerweise in ein Array reduzieren.

Wenn Sie benutzerdefinierte Void-Elemente benötigen, müssen Sie möglicherweise einen HTML-Parser finden, der diese unterstützt. Ich weiß nichts davon, aber es sollte möglich sein, Oga zu modifizieren, um das zu tun. Sie könnten Oga auch so modifizieren, dass das Einebnen eines Baumes in ein Array unterstützt wird. Etwas wie:

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>"]