2010-05-04 4 views
10

Pour une application ebook iPhone, je dois découper des documents HTML arbitrairement longs dans des pages qui correspondent exactement sur un écran. Si j'utilise simplement UIWebView pour cela, les lignes les plus basses ont tendance à ne s'afficher que partiellement: le reste disparaît du bord de la vue.Comment découper des documents HTML en pages pour ebook?

Je suppose donc que j'aurais besoin de savoir combien de lignes complètes (ou de caractères) seraient affichées par UIWebView, étant donné le code source HTML, puis de lui fournir exactement la bonne quantité de données. Cela implique probablement beaucoup de calculs, et l'utilisateur doit également être en mesure de changer les polices et les tailles.

Je ne sais pas si c'est même possible, bien que des applications comme Stanza prennent des fichiers HTML (epub) et les paginent bien. Il y a longtemps que j'ai regardé JavaScript, serait-ce une option qui vaut la peine d'être regardée?

Des suggestions très appréciées!

mise à jour

J'ai donc trouvé une solution, en utilisant JavaScript pour annoter les DOM-arbre avec des tailles et des positions de chaque élément. Il devrait alors être possible de restructurer l'arbre (en utilisant XSLT ou JavaScript), en le découpant dans des pages qui correspondent exactement à l'écran.

Le problème restant ici est que cela casse toujours la page sur les limites de paragraphe, puisqu'il n'y a pas d'accès au texte à un niveau inférieur à l'élément P. Peut-être y remédier en analysant le texte en mots, en encapsulant chaque mot dans une balise SPAN, en répétant la procédure de mesure ci-dessus, puis en affichant uniquement les éléments SPAN qui correspondent à l'écran, en insérant ceux restants au début du suivant page.

Tout cela semble plutôt compliqué. Est-ce que je parle n'importe quel sens? Y a-t-il un moyen plus simple?

Répondre

7

Vous devriez regarder le module CSS PagedMedia. http://www.w3.org/TR/css3-page/ CSS3 soutiennent également mises en page multicolonnes (google pour "css3-Multicol" Je n'ai pas assez Karma pour inclure un second lien ici :-)

A propos de votre mise à jour: que diriez-vous de faire la mise en page d'une seule page, puis utilisez un DIV avec débordement: caché pour la partie de texte. La prochaine chose serait de superposer un élément transparent par-dessus cela, qui ferait défiler par programmation le contenu interne des pixels DIV PAGE_HEIGHT vers le haut ou vers le bas selon certains contrôles de navigation (ou gestes).

+0

Merci, suggestion utile! Dommage que WebKit n'implémente même pas la règle CSS2 @page. Le support multi-colonnes est apparemment encore expérimental, mais peut-être que je peux jouer un peu avec ça. Je ne sais pas si je peux avoir un UIWebView qui est assez large pour le nombre de colonnes que j'ai besoin de rendre (1 par page), mais cela mérite d'être étudié. – radnoise

+0

Je n'ai pas essayé @page sur l'iPhone, mais je m'attendrais certainement à ce que Apple le supporte sur l'iPad, au moins dans une prochaine mise à jour. multicolonne fonctionne très bien dans les versions récentes de webkit (pas sûr à propos de iphone tho). – user336639

3

L'autre option est d'avoir un parent <div> avec plusieurs colonnes CSS3: link1, link2.
Cela fonctionne sur Android:

<style type='text/css'> 
div { 
    width: 1024px; // calculated 
    -webkit-column-gap: 0px; 
    -webkit-column-width: 320px; // calculated 
    } 
p { 
    text-align: justify; 
    padding:10px; 
    } 
</style> 
+0

Oui, une suggestion antérieure impliquait l'utilisation de colonnes CSS. Je l'ai essayé sur Safari 3.1 et ça a l'air bien, donc je vais regarder ça pour l'iPhone. – radnoise

+0

Comment calculer la largeur de div? – HelloWorld

+0

Utiliser P padding vs en utilisant -webkig-column-gap était la meilleure idée! L'espace de la colonne webkit ajoute des pixels supplémentaires imprévisibles sur chaque navigateur différent ... – BIOHAZARD

0

Les suggestions de Multicol CSS sont très intéressants! Cependant, et j'espère que vous pouvez répondre à une autre question: comment allez-vous séparer un ou plusieurs longs éléments <p> en colonnes pour que l'une de ces colonnes soit rendue dans un WebView? Le DOM n'a pas changé, donc vous ne pouvez pas choisir un élément et le rendre. Qu'est-ce que je rate?

+0

Je n'ai pas encore examiné cela en profondeur, et je ne connais pas de moyen de rendre une seule colonne. Mais je suppose que vous pouvez utiliser JavaScript pour faire défiler la colonne que vous voulez. Tant que votre fenêtre est dimensionnée en fonction des dimensions de la colonne, seule cette colonne sera visible. Bien sûr, j'espère que tout cela ne se traduira pas par des exigences de mémoire scandaleuses. – radnoise

Questions connexes