Прачытаю потым: цяжкі лёс афлайнавай калекцыі інтэрнэт-старонак

Ёсць віды софту, без якога адны людзі жыць не могуць, а іншыя нават не ўяўляюць, што такое існуе і камусьці ўвогуле трэба. Для мяне доўгія гады такой праграмай быў Macropool WebResearch, які дазваляў захоўваць, чытаць і арганізоўваць інтэрнэт-старонкі ў нейкае падабенства афлайнавай бібліятэкі. Упэўнены, многія з чытачоў выдатна абыходзяцца калекцыяй спасылак або камбінацыяй браўзэра і тэчкі з наборам захаваных дакументаў. Мне ж хацелася б мець магчымасць хаця б адзначаць дакументы як "прачытаныя" ці "выбраныя", хутка пераходзіць ад аднаго тэксту да іншага і не залежаць ад даступнасці інтэрнэту ці канкрэтнага сайта. Бывае, што чытаць ёсць час роўна тады, калі інтэрнэту няма (у дарозе, напрыклад), ды і спасылкі, нажаль, нярэдка апыняюцца недаўгавечнымі.

Відаць, прыкладна на такіх людзей і разлічвалі аўтары WebResearch. Гэтая праграма была нашпігавана самымі разнастайнымі функцыямі: каталагізацыя па раздзелах і па тэгах, рэдагаванне нататак, разнастайныя віды экспарту/імпарту і гэтак далей. Аднак прыкладна да 2013 года праект перастаў абнаўляцца, а затым спыніў існаванне і сайт распрацоўшчыка. Яшчэ некалькі гадоў мне ўдавалася катацца на гэтым коніку, але спачатку адваліліся браузерные плагіны (даступныя толькі для тагачасных версій IE і FireFox), а затым і сучасныя сайты перасталі нармальна адлюстроўвацца ў праглядніку на аснове старога IE-рухавічка.

Прачытаю потым: цяжкі лёс афлайнавай калекцыі інтэрнэт-старонак
Галоўнае акно WebResearch, PC Week/RE №17 (575)

Дарога расчараванняў

Як толькі стала зразумела, што замены не пазбегнуць, я ў фонавым рэжыме ўзяўся за пошук прыстойнага аналага. Мне здавалася, асаблівых складанасцяў тут не будзе, паколькі жаданні мае вельмі сціплыя. Я быў гатовы абыйсціся толькі малым падмноствам сродкаў WebResearch, якія ўключаюць у сябе:

  • захаванне HTML старонкі з браўзэра з дапамогай пашырэння;
  • хаця б мінімальныя сродкі каталагізацыі (перайменаванне, арганізацыя каталогаў, пазнакі);
  • (пажадана) падтрымка PDF дакументаў;
  • любы ніштаваты спосаб сінхранізацыі калекцыі з іншымі прыладамі.

Да майго здзіўлення, нічога падобнага мне знайсці так і не атрымалася, хоць я сапраўды аблазіў інтэрнэт уздоўж і папярок і ўважліва вывучыў з дзясятак падыходных па анатацыі праграм (за выключэннем Evernote, дзе падобная па апісанні функцыянальнасць даступная толькі па падпісцы). На сённяшні дзень хоць неяк задавальняюць маім пажаданням хіба што праекты. TagSpaces и myBase. Іх вывучэнне, наогул кажучы, уяўляе пэўную культуралагічную цікавасць.

TagSpaces – гэта такі вось "стыльны-модны-моладзевы" арганайзэр на Electron з прыгожым сайтам, адаптыўнай вёрсткай і, вядома, цёмнай тэмай, куды ж без яе. Пры гэтым злашчасны змест калекцыі c моднымі закругленымі значкамі займае палову экрана, змяшчаючы пры гэтым штук дваццаць элементаў максімум, а базавыя штукі накшталт падтрымкі гарачых клавіш або рэндэрынгу праглядаемага дакумента пішуцца па рэшткавым прынцыпе. У выніку дакументы адлюстроўваюцца крыва, а праца з калекцыяй ператвараецца ў сумны і працаёмкі комплекс практыкаванняў з мышшу.

Яго антыпод myBase родам з канца дзевяностых: тут апроч чыста функцыянальнага інтэрфейсу мы маем вельмі багаты набор налад і функцый. Аднак у якасці акна прагляду тут выступае ўсё той жа браўзэр на аснове старога IE (што ўжо робіць чытанне цяжкім), а ўсе дакументы захоўваюцца ў маналітнай базе дадзеных. Калі яе пакласці ў тэчку Dropbox, напрыклад (іншых спосабаў сінхранізацыі з іншымі прыладамі ўсё роўна няма), то пры найменшай змене калекцыі даводзіцца чакаць запампоўвання на сервер сотняў мегабайт інфармацыі.

Паваротны момант

Верагодна, далейшы змест нататкі чытачу ўяўляецца відавочным: цяпер нам прапануюць уласны ровар, які, вядома, апынецца на галаву вышэй любога існуючага аналага. Як бы так, але не зусім. Я сапраўды не вытрымаў пакут з myBase і TagSpaces і накідаў уласны мэнэджар дакументаў, спасылку на які прывяду бліжэй да канца. Аднак гэты дробны праект для асабістых патрэб сам па сабе не заслугоўваў бы асобнага артыкула; я пішу ў большай ступені таму, што мне падалося цікавым падзяліцца досведам, атрыманым у працэсе працы, і цэлым шэрагам непрыемных сюрпрызаў, на якія я ніяк не разлічваў.

Мэты і задачы

Пачну з таго, што ў мяне зараз даволі напружанае жыццё, і часу на паўнавартасныя хобі-праекты проста няма. Таму з самага пачатку я вырашыў, што гатовы ляпіць сваю прыладу з любых кампанентаў, якія трапяцца пад руку, калі гэта дазволіць паскорыць справу. Акрамя таго, я пакуль што бяруся рэалізаваць толькі абсалютны мінімум функцыянальнасці, без якога абысціся ніяк нельга.

Фармат даных і захаванне старонак

У якім выглядзе захоўваць вэб-старонкі на дыску? З улікам раней сфармуляваных патрабаванняў мне здавалася, што выбар невялікі: альбо фармат захавання "вэб-старонка цалкам", гэта значыць асноўны HTML файл і тэчка са звязанымі рэсурсамі, альбо фармат MHTML. Першы варыянт мне адразу здаўся меней пераважным: невялікая радасць мець на кружэлцы памыйніцу з кучы файлаў, з якіх спатрэбіцца здабываць значныя дакументы, фільтраваць лішняе пры пошуку і сачыць за цэласнасцю пры капіяванні. Калі я спрабаваў працаваць з TagSpaces, мне прыйшлося перазахаваць усе свае дакументы так, каб імя тэчкі з рэсурсамі пачыналася з кропкі: тады сістэма распазнавала іх як "схаваныя" і не адлюстроўвала.

Гэтая праблема ўтоена з-пад увагі ў myBase, паколькі ўсё захоўваецца ў базе дадзеных, але ў маім выпадку прынцып прастаты ўзяў верх: вельмі жадалася захоўваць усё ў выглядзе звычайных файлаў на дыску, каб не прыйшлося займацца рэалізацыяй руцінных аперацый накшталт капіявання, перайменавання, выдаленні і сінхранізацыі .

Фармат MHTML перажывае не найлепшыя свае часы. Просты спосаб захоўваць MHTML быў выкінуты з Chrome гэтым летам, і я вось нават не ведаю, у чым зараз мяркуецца захоўваць старонкі? Зразумела, што магчымасць пакуль што нікуды не падзелася, ёсць іншыя пашырэнні, але ў цэлым гэта нейкая нядобрая прыкмета. Акрамя таго, захаванне ў фармаце MHTML не падтрымліваецца ў Chromium Embedded Framework, Што таксама не дадае аптымізму.

Раўналежна я стаў шукаць просты спосаб захавання старонак з браўзэра ў паказаную тэчку. У выніку абедзве праблемы ўдалося вырашыць малой крывёй: я натыкнуўся на выдатны праект Адзін файл, які ўмее захоўваць змесціва вэб-старонкі ў асобным незалежным HTML-файле. Робіцца гэта шляхам пераўтварэння ўсіх звязаных рэсурсаў у фармат base64 і ўкаранення непасрэдна ў HTML. Вядома, пры гэтым памер файла расце, ды і змесціва выглядае некалькі засмечаным, але ў цэлым падыход мне здаўся надзейным і простым, і я спыніўся на ім.

SingleFile пастаўляецца як у выглядзе браузернага пашырэння, так і ў выглядзе прыкладання каманднага радка. Цяпер я проста карыстаюся пашырэннем: гэта дастаткова зручна, калі не лічыць таго, што трэба ўручную выбіраць мэтавую тэчку для захавання. У будучыні, верагодна, пастараюся дапрацаваць дадатак, каб спрасціць гэты працэс. Для выкліку іншага прыкладання з Chrome можна выкарыстоўваць пашырэнне External Application Button - Гэта яшчэ адно маё карыснае адкрыццё. Дарэчы, прыкладанне ўжо прынесла карысць: з яго дапамогай я сканвертаваў калекцыю тэчак і файлаў з TagSpaces у набор самастойных HTML-дакументаў.

Клопаты з GUI і браўзэрам

Мне падалося, што для разнастайных простых аперацый з файламі і радкамі добра падыходзіць Python, а паколькі ў адным з маіх працоўных праектаў выкарыстоўваецца wxWidgets, выбар wxPython у якасці асноўнага фрэймворка выглядаў лагічным.

Далей, наглядзеўшыся на вушакі з адлюстраваннем старонак у іншых праграмах, я зрабіў для сябе выснову, што адзіны надзейны спосаб зладзіцца з імі – гэта ўкараніць у праграму візуалізатар на аснове сучаснага браўзэра, гэта значыць Chrome ці Firefox.

Павінен прызнацца, што ў апошні раз мне даводзілася займацца чым-небудзь падобным гадоў 15 таму, і я не чакаў ніякіх падвохаў. Аказалася, што "проста шлёпнуць браўзэр на форму" нельга: неяк вось чалавецтва не здолела надзейна і ўніверсальна зладзіцца з гэтай задачай. Які-небудзь listbox або кнопку на форму можна змясціць у любым GUI-фрэймворку, ды яшчэ і згенераваць кросплатформавы код, і мне здавалася, што ў 2019 году адлюстраванне HTML таксама павінна было быць паўсюдна вырашанай праблемай.

Аказалася, што ў wxWidgets, напрыклад, стандартны кампанент "браўзэр" з'яўляецца кросплатформавай абгорткай над сістэмна-залежным "браўзэрам", які ў выпадку Windows, напрыклад, азначае Internet Explorer 7, прычым сітуацыя ў Windows Forms ані не лепш, і версіі свежае IE9 даступныя толькі пры дапамозе нетрывіяльных маніпуляцый з рэестрам. Як бачыце, не я адзін займаўся апошнія 15 гадоў іншымі справамі - тут таксама з месца нічога не ссунулася.

Далей перада мной стаяў выбар: мяняць фрэймворк ці шукаць альтэрнатыўны кампанент для браўзэра. Павагаўшыся, я вырашыў паспрабаваць спачатку другі шлях і досыць хутка натыкнуўся на праект CEF Python: Python bindings for Chromium Embedded Framework, прызначаны роўна для задачы ўбудавання Chromium у прыкладанні на Python.

Ацэніце сітуацыю: Python з'яўляецца адной з самых папулярных моў праграмавання ў свеце, Chrome – па сутнасці манапаліст на рынку браўзэраў. Пры гэтым CEF Python фактычна падтрымліваецца энергіяй. аднаго хлопца, сіл і здароўя яму. Няўжо гэта больш нікому не патрэбна?

Зрэшты, мне CEF Python у выніку не дапамог: хоць нават базавы прыклад інтэграцыі з wxWidgets з рэпазітара праекту адкрыта глючыць, я паспрабаваў павазіцца з ім даўжэй, але так і не змог вырашыць усе праблемы. Нават не буду паглыбляцца ў тэму, ці наўрад яна таго заслугоўвае.

Я вывучыў падрабязней кампаненты на аснове Chromium Embedded Framework і ў выніку вырашыў паспрабаваць версію для C#. Паколькі працую я амаль увесь час з Windows, далягляд адмовіцца ад кросплатформеннасці мяне, увогуле, не асабліва бянтэжыла.

Пасля некаторай непазбежнай валтузні на старце справа пайшла значна хутчэй: звязак CefSharp і Windows Forms аказалася выйгрышнай, і мне ўдалося без асаблівых праблем вырашыць большасць пастаўленых тэхнічных задач.

Аб невыпрабаваным

У дадатак на C# можна паспрабаваць укараніць і FireFox, выкарыстоўваючы кампанент Geckofx, Але я пра яго нічога сказаць не магу. Стандартны браузерны кампанент фрэймворка Qt пад назвай QWebEngineView заснаваны на Chromium, Так што, верагодна, будзе працаваць не горш за CefSharp.

У аматараў Qt можа ўзнікнуць спакуса пракаментаваць: маўляў, браў бы Qt, не меў бы праблем. Магчыма, што так яно і ёсць, але і wxWidgets можна лічыць калі не першай, то другой опцыяй пры выбары GUI фрэймворка для прыкладанняў на Python ці C++. І на маю сціплую думку ўжо такая рэч як браўзэр павінна ўбудоўвацца ў любы больш-менш развіты GUI фрэймворк без скокаў з бубнам.

WebLibrary

Вернемся, аднак, да майго дадатку з працоўнай назвай WebLibrary. На сённяшні дзень выглядае яно (барабанны дроб) вось так:

Прачытаю потым: цяжкі лёс афлайнавай калекцыі інтэрнэт-старонак

Акрамя чыстага і лаканічнага інтэрфейсу тут рэалізаваны толькі самыя наібазавыя функцыі:

  • Адлюстраванне любога названага каталога ў сістэме як бібліятэкі дакументаў.
  • Прагляд дакументаў у акне браўзэра. Навігацыя па спісе звычайнай выявай (клавішы курсора, PgUp, PgDn, Home, End), прагортванне ў браўзэры клавішамі Space і Shift+Space.
  • Перайменаванне дакументаў.
  • Пазнака дакументаў як прачытаных ці абраных з дапамогай гарачых клавіш.
  • Сартаванне дакументаў па любым полі.
  • Абнаўленне акна прыкладання пры любых зменах у бібліятэчнай тэчцы.
  • Захаванне налад акна пры выхадзе.

Гэта ўсё можа здацца трывіяльнай функцыянальнасцю, але вось, скажам, захаванне памераў калонак у TagSpaces усё яшчэ не падтрымліваецца – мабыць, у аўтараў іншыя прыярытэты.

Статус (прачытана/абранае) папросту захоўваецца ў імені файла (прачытаны файл doc.html пераназываецца ў doc{R,S}.html). Сінхранізацыя як такая не рэалізаваная, але я папросту трымаю бібліятэку ў Dropbox - у рэшце рэшт, гэта ўсяго толькі тэчка з файламі.

У планах яшчэ дапрацаваць простыя рэчы накшталт перасоўванні і выдаленні файлаў, а таксама рэалізаваць пазнакі адвольнымі тэгамі. Калі хто захоча дапамагчы - буду толькі рады.

Высновы

Самыя розныя. Як я сказаў з самага пачатку, дзіўна, наколькі інструментарый аднаго чалавека можа адрознівацца ад інструментарыя другога. Для мяне скарыстацца сродкам накшталт WebResearch натуральна, і я адчуваў амаль фізічны дыскамфорт ад яго адсутнасці. Пры гэтым, мяркуючы па ўсім, аднадумцаў у мяне няшмат, інакш бы праблем з пошукам аналагаў не ўзнікла б. З іншага боку, аналагічныя выпадкі адбываюцца і з куды больш меінстрымным софтам: напрыклад, Microsoft не збіраецца абнаўляць дэсктопную версію OneNote, так што я змушаны карыстацца версіяй 2016 гады, і рана ці позна прыйдзецца з яе таксама кудысьці пераязджаць.

Яшчэ дзіўна тое, наколькі няпроста арыентавацца ў цяперашнім ландшафце бібліятэк і фрэймворкаў. Мне па абавязку службы рэдка даводзіцца пісаць дэсктопныя прыкладанні ад пачатку да канца, і я меркаваў, што для маёй задачы (адно акно, тры кампанента, трывіяльныя ўзаемадзеянні) падыдзе літаральна любая прылада для любой мовы праграмавання. Вось прама бярэм што заўгодна і на працягу некалькіх дзён які робіцца.

Аказалася, што рэальнасць куды менш добразычлівая, і нарвацца на праблему можна проста на роўным месцы. Скажам, ёсць у мяне два splitter-а, з дапамогай якіх можна расцягнуць акно браўзэра. Дык вось, аднавіць іх пазіцыі пасля загрузкі ў wxWidgets вельмі няпроста, паколькі сістэма выстаўляе іх у пазіцыі па змаўчанні практычна пасля ўсіх даступных мне падзей, і даводзіцца займацца ўсялякім хакерствам, каб дамагчыся патрэбнага. Вось хто б меркаваў?

З іншага боку, відаць, што ў Windows Forms усё заменчана пад "бізнэс-інтэрфейсы". Практычна ўсё, што патрабавалася, апынулася даступна са скрынкі: і захаванне/аднаўленне налад прыкладання, і зручны інтэрфейс кампанентаў (скажам, не чакаў, што ў кампанента TreeView можна запытаць поўны шлях ад кораня да любога даччынага элемента ў выглядзе радка), і нетрывіяльныя сродкі накшталт адсочвальніка змен змесціва.

У любым выпадку час выдаткавана не дарма, а вынік можна прызнаць здавальняючым, дык чаго ж яшчэ жадаць ад жыцця, праўда?

Крыніца: habr.com

Купіць надзейны хостынг для сайтаў з абаронай ад DDoS, VPS VDS серверы 🔥 Купіць надзейны хостынг для сайтаў з абаронай ад DDoS, VPS VDS серверы | ProHoster