„Prečítam si to neskôr“: ťažký osud offline zbierky internetových stránok

Existujú typy softvéru, bez ktorých niektorí ľudia nemôžu žiť, zatiaľ čo iní si nevedia ani predstaviť, že niečo také existuje alebo že to vôbec niekto potrebuje. Pre mňa bol tento program dlhé roky Macropool WebResearch, ktorá umožňovala ukladať, čítať a organizovať internetové stránky do akejsi offline knižnice. Som si istý, že mnohí naši čitatelia si v pohode vystačia so zbierkou odkazov alebo kombináciou prehliadača a priečinka so sadou uložených dokumentov. Chcel by som mať možnosť aspoň označiť dokumenty ako „prečítané“ alebo „obľúbené“, rýchlo prechádzať z jedného textu na druhý a nezávisieť od dostupnosti internetu alebo konkrétnej stránky. Stáva sa, že je čas na čítanie presne vtedy, keď nie je internet (napríklad na cestách) a odkazy, žiaľ, často nie sú dlhé.

S približne týmito ľuďmi zrejme autori WebResearch rátali. Tento program bol nabitý širokou škálou funkcií: katalogizácia podľa sekcií a značiek, úprava poznámok, všetky druhy exportu/importu atď. Okolo roku 2013 sa však projekt prestal aktualizovať a webová stránka vývojára potom prestala existovať. Ešte niekoľko rokov sa mi na tomto koni darilo jazdiť, no najskôr odpadli pluginy prehliadača (dostupné len pre vtedajšie verzie IE a FireFox) a potom sa moderné stránky prestali normálne zobrazovať v prehliadači založenom na starom IE engine.

„Prečítam si to neskôr“: ťažký osud offline zbierky internetových stránok
Hlavné okno WebResearch, PC týždeň/RE č. 17 (575)

Cesta sklamania

Hneď ako bolo jasné, že sa nedá vyhnúť náhrade, v pozadí som začal hľadať slušný analóg. Zdalo sa mi, že tu nebudú žiadne zvláštne ťažkosti, pretože moje túžby sú mimoriadne skromné. Bol som pripravený vystačiť si len s malou podskupinou nástrojov WebResearch, vrátane:

  • uloženie stránky HTML z prehliadača pomocou rozšírenia;
  • aspoň minimálne katalogizačné nástroje (premenovanie, organizovanie katalógov, štítky);
  • (prednostne) podpora dokumentov PDF;
  • akýkoľvek slušný spôsob synchronizácie zbierky s inými zariadeniami.

Na moje prekvapenie sa mi nič podobné nepodarilo nájsť, hoci som poctivo brázdil internet široko-ďaleko a pozorne som si preštudoval tucet programov, ktoré sa zhodovali s anotáciami (s výnimkou Evernote, kde je funkcionalita podobná popisom dostupná len na základe predplatného). Dnes jediné, čo aspoň ako-tak uspokojuje moje priania, sú projekty TagSpaces и myBase. Ich štúdium má vo všeobecnosti určitý kultúrny záujem.

TagSpaces je taký “štýlovo-módny-mládežnícky” organizér na Electrone s krásnou webstránkou, adaptívnym rozložením a samozrejme tmavou témou, kde by sme bez neho boli. Nešťastný obsah kolekcie s módnymi zaoblenými ikonami zároveň zaberá polovicu obrazovky, pričom pojme nanajvýš dvadsať prvkov a píšu sa základné veci ako podpora klávesových skratiek alebo vykreslenie prezeraného dokumentu. podľa zvyškového princípu. V dôsledku toho sa dokumenty zobrazujú krivo a práca s kolekciou sa mení na nudné a časovo náročné cvičenia s myšou.

Jeho antipód myBase pochádza z konca deväťdesiatych rokov: tu okrem čisto funkčné rozhranie máme mimoriadne bohatú sadu nastavení a funkcií. Zobrazovacím oknom je tu však rovnaký prehliadač založený na starom IE (ktorý už sťažuje čítanie) a všetky dokumenty sú uložené v monolitickej databáze. Ak ho vložíte napríklad do priečinka Dropbox (stále neexistujú žiadne iné spôsoby synchronizácie s inými zariadeniami), potom pri najmenšej zmene v kolekcii musíte počkať, kým sa na server nenahrajú stovky megabajtov informácií.

Moment otáčania

Pravdepodobne sa čitateľovi zdá ďalší obsah poznámky zrejmý: teraz nám ponúkneme vlastný bicykel, ktorý bude, samozrejme, hlavou a ramenami nad akýmkoľvek existujúcim analógom. Asi áno, ale nie celkom. Naozaj som nemohol vydržať utrpenie s myBase a TagSpaces a načrtol som si vlastného správcu dokumentov, odkaz na ktorý uvediem na konci. Tento malý osobný projekt by si však sám o sebe nezaslúžil vlastný článok; Píšem z veľkej časti preto, lebo som si myslel, že by bolo zaujímavé podeliť sa o skúsenosti, ktoré som počas svojej práce nadobudol, a množstvo nepríjemných prekvapení, ktoré som nikdy nečakal.

Ciele a ciele

Začnem tým, že teraz mám dosť zaneprázdnený život a na plnohodnotné hobby projekty jednoducho nemám čas. Preto som sa od samého začiatku rozhodol, že som pripravený vyrezať svoj nástroj z akýchkoľvek komponentov, ktoré mi prídu pod ruku, ak to urýchli veci. Navyše sa zatiaľ zaväzujem implementovať len absolútne minimum funkcionality, bez ktorej sa absolútne nedá.

Formát údajov a ukladanie stránky

V akej forme majú byť webové stránky uložené na disku? Vzhľadom na predtým formulované požiadavky sa mi zdalo, že výber bol malý: buď formát uloženia „celej webovej stránky“, teda hlavný súbor HTML a priečinok s pridruženými zdrojmi, alebo formát MHTML. Prvá možnosť sa mi hneď zdala menej výhodná: mať na disku kopu súborov, z ktorých budete musieť extrahovať významné dokumenty, odfiltrovať nepotrebné pri vyhľadávaní a sledovať integritu pri kopírovaní, je malá radosť. Keď som sa pokúšal pracovať s TagSpaces, musel som znova uložiť všetky svoje dokumenty tak, aby názov priečinka zdrojov začínal bodkou: potom ich systém rozpoznal ako „skryté“ a nezobrazil ich.

Tento problém je v myBase skrytý, keďže všetko je uložené v databáze, no v mojom prípade zvíťazil princíp jednoduchosti: naozaj som chcel všetko uložiť ako bežné súbory na disk, aby som sa nemusel zaoberať implementáciou rutinné operácie ako kopírovanie, premenovanie, mazanie a synchronizácia.

Formát MHTML prechádza ťažkými časmi. Jednoduchý spôsob, ako uložiť MHTML bolo toto leto vyhodené z prehliadača Chrome, a ani neviem, kde majú byť stránky teraz uložené? Je jasné, že príležitosť ešte nezmizla, existujú rozšírenia tretích strán, ale vo všeobecnosti je to nejaké zlé znamenie. Navyše ukladanie vo formáte MHTML nie je podporované v rámci Chromium Embedded Framework, čo tiež optimizmu nepridáva.

Zároveň som začal hľadať jednoduchý spôsob, ako uložiť stránky z prehliadača do určeného priečinka. Výsledkom bolo, že oba problémy boli vyriešené s malými stratami: narazil som na úžasný projekt Jeden súbor, schopný uložiť obsah webovej stránky do samostatného nezávislého súboru HTML. To sa dosiahne konverziou všetkých súvisiacich zdrojov do formátu base64 a ich vložením priamo do HTML. Veľkosť súboru sa samozrejme zväčšuje a obsah vyzerá trochu neprehľadne, ale celkovo sa mi tento prístup zdal spoľahlivý a jednoduchý a usadil som sa na ňom.

SingleFile prichádza ako rozšírenie prehliadača aj ako aplikácia príkazového riadku. Teraz používam len rozšírenie: je to celkom pohodlné, s výnimkou skutočnosti, že musíte manuálne vybrať cieľový priečinok na uloženie. V budúcnosti sa pravdepodobne pokúsim aplikáciu vylepšiť, aby som tento proces zjednodušila. Ak chcete zavolať aplikáciu tretej strany z prehliadača Chrome, môžete použiť rozšírenie Externé aplikačné tlačidlo - to je ďalší môj užitočný objav. Mimochodom, aplikácia už bola užitočná: s jej pomocou som previedol zbierku priečinkov a súborov z TagSpaces na sadu nezávislých HTML dokumentov.

Problémy s GUI a prehliadačom

Zistil som, že Python je dobrý na všetky druhy jednoduchých operácií so súbormi a reťazcami, a keďže jeden z mojich pracovných projektov používa wxWidgety, výber wxPython sa zdalo logické ako hlavný rámec.

Ďalej, keď som videl dosť problémov so zobrazovaním stránok v iných programoch, dospel som k záveru, že jediný spoľahlivý spôsob, ako sa s nimi vysporiadať, je zaviesť do programu vizualizér založený na modernom prehliadači, teda Chrome alebo Firefox.

Musím sa priznať, že naposledy som niečo také musel urobiť asi pred 15 rokmi a nečakal som žiadne úskalia. Ukázalo sa, že nie je možné „len plácnuť prehliadač do formulára“: ľudstvo sa s touto úlohou nejako nedokázalo spoľahlivo a univerzálne vyrovnať. Nejaký zoznam alebo tlačidlo na formulári je možné umiestniť do ľubovoľného rámca GUI a dokonca generovať multiplatformový kód a zdalo sa mi, že v roku 2019 malo byť zobrazenie HTML tiež univerzálne vyriešeným problémom.

Ukázalo sa, že napríklad vo wxWidgets je štandardným komponentom „prehliadač“ multiplatformový obal nad systémovo závislým „prehliadačom“, čo v prípade Windows napr. Internet Explorer 7a situácia v systéme Windows Forms nie je o nič lepšia a verzie novšie ako IE9 sú dostupné iba pomocou netriviálnych manipulácia s registrami. Ako vidíte, nie som jediný, kto posledných 15 rokov robil iné veci – ani tu sa nič nepohlo.

Potom som stál pred voľbou: zmeniť framework alebo hľadať alternatívny komponent pre prehliadač. Po váhaní som sa rozhodol najprv vyskúšať druhú cestu a rýchlo som natrafil na projekt CEF Python: Python väzby pre Chromium Embedded Framework, navrhnutý špeciálne pre úlohu vkladania Chromia do aplikácií Python.

Posúďte situáciu: Python je jedným z najpopulárnejších programovacích jazykov na svete, Chrome je v podstate monopolistom na trhu prehliadačov. Zároveň je CEF Python v skutočnosti podporovaný energiou jeden chlap, silu a zdravie jemu. To už fakt nikto nepotrebuje?...

CEF Python mi však nakoniec nepomohol: hoci aj základný príklad integrácie s wxWidgets z projektového repozitára je úprimne zabugovaný, snažil som sa v ňom pohrať viac, ale nepodarilo sa mi vyriešiť všetky problémy, ktoré sa vyskytli. Nebudem ani zachádzať hlbšie do témy, sotva si to zaslúži.

Pozrel som sa na komponenty založené na Chromium Embedded Framework podrobnejšie a nakoniec som sa rozhodol to vyskúšať verzia pre C#. Keďže takmer stále pracujem so systémom Windows, perspektíva vzdať sa funkcií viacerých platforiem ma vo všeobecnosti nijako neobťažovala.

Po istom nevyhnutnom rozruchu na začiatku to išlo oveľa rýchlejšie: kombinácia CefSharp a Windows Forms sa ukázala ako víťazná a väčšinu technických problémov som dokázal vyriešiť bez problémov.

O nevyskúšanom

Môžete tiež skúsiť implementovať FireFox do aplikácie C# pomocou komponentu Geckofxale nemôžem o ňom nič povedať. Štandardná súčasť prehliadača rámca Qt tzv QWebEngineView založený v prehliadači Chromium, tak to bude pravdepodobne fungovať rovnako ako CefSharp.

Fanúšikovia Qt môžu byť v pokušení vyjadriť sa: keby si vzali Qt, nemali by žiadne problémy. To môže byť pravda, ale wxWidgets možno zvážiť, ak nie prvú, tak druhú možnosť pri výbere GUI frameworku pre aplikácie v Pythone alebo C++. A podľa môjho skromného názoru by taká vec, ako je prehliadač, mala byť zabudovaná do akéhokoľvek viac či menej vyvinutého GUI frameworku bez tancovania s tamburínou.

WebLibrary

Vráťme sa však k mojej žiadosti s pracovným názvom WebLibrary. Dnes to vyzerá (bubnová rola) takto:

„Prečítam si to neskôr“: ťažký osud offline zbierky internetových stránok

Okrem čisté a stručné rozhranie Tu sú implementované iba najzákladnejšie funkcie:

  • Zobrazte ľubovoľný zadaný adresár v systéme ako knižnicu dokumentov.
  • Zobrazenie dokumentov v okne prehliadača. Prechádzajte zoznamom obvyklým spôsobom (kurzorové klávesy, PgUp, PgDn, Home, End), prechádzajte prehliadačom pomocou klávesov Space a Shift+Space.
  • Premenovanie dokumentov.
  • Označte dokumenty ako prečítané alebo obľúbené pomocou klávesových skratiek.
  • Triedenie dokumentov podľa ľubovoľného poľa.
  • Obnoví okno aplikácie, keď dôjde k zmenám v priečinku knižnice.
  • Pri ukončení uložte nastavenia okna.

Toto všetko sa môže zdať ako triviálna funkcia, ale povedzme, že ukladanie veľkostí stĺpcov v TagSpaces stále nie je podporované - autori majú zrejme iné priority.

Stav (prečítané/obľúbené) sa jednoducho uloží do názvu súboru (prečítaný súbor doc.html premenovaný na doc{R,S}.html). Synchronizácia ako taká neexistuje, ale knižnicu jednoducho uchovávam v Dropboxe - je to predsa len priečinok so súbormi.

Stále existujú plány na zlepšenie jednoduchých vecí, ako je presúvanie a odstraňovanie súborov, ako aj implementácia označovania ľubovoľnými značkami. Ak chce niekto pomôcť, budem len rád.

Závery

Rozmanitosť. Ako som povedal na začiatku, je úžasné, ako odlišná môže byť súprava nástrojov jednej osoby od inej. Používanie nástroja ako WebResearch je pre mňa prirodzené a z jeho absencie som pociťoval takmer fyzické nepohodlie. Zároveň, zdá sa, mám málo podobne zmýšľajúcich ľudí, inak by neboli problémy s hľadaním analógov. Na druhej strane, podobné prípady sa vyskytujú pri oveľa bežnejšom softvéri: Microsoft sa napríklad nechystá aktualizovať desktopovú verziu OneNotu, takže som nútený používať verziu 2016 a skôr či neskôr budem musieť prejsť aj z to niekde.

Prekvapivé je aj to, aké ťažké je orientovať sa v súčasnej krajine knižníc a rámcov. V mojej práci som len zriedka musel písať desktopové aplikácie od začiatku do konca a predpokladal som, že pre moju úlohu bude vhodný doslova akýkoľvek nástroj pre akýkoľvek programovací jazyk (jedno okno, tri komponenty, triviálne interakcie). Takže vezmeme čokoľvek a urobíme to v priebehu niekoľkých dní.

Ukázalo sa, že realita je oveľa menej benevolentná a jednoducho z ničoho nič môžete naraziť na problém. Povedzme, že mám dva rozdeľovače, ktoré sa dajú použiť na roztiahnutie okna prehliadača. Obnovenie ich pozícií po načítaní do wxWidgets je teda mimoriadne náročné, keďže systém ich takmer po všetkých udalostiach, ktoré mám k dispozícii, umiestni do predvolených pozícií a ja musím robiť všemožné hackovanie, aby som dosiahol to, čo potrebujem. Kto by to tušil?

Na druhej strane je jasné, že vo Windows Forms je všetko navrhnuté pre „obchodné rozhrania“. Takmer všetko, čo bolo potrebné, bolo k dispozícii hneď po vybalení: uloženie/obnovenie nastavení aplikácie, pohodlné rozhranie komponentov (napríklad som nečakal, že komponent TreeView môže byť požiadaný o úplnú cestu od koreňového k akémukoľvek podradenému prvku vo forme reťazca) a netriviálne nástroje, ako je nástroj na sledovanie zmien obsahu priečinka.

V každom prípade, čas nebol stratený a výsledok možno považovať za uspokojivý, tak čo viac si od života priať, že?

Zdroj: hab.com

Pridať komentár