Question

Je crée un programme Linux en C ++ pour un appareil portable afin de rendre les fichiers html.

Le problème est que le dispositif est limité dans la RAM, rendant ainsi impossible d'ouvrir de gros fichiers (avec le logiciel réel).

Une solution consiste à charger / décharger dynamiquement parties du fichier, mais je ne suis pas sûr de savoir comment mettre en oeuvre.

La capacité de défilement est un must, avec une expérience lisse si possible

Je voudrais vous entendre quelle est la meilleure approche pour une telle situation? Vous pouvez proposer un algorithme, un projet open-source pour jeter un oeil à, ou une bibliothèque qui prennent en charge ce que je suis en train de faire (webkit?).

EDIT: J'écris un lecteur ebook, donc j'ai juste besoin pur rendu html, pas javascript, pas CSS, ...

Était-ce utile?

La solution

Pour pouvoir parcourir un document d'arbre (comme HTML) sans totalement le chargement, vous devrez faire quelques hypothèses - comme le document étant un arbre réel. Alors, ne prenez pas la peine de vérifier les balises proches. Fermer les étiquettes sont conçues pour la consommation humaine de toute façon, les ordinateurs seraient heureux avec <> aussi.

La première étape consiste à supposer que la première partie de votre document est représenté par la première partie de votre document. Cela ressemble à une tautologie, mais avec « moderne » HTML et JS certainement c'est pas techniquement plus vrai. Pourtant, si une ligne de HTML peut affecter tout pixel, vous ne pouvez pas charger partiellement une page.

Donc, s'il y a une relation simple entre la position du le fichier HTML et les pages à l'écran, l'étape suivante consiste à définir l'état d'analyse à la fin de chaque page. Cela comprendra alors un seul fichier offset, probablement (mais pas nécessairement) à la fin d'un paragraphe. Font également partie de cet état est une pile de balises ouvertes.

Pour faciliter la pagination, il est judicieux de conserver pour chaque page que vous avez rencontré jusqu'à présent cet état « limite de page ». Cela rend la pagination de retour facile.

Maintenant, lors du rendu une nouvelle page, l'état précédent de limite de page vous donnera l'état de rendu initial. Vous lisez simplement HTML et le rendre élément par élément jusqu'à ce que vous débordez une seule page. Vous puis remonter un peu et déterminer le nouvel état de limite de page.

défilement lisse est essentiellement une question de rendre deux pages adjacentes et montrant x% de la première et de 100 x% de la seconde. Une fois que vous avez mis en place ce bit, il peut devenir intelligent pour terminer un paragraphe lors du rendu de chaque page. Cela vous donnera des longueurs de pages légèrement différentes, mais vous ne devez pas traiter aux paragraphes cassés, et que, à son tour rend votre état limite de la page un peu plus petite.

Autres conseils

Dillo est le plus léger navigateur web Linux que je suis au courant.

Modifier : Si elle (ou son composant de rendu) ne répondra pas à vos besoins, vous trouverez peut-être la liste de Wikipedia de comparaison et de moteurs de mise en page pour être utile.

Edit 2: Je soupçonne que dynamique du chargement et déchargement des parties d'un fichier HTML serait difficile; par exemple, comment savez-vous qu'un morceau choisi au hasard du fichier est pas au milieu d'une étiquette? Vous auriez probablement utiliser quelque chose comme SAX pour analyser le fichier dans une représentation intermédiaire, économie morceaux discrets de la représentation intermédiaire à un stockage persistant afin qu'ils ne prennent pas trop de RAM. Ou vous pouvez analyser le fichier avec SAX pour montrer ce qui convient dans la RAM à la fois, puis ré-analyser chaque fois que l'utilisateur fait défiler trop loin. (Feuilles de style et Javascript ruinerait cette approche, certains HTML brut pourrait aussi.) Si elle était moi, je vais essayer de trouver un langage de balisage simple ou une sorte de spectateur riche en texte plutôt que d'aller à tous cette difficulté

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top