LinuxOS novinky 44. týždeň 2015
Ďalší príspevok zo zákulisia vývoja LinuxOS.sk je tu. Tentoraz o editácii.
Vizuálny editor je často kritizovanou časťou LinuxOS.sk. Jeho výmena bola plánovaná pomerne dlho. Keďže sa nikto nechytil úpravy kódu zostala celá práca na mne. Pred pár dňami som teda z README vymazal poznámku o editore a pustil sa do práce.
V python kóde reprezentujú editor 2 databázové polia - RichTextOriginalField (zapisuje do db presne to, čo používateľ vloží s príznakom formátu napr. "html") a RichTextFilteredField (zapisuje do db upravenú verziu ošetrenú voči XSS). Názov RichText nie je náhodný, tento systém totiž podporuje zásuvné parsery textu, takže nie je problém vymeniť HTML za Markdown, alebo dať používateľovi možnosť v čom písať príspevok. Zatiaľ som sa rozhodol ponechať len HTML, takže jediné čoho sa bol potrebné dotknúť pri výmene editora bol javascript a css.
Momentálne (v aktuálnom git repozitári) je na výber surový HTML editor (textarea, do ktorej sa vkladá zdroják) a CKEditor. Predvolený bude surový editor. Možnosť dať štandardne CKEditor som zvažoval tiež, ale mať na písanie príspevku štandardne 0.5MB javascriptu nie je najšťastnejšie riešenie.
Prepínanie editorov je kapitola sama o sebe. V staršej verzii shakala to nikdy nefungovalo poriadne ... lebo som prasa, ktoré nevie napísať ukladanie cookies. V novej verzii by malo spárvne zaznamenať naposledy použitý editor a ten použiť (nastavenie je samostatné pre admin a užívateľske rozhranie, takže bude možné upravovať články cez admin rovno ako zdroják a pritom mať pri písaní komentárov wysiwyg). Načítavanie CKEditoru je lazy, takže ak je zvolený jednoduchý editor vôbec sa CKEditor nenačíta.
Čo zač je CKEditor si každý môže pozrieť na webe projektu. Čo sa týka integrácie do LinuxOS.sk ... robil som čo sa dalo. Momentálne je podporované skrývanie nepodporovaných tlačidiel pre daný typ obsahu (napr. v komentároch nie je možné vložiť obrázok) a v náhľade sa všetky nepodporované tagy zobrazia s červeným orámovaním.
Editor kódu je trochu iné kafé. Na začiatok pár screenshotov:
Celý kód je písaný vo vanilla js (teda bez akýchkoqvek frameworkov). Niektoré funkcie už začínajú vyzerať podľa mojich predstáv. Chýba zatiaľ skrývanie nepodporovaných funkcií. Spokojný nie som so spracovaním udalostí (zbytočné zneužívanie onmousedown namiesto onclick, v niektorých browseroch to robí problém).
Editor možno vyzerá moc veľký, ale je to okolo 600 riadkov pomerne rýchleho js kódu. CSS a ikony sú vykradnuté z CKEditoru (je tam poznámka).
Jedno z možných vylepšení, ktoré zvažujem do budúcnosti je zvýrazňovanie syntaxe. Nemyslím teraz tie monštrá ako codemirror, ale skôr hack ako LDT.
Posledná drobnosť, nad ktorou som tiež ešte rozmýšľal bola možnosť pridať zvýrazňovanie syntaxe v tagoch pre
podobne ako to je na abclinuxu.cz. Zvýrazňovanie by nebolo client side, ale server side (pravdepodobne pygments). To, čo majú na abclinuxu.cz nepovažujem za práve najšťastnejšie. Dlhšie zdrojáky parsuje veľmi dlho a niekedy má problém vôbec načítať web ak je v zdrojáku chyba syntaxe.
Pre pridávanie komentárov sa musíte prihlásiť.
Ten editor vyzerá famózne a dík za vanilku. Mňa osobne vie web spoľahlivo odradiť pokiaľ niekto veselo kvôli pár riadkovému kódu naťahá tony frameworkov, pluginov a aj 3GHz dvojjadro vyletí na 100%.
Riešiť zvýraznenie syntaxe na strane užívateľa pokladám za výborný nápad, zas plus pre užívateľa.
Čo sa mi nezdá ako dobrý nápad, všetko ukladať dva krát, zdrojový aj filtrovaný výstup, alebo som to nepochopil?
Ja výstup parsujem na servery a réžia je zanedbateľná. Som ti to tuším spomínal. Teraz používam kvázi BB sysntax [pre]text[/pre].
Má to výhodu, nedá sa tam dostať žiadny škodlivý kód páč všetko medzi < a > sa eskejpuje.
Žiaden škodlivý kód sa nedá dostať ani tým systémom, ktorý používam ja. Originál aj vyrenderovaná verzia sú v db pretože originál tam musí zostať kvôli možnosti editácie a vyrenderovaná verzia sa nesmie zmeniť pri zmene algoritmu renderovania. Mnoho fór na phpbb a podobných trpí problémom, že pri upgrade jednoducho prestali v starších príspevkoch fungovať niektoré tagy, alebo odkazy pretože sa zmenil algoritmus. Ja som chcel zachovať plnú funkčnosť starších príspevkov aj v prípade keď by sa zmenil algoritmus (a ten sa zmenil už mnoho krát). S renderovaním pri každom requeste by som buď musel zabetónovať súčasný stav (čo nechcem) alebo sa zmieriť s tým, že staršie príspevky rozbijem (čo tak isto nechcem).
Obe verzie teda neukladám kvôli výkonu, ale kvôli flexibilite. Zväčší to síce o niečo databázu, ale momentálne databáza nie je úzkym hrdlom a keby aj bola nie je problém zmeniť storage pre originálny obsah (síce sa tým spomalí prístup k originálnemu obsahu, ale na ten nehrabem skoro nikdy, takže sa tým vlastne db operácie zrýchlia).
phpBB má fakt hrozné skripty na upgrade ktoré spoľahlivo rozbili staršie verzie príspevkov, za to ale nemôže syntax, ale práve tie upgradovacie skripty a autor čo ich písal.
Výhodu vidím hlavne v tom, že tam naleješ skripty a html bez úpravy, väčšina kódu z iných jazykov prebehne rovnako hladko a prakticky nič neriešiš, teda treba si zas dať majzla aby sa niečo typu [script] nepreložilo na <script>.
Inak novinky má tešia bratm.
Teda eskejpuje sa to pri renderingu, pretože sa všetko ukladá tak, ako to bolo napísané.
Na niektoré veci používam predrenderované veci, rozmýšľam či to rozšírim na viacero vecí, alebo len použijem nejakú cache.
Kurwa omyl myslel, som syntax riešiť na strane serveru je výborný nápad.