inclusion statique dans fichier xml/html avec ob_start(); et Apache sans décrocher...

décembre 2021 modifié dans Entraide

Je suis en train tester la conversion du contenu d'un site PluXml en un fichier Epub.

Je rencontre bien sur plusieurs difficultés n'étant pas programmeur. L'une d'entre elle est de récupérer ce qui parvient à l'affichage d'une page statique .

Inspirer de la fonction staticContent()de plxshow, je n'arrive pas à concrétiser (serveur apache).

Voici un morceau qui peut être intégré dans une page statique à des fins de test pour mettre en evidence le défaut:

la boucle ne redémarre pas après avoir trouvé un premier fichier contenant du php, celui-ci est bien interprété et le retour HTML bien enregistrer aussi.

A prioiri apache bug, le script de la boucle (foreach) semble vouloir redémarrer depuis le fichier de la page statique parsée et pas depuis son propre fichier (en passant, bug qui ressemble à une drôle de faille si exploitable de l'extérieur) . Je ne vois pas trop comment faire en sorte pour que le serveur ne s’emmêle pas les pinceaux entre la page du script et la page que l'ont met dans un buffer pour en récupérer le contenu au lieu de pointer dessus et l'afficher.

Note , les \ sont doublés/échappés dans le code à copier/coller dans une page statique , pensez à les echapper à nouveaux avant chaque réenregistrement de votre page statique ;) .


<?php global $plxMotor; $xhtml ='<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="'.$plxMotor->aConf['default_lang'].'" lang="'.$plxMotor->aConf['default_lang'].'"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><link rel="stylesheet" type="text/css" href="CSS/epub.css" /><script src="JS/script.js"></script></head><body></body></html>'; $annexe="0"; foreach ($this->plxMotor->aStats as $k => $v) { if ($v['active'] == 1 and $v['menu'] == 'oui' /* && $k !== '004' */ ) {// en testant , n'oublier pas de filtrer et exclure le numéro de cette page statique pour ne pas partir en orbite !!!!!! $annexe++; // inscription opf ici , retiré pour la question $pageAnnexe = new DOMDocument('1.0', 'utf-8'); // parceque prévue d'être stocké dans un fichier epub $pageAnnexe->preserveWhiteSpace = false; $pageAnnexe->formatOutput = true; $pageAnnexe->loadHTML(mb_convert_encoding($xhtml, 'HTML-ENTITIES', 'UTF-8')); $title = $pageAnnexe->createElement('title', $v['name'] ); // ajout du titre $xpath = new DOMXPath($pageAnnexe); $results = $xpath->query('/html/head'); $head = $results->item(0); $head->appendChild($title); //ajout contenu $results = $xpath->query('/html/body'); $body=$results->item(0); $section= $pageAnnexe->createElement('section'); $h1=$pageAnnexe->createElement('h1',$v['name'] ); $section->appendChild($h1); $pagestat= PLX_ROOT .$plxMotor->aConf['racine_statiques'].$k.'.'.$v['url'].'.php'; // ce que j'utilise pour le moment et par depis /*$output = file_get_contents($pagestat); $output = preg_replace('#\\<\\?php(.*?)\\?\\>#is', '', $output);*/ // ce que j'aimerais faire sans comprendre ou se trouve les subtilités pour que cela fonctionne ob_start(); require $pagestat; // je sais pas trop lequel est le plus opportun là, suggestion appréciée // $output = ob_get_clean(); // $output = ob_get_contents(); $output = ob_get_flush(); // premiere statique avec php interpréte : okay $divite=$pageAnnexe->createCDATASection('<div>'.$output.'</div>' ); $section->appendChild($divite); $body->appendChild($section); $pageA= $pageAnnexe->saveXML(); //insertion dans un fichier pour l'exemple $myStatique = fopen("stat-".$annexe.".xhtml", "w") or die("Impossible d'ouvrir le fichier"); fwrite($myStatique, $pageA); fclose($myStatique); // La boucle s’arrête ici dés qu’une page statique contient du PHP, son contenu HTML est sauvegardé avant que l'on soit rediriger vers la dite page } } ?>

Pour les curieux qui voudraient bien voir où j'en suis pour le moment , le dernier epub générer à tester se trouve là et rempli grâce au plugin "les fables de la fontaine" : http://gcyrillus.alwaysdata.net/Lesfablesdel.epub l'avancement est aléatoire en fonction des test et modifications répétées selon le temps libre que j'y accorde. Pour le moment, il est apparement ouvrable avec SiGil, Calibre et quelques lecteur d'epub gratuit android, aucune idées en ce qui concerne les tablettes ni les machin qui se prennent pour la Pomme.

Remise en ligne et test de mon vieux site re7net.com . le design et moi on ne sait ... s'est jamais reconnu en fait! mais je fait des efforts.

Réponses

  • Bonjour,

    Dans la boucle foreach, tu ne fais pas de test sur l'id de la page statique pour savoir si la page à analyser est différente de la page qui a servi à lancer ton script. Et donc, quand la page analysée correspond à celle du script, on risque bien de rentrer dans une boucle infinie !!! Et Apache n'y pourra rien. La boucle s'arrêtera quand PHP jugera que le script est trop long à s'exécuter.

    Je ne comprends pas l'intérêt d'utiliser la class DOMDocument. En effet, un livre électronique au format epub n'est qu'une archive zip de pages html agrémentée de quelques fichiers annexes ( format du fichier, manifest, table des matières, feuilles de style, polices, ...)

    Il me semble plus simple de stocker dans un dossier temporaire toutes les pages générées par PluXml et d'y ajouter les fichiers annexes. Ensuite, il reste juste à faire une archive zip du dossier et de le supprimer.

  • décembre 2021 modifié

    Bonjour,

    Dans la boucle foreach, tu ne fais pas de test sur l'id de la page statique pour savoir si la page à analyser est différente de la page qui a servi à lancer ton script. Et donc, quand la page analysée correspond à celle du script, on risque bien de rentrer dans une boucle infinie !!! Et Apache n'y pourra rien. La boucle s'arrêtera quand PHP jugera que le script est trop long à s'exécuter.

    Si , j’exclus bien sur l'id de la page en test , je pourrais aussi l'exclure du tableau avant de lancer la boucle. Mon soucis ne se trouve pas là. en fait la majorité des pages statiques ne posent aucun de problèmes . Cependant il peut y avoir des script dans ces pages qui pose problème et qui mettent fin à la boucle bien qu'il reste encore des fichiers à traiter, ou en renvoyant vers la page traiter (un header(location ) par exemple.
    Il est surement possible que je ne comprenne pas l'usage de ob_start() et Cie, qui , ce que j'en comprend, mettent en principe dans un tampon le texte renvoyé par les scripts et les variables en suspend , tampon ou variables que l'on peut récupérer/traiter plus tard .
    Par exemple, si dans les pages statiques, l'on y trouve le plugin maxicontact, la boucle s'arrêtent et et affiche la page contact, avec le plugin mySearch la boucle continue. En aucun cas je me trouve dans une boucle infinie ou renvoyé sur une 404. En fait je ne sais pas comment faire pour qu'un autre script , sur une URI différente, s’exécute en parallèle sans interférence avec celui qui le lance dans un buffer. Un peu comme en HTML, un petit coup d'AJAX .

    Je ne comprends pas l'intérêt d'utiliser la class DOMDocument. En effet, un livre électronique au format epub n'est qu'une archive zip de pages html agrémentée de quelques fichiers annexes ( format du fichier, manifest, table des matières, feuilles de style, polices, ...)

    Je ne suis pas développeur et beaucoup de chose m’échappent car tout simplement inconnues. Les choix qu'il me semblait avoir: écrire directement dans un fichier texte,en passer par simpleXML ou DOMdocument pour générer des documents peut-être mieux formés. Pour l’exercice je me suit décider à utiliser DOMdocument et à alimenter au fur et à mesure les différents tag du fichier opf (manifest,spine,guide,...), créer les différentes pages (extension XHTML en utf-8 et une dtd html5). Il n'y a que les mots clés que je stocke dans un tableau pour refaire comme un index en les triant alphabétiquement après que le dernier article soit passé dans la boucle. Les infos meta du fichier opf, seront surement aussi générer par la suite à partir d'un tableau . En gros il me fallait prendre une option pour poser les premières lignes et me lancer dans l'inconnu ;)

    Il me semble plus simple de stocker dans un dossier temporaire toutes les pages générées par PluXml et d'y ajouter les fichiers annexes. Ensuite, il reste juste à faire une archive zip du dossier et de le supprimer.

    Tu as raison , en fait, dans mes test, je génère pour le moment directement les fichiers dans l'archive (triage et exclusion catégorie ou article vide inclus dans la boucle) , j'y ajoute aussi en vrac le dossier média pour ce qui est des images, il n'y aura éventuellement que l'image de couverture et un logo? qui mériterait un traitement spécifique. Pour l'exercice je m’intéresse au spécifications epub 3.x et à la rétrocompatibilité epub2 . Je part d'une archive (qui écrase la précédente si présente) dans laquelle j'y met le fichier mimetype et container.xml avec deux répertoire de base : EPUB et META-INF , le reste des fichiers est ensuite ajouté au fir et à mesure et les fichiers .opf, .ncx et nav.xhtml sont les derniers à tomber dans l'archive.

    Il se trouve que PluXml ( a l'XML) dispose de l'essentiel pour un petit livre / magazine : un titre et un sous-titre, des catégories/chapitres , des pages, des mots clés pour générè un index, un ou plusieurs user/auteurs et un champs description qui peut servir de bibliographie ou autres(merci a la V5.8.7), des pages statiques pour les annexes, préfaces,page de copyrights, .... En fait PluXml pourrait-être un éditeur d’e-pub et comme j'aime bien bricolé, pourquoi ne pas voir ce que cela donnerait.

    J'ai commencé a tester à partir d'une page statique et j'y suis encore , lorsque je serais arrivé a un résultat acceptable, je tenterais transposer celle ci en un plugin configurable, ce sera surement encore un truc plein de code redondant et mal habile :) , pour le moment mon petit script s'allonge et s’étoffe au fur et à mesure que je découvre ou que je m'attache à un point de validation (je pense avoir déjà derrière moi la gestion des accents) , de compatibilité (son,vidéo/js,..), est ce que je vire les style inline , les class et id , les balises style et script (exemple: le script de pagination dans un article fonctionne mais coté ergonomie c'est une catastrophe dans un epub), qu'est ce que je fais des iframes, (video youtube ,...) et des object, , des formulaires (action vers ressources externes ou est ce simplement pour une fonction d'affichage de la page ou interne au livre) , le poids et résolution des images , un fichier reset CSS , puis un second pour les styles personnalisé et dédié epub3 (théme?) mediaquerie à part dans un 3e? ,ajoutons une pointe d'accessibilité. Est ce que les commentaires aurait un intérêt quelconque, à être ajouté à une page ou trié et passer en annexe? . Il y a encore beaucoup de chemin et de choix à faire avant d'arrivé à un truc correct et assez polyvalent pour avoir une éventuelle utilité(blog composé de texte, texte et image, vitrine d'artiste avec des galeries photos, de sons, de vidéos, ou illustration, genre bandes dessinées, site d'association) . Je fais ça pour la curiosité et je suis déjà surpris d'arriver à sortir quelque chose que l'on peut ouvrir :)

    Cette histoire de page php interprétée dans un buffer qui peut prendre la main sur le script qui l’appelle, me dépasse, et me montre bien que je ne suis qu'un bricoleur, sur php.net, une histoire de "callback" peut être nécessaire avec un serveur apache , pourtant c'est au moment de l'appel de la page avec require lapage.php que ça passe ou saute selon. Je ne sais pas comment mettre ça dans un process étanche et n'en récupérer que le résultat d'affichage. Ce n'est peut-être pas possible.

    L'idée est finale est d'obtenir soit dans l'administration soit sur le front, un bouton permettent de générer un EPUB diffusable avec la possibilité d'y donner un N° ISSN(diffusion de type magazine/journaux version électronique) ou ISBN(celui attribuer a une version électronique d'un livre finit) , avec le choix de sélectionner toutes ou en partie les catégories active. PluXml, si je me souviens, est la contraction de plume et XML :) .
    Cette fonction ou plugin de conversion en EPUB semble ne pas être disponible sur un wordpress ni sur wattpad par exemple.

    Le choix d'un ISSN est le seul adapté à un blog alimenté régulièrement me semble t-il, si le blogueur arrive à en obtenir un.
    Cdt

    Remise en ligne et test de mon vieux site re7net.com . le design et moi on ne sait ... s'est jamais reconnu en fait! mais je fait des efforts.

  • décembre 2021 modifié

    Bon je m'aperçois bêtement , que mis à part les header(location ...) que des variables avec le même nom peuvent aussi apparaitre dans les pages statiques ...

    Mise à jour de la question :
    peut-on passer ob_start() dans une class pour eviter ce genre de télescopage, et comment sans juste déplacer le telescopage?
    Faut-il voir pour une autre méthode et laquelle?

    Remise en ligne et test de mon vieux site re7net.com . le design et moi on ne sait ... s'est jamais reconnu en fait! mais je fait des efforts.

  • Bonjour,

    Quand tu parles de class, je suppose que tu veux dire plugin.
    obstart() et ob_get_clean() forment un couple inséparable. Tu as un magnifique exemple dans le fichier index.php de PluXml.
    Tu peux faire appel à ce fabuleux couple à l'intérieur de n'importe quelle fonction. Même avec de l'injection de code php.
    C'est une méthode bien commode pour modifier un contenu généré par PluXml et envoyé directement au navigateur quand PluXml n'a pas prévu qu'on veuille modifier ce contenu :

    function gros_titre() {
      # On suppose qu'on affiche une page statique côté site
       $plxShow = plxShow::getInstance();
       ob_start();
       $plxShow->staticTitle();
       $title = ob_get_clean();
       echo strtoupper($title);
    }
    
  • décembre 2021 modifié

    Bonjour, merci de ton intérêt.

    En fait j’avais essayer de faire quelque chose du genre avec une fonction lancé à partir de la boucle :


    function getMyStat($getIt) { ob_start(); require $getIt; $output= ob_get_clean(); return $output;//avec ou sans le return, je recupere un tableau vide : array(1) { [0]=> string(0) ""} et un Notice: Array to string conversion in ... } // et toujours dans la boucle $divite=$pageAnnexe->createCDATASection('<div>'.$output.'</div>' ); // à ce stade $output n'injectera que le mot 'array' dans le fichier texte si pas ejecter de la boucle.

    Pour sortir la bufférisation (si le terme imagé à un sens) de la boucle mais j'ai plus d'erreur qu'en l'ayant en dur dans la boucle, en fait j'empire le problème . Je récupére un tableau vide et le droit à l’éjection de la boucle sitôt qu'une erreur surgit .de fait, $output existes deux fois, une fois dans la fonction, puis dans la tentative d'insertion dans un fichier texte, si dans la page statique une fonction est lancée pour initialisé un script , j'ai le droit au message du type : Fatal error: Cannot redeclare myFunction () (previously declared in ....
    Je ne vois pas comment faire pour n'extraire que la partie texte sans que les script et les variables en suspend se terminent . Je suis probablement sur une mauvaise approche mais mes compétences en programmation sont tellement empirique que je n'ai pas le moindre bout de ficelle à tirer pour m’éclairer.

    Je n'ai pas vraiment d'urgence à solutionner ce soucis qui en final n'en est peut-être pas un du tout, je peut simplement omettre les pages statiques et laisser l'option de sélectionner celle(s) que l'on veut inclure(nt), prendre l'option de n'inclure que celles qui ont un nom précis (avec une structure précise), après tout il s'agit de générer un epub et accessoirement des pages statiques servant à mettre une page de préface, de copyrights/bibliographie/licence si ces pages n'ont pas lieu d'être affichées sur le site, je peut aussi les réduire a des champs textes dans l'admin du plugin, ... Cependant cela à piquer ma curiosité.

    Cdt

    Remise en ligne et test de mon vieux site re7net.com . le design et moi on ne sait ... s'est jamais reconnu en fait! mais je fait des efforts.

  • bazooka07bazooka07 Moderator
    décembre 2021 modifié

    Bonsoir,

    J'ai commencé à développer le plugin kzBook qui devrait répondre à tes attentes.
    Il n'est pas encore terminé mais permet déjà de générer un "ebook" à partir d'une sélection de pages statiques ou d'articles.
    Voir dépôt sur Github
    Voir démo en ligne
    Cliquer sur l'entrée "epub" du menu.
    Le lecteur de Calibre l'ouvre sans souci particulier.

    Il reste encore des choses à faire:

    • générer une table des matières
    • générer la page de couverture
    • générer une page de copyright
    • optimiser le thème pour un ebook
    • sélectionner plus finement les sources de l'"ebook"
    • valider le livre généré par un logiciel tiers. Par ex.: epubcheck

    Quelques remarques :

    • On ne peut pas générer l'ebook depuis le côté admin. En effet le thème utilise $plxShow qui pointe sur $plxMotor côté site. Sauf que si on est connecté $plxMotor est remplacé par $plxAdmin.
    • L'"ebook" est généré à la volée. On peut prévoir ultérieurement une mise en cache ( en comparant des dates de fichiers ou plus simplement avec une "DLC" comme pour les yaourts.
    • il faut un ou plusieurs thèmes dédiés aux "ebooks". les sidebar, menu, bandeau dynamique, pied de page sophistiqué, ... sont inutiles sur une liseuse. La mise en forme est limitée dans ce contexte.
    • On peut à partir des pages statiques, d'un groupe de pages statiques, d'un gabarit (template) de pages statiques ou d'une catégorie d'articles.

    J'essaierai d'avancer plus dès que possible. Mais le plugin est déjà fonctionnel.
    A++

  • kowalskykowalsky Member
    décembre 2021 modifié

    Oh... Quel plugin sympa !

    Sera-t-il possible à terme de générer un epub de tout un site complet (sans les commentaires) ? (dans l'optique d'un archivage temporel)

    Et d'avoir un ordonnancement chronologique des articles (du plus ancien au plus récent) ?

  • Pour l'instant, le plugin sait générer un epub avec tous les articles d'une catégorie donnée.
    On utilise l'ordre de tri configuré pour la catégorie.~~~~
    Il manque juste une page avec tous les tags pour les articles de la catégorie (plxShow::tagList() ne gère pas les catégories)

    En modifiant la requête pour filtrer les articles, on pourra récupérer tous les articles publiés du site.
    En plus des tags ci-dessus, il faudra créer une page pour recenser les articles par catégorie.
    Pour l'ordre chronologique, il faut juste prévoir une option dans le panneau de config du plugin.

  • décembre 2021 modifié

    Bonjour,

    Super sympa, en fait ma question initiale n'était pas une demande de plugin, je n'aurais pas osé , mais à propos de l'inclusion des pages statiques qui, selon leur script, mettait un terme a une boucle sur les statiques ou me renvoyer directement sur la page de la dite statique. Le contexte est effectivement dans la création d'un epub presqu'à la volée, pour la génération je n'ai pas de soucis particulier sur le fond, c'est d'ailleurs ce qui m'a incité a aller plus loin et tenter de faire un epub compatible avec les liseuse epub2 et éventuellement convertible en mobi sans trop de dégats. Pour l'instant voici ce que mon script embarqué dans une statique produit : http://gcyrillus.alwaysdata.net/Lesfablesdel.epub .

    Mon approche est différente de la tienne, d'abord je ne suis pas développeur et mon approche est moins intime avec PluXml que ton plugin. En fait j'essaie d'abord de généré un epub qui va coller au spécification epub3.x ( => HTML5 avec media et interactivités) et une retro compatibilité epub2 pour une majorité de liseuse, pour au moins accéder aux contenus textes plutôt qu'un livre qui ne s'ouvre pas. Je me prend surement la la tête en comparaison, mais je n'ai pas de deadline . Il se trouve que PluXml a une bonne base et structure de contenu et le script va chercher ces données dans PluXml , mais il pourrait être alimenter à partir d'une base de données, de fichiers dans un répertoire , d'un .csv, ... le script (qui s'allonge à chaque nouvelle etape epub) n'est pas intimement lié à Pluxml, juste aux contenu qu'il stocke.
    Pour le moment , c'est les catégories, les articles, les mots clé (dans un index alphabétique) , les statiques (pages annexes , copyright, ....) , l'intégration des statiques ne sera pas automatique, un choix sera a effectué dans la config pour déterminer lesquelles seront intégré ainsi que leur position , le champs user pour une page sur le/les auteur(s), là pas encore décider ou la mettre, etc ... Je m'aperçois que je n'ai pas regardé du coté des archives. (les commentaires sont pour le moment ignorés, peut-être que l'option de les intégrés individuellement par page refera surface).

    Je fais une pose de quelques semaines, je suis sur une période d'activités professionnelles chargées et autant coté proches , c'est les fêtes qui arrivent et les vacances pour un bon nombre de proche.

    J'ai choisi pour le moment

    • de virer tout les script et style trouvée dans les pages (avec une fonction maison fourre-tout en str_replace et preg_rplace)

    • vérifier les balises auto-fermantes (=>extension .xhtml) (avec la fonction fourre-tout en str_replace et preg_rplace)
      
    • de repassé tout les `&xx;` en caractères utf-8 (alerter par l'epubChecker et l'impossibilité de faire un tri alphabétique)
      
    • faire le reset CSS dédié EPub et une surcouche provisoire.

    • ne pas intégré les statiques par défauts on peut y trouver toutes sortes de script prêt à tout chambouler (je ne suis pas le dernier y mettre tout et n'importe quoi :) )

    Est commencé mais en pause pour le moment (l'archive test en lien plus haut à peu de chance d'évoluer avant 2 à 3 semaines) :

    • l'interface de config : identité du bouquin et métadonnée . Là on peut pas trop m'aider, je m'inspire des interface de sigil et calibre, mais il me faudrait faire quelque chose de plus clair et plus concis pour un novice et rester dans l'essentiel, quelque chose qui ne nécessite pas un fichier d'aide et de connaitre les spécification d'un epub ).

    • bon usage des attributs Dublin Core et epub:type, ..., (toc/chapitrage, etc ...) en gros le fichier OPF et le NCX (idem, la on peut pas trop m'aider, je continue à faire des allées et venue sur les spécifications et epubchecker) l'idée est de faire au mieux sans devoir reprendre l'archive à la main.

    • génération de l'image de couverture et association couleur/font pour des template simple (la pareil c'est une histoire de gout, pour écrire sur l'image , ça c'est fait sans être intégré au script, cela ira directement dans le plugin , j'ai choisis ici une largeur de 1200px (à priori la longueur minimale du plus petit coté est requis par certain outils ou diffuseurs) avec arbitrairement un format au ratio de celui d'un livre de poche . un ratio de 1:1.5454 .

    A faire (ça peut changer forcément):

    • gerer les doublons d'article rattachés à plusieurs catégories et réintégrer les articles dans le fichier toc.ncx en voyant si un même fichier peut être déclaré plusieurs fois avec un playOrder="X" different.

    • rendre fonctionnelle l'interface de config du epub + choix template de base + gestion de pages annexes à partir des statiques ou fichiers de config du plugin.

    • Réduire le code redondant (ça c'est pour pas faire peur ni mourir de rire les dév ... j'ai perdu d'avance lol )

    • transposer le script en un greffon en le passant au hachoir .

    • voir ce que l'on fait des styles et script des plugins et si l'option d'un fixed layout pour les réinjecter est approprié dans ce cas et du coup, en réduisant drastiquement le nombre de liseuses et software compatibles

    • repérer les liens externes et les liens internes avec des ressources manquantes ou cassé (le répertoire media n'est pas le seul endroit ou les ressources peuvent-être stockées)

    • ne pas intégrées les fichiers se trouvant dans /data/media qui ne sont pas utilisés

    • autres que je n'ai pas encore remarqué ou envisagé.

    • Attendre les retours de test (à défaut j'irais voir ce que l'on trouve dans les PluXml en lignes pour y dénicher tout ce qui peut mettre le bins)

    Mes ressources sont principalement le w3c.org , idpf.org (qui vient de retirer ses pages ou liens vers des pages obsolètes et qui a fusionner avec le w3c) , https://github.com/idpf/epub3-samples pour l'exemple . Et puis d'autres infos, que je recoupe, proviennent de blog d'auteur ou d'article parlant de la diffusion d'ebook (ce qui m'a alerté sur la compatibilité mobi/site diffuseurs, par exemple réduire le titre a 12 lettres, mettre une image cover titrer sans autre pub ou copyright dans l'archive, ... ) Entre autre source, il y a en a ici http://jiminy.chapalpanoz.com/archives/ que je trouve claires . Tout ça est encore en train de mijoter, c'est un peu comme inventer une nouvelle recette. On choisit les ingrédients , on s'arrange avec les outils que l'on a, on goutte, on rectifie , on retourne au piano .

    Mes outils les pages statiques de PluXml et notepad++ , epubChecker et pour les tests : sigil, calibre, lithium , Aldiko classic , readEra , reasily, icecream reader, (rien chez la pomme) ... j'ai vu qu'il y avait aussi epub.js que je n'ai pas essayé.

    C'est un sujet intéressant en le survolant de pas trop loin, trop prés c'est gavant, et encapsuler un site dans un epub qui peut aujourd'hui être interactif , je trouve ça bien sympa.

    Bonne fin d'année.

    edit , @bazooka07 pour les tags , voici un extrait de ce que je fais , c'est là que j'ai du voir pour les accents (pour la fonction remove_accents() dans l'extrait , elle vient de là https://github.com/WordPress/WordPress/blob/a2693fd8602e3263b5925b9d799ddd577202167d/wp-includes/formatting.php#L1528

    // creation page index 
    {
               $taglist = $plxMotor->aTags;
            if (!empty($taglist)) {
                //echo '<ul style="display:grid;grid-template-columns: repeat(auto-fill,minmax(12ch,1fr));gap:0 1rem;list-style:none;">'.PHP_EOL;
                // creation index.xhtml
                    $index = new DOMDocument('1.0', 'utf-8'); 
                    $index->preserveWhiteSpace = false; 
                    $index->formatOutput = true;                
                    $index->loadHTML(mb_convert_encoding($xhtml, 'HTML-ENTITIES', 'UTF-8'));
    
                    // on pointe sur <head> $head               
                    $xpath = new DOMXPath($index);    
                    $results = $xpath->query('/html/head');   
                    $head = $results->item(0);
    
                    // ajout du titre   (title document)            
                    $headtitle = $index->createElement('title', $plxMotor->aConf['title'] );
                    $head->appendChild($headtitle);
    
                    // on pointe sur <body>  $body 
                    $results = $xpath->query('/html/body');
                    $body=$results->item(0);
    
                    // conteneur principal  <section> $container        
                    $container= $index->createElement('section');
                    // attribut(s) du conteneur 
                    $container_attr=$index->createAttribute('xml:lang');
                    $container_attr->value=$plxMotor->aConf['default_lang'];
                    $container->appendChild($container_attr);
    
                    $container_attr_1=$index->createAttribute('title');
                    $container_attr_1->value='Index - '.$plxMotor->aConf['title'];
                    $container->appendChild($container_attr_1);
    
                    $container_attr_2=$index->createAttribute('id');
                    $container_attr_2->value='Book_index';
                    $container->appendChild($container_attr_2);
    
    
                    // remplissage <section> $container 
                    // titre page 
                    $h1=$index->createElement('h1', 'Index des Mots clés');
                    $container->appendChild($h1);
    
                    // list
                    $dl=$index->createElement('dl');
                        $dl_attr=$index->createAttribute('id');
                        $dl_attr->value="keywords";
                        $dl->appendChild($dl_attr);
                    $container->appendChild($dl);
    
    
    
                // recherche tag dans tags.xml
                    foreach ($taglist as $idx => $tag) {
                        // filtre sur page actives a partir du fichier tags.xml
                        if( $tag['active'] !='0') {
                        $extract=  explode( ',', $tag['tags']);
                        foreach($extract as $k => $v) {
                            if($v !="") {
                            $indexTag[] = strtolower(trim($v)); 
    
    
    
                            }
                        }
                        }
                    }
    
                    // pas de doublon svp
                    $indexTag = array_unique($indexTag);
                    // tri alphabetique 
                    if (class_exists('Collator')) {
                        $collator = new Collator($plxMotor->aConf['default_lang']);
                        $collator->asort( $indexTag );
                    }
                    else {
                        function compareASCII($a, $b) {
                            $at = iconv('UTF-8', 'ASCII//TRANSLIT', $a);
                            $bt = iconv('UTF-8', 'ASCII//TRANSLIT', $b);
                            return strcmp($at, $bt);
                        }
    
                        uasort($indexTag, 'compareASCII');
                    }
    
                    // ressort les tags un à un  et on prend la premiere lettre trouvée
                    $cap="";//init 
                    foreach($indexTag as $kit => $vit) { 
                        $fltr = mb_substr($vit, 0, 1);// prend les accents 
    
                         ///collecte liens pages taguées 
                         $links="";
                         if(isset($taglink[$vit]) && $taglink[$vit] !='') { 
    
                                 if(remove_accents($fltr) > $cap) { //si  position dans l'alphabet
                                $dt=$index->createElement('dt',$fltr);
                                $dl->appendChild($dt);
                                 $cap= $fltr;
                                }
    
                             foreach($taglink[$vit] as $keywords => $link) {    
    
                                 $links .= $link;
                             }
                            $dd=$index->createCDATASection('<dd><b>'.$vit.'</b><span>'.$links.'</span></dd>'.PHP_EOL);
                            $dl->appendChild($dd);
                         }  
    
    
                    } 
    
            }
    
    
                        //$container->appendChild($dl);
                        $body->appendChild($container);
    
                        $pageXHMLIndex =$index->saveXML();
                        $pageindex = str_replace('<![CDATA[', '', $pageXHMLIndex);
                        $pageindex = str_replace(']]>','',$pageindex );
                        // ajout index à :
                        // epub zip
                        addFiletxt('EPUB/index.xhtml', $pageindex, $ebook); 
    
                        // nav.xhtml 
    
                        $liIndex = $pagenav->createElement('li');
                        $ol->appendChild($liIndex);             
                            $a=$pagenav->createElement('a','Index');
                            $a_attr=$pagenav->createAttribute('href');
                            $a_attr->value='index.xhtml';
                            $a->appendChild($a_attr);
                        $liIndex->appendChild($a);
                        $ol->appendChild($liIndex);
    
                        // manifest
    
                        $keywordIndex =$opf->createElement('item');
                        $keywordIndex_attr_1= $opf->createAttribute('id'); 
                        $keywordIndex_attr_1->value="keywords"; 
                        $keywordIndex->appendChild($keywordIndex_attr_1);
    
                        $keywordIndex_attr_2= $opf->createAttribute('href'); 
                        $keywordIndex_attr_2->value="index.xhtml";
                        $keywordIndex->appendChild($keywordIndex_attr_2);
    
                        $keywordIndex_attr_3= $opf->createAttribute('media-type'); 
                        $keywordIndex_attr_3->value="application/xhtml+xml";
                        $keywordIndex->appendChild($keywordIndex_attr_3);
    
                        $keywordIndex_attr_4= $opf->createAttribute('properties'); 
                        $keywordIndex_attr_4->value="scripted";
                        $keywordIndex->appendChild($keywordIndex_attr_4);   
                        $manifest->appendChild($keywordIndex);
    
    
                        //spine                 
                        $spineItemIndex=$opf->createElement('itemref');
                        $spineItemIndex_attr= $opf->createAttribute('idref'); 
                        $spineItemIndex_attr->value=$keywordIndex_attr_1->value;
                        $spineItemIndex->appendChild($spineItemIndex_attr);
                        $spine->appendChild($spineItemIndex);   
    
                        // Creation reference dans guide
                            $ref = $opf->createElement('reference');
                            $ref_attr = $opf->createAttribute('href');
                            $ref_attr->value=$keywordIndex_attr_2->value;
                            $ref->appendChild($ref_attr);
                            $ref_attr_1 = $opf->createAttribute('title');
                            $ref_attr_1->value=$keywordIndex_attr_1->value;
                            $ref->appendChild($ref_attr_1);
                            $ref_attr_2 = $opf->createAttribute('type');
                            $ref_attr_2->value="text";
                            $ref->appendChild($ref_attr_2);
                            $guide->appendChild($ref);                  
    }
    
    

    Remise en ligne et test de mon vieux site re7net.com . le design et moi on ne sait ... s'est jamais reconnu en fait! mais je fait des efforts.

  • décembre 2021 modifié

    @bazooka07 Retour sur KzBook :
    Je viens juste de prendre le temps d'installer ta version de plugin entre un moment de vie pro et perso pour le tester et voir si mon soucis se résout avec ton approche.
    J'y retrouve un défaut similaire, je me trouve rediriger sur le contenu de la première page statique trouvée affichée sans style ni les images (étonnamment sans scripts php ) avec comme uri http://re7netlocal.gc/epub/stat/all (une copie de mon site perso en local) , ça coince sur la page à propos, première dans la boucle des statiques, n'affichant juste du texte sans scriipt php embarqué. message affichée après l'affichage de cette page : Fatal error: Uncaught Error: Call to a member function callHook() on null in: path_vers_la_data_page_statique . Sinon, pas de soucis avec les liens vers les catégories à priori, une modal pour télécharger le fichier s'affiche bien.intitulé pluxml-cat- + nom de la catégorie.

    PluXml version 5.8.7 (encodage UTF-8)
    
        Version de PHP : 7.2.19
        Apache/2.4.35 (Win64) OpenSSL/1.1.1b PHP/7.2.19
    
    

    Bonne soirée/journée/week-end/fêtes ... bon tout court ;)

    Remise en ligne et test de mon vieux site re7net.com . le design et moi on ne sait ... s'est jamais reconnu en fait! mais je fait des efforts.

  • Je n'ai pas ce problème sur mon site de démo chez AlwaysData. Ni sur mon PC.
    Utilises-tu un hook de plugin dans le contenu d'une de tes pages statiques ? Si oui, nom du plugin et éventuellement contenu en php de cette page statique.
    Tu sais te servir de xdebug ?

  • bonjour,

    en effet il y avait un hook de plugin qui trainait sur cette première page, en l'enlevant , cette page ne pose plus de problème, cependant cela décroche sur les même autre pages qui me posaient problème. (un header(location:..) par exemple. En désactivant les pages elles semblent tout de même prise en compte. Je creuserais un peu plus tard , pour le moment je dois partir au boulot.

    Je ne connais pas xdebug.

    Je reviens sur le sujet aussitôt que dispo.
    Bonne journée.

    Remise en ligne et test de mon vieux site re7net.com . le design et moi on ne sait ... s'est jamais reconnu en fait! mais je fait des efforts.

  • décembre 2021 modifié

    Merci pour ces liens, c'est excellent , ça devrait figurer dans la liste à outils de l’apprenti. Je vais voir pour installer ça , ça va m'aider à comprendre ce qu'il se passe réellement quand un script tourne.

    Pour revenir au défaut,
    Voici par exemple une page statique qui m'intrigue avec ton plugin.

    <?php
    global $plxShow;
    ?>
      <h3>le site : <?php $plxShow->mainTitle(); ?></h3>
       <p>lorem blabla</p>
    

    coincée entre deux autre pages statiques ne contenant que du texte, il n'y a pas d’alerte, le fichier epub pluxml-stat-all.epub est proposé au téléchargement ou ouverture. Si l'on ouvre l'archive, cette page ne figure pas dans l'archive.

    En faisant une copie conforme et en la plaçant en 4eme position (peut-être sera t-elle dans l'archive cette fois ci ?), j'ai une erreur tout en étant rediriger vers index.php?epub/stat/all : erreur affichée après le titre de la page statique (la copie) Fatal error: Uncaught Error: Call to a member function mainTitle() on null in la page en copie conforme.

    En désactivant cette page statique le plugin semble toujours la prendre en compte. seul solution, l'effacer purement et simplement pour éviter le crash sans pour autant récupérer le contenu de la première, qui elle passe sans provoquer d'erreurs ni être enregistrer.

    Pour ce qui est des autres pages qui posaient aussi problèmes , je reviendrais dessus en réduisant le code à la partie qui fait décrocher . si le header(location: ailleurs) se comprend aisément et n'est finalement surement pas gérable en arriere plan, il faut que je trouve les portions de codes responsables dans les autres pages. Pour le moment, en évitant des variables de mêmes noms cela réduits énormément les éjections intempestives.

    cdt,
    GC

    Remise en ligne et test de mon vieux site re7net.com . le design et moi on ne sait ... s'est jamais reconnu en fait! mais je fait des efforts.

  • Le message d'erreur dit simplement qu'il ne trouve pas $plxShow ( valeur nulle ).
    Ce n'est écrit nulle part dans la documentation de PluXml, mais il faut savoir qu'à l'intérieur du contenu d'une page statique $plxShow est accessible avec $this. Voir la fonction plxShow::staticContent() pour plus de détails.
    Le code suivant devrait passer sans souci. Il n'y a pas lieu de déclarer "global $plxShow".

    <h3>le site : <?php $this->mainTitle(); ?></h3>
    <p>lorem blabla</p>
    

    Pour les pages statiques désactivées, "git pull ...." pour récupérer la dernière mise à jour sur mon dépôt Github.

  • bazooka07bazooka07 Moderator
    décembre 2021 modifié

    Je poursuis le développement du plugin :

    • Génération de la table des matières pour les pages statiques ou une catégorie d'articles
    • pour les articles une page d'index pour retrouver les articles pour un mot-clé ( tag ) donné
    • ebook avec tous les articles publiés avec table des matières par catégorie
    • Génération d'une page de couverture

    Voir site de démo et dépôt Github ci-avant.

    A venir :

    • panneau de config
    • personnaliser les méta-données de chaque ebook
    • améliorer le thème et le style pour l'ebook
  • décembre 2021 modifié

    Bonsoir,
    mais oui mais c'est bien sur pour le global $plxShow ... obj_start inside ...

    Sympa pour le développement du plugin, mais je ne vais pour le moment pas m'y intéresser pour éviter de modifier mon approche et apprentissage perso ,je m'y remettrais dans quelques semaine lorsque mon activité professionnelle aura repris un rythme de croisière normal, entre les fêtes , repas de fêtes, gouter de fêtes, repas améliorer pour causes de .. périodes festives, y'en à même qui ont leur anniversaire entre aujourd'hui et le 31! et les congés de mes collaborateurs, le peut de temps libre dispo qu'il me reste est résolument dédié aux proches.

    Par contre une fois ma première version passer en plugin et mis sur github, je jetterais un œil très très curieux, puis apprécierais une critique sur mon approche de non professionnel et le code. (il y a et avait déjà beaucoup à dire sur mon plug mother/daughter dont j'attends la sortie de plx6 pour raccourcir le code et le soumettre à nouveau sur le forum et la critique.)

    Bonnes fêtes à tous et à l'année prochaine.

    GC

    Remise en ligne et test de mon vieux site re7net.com . le design et moi on ne sait ... s'est jamais reconnu en fait! mais je fait des efforts.

  • Nouvelle mise à jour du plugin pour enregistrer tous les articles publiés.

  • 20 janv. modifié

    Bonjour @bazooka07 , je n'ai toujours pas été voir ton plugin, j'ai repris le mien en mode plugin, j'ai la page coté visiteur qui affiche la listes des epubs dispos (ça c'est simple) et j'ai commencé à faire la page de config ... (ça a tendance a tourner en usine à gaz) ...

    En cherchant à trier les fichiers nécessaire pour les balises images rencontré dans les pages, je me sert de cURL pour télecharger les fichiers externes au site pour les rapatrier dans l'archive et mettre à jour le src des balises img concernées.

    cURL ne me permettrait-il pas de rapatrier les pages statiques sans que celle-ci ne puissent agir avec le script qui tourne et m'affranchir d'incompatibilité de nom de variable ou de redirection ?

    Bonne Année

    edit par ailleurs, en voulant comparer une valeur avec un tableau, je me suis aperçu que sur des tableaux approchant une dizaine de clé et plus, certaine comparaison ne matcher pas avec in_array() et search_array() , certaines clés sont zappée , je me suis rabattu sur une option qui consiste a passer le tableau en chaine et ensuite faire une recherche sur la chaine. du coup, plus rien n'est zappé, mais ça prend aussi tout ce qui contient la chaine . par exemple, cherchant un img.jpg , ça va aussi matcher avec un bimg.jpg . Je n'ai pas encore essayer array_walk() , serait-ce plus fiable ?

    Remise en ligne et test de mon vieux site re7net.com . le design et moi on ne sait ... s'est jamais reconnu en fait! mais je fait des efforts.

  • bazooka07bazooka07 Moderator

    Bonjour,

    Si tes images sont sur ton serveur, il n'y a aucun intérêt à utiliser Curl. Il faut juste corriger les liens générés par PluXml dans la page HTML. Après avoir capturé la page HTML avec le couple ob_start() et ob_get_clean(), il suffit d'utiliser la fonction preg_replace() pour appliquer la correction sur les images. voir la fonction kzBook::_updateLinks() sur mon dépôt. Cela demande de maîtriser les expressions régulières.
    Curl peut très bien rapatrier une page statique si tu lui donnes l'url affiché dans le navigateur. Mais c'est plus lent que d'agir directement sur le serveur sans passer par Internet.
    Pour in_array(), il semble effectivement qu'il y a quelques problèmes d'après les commentaires sur la page de php.net et il est sensible à la casse.
    J'utiliserai plutôt array_filter() que array_walk() pour rechercher un élément du tableau avec une expression régulière :

    $found = array_filter($tableau, function($value) {
       return preg_match('#\bimg\.jpe?g\b#i', $value);
       # ou pour capturer toutes les images :
       # return preg_match('#\.(?:jpe?g|png|gif|webp)\b#i', $value);
    });
    

    Il faut que je publie mon plugin kzBook. Il me reste la doc à finir.

  • Merci de ton retour et conseils,
    Pour cURL , je lance un rapatriement vers l'archive uniquement si l'attribut source commence avec http, en principe, toutes les images uploadées sur PluXml sont ensuite insérer avec un chemin relatif si l'on fait comme prévue. (je me sert de Xpath pour les éventuels srcset que l'on peut aussi rencontrer et virer .... un autre tuyau pour l’usine à gaz ...

    Pour les statiques, cURL pourrait donc être une option à cocher si il y a un plantage sur une statique. Je testerais en revenant dessus plus tard, à priori , cela pourrait résoudre mon soucis initial.

    Remise en ligne et test de mon vieux site re7net.com . le design et moi on ne sait ... s'est jamais reconnu en fait! mais je fait des efforts.

Connectez-vous ou Inscrivez-vous pour répondre.