Předělat generování výstupu #13
Labels
No labels
ksp-implementace
No milestone
No project
No assignees
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: KSP/formatitko#13
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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.
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.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ímself.tagname(e)
a atributy získané zself.common_attributes(e)
. Nestačilo by, kdyby si tohle funkcegenerate_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ěkdywrite
... možná z toho udělat booleovský argument? Viz níže.) Možná by se také mohly jmenovat nějak intuitivněji. Třebastart_tag
?Podobně
iup
aidown
bych raději pojmenoval méně zkratkovitě. Třebaindent_up
aindent_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řebawrite
a jindywriteln
.)U metod, které obecný
OutputGenerator
volá, ale čeká, že je nadefinují až potomci (třebatagname
), 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 jakotext = 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 metodareplace
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.
Taková metoda existuje?
tagname
, který zmiňuješ, má implementaci tady. Souhlasím, že by měl OutputGenerator implementovat všechny metody, které čeká.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.
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.
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.Jasný, to zní líp.
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.
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?
Provedeno v
fe63458a51
, co tomu říkáš @mj?U obojího především čitelnost vygenerovaného HTML.
To máš pravdu, tohle činí můj komentář podstatně méně zajímavým :)
Pardon, tagname jsem přehlédl a další příklad teď nevidím.
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í).
Tak jest. LaTeXGenerator je intenzivně WIP záležitost.