Předělat generování výstupu #13

Open
opened 10 months ago by jan · 8 comments
jan commented 10 months ago

Nejspíš jedna velká třída se spoustou funkcí, některé sdílené i mezi HTML a TeX pipelinami. Třída se dá poté overridovat, KSP si pomocí toho může například handlovat svoje fancy odkazy.

Nejspíš jedna velká třída se spoustou funkcí, některé sdílené i mezi HTML a TeX pipelinami. Třída se dá poté overridovat, KSP si pomocí toho může například handlovat svoje fancy odkazy.
Poster

Také místo vracení stringů z rekurzivní funkce (což je pomalé) spíš vypisovat rovnou do file handlu, který by mohl být dostupný v selfu.

Také místo vracení stringů z rekurzivní funkce (což je pomalé) spíš vypisovat rovnou do file handlu, který by mohl být dostupný v `self`u.
Owner

První dojem: Líbí se mi to.

Zde je pár nápadů:

  • Je hezké, že se spousta typů ošetří voláním generické funkce ve stylu generate_simple_inline_tag, ale není mi jasné, proč se jí vždycky explicitně předává název tagu získaný voláním self.tagname(e) a atributy získané z self.common_attributes(e). Nestačilo by, kdyby si tohle funkce generate_simple_inline_tag zjistila sama? Volající by to případně mohl overridovat nepovinným parametrem, kdyby potřeboval.

  • Nebylo by lepší, kdyby funkce typu self.stag rovnou zapisovaly do výstupu, místo aby vracely string? (Aha, jasně, teď někdy voláš writeln a někdy write... možná z toho udělat booleovský argument? Viz níže.) Možná by se také mohly jmenovat nějak intuitivněji. Třeba start_tag?

  • Podobně iup a idown bych raději pojmenoval méně zkratkovitě. Třeba indent_up a indent_down? (Přemýšlím, jestli rovnou nevyrobit funkce pro otevření a zavření "blokového" tagu, které se budou starat i o indentaci. Tím by se vyřešilo i to, že je někdy potřeba write a jindy writeln.)

  • U metod, které obecný OutputGenerator volá, ale čeká, že je nadefinují až potomci (třeba tagname), by bylo hezčí, kdyby je sam nadefinoval s nějakou prázdnou implementací (třeba ... nebo vyhození výjimky). Pak bude jasnější, jak vypadá rozhraní.

  • V escape_special_chars pro HTML děláš věci jako text = re.sub(re.compile(r"&"), "&", text). Jednak mi není jasné, proč regex explicitně kompiluješ. Ale hlavně nevím, proč vůbec regex, když by to zvládla metoda replace na stringu.

  • V HTML bych asi odlišoval escapování textu od escapování atributů. V textu není potřeba escapovat uvozovky.

  • V HTML bych neescapoval triviální hodnoty atributů (například rozměry obrázků).

  • Slovníky překládající typy na funkce bych vyrobil jednou v čase kompilace místo při každém vstupu do funkce.

První dojem: Líbí se mi to. Zde je pár nápadů: - Je hezké, že se spousta typů ošetří voláním generické funkce ve stylu `generate_simple_inline_tag`, ale není mi jasné, proč se jí vždycky explicitně předává název tagu získaný voláním `self.tagname(e)` a atributy získané z `self.common_attributes(e)`. Nestačilo by, kdyby si tohle funkce `generate_simple_inline_tag` zjistila sama? Volající by to případně mohl overridovat nepovinným parametrem, kdyby potřeboval. - Nebylo by lepší, kdyby funkce typu `self.stag` rovnou zapisovaly do výstupu, místo aby vracely string? (Aha, jasně, teď někdy voláš `writeln` a někdy `write`... možná z toho udělat booleovský argument? Viz níže.) Možná by se také mohly jmenovat nějak intuitivněji. Třeba `start_tag`? - Podobně `iup` a `idown` bych raději pojmenoval méně zkratkovitě. Třeba `indent_up` a `indent_down`? (Přemýšlím, jestli rovnou nevyrobit funkce pro otevření a zavření "blokového" tagu, které se budou starat i o indentaci. Tím by se vyřešilo i to, že je někdy potřeba `write` a jindy `writeln`.) - U metod, které obecný `OutputGenerator` volá, ale čeká, že je nadefinují až potomci (třeba `tagname`), by bylo hezčí, kdyby je sam nadefinoval s nějakou prázdnou implementací (třeba `...` nebo vyhození výjimky). Pak bude jasnější, jak vypadá rozhraní. - V `escape_special_chars` pro HTML děláš věci jako `text = re.sub(re.compile(r"&"), "&", text)`. Jednak mi není jasné, proč regex explicitně kompiluješ. Ale hlavně nevím, proč vůbec regex, když by to zvládla metoda `replace` na stringu. - V HTML bych asi odlišoval escapování textu od escapování atributů. V textu není potřeba escapovat uvozovky. - V HTML bych neescapoval triviální hodnoty atributů (například rozměry obrázků). - Slovníky překládající typy na funkce bych vyrobil jednou v čase kompilace místo při každém vstupu do funkce.
Poster

U metod, které obecný OutputGenerator volá, ale čeká, že je nadefinují až potomci (třeba tagname), by bylo hezčí, kdyby je sam nadefinoval s nějakou prázdnou implementací (třeba ... nebo vyhození výjimky). Pak bude jasnější, jak vypadá rozhraní.

Taková metoda existuje? tagname, který zmiňuješ, má implementaci tady. Souhlasím, že by měl OutputGenerator implementovat všechny metody, které čeká.

iup, ido, stag...

Jojo, asi máš pravdu, já jsem původně myslel, že se budou používat častěji a mít tam celé názvy by byl pain, ale AutoComplete existuje... Předělám.

proč regex?

Z nějakého důvodu jsem si myslel, že to je rychlejší než stringový replace, ale teď na to koukám, že není, předělám.

simple... funkce

Teď mě ještě napadlo, že by bylo asi výhodnější, umět tagname, atributy, ale i obsah overridenout, ale může tam být default, pak půjde i čášt kódu zjednodušit. Zkusím se ještě zamyslet nad tím, jak tyhle základní funkce, spolu s write,stag, vylepšit.

Slovníky překládající typy na funkce bych vyrobil jednou v čase kompilace místo při každém vstupu do funkce.

Jasný, to zní líp.

V HTML bych asi odlišoval escapování textu od escapování atributů. V textu není potřeba escapovat uvozovky.

Jaká je za tímto motivace? Rychlost nebo čitelnost výsledného zdrojáku? Co je možná zajímavé dodat je, že normální uvozovky se vzhledem k chytrému uvozovkovátku v textu spíše neobjeví, takže se jich tolik neescapuje.

V HTML bych neescapoval triviální hodnoty atributů (například rozměry obrázků).

Stejná otázka, není mi moc jasné, proč z escapování dělat nějaké výjimky, nadměrné escapování nemůže uškodit, ne?

> U metod, které obecný OutputGenerator volá, ale čeká, že je nadefinují až potomci (třeba tagname), by bylo hezčí, kdyby je sam nadefinoval s nějakou prázdnou implementací (třeba ... nebo vyhození výjimky). Pak bude jasnější, jak vypadá rozhraní. Taková metoda existuje? `tagname`, který zmiňuješ, má implementaci [tady](https://gitea.ks.matfyz.cz/KSP/formatitko/src/branch/master/src/formatitko/output_generator.py#L69). Souhlasím, že by měl OutputGenerator implementovat všechny metody, které čeká. > iup, ido, stag... Jojo, asi máš pravdu, já jsem původně myslel, že se budou používat častěji a mít tam celé názvy by byl pain, ale AutoComplete existuje... Předělám. > proč regex? Z nějakého důvodu jsem si myslel, že to je rychlejší než stringový replace, ale teď na to koukám, že není, předělám. > simple... funkce Teď mě ještě napadlo, že by bylo asi výhodnější, umět tagname, atributy, ale i obsah overridenout, ale může tam být default, pak půjde i čášt kódu zjednodušit. Zkusím se ještě zamyslet nad tím, jak tyhle základní funkce, spolu s `write`,`stag`, vylepšit. > Slovníky překládající typy na funkce bych vyrobil jednou v čase kompilace místo při každém vstupu do funkce. Jasný, to zní líp. > V HTML bych asi odlišoval escapování textu od escapování atributů. V textu není potřeba escapovat uvozovky. Jaká je za tímto motivace? Rychlost nebo čitelnost výsledného zdrojáku? Co je možná zajímavé dodat je, že normální uvozovky se vzhledem k chytrému uvozovkovátku v textu spíše neobjeví, takže se jich tolik neescapuje. > V HTML bych neescapoval triviální hodnoty atributů (například rozměry obrázků). Stejná otázka, není mi moc jasné, proč z escapování dělat nějaké výjimky, nadměrné escapování nemůže uškodit, ne?
Poster

Teď mě ještě napadlo, že by bylo asi výhodnější, umět tagname, atributy, ale i obsah overridenout, ale může tam být default, pak půjde i čášt kódu zjednodušit

Provedeno v fe63458a51, co tomu říkáš @mj?

> Teď mě ještě napadlo, že by bylo asi výhodnější, umět tagname, atributy, ale i obsah overridenout, ale může tam být default, pak půjde i čášt kódu zjednodušit Provedeno v fe63458a51cb40cd3cf4bebbcd83ffd5185c7d21, co tomu říkáš @mj?
jan referenced this issue from a commit 10 months ago
jan referenced this issue from a commit 10 months ago
Owner

Stejná otázka, není mi moc jasné, proč z escapování dělat nějaké výjimky, nadměrné escapování nemůže uškodit, ne?

U obojího především čitelnost vygenerovaného HTML.

Co je možná zajímavé dodat je, že normální uvozovky se vzhledem k chytrému uvozovkovátku v textu spíše neobjeví, takže se jich tolik neescapuje.

To máš pravdu, tohle činí můj komentář podstatně méně zajímavým :)

Taková metoda existuje?

Pardon, tagname jsem přehlédl a další příklad teď nevidím.

> Stejná otázka, není mi moc jasné, proč z escapování dělat nějaké výjimky, nadměrné escapování nemůže uškodit, ne? U obojího především čitelnost vygenerovaného HTML. > Co je možná zajímavé dodat je, že normální uvozovky se vzhledem k chytrému uvozovkovátku v textu spíše neobjeví, takže se jich tolik neescapuje. To máš pravdu, tohle činí můj komentář podstatně méně zajímavým :) > Taková metoda existuje? Pardon, tagname jsem přehlédl a další příklad teď nevidím.
Owner

Také z toho mám poměrně dobrý první dojem. HTML generátor vypadá použitelné, na TeXovém to bude chtít ještě zapracovat (pokud dobře chápu, tak momentálně ždný použitelný není).

Také z toho mám poměrně dobrý první dojem. HTML generátor vypadá použitelné, na TeXovém to bude chtít ještě zapracovat (pokud dobře chápu, tak momentálně ždný použitelný není).
Owner

Také z toho mám poměrně dobrý první dojem. HTML generátor vypadá použitelné, na TeXovém to bude chtít ještě zapracovat (pokud dobře chápu, tak momentálně ždný použitelný není).

Také z toho mám poměrně dobrý první dojem. HTML generátor vypadá použitelné, na TeXovém to bude chtít ještě zapracovat (pokud dobře chápu, tak momentálně ždný použitelný není).
Poster

pokud dobře chápu, tak momentálně ždný použitelný není

Tak jest. LaTeXGenerator je intenzivně WIP záležitost.

> pokud dobře chápu, tak momentálně ždný použitelný není Tak jest. LaTeXGenerator je intenzivně WIP záležitost.
Sign in to join this conversation.
No Milestone
No project
No Assignees
3 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.