rub_html

Final project for MI-RUB course CTU Prague. Simple HTML parser and basic well-formated error handling made with ANTLR (ANTLR4Ruby).

3
0
Ruby

== HTML Parser ==
Semestrální projekt do předmětu MI-RUB FIT ČVUT Praha.

=== Zadání ===
‘’‘Parsery:’‘’

Princip těchto úloh spočívá ve správném rozparsování vstupu. Ten se dá uložit do stromu a následnou kontrolou zjistit, zda jsou prvky správně zanořeny. Strom je vhodné reprezentovat objektově.

‘’‘17. HTML parser (KS)’‘’

Vytvořte program, který dostane na vstup HTML soubor a na výstup dá hlášku, zda je soubor dobře utvořen. Nemusíte řešit všechny tagy, stačí , , , <BODY>, <B>, <I>, <U>, <BR></code> a tagy pro tabulky a nadpisy. U každého tagu uvažujte pouze několik nejběžnejších parametrů, ale minimálně 3. Výstup zpracujte co nejpřehledněji.</p> <p>=== Řešení ===</p> <p>Pro vypracování jsem využil ANTLR4Ruby. Pomocí něho jsem si vytvořil gramatiku. Při parsování textu (v Parseru) se mi víceméně automaticky kontroluje správnost syntaxe.</p> <p>Přepsal jsem metodu error_message tak, aby mi vracela několik smysluplnějších hlášek specifických pro zpracování HTML. Proto jsem ale musel omezit zobrazení dalších chybových hlášek, takže se vždy zobrazí jen první chyba.</p> <p>Ostatní chyby v gramatice jsou hlášeny pomocí standardních zpráv knihovny.</p> <p>Poté, co se mi vytvoří lexer a parser, tak dostanu strom, který procházím pomocí stromové gramatiky HtmlPrinter.</p> <p>Ta mi pomáhá poměrně výrazně ve formátování výstupu, protože tím, že to mám ve stromu a ten procházím, jsem schopný u jednotlivých uzlů zjistit jejich hloubku a tedy i zanoření při formátování.</p> <p>Navíc jsem použil gem colorize pro obarvení výstupu v konzoli. Tato knihovna by se měla automaticky naistalovat díky použití gemfilu.</p> <p>Rozeznávám jen několik základních tagů a jejich atributů. Nerozlišuji hodnoty atributů. Tedy nekontroluji, zda je daný atrbibut textový, nebo zda má mít hodnotu z výčtu jako left, right…</p> <p>=== Použití ===<br /> Spouštěcí soubor je v ‘’/bin/htmlparser/htmlparser’’</p> <code> Usage: htmlParser [ options ] path/to/input_file... </code> <code> Volitelné parametry: </code> <code> -o, --output FILE Path to output file (output to STDOUT otherwise) </code> <code> -h, --help Show help </code> <p>Pokud není specifikován výstupní soubor, vypíše se zformátovaný text na standardní výstup.</p> <p>Soubory pro testování je možné nalézt v ‘’/test/sample’'. Soubor ‘‘test2.html’’ obsahuje všechny použitelné tagy a atributy.</p> <p>‘’‘Zpracovávané tagy: ‘’’ ‘‘html, head, title, body, div, p, table, tr, th, td, i, b, u, a, img, br, h1-h6’’ a jejich základní parametry</p> </div></div><!----><!----></div></div></div></div></div></div><script>window.__NUXT__=(function(a){return {layout:"default",data:[{repo:{name:"rub_html",url:"https:\u002F\u002Fgithub.com\u002Fmatejuh\u002Frub_html",description:"Final project for MI-RUB course CTU Prague. Simple HTML parser and basic well-formated error handling made with ANTLR (ANTLR4Ruby).",stars:3,language:"Ruby",forks:0,list:[658],user_repo:{url:"https:\u002F\u002Fgithub.com\u002Fmatejuh",username:"matejuh",type:"User"},slug:"rub_html-matejuh",readme_url:"https:\u002F\u002Fraw.githubusercontent.com\u002Fmatejuh\u002Frub_html\u002Fmaster\u002FREADME.mediawiki"},data:"== HTML Parser ==\nSemestrální projekt do předmětu MI-RUB FIT ČVUT Praha.\n\n=== Zadání ===\n'''Parsery:'''\n\nPrincip těchto úloh spočívá ve správném rozparsování vstupu. Ten se dá uložit do stromu a následnou kontrolou zjistit, zda jsou prvky správně zanořeny. Strom je vhodné reprezentovat objektově.\n\n'''17. HTML parser (KS)'''\n\nVytvořte program, který dostane na vstup HTML soubor a na výstup dá hlášku, zda je soubor dobře utvořen. Nemusíte řešit všechny tagy, stačí \u003Ccode\u003E\u003CHTML\u003E, \u003CHEAD\u003E, \u003CTITLE\u003E, \u003CBODY\u003E, \u003CB\u003E, \u003CI\u003E, \u003CU\u003E, \u003CBR\u003E\u003C\u002Fcode\u003E a tagy pro tabulky a nadpisy. U každého tagu uvažujte pouze několik nejběžnejších parametrů, ale minimálně 3. Výstup zpracujte co nejpřehledněji.\n\n=== Řešení ===\n\nPro vypracování jsem využil ANTLR4Ruby. Pomocí něho jsem si vytvořil gramatiku. Při parsování textu (v Parseru) se mi víceméně automaticky kontroluje správnost syntaxe.\n\nPřepsal jsem metodu error_message tak, aby mi vracela několik smysluplnějších hlášek specifických pro zpracování HTML. Proto jsem ale musel omezit zobrazení dalších chybových hlášek, takže se vždy zobrazí jen první chyba.\n\nOstatní chyby v gramatice jsou hlášeny pomocí standardních zpráv knihovny.\n\nPoté, co se mi vytvoří lexer a parser, tak dostanu strom, který procházím pomocí stromové gramatiky HtmlPrinter.\n\nTa mi pomáhá poměrně výrazně ve formátování výstupu, protože tím, že to mám ve stromu a ten procházím, jsem schopný u jednotlivých uzlů zjistit jejich hloubku a tedy i zanoření při formátování.\n\nNavíc jsem použil gem colorize pro obarvení výstupu v konzoli. Tato knihovna by se měla automaticky naistalovat díky použití gemfilu.\n\nRozeznávám jen několik základních tagů a jejich atributů. Nerozlišuji hodnoty atributů. Tedy nekontroluji, zda je daný atrbibut textový, nebo zda má mít hodnotu z výčtu jako left, right...\n\n=== Použití ===\nSpouštěcí soubor je v ''\u002Fbin\u002Fhtmlparser\u002Fhtmlparser''\n\n\u003Ccode\u003E\nUsage: htmlParser [ options ] path\u002Fto\u002Finput_file...\n\u003C\u002Fcode\u003E\n\n\u003Ccode\u003E\nVolitelné parametry:\n\u003C\u002Fcode\u003E\n\n\u003Ccode\u003E\n-o, --output FILE Path to output file (output to STDOUT otherwise)\n\u003C\u002Fcode\u003E\n\n\u003Ccode\u003E\n-h, --help Show help\n\u003C\u002Fcode\u003E\n\nPokud není specifikován výstupní soubor, vypíše se zformátovaný text na standardní výstup.\n\nSoubory pro testování je možné nalézt v ''\u002Ftest\u002Fsample''. Soubor ''test2.html'' obsahuje všechny použitelné tagy a atributy.\n\n'''Zpracovávané tagy: ''' ''html, head, title, body, div, p, table, tr, th, td, i, b, u, a, img, br, h1-h6'' a jejich základní parametry"}],fetch:{},error:a,state:{store:{}},serverRendered:true,routePath:"\u002Frub_html-matejuh",config:{_app:{basePath:"\u002F",assetsPath:"\u002F_nuxt\u002F",cdnURL:a}}}}(null));</script><script src="/_nuxt/cb9ae3a.js" defer></script><script src="/_nuxt/f0c76e2.js" defer></script><script src="/_nuxt/13448bd.js" defer></script><script src="/_nuxt/9d4e996.js" defer></script><script src="/_nuxt/35e495c.js" defer></script><script src="/_nuxt/fe257ca.js" defer></script> </body> </html>