"Lo leeré más tarde": el destino difícil de una colección de páginas web fuera de línea

Hay tipos de software, sin los cuales algunas personas no pueden vivir, mientras que otros ni siquiera se imaginan que tal cosa existe y alguien lo necesita. Para mí, durante muchos años, dicho programa fue Macropool WebResearch , que me permitió guardar, leer y organizar páginas web en una especie de biblioteca fuera de línea. Estoy seguro de que muchos de los lectores están bien con una colección de enlaces o una combinación de un navegador y una carpeta con un conjunto de documentos guardados. Me gustaría poder marcar al menos los documentos como "leídos" o "favoritos", cambiar rápidamente de un texto a otro y no depender de la disponibilidad de Internet o un sitio específico. Sucede que hay tiempo para leer exactamente cuando no hay Internet (en el camino, por ejemplo), y los enlaces, desafortunadamente, a menudo resultan ser de corta duración.


Aparentemente, los autores de WebResearch contaban con esas personas. Este programa estaba repleto de una amplia variedad de funciones: catalogación por secciones y etiquetas, edición de notas, todo tipo de exportación / importación, etc. Sin embargo, alrededor de 2013, el proyecto dejó de actualizarse, y luego el sitio del desarrollador también dejó de existir. Durante varios años logré montar este caballo, pero primero los complementos del navegador (disponibles solo para las versiones de IE y FireFox) se cayeron, y luego los sitios modernos dejaron de mostrarse normalmente en el visor basado en el viejo motor IE.



La ventana principal de WebResearch, PC Week / RE No. 17 (575)


Camino de la decepción


Tan pronto como quedó claro que no se podía evitar el reemplazo, comencé a buscar una contraparte decente en el fondo. Me pareció que no habría dificultades particulares, porque mis deseos son extremadamente modestos. Estaba listo para llevarme bien con solo un pequeño subconjunto de herramientas de WebResearch, que incluyen:


  • Guardar páginas HTML desde el navegador usando la extensión;
  • al menos herramientas mínimas de catalogación (cambio de nombre, organización de directorios, etiquetas);
  • (preferiblemente) soporte para documentos PDF;
  • cualquier forma decente de sincronizar una colección con otros dispositivos.

Para mi sorpresa, no pude encontrar nada parecido, aunque honestamente subí y bajé a Internet y estudié cuidadosamente docenas de programas de anotación adecuados (con la excepción de Evernote, donde la funcionalidad de descripción similar está disponible solo por suscripción). Hasta la fecha, al menos de alguna manera satisfacen mis deseos, excepto para los proyectos TagSpaces y myBase . Su estudio, en general, es de cierto interés cultural.


TagSpaces es un organizador de "estilo-moda-juvenil" en Electron con un hermoso sitio web, diseño adaptable y, por supuesto, un tema oscuro, sin él. Al mismo tiempo, la tabla de contenido desafortunada de la colección con íconos redondeados de moda ocupa la mitad de la pantalla, mientras que contiene veinte piezas como máximo, y las piezas básicas como las teclas de acceso rápido o el documento que está viendo se escriben de acuerdo con el principio residual. Como resultado, los documentos se muestran torcidamente y el trabajo con la colección se convierte en un conjunto de ejercicios aburridos y que requieren mucho tiempo con el mouse.


Su antípoda myBase proviene de finales de los noventa: aquí, además de una interfaz puramente funcional, tenemos un conjunto extremadamente rico de configuraciones y funciones. Sin embargo, el espectador aquí sigue siendo el mismo navegador basado en el antiguo IE (que ya dificulta la lectura), y todos los documentos se almacenan en una base de datos monolítica. Si lo coloca en la carpeta de Dropbox, por ejemplo (todavía no hay otras formas de sincronizar con otros dispositivos), entonces, con el más mínimo cambio en la colección, tendrá que esperar a que se descarguen cientos de megabytes de información al servidor.


Punto de inflexión


Probablemente el contenido adicional de la nota parezca obvio para el lector: ahora se nos ofrecerá nuestra propia bicicleta, que, por supuesto, estará por encima de cualquier análogo existente. Como si sí, pero en realidad no. Realmente no podía soportar las pruebas con myBase y TagSpaces y dibujé mi propio administrador de documentos, un enlace al que acercaré más al final. Sin embargo, este pequeño proyecto para necesidades personales no merece en sí mismo un artículo separado; Escribo más porque me pareció interesante compartir la experiencia adquirida durante el trabajo y una serie de sorpresas desagradables con las que no podía contar.


Metas y objetivos


Para empezar, tengo una vida bastante estresante ahora, y simplemente no hay tiempo para proyectos de hobby completos. Por lo tanto, desde el principio, decidí que estaba listo para esculpir mi herramienta a partir de cualquier componente que pudiera tener a mano, si esto aceleraba las cosas. Además, por el momento estoy tratando de implementar solo un mínimo absoluto de funcionalidad, que no se puede prescindir.


Formato de datos y guardar páginas


¿Cómo almacenar páginas web en disco? Teniendo en cuenta los requisitos formulados anteriormente, me pareció que la elección era pequeña: ya sea el formato de guardado de "página web completa", es decir, el archivo HTML principal y la carpeta con recursos relacionados, o el formato MHTML. La primera opción de inmediato me pareció menos preferible: no es bueno tener un basurero en el disco de un montón de archivos de los que necesitará extraer documentos significativos, filtrar el exceso al buscar y controlar la integridad al copiar. Cuando intenté trabajar con TagSpaces, tuve que volver a guardar todos mis documentos para que el nombre de la carpeta de recursos comenzara con un punto: luego el sistema los reconoció como "ocultos" y no los mostró.


Este problema está oculto a la vista en myBase, porque todo está almacenado en la base de datos, pero en mi caso prevaleció el principio de simplicidad: realmente quería almacenar todo en forma de archivos ordinarios en el disco para no tener que lidiar con operaciones rutinarias como copiar, renombrar, eliminar y sincronizar .


El formato MHTML está pasando por tiempos difíciles. Este verano , Chrome eliminó una forma fácil de guardar MHTML y ni siquiera sé qué se supone que ahora debe almacenar páginas. Está claro que la oportunidad aún no ha desaparecido, hay extensiones de terceros, pero en general esto es algún tipo de mala señal. Además, guardar en formato MHTML no es compatible con Chromium Embedded Framework , que tampoco agrega optimismo.


Paralelamente, comencé a buscar una manera fácil de guardar páginas del navegador en la carpeta especificada. Como resultado, logré resolver ambos problemas con un poco de sangre: me encontré con un maravilloso proyecto SingleFile que puede guardar el contenido de una página web en un archivo HTML independiente. Esto se hace convirtiendo todos los recursos relacionados al formato base64 e incrustándolo directamente en HTML. Por supuesto, con esto, el tamaño del archivo crece y el contenido parece un poco basura, pero en general, el enfoque me pareció confiable y simple, y me decidí por él.


SingleFile viene como una extensión del navegador o como una aplicación de línea de comandos. Ahora solo uso la extensión: es bastante conveniente, excepto por el hecho de que necesita seleccionar manualmente la carpeta de destino para guardar. En el futuro, probablemente intentaré finalizar la aplicación para simplificar este proceso. Para llamar a una aplicación de terceros desde Chrome, puede usar la extensión del botón de aplicación externa ; este es otro descubrimiento útil para mí. Por cierto, la aplicación ya se ha beneficiado: con su ayuda, convertí la colección de carpetas y archivos de TagSpaces en un conjunto de documentos HTML independientes.


Problemas con GUI y navegador


Me pareció que Python es muy adecuado para todo tipo de operaciones simples con archivos y cadenas, y dado que wxWidgets se usa en uno de mis proyectos de trabajo, elegir wxPython como el marco principal parecía lógico.


Además, después de mirar las jambas con la visualización de páginas en otros programas, concluí por mí mismo que la única forma confiable de lidiar con ellas es introducir un visualizador basado en un navegador moderno, es decir, Chrome o Firefox, en el programa.


Debo admitir que la última vez que tuve que hacer algo así hace unos 15 años, y no esperaba ningún truco sucio. Resultó que "simplemente abofetear el navegador en el formulario" es imposible: de alguna manera, la humanidad no ha podido hacer frente a esta tarea de manera confiable y universal. Cualquier cuadro de lista o botón en el formulario se puede colocar en cualquier marco GUI, e incluso generar código multiplataforma, y ​​me pareció que en 2019 la visualización de HTML también debería haber sido un problema universalmente resuelto.


Resultó que en wxWidgets, por ejemplo, el componente estándar de "navegador" es un contenedor multiplataforma sobre un "navegador" dependiente del sistema, que en el caso de Windows, por ejemplo, significa Internet Explorer 7 , y la situación en Windows Forms no es mejor, y hay versiones nuevas disponibles que IE9 están disponibles solo con la ayuda de manipulaciones de registro no triviales. Como puede ver, los últimos 15 años no fui el único que se ocupó de otros asuntos; aquí, tampoco, nada se movió.


A continuación, tuve una opción: cambiar el marco o buscar un componente alternativo para el navegador. Después de dudar, decidí probar primero la segunda forma y rápidamente encontré un proyecto Python CEF: enlaces de Python para Chromium Embedded Framework , diseñado específicamente para la tarea de incrustar Chromium en aplicaciones de Python.


Evalúe la situación: Python es uno de los lenguajes de programación más populares del mundo, Chrome es esencialmente un monopolista en el mercado de los navegadores. Al mismo tiempo, CEF Python está respaldado por la energía de un hombre , su fuerza y ​​su salud. ¿Alguien realmente necesita esto más? ..


Sin embargo, CEF Python no me ayudó al final: aunque incluso el ejemplo básico de integración con wxWidgets desde el repositorio del proyecto es claramente defectuoso, traté de arreglarlo más tiempo, pero no pude resolver todos los problemas que surgen. Ni siquiera profundizaré en el tema, es poco probable que lo merezca.


Estudié los componentes basados ​​en Chromium Embedded Framework con más detalle y finalmente decidí probar la versión para C # . Como trabajo casi todo el tiempo con Windows, la posibilidad de abandonar la plataforma multiplataforma no me molestó, en general.


Después de un alboroto inevitable al comienzo, las cosas fueron mucho más rápido: la combinación de CefSharp y Windows Forms resultó ser ganadora, y pude resolver la mayoría de los problemas técnicos sin ningún problema.


Sobre no probado


Puede intentar implementar FireFox en una aplicación C # usando el componente Geckofx , pero no puedo decir nada al respecto. El componente estándar del navegador Qt llamado QWebEngineView se basa en Chromium , por lo que probablemente no funcionará peor que CefSharp.


Los fanáticos de Qt pueden verse tentados a comentar: dicen, tomaría Qt, no tendría problemas. Es posible que así sea, pero se puede considerar wxWidgets, si no la primera, luego la segunda opción al elegir un marco de GUI para aplicaciones en Python o C ++. Y en mi humilde opinión, una cosa como un navegador debería estar integrada en un marco GUI más o menos desarrollado sin bailar con una pandereta.


Biblioteca web


Sin embargo, volvamos a mi aplicación con el título de trabajo WebLibrary . Hoy se ve así (redoble de tambor) así:



Además de una interfaz limpia y concisa , aquí solo se implementan las funciones más básicas:


  • Muestra cualquier directorio especificado en el sistema como una biblioteca de documentos.
  • Ver documentos en una ventana del navegador. Navegar por la lista de la manera habitual (teclas de cursor, PgUp, PgDn, Home, End), desplazarse en el navegador con las teclas Space y Shift + Space.
  • Renombrar documentos.
  • Marque los documentos como leídos o seleccionados utilizando las teclas de acceso rápido.
  • Ordenar documentos por cualquier campo.
  • Actualización de la ventana de la aplicación con cualquier cambio en la carpeta de la biblioteca.
  • Guardando la configuración de la ventana al salir.

Todo esto puede parecer una funcionalidad trivial, pero, digamos, guardar tamaños de columna en TagSpaces todavía no es compatible; aparentemente, los autores tienen diferentes prioridades.


El estado (leído / seleccionado) simplemente se almacena en el nombre del archivo (el archivo read doc.html cambia de nombre a doc{R,S}.html ). La sincronización como tal no está implementada, pero solo mantengo la biblioteca en Dropbox; al final, es solo una carpeta con archivos.


Hay planes para finalizar cosas simples como mover y eliminar archivos, así como implementar el etiquetado con etiquetas arbitrarias. Si alguien quiere ayudar, solo me alegraré.


Conclusiones


Lo mas diferente. Como dije desde el principio, es sorprendente cuán diferentes pueden ser las herramientas de una persona de las herramientas de otra. Es natural para mí usar una herramienta como WebResearch, y sentí una molestia casi física por su ausencia. Al mismo tiempo, aparentemente, tengo pocas personas de ideas afines, de lo contrario no habría habido problemas para encontrar análogos. Por otro lado, ocurren casos similares con mucho más software convencional: por ejemplo, Microsoft no va a actualizar la versión de escritorio de OneNote, por lo que tengo que usar la versión 2016, y tarde o temprano tendré que moverme de ella también.


Lo que es aún más sorprendente es lo difícil que es navegar en el panorama actual de bibliotecas y marcos. Como resultado de mi servicio, rara vez tengo que escribir aplicaciones de escritorio de principio a fin, y supuse que, literalmente, cualquier herramienta para cualquier lenguaje de programación sería adecuada para mi tarea (una ventana, tres componentes, interacciones triviales). Tomaremos cualquier cosa directamente y lo haremos dentro de unos días.


Resultó que la realidad es mucho menos favorable, y puede encontrarse con un problema de la nada. Digamos que tengo dos divisores que se pueden usar para extender la ventana del navegador. Por lo tanto, restaurar su posición después de cargar en wxWidgets es extremadamente difícil, porque el sistema los coloca en la posición predeterminada después de casi todos los eventos disponibles para mí, y tienes que hacer todo tipo de piratería para obtener lo que necesitas. ¿Quién lo hubiera adivinado?


Por otro lado, está claro que en Windows Forms todo se adapta a las "interfaces comerciales". Casi todo lo que se requería resultaba accesible desde el cuadro: guardar / restaurar la configuración de la aplicación y una interfaz conveniente de componentes (digamos, no esperaba que el componente TreeView pueda solicitarse la ruta completa desde la raíz a cualquier elemento hijo como una cadena) y herramientas no triviales como un rastreador para cambiar el contenido de una carpeta


En cualquier caso, el tiempo no se pierde en vano, y el resultado puede considerarse satisfactorio, entonces, ¿qué más se puede pedir de la vida, ¿verdad?

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


All Articles