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

Il existe des types de logiciels sans lesquels certaines personnes ne peuvent pas vivre, tandis que d'autres n'imaginent même pas qu'une telle chose existe et que quelqu'un en a besoin. Pour moi, pendant de nombreuses années, un tel programme était Macropool WebResearch , ce qui m'a permis d'enregistrer, de lire et d'organiser des pages Web dans une sorte de bibliothèque hors ligne. Je suis sûr que de nombreux lecteurs sont satisfaits d'une collection de liens ou d'une combinaison d'un navigateur et d'un dossier avec un ensemble de documents enregistrés. J'aimerais pouvoir marquer au moins les 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'il y ait du temps pour lire exactement quand il n'y a pas d'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 de telles personnes. Ce programme comprenait une grande variété de fonctions: catalogage par sections et par balises, édition de notes, toutes sortes d'export / import, etc. Cependant, vers 2013, le projet a cessé d'être mis à jour, puis le site du développeur a également cessé d'exister. Pendant plusieurs années, j'ai pu monter sur ce cheval, mais d'abord les plug-ins de navigateur (disponibles uniquement pour les versions de IE et FireFox) sont tombés, puis les sites modernes ont cessé de s'afficher normalement dans la visionneuse sur la base de l'ancien moteur IE.



La fenêtre principale de WebResearch, PC Week / RE n ° 17 (575)


Route de déception


Dès qu'il est devenu clair que le remplacement ne pouvait être évité, je me suis mis à la recherche d'un homologue décent en arrière-plan. Il me semblait qu'il n'y aurait pas de difficultés particulières, car mes envies sont extrêmement modestes. J'étais prêt à m'entendre avec seulement un petit sous-ensemble d'outils de recherche Web, y compris:


  • Enregistrement de pages HTML à partir du navigateur à l'aide de l'extension;
  • outils de catalogage au moins minimes (renommage, organisation des répertoires, balises);
  • (de préférence) prise en charge des documents PDF;
  • toute façon décente de synchroniser une collection avec d'autres appareils.

À ma grande surprise, je n'ai rien trouvé de tel, bien que j'ai honnêtement grimpé sur Internet de haut en bas et étudié attentivement des dizaines de programmes d'annotation appropriés (à l'exception d'Evernote, où une fonctionnalité de description similaire n'est disponible que par abonnement). À ce jour, ils satisfont au moins d'une manière ou d'une autre à mes souhaits, à l'exception des projets TagSpaces et myBase . Leur étude, d'une manière générale, présente un certain intérêt culturel.


TagSpaces est un organisateur de "style-mode-jeunesse" sur Electron avec un beau site Web, une mise en page adaptative et, bien sûr, un thème sombre, sans lui. En même temps, la table des matières malheureuse de la collection avec des icônes arrondies à la mode occupe la moitié de l'écran, contenant en même temps vingt pièces au plus, et les pièces de base comme le soutien des touches de raccourci ou le rendu du document que vous consultez sont écrites selon le principe résiduel. En conséquence, les documents sont affichés de façon tordue et le travail avec la collection se transforme en un ensemble ennuyeux et fastidieux d'exercices avec la souris.


Son antipode myBase vient de la fin des années 90: ici, en plus d'une interface purement fonctionnelle, nous avons un ensemble extrêmement riche de paramètres et de fonctions. Cependant, le visualiseur est toujours 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'y a toujours pas d'autres moyens de se synchroniser avec d'autres appareils), alors avec le moindre changement dans la collection, vous devez attendre que des centaines de mégaoctets d'informations soient téléchargés sur le serveur.


Point tournant


Le contenu supplémentaire de la note semble probablement évident pour le lecteur: on nous proposera maintenant notre propre vélo, qui, bien sûr, sera au-dessus de tout analogue existant. Comme si oui, mais pas vraiment. Je ne pouvais vraiment pas supporter les épreuves avec myBase et TagSpaces et j'ai esquissé mon propre gestionnaire de documents, un lien que je rapprocherai de la fin. Cependant, ce petit projet pour des besoins personnels ne mériterait pas en soi un article séparé; J'écris davantage car j'ai trouvé intéressant de partager l'expérience acquise au cours du travail, et un certain nombre de surprises désagréables sur lesquelles je ne pouvais pas compter.


Buts et objectifs


Pour commencer, j'ai une vie plutôt stressante maintenant et il n'y a tout simplement pas de temps pour des projets de loisirs à part entière. Par conséquent, dès le début, j'ai décidé que j'étais prêt à sculpter mon outil à partir de tous les composants qui viendraient à la main, si cela accélérait les choses. De plus, pour l'instant, j'essaie de ne mettre en œuvre qu'un minimum absolu de fonctionnalités, dont on ne peut se passer.


Format de données et pages d'enregistrement


Comment stocker des pages Web 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 complète», c'est-à-dire le fichier et dossier HTML principal avec les ressources associées, soit le format MHTML. La première option m'a semblé immédiatement moins préférable: ce n'est pas génial d'avoir un vidage sur le disque à partir d'un tas de fichiers à partir desquels vous devrez extraire des documents significatifs, filtrer les excès 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 afin que le nom du dossier de ressources commence par un point: ensuite le système les a reconnus comme "cachés" et ne les a pas affichés.


Ce problème n'est pas visible dans myBase, car 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 ordinaires sur le disque afin de ne pas avoir à gérer la mise en œuvre d'opérations de routine comme la copie, le changement de nom, la suppression et la synchronisation .


Le format MHTML traverse des moments difficiles. Un moyen simple d'économiser du MHTML a été supprimé de Chrome cet été , et je ne sais même pas ce qui est désormais censé stocker les pages? Il est clair que l'opportunité n'a pas encore disparu, il y a des extensions tierces, mais en général c'est une sorte de mauvais signe. De plus, l'enregistrement au format MHTML n'est pas pris en charge dans Chromium Embedded Framework , qui n'ajoute pas non plus d'optimisme.


En parallèle, j'ai commencé à chercher un moyen simple d'enregistrer des pages du navigateur dans le dossier spécifié. En conséquence, j'ai réussi à résoudre les deux problèmes avec un peu de sang: je suis tombé sur un merveilleux projet SingleFile qui peut enregistrer 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 incorporant directement au format HTML. Bien sûr, avec cela, la taille du fichier augmente, et le contenu semble un peu poubelle, mais en général, l'approche m'a semblé fiable et simple, et je me suis décidé.


SingleFile se présente sous la forme d'une extension de navigateur ou d'une application en ligne de commande. Maintenant, j'utilise simplement l'extension: c'est assez pratique, sauf que vous devez sélectionner manuellement le dossier de destination à enregistrer. À l'avenir, j'essaierai probablement de finaliser l'application pour simplifier ce processus. Pour appeler une application tierce à partir de Chrome, vous pouvez utiliser l'extension du bouton d'application externe - c'est une autre découverte utile à moi. Soit dit en passant, l'application a déjà bénéficié: avec son aide, j'ai converti la collection de dossiers et de fichiers de TagSpaces en un ensemble de documents HTML autonomes.


Tracas avec interface graphique et navigateur


Il me semblait que Python est bien adapté à toutes sortes d'opérations simples avec des fichiers et des chaînes, et puisque wxWidgets est utilisé dans l'un de mes projets de travail, choisir wxPython comme cadre principal semblait logique.


De plus, après avoir examiné les montants avec l'affichage des pages dans d'autres programmes, j'ai conclu par moi-même que le seul moyen fiable de les traiter est d'introduire un visualiseur basé sur un navigateur moderne, c'est-à-dire Chrome ou Firefox, dans le programme.


Je dois admettre que la dernière fois que j'ai dû faire quelque chose comme ça il y a une quinzaine d'années, je ne m'attendais à aucun sale tour. Il s'est avéré qu '"il suffit de gifler le navigateur sur le formulaire" est impossible: d'une manière ou d'une autre, l'humanité n'a pas réussi à faire face à cette tâche de manière fiable et universelle. Toute zone de liste ou bouton du formulaire peut être placé dans n'importe quel cadre d'interface graphique, et même générer du code multiplateforme, et il m'a semblé qu'en 2019, l'affichage du 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 un «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 des versions plus récentes que IE9 sont disponibles uniquement à l'aide de manipulations de registre non triviales. Comme vous pouvez le voir, au cours des 15 dernières années, je n'ai pas été le seul à m'occuper d'autres affaires - ici aussi, rien n'a bougé.


Ensuite, j'avais le choix: changer le framework ou chercher un composant alternatif pour le navigateur. Après avoir hésité, j'ai décidé d'essayer la deuxième voie en premier et j'ai rapidement trouvé un projet Python CEF: des liaisons Python pour Chromium Embedded Framework , conçues spécifiquement pour la tâche d'incorporation de Chromium dans des 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. Dans le même temps, CEF Python est réellement soutenu par l'énergie d' un gars , sa force et sa santé. Est-ce que quelqu'un en a vraiment besoin? ..


Cependant, CEF Python ne m'a pas aidé à la fin: bien que même l'exemple de base d'intégration avec wxWidgets du référentiel de projet soit clairement bogué, j'ai essayé de le bricoler plus longtemps, mais je n'ai pas pu résoudre tous les problèmes qui se posent. Je ne vais même pas me plonger dans le sujet, cela n'en vaut pas la peine.


J'ai étudié plus en détail les composants basés sur le Chromium Embedded Framework et j'ai finalement décidé d'essayer la version pour C # . Étant donné que je travaille presque tout le temps avec Windows, la perspective d'abandonner la plateforme multiplateforme ne me dérange pas, en général.


Après quelques histoires inévitables 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 de non testé


Vous pouvez essayer d'implémenter FireFox dans une application C # en utilisant le composant Geckofx , mais je ne peux rien dire à ce sujet. Le composant de navigateur Qt standard appelé QWebEngineView est basé sur Chromium , il ne fonctionnera donc probablement pas pire que CefSharp.


Les fans de Qt peuvent être tentés de commenter: ils disent, je prendrais Qt, je n'aurais pas de problèmes. Il est possible que ce soit le cas, mais wxWidgets peut être considéré, sinon la première, puis la deuxième option lors du choix d'un cadre GUI pour les applications en Python ou C ++. Et à mon humble avis, une chose telle qu'un navigateur devrait être intégrée dans un cadre graphique plus ou moins développé sans danser avec un tambourin.


Weblibrary


Revenons cependant à mon application avec le titre de travail WebLibrary . Aujourd'hui, cela ressemble à (roulement de tambour) comme ceci:



En plus d'une interface claire et concise , seules les fonctions les plus élémentaires sont implémentées ici:


  • Affiche tout répertoire spécifié dans le système en tant que bibliothèque de documents.
  • Affichez les documents dans une fenêtre de navigateur. Navigation dans la liste de la manière habituelle (touches de curseur, PgUp, PgDn, Home, End), défilement dans le navigateur avec les touches Espace et Maj + Espace.
  • Renommez les documents.
  • Marquez les documents comme lus ou sélectionnés à l'aide de raccourcis clavier.
  • Triez les documents par n'importe quel champ.
  • Mise à jour de la fenêtre d'application avec toute modification dans le dossier de la bibliothèque.
  • Enregistrement des paramètres de la fenêtre à la sortie.

Tout cela peut sembler être une fonctionnalité triviale, mais, disons, l'enregistrement de la taille des colonnes dans TagSpaces n'est toujours pas pris en charge - apparemment, les auteurs ont des priorités différentes.


Le statut (lu / sélectionné) est simplement stocké dans le nom du fichier (le fichier lu doc.html renommé doc{R,S}.html ). La synchronisation en tant que telle n'est pas implémentée, mais je garde simplement la bibliothèque dans Dropbox - au final, c'est juste un dossier avec des fichiers.


Il est prévu de finaliser 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 serai content.


Conclusions


Le plus différent. Comme je l'ai dit dès le début, il est étonnant de voir à quel point les outils d'une personne peuvent être différents des outils d'une autre. C’est naturel pour moi d’utiliser un outil comme WebResearch, et j’ai ressenti un inconfort 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 eu aucun problème à trouver des analogues. D'un autre côté, des cas similaires se produisent avec des logiciels beaucoup plus traditionnels: par exemple, Microsoft ne va pas mettre à jour la version de bureau de OneNote, donc je dois utiliser la version 2016, et tôt ou tard je devrai aussi m'en éloigner.


Ce qui est encore plus surprenant, c'est la difficulté de naviguer dans le paysage actuel des bibliothèques et des frameworks. Grâce à mon service, je dois rarement écrire des applications de bureau du début à la fin, et j'ai supposé que n'importe quel outil pour n'importe quel langage de programmation conviendrait à ma tâche (une fenêtre, trois composants, interactions triviales). Nous prendrons quoi que ce soit directement et le ferons dans quelques jours.


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


D'un autre côté, il est clair que dans Windows Forms, tout est adapté aux "interfaces métier". Presque tout ce qui était requis s'est avéré accessible depuis la boîte: à la fois l'enregistrement / la restauration des paramètres d'application et une interface pratique de composants (disons, je ne m'attendais pas à ce que le composant TreeView puisse être demandé le chemin complet de la racine à n'importe quel élément enfant sous forme de chaîne), et des outils non triviaux comme un tracker pour changer le contenu d'un dossier.


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

Source: https://habr.com/ru/post/fr475092/


All Articles