«Je le lirai plus tard» : le sort difficile d'une collection de pages Internet hors ligne

Il existe des types de logiciels sans lesquels certaines personnes ne peuvent pas vivre, tandis que d’autres ne peuvent même pas imaginer qu’une telle chose existe ou que quiconque en ait besoin. Pour moi, pendant de nombreuses années, ce programme était Recherche Web Macropool, qui vous permettait de sauvegarder, lire et organiser des pages Internet dans une sorte de bibliothèque hors ligne. Je suis sûr que beaucoup de nos lecteurs se débrouillent très bien avec une collection de liens ou une combinaison d'un navigateur et d'un dossier contenant un ensemble de documents enregistrés. J'aimerais pouvoir au moins marquer des documents comme « lus » ou « favoris », passer rapidement d'un texte à un autre et ne pas dépendre de la disponibilité d'Internet ou d'un site spécifique. Il arrive qu'on ait le temps de lire exactement quand il n'y a pas Internet (sur la route par exemple), et les liens, malheureusement, s'avèrent souvent de courte durée.

Apparemment, les auteurs de WebResearch comptaient sur environ ces personnes. Ce programme était doté d'une grande variété de fonctions : catalogage par sections et balises, édition de notes, toutes sortes d'exportation/importation, etc. Cependant, vers 2013, le projet a cessé d’être mis à jour, puis le site Web du développeur a cessé d’exister. Pendant plusieurs années encore, j'ai réussi à monter ce cheval, mais d'abord les plugins du navigateur sont tombés (disponibles uniquement pour les versions d'IE et FireFox d'alors), puis les sites modernes ont cessé de s'afficher normalement dans une visionneuse basée sur l'ancien moteur IE.

«Je le lirai plus tard» : le sort difficile d'une collection de pages Internet hors ligne
Fenêtre principale de WebResearch, Semaine PC/RE n°17 ​​(575)

Route de la déception

Dès qu’il est devenu clair qu’un remplacement ne pouvait être évité, j’ai commencé en arrière-plan à chercher un analogue décent. Il m'a semblé qu'il n'y aurait pas de difficultés particulières ici, puisque mes désirs sont extrêmement modestes. J'étais prêt à me contenter d'un petit sous-ensemble d'outils WebResearch, notamment :

  • enregistrer une page HTML depuis le navigateur à l'aide d'une extension ;
  • au moins des outils de catalogage minimaux (renommer, organiser les catalogues, étiquettes) ;
  • (de préférence) prise en charge des documents PDF ;
  • tout moyen décent de synchroniser votre collection avec d’autres appareils.

À ma grande surprise, je n'ai rien trouvé de similaire, même si j'ai honnêtement parcouru Internet partout et étudié soigneusement une douzaine de programmes correspondant aux annotations (à l'exception d'Evernote, où des fonctionnalités de description similaire ne sont disponibles que sur abonnement). Aujourd'hui, les seules choses qui satisfont au moins d'une manière ou d'une autre mes souhaits, ce sont les projets TagSpace и maBase. Leur étude, d'une manière générale, présente un certain intérêt culturel.

TagSpaces est un organisateur tellement « élégant et à la mode » sur Electron avec un beau site Web, une mise en page adaptative et, bien sûr, un thème sombre, où serions-nous sans lui. Dans le même temps, la malheureuse table des matières de la collection avec des icônes arrondies à la mode occupe la moitié de l'écran, tout en accueillant une vingtaine d'éléments au maximum, et des éléments de base comme la prise en charge des raccourcis clavier ou le rendu du document visualisé sont écrits. selon le principe résiduel. En conséquence, les documents sont affichés de travers et travailler avec la collection se transforme en une série d'exercices ennuyeux et fastidieux avec la souris.

Son antipode myBase date de la fin des années XNUMX : ici, en plus de interface purement fonctionnelle nous disposons d’un ensemble extrêmement riche de paramètres et de fonctions. Cependant, la fenêtre de visualisation ici est le même navigateur basé sur l'ancien IE (ce qui rend déjà la lecture difficile), et tous les documents sont stockés dans une base de données monolithique. Si vous le placez dans le dossier Dropbox, par exemple (il n'existe toujours pas d'autres moyens de synchronisation avec d'autres appareils), alors au moindre changement dans la collection, vous devrez attendre que des centaines de mégaoctets d'informations soient téléchargés sur le serveur.

Поворотный момент

Probablement, le contenu ultérieur de la note semble évident au lecteur : on nous proposera désormais notre propre vélo, qui, bien sûr, sera de la tête et des épaules supérieur à tout analogue existant. En quelque sorte oui, mais pas tout à fait. Je ne pouvais vraiment pas supporter l'épreuve avec myBase et TagSpaces et j'ai esquissé mon propre gestionnaire de documents, dont je fournirai le lien vers la fin. Cependant, ce petit projet personnel ne mériterait pas à lui seul son propre article ; J'écris en grande partie parce que j'ai pensé qu'il serait intéressant de partager l'expérience que j'ai acquise au cours de mon travail et un certain nombre de mauvaises surprises auxquelles je ne m'attendais pas.

Buts et objectifs

Permettez-moi de commencer par le fait que j’ai maintenant une vie assez chargée et que je n’ai tout simplement pas de temps pour des projets de loisirs à part entière. C'est pourquoi, dès le début, j'ai décidé que j'étais prêt à sculpter mon instrument à partir de tous les composants qui me tombaient sous la main, si cela pouvait accélérer les choses. De plus, pour l'instant je m'engage à n'implémenter que le minimum absolu de fonctionnalités, dont il est absolument impossible de se passer.

Format des données et enregistrement des pages

Sous quelle forme les pages Web doivent-elles être stockées sur disque ? Compte tenu des exigences formulées précédemment, il m'a semblé que le choix était restreint : soit le format de sauvegarde « page web entière », c'est-à-dire le fichier HTML principal et un dossier avec les ressources associées, soit le format MHTML. La première option m'a tout de suite semblé moins préférable : il n'y a pas de joie à avoir une poubelle de fichiers sur votre disque, à partir de laquelle vous devrez extraire des documents importants, filtrer ceux qui sont inutiles lors de la recherche et surveiller l'intégrité lors de la copie. Lorsque j'ai essayé de travailler avec TagSpaces, j'ai dû réenregistrer tous mes documents pour que le nom du dossier de ressources commence par un point : le système les a alors reconnus comme « cachés » et ne les a pas affichés.

Ce problème est caché dans myBase, puisque tout est stocké dans la base de données, mais dans mon cas, le principe de simplicité a prévalu : je voulais vraiment tout stocker sous forme de fichiers normaux sur le disque afin de ne pas avoir à m'occuper de l'implémentation de opérations de routine comme copier, renommer, supprimer et synchroniser.

Le format MHTML traverse une période difficile. Un moyen simple de sauvegarder du MHTML a été expulsé de Chrome cet été, et je ne sais même pas où les pages sont censées être stockées maintenant ? Il est clair que l'opportunité n'a pas encore disparu, il existe des extensions tierces, mais en général, c'est une sorte de mauvais signe. De plus, enregistrement au format MHTML non pris en charge dans Chromium Embedded Framework, ce qui n’ajoute pas non plus d’optimisme.

Dans le même temps, j'ai commencé à chercher un moyen simple d'enregistrer les pages du navigateur dans un dossier spécifié. En conséquence, les deux problèmes ont été résolus avec peu de pertes : je suis tombé sur un merveilleux projet Un seul fichier, capable de sauvegarder le contenu d'une page Web dans un fichier HTML indépendant distinct. Cela se fait en convertissant toutes les ressources associées au format base64 et en les intégrant directement dans HTML. Bien sûr, la taille du fichier augmente et le contenu semble un peu encombré, mais dans l'ensemble, l'approche m'a semblé fiable et simple, et je l'ai retenue.

SingleFile se présente à la fois comme une extension de navigateur et une application en ligne de commande. Maintenant, j'utilise simplement l'extension : c'est assez pratique, sauf qu'il faut sélectionner manuellement le dossier cible pour l'enregistrement. À l’avenir, j’essaierai probablement d’améliorer l’application pour simplifier ce processus. Pour appeler une application tierce depuis Chrome, vous pouvez utiliser l'extension Bouton d'application externe - c'est une autre de mes découvertes utiles. D'ailleurs, l'application a déjà été utile : avec son aide, j'ai converti une collection de dossiers et de fichiers de TagSpaces en un ensemble de documents HTML indépendants.

Problème avec l'interface graphique et le navigateur

J'ai trouvé que Python était bon pour toutes sortes d'opérations simples sur les fichiers et les chaînes, et comme l'un de mes projets de travail utilise wxWidgets, choix wxPython semblait logique comme cadre principal.

De plus, après avoir constaté suffisamment de problèmes d'affichage des pages dans d'autres programmes, je suis arrivé à la conclusion que le seul moyen fiable de les résoudre est d'introduire dans le programme un visualiseur basé sur un navigateur moderne, c'est-à-dire Chrome ou Firefox.

Je dois admettre que la dernière fois que j'ai dû faire quelque chose comme ça, c'était il y a environ 15 ans, et je ne m'attendais à aucun piège. Il s’est avéré qu’il est impossible de « simplement taper le navigateur sur le formulaire » : d’une manière ou d’une autre, l’humanité n’a pas été en mesure de faire face à cette tâche de manière fiable et universelle. Une sorte de liste ou de bouton sur un formulaire peut être placé dans n'importe quel framework GUI, et même générer du code multiplateforme, et il m'a semblé qu'en 2019, l'affichage HTML aurait également dû être un problème universellement résolu.

Il s'est avéré que dans wxWidgets, par exemple, le composant « navigateur » standard est un wrapper multiplateforme sur le « navigateur » dépendant du système, ce qui dans le cas de Windows, par exemple, signifie Internet Explorer 7, et la situation dans Windows Forms n'est pas meilleure, et les versions plus récentes que IE9 ne sont disponibles qu'en utilisant des méthodes non triviales manipulation du registre. Comme vous pouvez le constater, je ne suis pas le seul à faire autre chose depuis 15 ans, ici non plus, rien n’a bougé.

Ensuite, j'ai été confronté à un choix : changer de framework ou rechercher un composant alternatif pour le navigateur. Après avoir hésité, j'ai décidé d'essayer d'abord la deuxième voie et suis rapidement tombé sur le projet CEF Python : liaisons Python pour Chromium Embedded Framework, conçu spécifiquement pour la tâche d'intégration de Chromium dans les applications Python.

Évaluez la situation : Python est l'un des langages de programmation les plus populaires au monde, Chrome est essentiellement un monopole sur le marché des navigateurs. En même temps, CEF Python est en fait soutenu par l'énergie un type, force et santé à lui. Personne n’en a vraiment besoin ?

Cependant, CEF Python ne m'a finalement pas aidé : bien que même l'exemple de base d'intégration avec wxWidgets du référentiel du projet soit franchement bogué, j'ai essayé de le bricoler davantage, mais je n'ai pas pu résoudre tous les problèmes qui se sont posés. Je n’approfondirai même pas le sujet, il ne le mérite guère.

J'ai examiné plus en détail les composants basés sur Chromium Embedded Framework et j'ai finalement décidé de l'essayer. version pour C#. Comme je travaille presque tout le temps avec Windows, la perspective d'abandonner les fonctionnalités multiplateformes, en général, ne me dérangeait pas particulièrement.

Après quelques inévitables tracas au début, les choses sont allées beaucoup plus vite : la combinaison de CefSharp et de Windows Forms s'est avérée gagnante, et j'ai pu résoudre la plupart des problèmes techniques sans aucun problème.

À propos des inédits

Vous pouvez également essayer d'implémenter FireFox dans une application C# à l'aide du composant Geckofx, mais je ne peux rien dire sur lui. Un composant de navigateur standard du framework Qt appelé QWebEngineView basé sur Chrome, donc cela fonctionnera probablement aussi bien que CefSharp.

Les fans de Qt pourraient être tentés de commenter : s'ils avaient pris Qt, ils n'auraient eu aucun problème. Cela peut être vrai, mais wxWidgets peut être considéré, sinon la première, du moins la deuxième option lors du choix d'un framework GUI pour les applications en Python ou C++. Et à mon humble avis, un navigateur devrait être intégré à n'importe quel cadre d'interface graphique plus ou moins développé sans danser avec un tambourin.

Bibliothèque Web

Revenons cependant à ma candidature avec le titre provisoire Bibliothèque Web. Aujourd'hui, cela ressemble (roulements de tambour) à ceci :

«Je le lirai plus tard» : le sort difficile d'une collection de pages Internet hors ligne

en plus de interface claire et concise Seules les fonctions les plus élémentaires sont implémentées ici :

  • Afficher n'importe quel répertoire spécifié dans le système en tant que bibliothèque de documents.
  • Afficher les documents dans une fenêtre de navigateur. Naviguez dans la liste de la manière habituelle (touches curseur, PgUp, PgDn, Home, End), faites défiler le navigateur à l'aide des touches Espace et Maj+Espace.
  • Renommer des documents.
  • Marquez les documents comme lus ou favoris à l’aide des raccourcis clavier.
  • Tri des documents par n'importe quel champ.
  • Actualise la fenêtre de l'application en cas de modifications dans le dossier de la bibliothèque.
  • Enregistrez les paramètres de la fenêtre en quittant.

Tout cela peut sembler une fonctionnalité triviale, mais, par exemple, l'enregistrement de la taille des colonnes dans TagSpaces n'est toujours pas pris en charge - apparemment, les auteurs ont d'autres priorités.

Le statut (lecture/favori) est simplement stocké dans le nom du fichier (lecture du fichier doc.html renommé en doc{R,S}.html). Il n'y a pas de synchronisation en tant que telle, mais je garde simplement la bibliothèque dans Dropbox - après tout, ce n'est qu'un dossier contenant des fichiers.

Il est encore prévu d'améliorer des choses simples comme le déplacement et la suppression de fichiers, ainsi que d'implémenter le balisage avec des balises arbitraires. Si quelqu'un veut aider, je n'en serai que ravi.

résultats

Variété. Comme je l'ai dit dès le début, il est étonnant de constater à quel point la boîte à outils d'une personne peut être différente de celle d'une autre. Utiliser un outil comme WebResearch me vient naturellement, et j'ai ressenti un inconfort presque physique dû à son absence. En même temps, apparemment, j'ai peu de personnes partageant les mêmes idées, sinon il n'y aurait aucun problème à trouver des analogues. En revanche, des cas similaires se produisent avec des logiciels beaucoup plus courants : par exemple, Microsoft ne va pas mettre à jour la version de bureau de OneNote, je suis donc obligé d'utiliser la version 2016, et tôt ou tard je devrai également passer de quelque part.

Ce qui est également surprenant, c’est à quel point il est difficile de naviguer dans le paysage actuel des bibliothèques et des frameworks. Dans mon travail, je dois rarement écrire des applications de bureau du début à la fin, et j'ai supposé que littéralement n'importe quel outil pour n'importe quel langage de programmation conviendrait à ma tâche (une fenêtre, trois composants, des interactions triviales). Nous prenons donc n’importe quoi et le faisons en quelques jours.

Il s'est avéré que la réalité est beaucoup moins bienveillante et que vous pouvez simplement rencontrer un problème à l'improviste. Disons que j'ai deux séparateurs qui peuvent être utilisés pour étendre la fenêtre du navigateur. Ainsi, restaurer leurs positions après le chargement dans wxWidgets est extrêmement difficile, car le système les met dans les positions par défaut après presque tous les événements à ma disposition, et je dois faire toutes sortes de piratages pour obtenir ce dont j'ai besoin. Qui l'aurait deviné ?

En revanche, il est clair que dans Windows Forms tout est conçu pour les « interfaces métiers ». Presque tout ce qui était nécessaire était disponible immédiatement : sauvegarde/restauration des paramètres de l'application, une interface pratique des composants (par exemple, je ne m'attendais pas à ce qu'on puisse demander au composant TreeView le chemin complet de la racine à n'importe quel élément enfant sous la forme d'une chaîne) et des outils non triviaux comme un outil de suivi des modifications du contenu d'un dossier.

En tout cas, le temps n'a pas été perdu, et le résultat peut être considéré comme satisfaisant, alors que demander de plus à la vie, n'est-ce pas ?

Source: habr.com

Ajouter un commentaire