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

Галоўнае акно WebResearch,
Дарога расчараванняў
Як толькі стала зразумела, што замены не пазбегнуць, я ў фонавым рэжыме ўзяўся за пошук прыстойнага аналага. Мне здавалася, асаблівых складанасцяў тут не будзе, паколькі жаданні мае вельмі сціплыя. Я быў гатовы абыйсціся толькі малым падмноствам сродкаў WebResearch, якія ўключаюць у сябе:
- захаванне HTML старонкі з браўзэра з дапамогай пашырэння;
- хаця б мінімальныя сродкі каталагізацыі (перайменаванне, арганізацыя каталогаў, пазнакі);
- (пажадана) падтрымка PDF дакументаў;
- любы ніштаваты спосаб сінхранізацыі калекцыі з іншымі прыладамі.
Да майго здзіўлення, нічога падобнага мне знайсці так і не атрымалася, хоць я сапраўды аблазіў інтэрнэт уздоўж і папярок і ўважліва вывучыў з дзясятак падыходных па анатацыі праграм (за выключэннем Evernote, дзе падобная па апісанні функцыянальнасць даступная толькі па падпісцы). На сённяшні дзень хоць неяк задавальняюць маім пажаданням хіба што праекты. и . Іх вывучэнне, наогул кажучы, уяўляе пэўную культуралагічную цікавасць.
TagSpaces – гэта такі вось "стыльны-модны-моладзевы" арганайзэр на Electron з прыгожым сайтам, адаптыўнай вёрсткай і, вядома, цёмнай тэмай, куды ж без яе. Пры гэтым злашчасны змест калекцыі c моднымі закругленымі значкамі займае палову экрана, змяшчаючы пры гэтым штук дваццаць элементаў максімум, а базавыя штукі накшталт падтрымкі гарачых клавіш або рэндэрынгу праглядаемага дакумента пішуцца па рэшткавым прынцыпе. У выніку дакументы адлюстроўваюцца крыва, а праца з калекцыяй ператвараецца ў сумны і працаёмкі комплекс практыкаванняў з мышшу.
Яго антыпод myBase родам з канца дзевяностых: тут апроч чыста функцыянальнага інтэрфейсу мы маем вельмі багаты набор налад і функцый. Аднак у якасці акна прагляду тут выступае ўсё той жа браўзэр на аснове старога IE (што ўжо робіць чытанне цяжкім), а ўсе дакументы захоўваюцца ў маналітнай базе дадзеных. Калі яе пакласці ў тэчку Dropbox, напрыклад (іншых спосабаў сінхранізацыі з іншымі прыладамі ўсё роўна няма), то пры найменшай змене калекцыі даводзіцца чакаць запампоўвання на сервер сотняў мегабайт інфармацыі.
Паваротны момант
Верагодна, далейшы змест нататкі чытачу ўяўляецца відавочным: цяпер нам прапануюць уласны ровар, які, вядома, апынецца на галаву вышэй любога існуючага аналага. Як бы так, але не зусім. Я сапраўды не вытрымаў пакут з myBase і TagSpaces і накідаў уласны мэнэджар дакументаў, спасылку на які прывяду бліжэй да канца. Аднак гэты дробны праект для асабістых патрэб сам па сабе не заслугоўваў бы асобнага артыкула; я пішу ў большай ступені таму, што мне падалося цікавым падзяліцца досведам, атрыманым у працэсе працы, і цэлым шэрагам непрыемных сюрпрызаў, на якія я ніяк не разлічваў.
Мэты і задачы
Пачну з таго, што ў мяне зараз даволі напружанае жыццё, і часу на паўнавартасныя хобі-праекты проста няма. Таму з самага пачатку я вырашыў, што гатовы ляпіць сваю прыладу з любых кампанентаў, якія трапяцца пад руку, калі гэта дазволіць паскорыць справу. Акрамя таго, я пакуль што бяруся рэалізаваць толькі абсалютны мінімум функцыянальнасці, без якога абысціся ніяк нельга.
Фармат даных і захаванне старонак
У якім выглядзе захоўваць вэб-старонкі на дыску? З улікам раней сфармуляваных патрабаванняў мне здавалася, што выбар невялікі: альбо фармат захавання "вэб-старонка цалкам", гэта значыць асноўны HTML файл і тэчка са звязанымі рэсурсамі, альбо фармат MHTML. Першы варыянт мне адразу здаўся меней пераважным: невялікая радасць мець на кружэлцы памыйніцу з кучы файлаў, з якіх спатрэбіцца здабываць значныя дакументы, фільтраваць лішняе пры пошуку і сачыць за цэласнасцю пры капіяванні. Калі я спрабаваў працаваць з TagSpaces, мне прыйшлося перазахаваць усе свае дакументы так, каб імя тэчкі з рэсурсамі пачыналася з кропкі: тады сістэма распазнавала іх як "схаваныя" і не адлюстроўвала.
Гэтая праблема ўтоена з-пад увагі ў myBase, паколькі ўсё захоўваецца ў базе дадзеных, але ў маім выпадку прынцып прастаты ўзяў верх: вельмі жадалася захоўваць усё ў выглядзе звычайных файлаў на дыску, каб не прыйшлося займацца рэалізацыяй руцінных аперацый накшталт капіявання, перайменавання, выдаленні і сінхранізацыі .
Фармат MHTML перажывае не найлепшыя свае часы. Просты спосаб захоўваць MHTML , і я вось нават не ведаю, у чым зараз мяркуецца захоўваць старонкі? Зразумела, што магчымасць пакуль што нікуды не падзелася, ёсць іншыя пашырэнні, але ў цэлым гэта нейкая нядобрая прыкмета. Акрамя таго, захаванне ў фармаце MHTML , Што таксама не дадае аптымізму.
Раўналежна я стаў шукаць просты спосаб захавання старонак з браўзэра ў паказаную тэчку. У выніку абедзве праблемы ўдалося вырашыць малой крывёй: я натыкнуўся на выдатны праект , які ўмее захоўваць змесціва вэб-старонкі ў асобным незалежным HTML-файле. Робіцца гэта шляхам пераўтварэння ўсіх звязаных рэсурсаў у фармат base64 і ўкаранення непасрэдна ў HTML. Вядома, пры гэтым памер файла расце, ды і змесціва выглядае некалькі засмечаным, але ў цэлым падыход мне здаўся надзейным і простым, і я спыніўся на ім.
SingleFile пастаўляецца як у выглядзе браузернага пашырэння, так і ў выглядзе прыкладання каманднага радка. Цяпер я проста карыстаюся пашырэннем: гэта дастаткова зручна, калі не лічыць таго, што трэба ўручную выбіраць мэтавую тэчку для захавання. У будучыні, верагодна, пастараюся дапрацаваць дадатак, каб спрасціць гэты працэс. Для выкліку іншага прыкладання з Chrome можна выкарыстоўваць пашырэнне - Гэта яшчэ адно маё карыснае адкрыццё. Дарэчы, прыкладанне ўжо прынесла карысць: з яго дапамогай я сканвертаваў калекцыю тэчак і файлаў з TagSpaces у набор самастойных HTML-дакументаў.
Клопаты з GUI і браўзэрам
Мне падалося, што для разнастайных простых аперацый з файламі і радкамі добра падыходзіць Python, а паколькі ў адным з маіх працоўных праектаў выкарыстоўваецца , выбар у якасці асноўнага фрэймворка выглядаў лагічным.
Далей, наглядзеўшыся на вушакі з адлюстраваннем старонак у іншых праграмах, я зрабіў для сябе выснову, што адзіны надзейны спосаб зладзіцца з імі – гэта ўкараніць у праграму візуалізатар на аснове сучаснага браўзэра, гэта значыць Chrome ці Firefox.
Павінен прызнацца, што ў апошні раз мне даводзілася займацца чым-небудзь падобным гадоў 15 таму, і я не чакаў ніякіх падвохаў. Аказалася, што "проста шлёпнуць браўзэр на форму" нельга: неяк вось чалавецтва не здолела надзейна і ўніверсальна зладзіцца з гэтай задачай. Які-небудзь listbox або кнопку на форму можна змясціць у любым GUI-фрэймворку, ды яшчэ і згенераваць кросплатформавы код, і мне здавалася, што ў 2019 году адлюстраванне HTML таксама павінна было быць паўсюдна вырашанай праблемай.
Аказалася, што ў wxWidgets, напрыклад, стандартны кампанент "браўзэр" з'яўляецца кросплатформавай абгорткай над сістэмна-залежным "браўзэрам", які ў выпадку Windows, напрыклад, азначае , прычым сітуацыя ў Windows Forms ані не лепш, і версіі свежае IE9 даступныя толькі пры дапамозе нетрывіяльных . Як бачыце, не я адзін займаўся апошнія 15 гадоў іншымі справамі - тут таксама з месца нічога не ссунулася.
Далей перада мной стаяў выбар: мяняць фрэймворк ці шукаць альтэрнатыўны кампанент для браўзэра. Павагаўшыся, я вырашыў паспрабаваць спачатку другі шлях і досыць хутка натыкнуўся на праект , прызначаны роўна для задачы ўбудавання Chromium у прыкладанні на Python.
Ацэніце сітуацыю: Python з'яўляецца адной з самых папулярных моў праграмавання ў свеце, Chrome – па сутнасці манапаліст на рынку браўзэраў. Пры гэтым CEF Python фактычна падтрымліваецца энергіяй. , сіл і здароўя яму. Няўжо гэта больш нікому не патрэбна?
Зрэшты, мне CEF Python у выніку не дапамог: хоць нават базавы прыклад інтэграцыі з wxWidgets з рэпазітара праекту адкрыта глючыць, я паспрабаваў павазіцца з ім даўжэй, але так і не змог вырашыць усе праблемы. Нават не буду паглыбляцца ў тэму, ці наўрад яна таго заслугоўвае.
Я вывучыў падрабязней кампаненты на аснове Chromium Embedded Framework і ў выніку вырашыў паспрабаваць . Паколькі працую я амаль увесь час з Windows, далягляд адмовіцца ад кросплатформеннасці мяне, увогуле, не асабліва бянтэжыла.
Пасля некаторай непазбежнай валтузні на старце справа пайшла значна хутчэй: звязак CefSharp і Windows Forms аказалася выйгрышнай, і мне ўдалося без асаблівых праблем вырашыць большасць пастаўленых тэхнічных задач.
Аб невыпрабаваным
У дадатак на C# можна паспрабаваць укараніць і FireFox, выкарыстоўваючы кампанент , Але я пра яго нічога сказаць не магу. Стандартны браузерны кампанент фрэймворка Qt пад назвай заснаваны , Так што, верагодна, будзе працаваць не горш за CefSharp.
У аматараў Qt можа ўзнікнуць спакуса пракаментаваць: маўляў, браў бы Qt, не меў бы праблем. Магчыма, што так яно і ёсць, але і wxWidgets можна лічыць калі не першай, то другой опцыяй пры выбары GUI фрэймворка для прыкладанняў на Python ці C++. І на маю сціплую думку ўжо такая рэч як браўзэр павінна ўбудоўвацца ў любы больш-менш развіты GUI фрэймворк без скокаў з бубнам.
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
