„Ще го прочета по-късно“: трудната съдба на офлайн колекция от интернет страници

Има видове софтуер, без които някои хора не могат, докато други дори не могат да си представят, че такова нещо съществува или че изобщо има нужда от него. За мен дълги години тази програма беше Macropool WebResearch, което ви позволява да запазвате, четете и организирате интернет страници в един вид офлайн библиотека. Сигурен съм, че много от нашите читатели се справят добре с колекция от връзки или комбинация от браузър и папка с набор от запазени документи. Бих искал поне да мога да маркирам документи като „прочетени“ или „предпочитани“, бързо да преминавам от един текст към друг и да не зависят от наличието на интернет или конкретен сайт. Случва се да има време за четене точно когато няма интернет (например на път), а връзките, за съжаление, често се оказват краткотрайни.

Очевидно авторите на WebResearch са разчитали приблизително на тези хора. Тази програма беше пълна с голямо разнообразие от функции: каталогизиране по секции и етикети, редактиране на бележки, всички видове експорт/импорт и т.н. Въпреки това около 2013 г. проектът спря да се актуализира и след това уебсайтът на разработчика престана да съществува. Още няколко години успях да яздя този кон, но първо плъгините на браузъра паднаха (достъпни само за тогавашните версии на IE и FireFox), а след това модерните сайтове спряха да се показват нормално във визуализатор, базиран на стария IE двигател.

„Ще го прочета по-късно“: трудната съдба на офлайн колекция от интернет страници
Главен прозорец на WebResearch, PC Week/RE № 17 (575)

Пътят на разочарованието

Веднага щом стана ясно, че замяната не може да бъде избегната, на заден план започнах да търся приличен аналог. Струваше ми се, че тук няма да има особени трудности, тъй като желанията ми са изключително скромни. Бях готов да се справя само с малка част от инструментите на WebResearch, включително:

  • запазване на HTML страница от браузъра с помощта на разширение;
  • поне минимални инструменти за каталогизиране (преименуване, организиране на каталози, етикети);
  • (за предпочитане) поддръжка на PDF документи;
  • всеки приличен начин да синхронизирате колекцията си с други устройства.

За моя изненада не успях да намеря нищо подобно, въпреки че честно прерових интернет надлъж и нашир и внимателно проучих дузина програми, които отговаряха на анотациите (с изключение на Evernote, където функционалност, подобна на описание, е достъпна само чрез абонамент). Днес единствените неща, които поне по някакъв начин удовлетворяват желанията ми, са проектите TagSpaces и myBase. Тяхното изучаване, най-общо казано, представлява известен културен интерес.

TagSpaces е такъв „стилен-модерен-младежки“ органайзер на Electron с красив уебсайт, адаптивно оформление и, разбира се, тъмна тема, къде бихме били без нея. В същото време злополучното съдържание на колекцията с модерни заоблени икони заема половината екран, като побира най-много около двадесет елемента и са написани основни неща като поддръжка на горещи клавиши или изобразяване на разглеждания документ според остатъчния принцип. В резултат на това документите се показват криво, а работата с колекцията се превръща в скучен и отнемащ време набор от упражнения с мишката.

Неговият антипод myBase идва от края на деветдесетте: тук, в допълнение към чисто функционален интерфейс разполагаме с изключително богат набор от настройки и функции. Въпреки това прозорецът за преглед тук е същият браузър, базиран на стария IE (което вече затруднява четенето) и всички документи се съхраняват в монолитна база данни. Ако го поставите в папката Dropbox, например (все още няма други начини за синхронизиране с други устройства), тогава с най-малката промяна в колекцията трябва да изчакате, докато стотици мегабайти информация бъдат качени на сървъра.

Точка на обръщане

Вероятно по-нататъшното съдържание на бележката изглежда очевидно за читателя: сега ще ни бъде предложен собствен велосипед, който, разбира се, ще бъде с глава и рамене над всеки съществуващ аналог. Донякъде да, но не съвсем. Наистина не можах да издържа на изпитанието с myBase и TagSpaces и скицирах собствения си мениджър на документи, връзката към който ще дам в края. Въпреки това, този малък личен проект не би заслужил самостоятелна статия; Пиша до голяма степен, защото смятах, че ще е интересно да споделя опита, който натрупах по време на работата си и редица неприятни изненади, които никога не съм очаквал.

Цели и цели

Нека започна с факта, че сега имам доста натоварен живот и просто нямам време за пълноценни хоби проекти. Затова от самото начало реших, че съм готов да извая инструмента си от всякакви компоненти, които ми попаднат под ръка, ако това ще ускори нещата. Освен това засега се ангажирам да внедря само абсолютния минимум функционалност, без която е абсолютно невъзможно.

Формат на данните и запазване на страници

В каква форма трябва да се съхраняват уеб страниците на диск? Като се имат предвид формулираните по-рано изисквания, ми се стори, че изборът е малък: или форматът за запазване на „цялата уеб страница“, тоест основният HTML файл и папка със свързани ресурси, или форматът MHTML. Първият вариант веднага ми се стори по-малко за предпочитане: няма голяма радост да имате купчина боклук от файлове на вашия диск, от който ще трябва да извлечете значителни документи, да филтрирате ненужните при търсене и да наблюдавате целостта при копиране. Когато се опитах да работя с TagSpaces, трябваше да запазя отново всичките си документи, така че името на папката с ресурси да започва с точка: тогава системата ги разпознава като „скрити“ и не ги показва.

Този проблем е скрит от погледа в myBase, тъй като всичко се съхранява в базата данни, но в моя случай надделя принципът на простотата: наистина исках да съхранявам всичко като обикновени файлове на диска, така че да не се налага да се занимавам с внедряването на рутинни операции като копиране, преименуване, изтриване и синхронизиране.

Форматът MHTML преживява трудни времена. Лесен начин за запазване на MHTML беше изгонен от Chrome това лятои дори не знам къде трябва да се съхраняват страниците сега? Ясно е, че възможността все още не е изчезнала, има разширения на трети страни, но като цяло това е някакъв лош знак. Освен това запазване в MHTML формат не се поддържа в Chromium Embedded Framework, което също не добавя оптимизъм.

В същото време започнах да търся лесен начин за запазване на страници от браузъра в определена папка. В резултат на това и двата проблема бяха разрешени с малка загуба: попаднах на прекрасен проект Единичен файл, способен да запази съдържанието на уеб страница в отделен независим HTML файл. Това става чрез конвертиране на всички свързани ресурси във формат base64 и директното им вграждане в HTML. Разбира се, размерът на файла нараства и съдържанието изглежда малко претрупано, но като цяло подходът ми се стори надежден и прост и се спрях на него.

SingleFile идва както като разширение на браузъра, така и като приложение за команден ред. Сега просто използвам разширението: доста е удобно, с изключение на факта, че трябва ръчно да изберете целевата папка за запазване. В бъдеще вероятно ще се опитам да подобря приложението, за да опростя този процес. За да извикате приложение на трета страна от Chrome, можете да използвате разширението Бутон за външно приложение - това е още едно мое полезно откритие. Между другото, приложението вече беше полезно: с негова помощ преобразувах колекция от папки и файлове от TagSpaces в набор от независими HTML документи.

Проблем с GUI и браузър

Открих, че Python е добър за всякакви прости операции с файлове и низове и тъй като един от работните ми проекти използва wxWidgets, избор wxPython изглеждаше логично като основна рамка.

Освен това, след като видях достатъчно проблеми с показването на страници в други програми, стигнах до извода, че единственият надежден начин за справяне с тях е въвеждането на визуализатор в програмата, базиран на модерен браузър, тоест Chrome или Firefox.

Трябва да призная, че последният път, когато ми се наложи да направя нещо подобно, беше преди около 15 години и не очаквах капани. Оказа се, че е невъзможно „просто да ударите браузъра във формуляра“: някак си човечеството не успя да се справи надеждно и универсално с тази задача. Някакъв списък или бутон във формуляр може да бъде поставен във всяка GUI рамка и дори да генерира междуплатформен код и ми се стори, че през 2019 г. HTML дисплеят също трябваше да бъде универсално решен проблем.

Оказа се, че в wxWidgets, например, стандартният компонент „браузър“ е крос-платформена обвивка над системно зависимия „браузър“, което в случая на Windows, например, означава Internet Explorer 7, а ситуацията в Windows Forms не е по-добра и версиите, по-нови от IE9, са достъпни само с помощта на нетривиални манипулиране на регистъра. Както можете да видите, не съм единственият, който се занимава с други неща през последните 15 години - тук също нищо не е помръднало.

Тогава бях изправен пред избор: да променя рамката или да търся алтернативен компонент за браузъра. След като се поколебах, реших първо да опитам втория път и бързо попаднах на проекта CEF Python: Python свързвания за Chromium Embedded Framework, създаден специално за задачата за вграждане на Chromium в приложения на Python.

Оценете ситуацията: Python е един от най-популярните езици за програмиране в света, Chrome е по същество монополист на пазара на браузъри. В същото време CEF Python всъщност се поддържа от енергия един човек, сила и здраве за него. Никой ли вече не се нуждае от това?..

Въпреки това CEF Python не ми помогна в крайна сметка: въпреки че дори основният пример за интеграция с wxWidgets от хранилището на проекта е откровено бъг, опитах се да се занимавам с него повече, но не успях да разреша всички възникнали проблеми. Дори няма да навлизам в темата, едва ли си заслужава.

Разгледах по-подробно компонентите, базирани на Chromium Embedded Framework и най-накрая реших да опитам версия за C#. Тъй като работя почти през цялото време с Windows, перспективата да се откажа от функционалността на различни платформи като цяло не ме притесняваше особено.

След известно неизбежно суетене в началото, нещата тръгнаха много по-бързо: комбинацията от CefSharp и Windows Forms се оказа печеливша и успях да разреша повечето от техническите проблеми без никакви проблеми.

За неопитното

Можете също да опитате да внедрите FireFox в C# приложение, като използвате компонента Geckofx, но не мога да кажа нищо за него. Стандартен компонент на браузъра на Qt framework, наречен 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 и рано или късно ще трябва да премина и от то някъде.

Това, което също е изненадващо, е колко трудно е да се ориентирате в текущия пейзаж от библиотеки и рамки. В моята работа рядко ми се налага да пиша настолни приложения от началото до края и предположих, че буквално всеки инструмент за всеки език за програмиране би бил подходящ за моята задача (един прозорец, три компонента, тривиални взаимодействия). Така че просто вземаме всичко и го правим в рамките на няколко дни.

Оказа се, че реалността е много по-малко добронамерена и можете просто да се сблъскате с проблем изневиделица. Да кажем, че имам два сплитера, които могат да се използват за разтягане на прозореца на браузъра. Така че възстановяването на позициите им след зареждане в wxWidgets е изключително трудно, тъй като системата ги поставя в позициите по подразбиране след почти всички събития, които са ми достъпни, и трябва да правя всякакви хакерски действия, за да постигна това, от което се нуждая. Кой би предположил?

От друга страна е ясно, че в Windows Forms всичко е предназначено за „бизнес интерфейси“. Почти всичко, което беше необходимо, беше налично извън кутията: запазване/възстановяване на настройките на приложението, удобен интерфейс на компонентите (например, не очаквах, че компонентът TreeView може да бъде поискан за пълния път от корена до всеки дъщерен елемент под формата на низ) и нетривиални инструменти като проследяване на промяна на съдържанието на папка.

Във всеки случай времето не беше загубено и резултатът може да се счита за задоволителен, така че какво повече можете да искате от живота, нали?

Източник: www.habr.com

Добавяне на нов коментар