Topic: Couper les articles trop long

Hello,
Pourquoi ne pas couper les articles trop long (limite paramétrable ou limite sql) et mettre un liens qui dis : Article tronqué, la suite sur l'original ....

Personnellement je voix cela sur planetplanet (script de planet en python) et je trouve cela bien pratique

Re: Couper les articles trop long

La contrainte c'est qu'on ne peut pas couper n'importe comment au risque de se retrouver avec un code HTML complètement nuké. Donc il faut faire attention de bien respecter les balises ouvrantes et fermantes pour ne pas en oublier. Donc si on tronque les articles, alors la solution la plus simple est de retirer les balises.

Dès lors, si on retire les balises, autant n'affiche que très peu de contenu (sinon ça ressemblera vraiment plus à rien). Du coup il faut le faire pour tous les articles si on veut un peu d'uniformisation dans le thème ...

Bref, je ne sais pas comment ils font dans planetplanet. Je serais curieux de savoir

Re: Couper les articles trop long

Ne serait-ce pas plutôt les membres qui coupe leurs articles ?

Re: Couper les articles trop long

Je livrait une idée que j'ai trouvé en regardant des planets tel que planetplanet (suffit de lire la version anglaise du planet php) j'ai pas dit que c'était simple .... mais c'est faisable, normalement l'html fourni dans un  flux rss est censé être standard ...
donc qui dit standard dis si balise ouvrante => faut la fermer ....

Re: Couper les articles trop long

Grummfy wrote:

Je livrait une idée que j'ai trouvé en regardant des planets tel que planetplanet (suffit de lire la version anglaise du planet php) j'ai pas dit que c'était simple .... mais c'est faisable, normalement l'html fourni dans un  flux rss est censé être standard ...
donc qui dit standard dis si balise ouvrante => faut la fermer ....

De nouveau, ce sont des assomptions qu'on ne peut pas faire. Il arrive qu'un abonné code mal. Qu'il ouvre une balise <b> et qu'il oublie de la fermer. Du coup tout le reste de la page sera en gras !! C'est foireux. Donc on ne peut pas "se dire" que l'HTML est sensé être standard !

Ce qu'on peut faire par contre, c'est juste "cacher"  en javascript une partie des articles en ne laissant que X caractères. Mais ça a aussi des risques de lenteur (ou disons plutôt que ça n'accélerait pas les pages alors qu'il n'y aurait rien dessus ... et ça va frustrer les gens). Donc c'est pas une solution non-plus.

Sous planet-planet je suis quasi sur que ce ne sont pas eux qui font la scission des articles et que les articles sont scindés à la source. Mais si tu peux me donner des exemples de planet qui tronquent les articles, ça m'intéresserait ! :-) j'irais voir de plus près

Re: Couper les articles trop long

http://www.planet-php.org/  (apparemment eux utiliserait aussi un moteur php)
regarde en bas de certains articles : "Truncated by Planet PHP, read more at the original (another 1212 bytes)"

Last edited by Grummfy (2010-02-09 09:38:48)

Re: Couper les articles trop long

Bon, j'ai choppé le code ... je vais tester tout ça et voir comment il marche.

Mais planet-php est un CMS en lui-même ... il a certainements des avantages par rapport au bilbo. Mais je vois deux inconvénients important :
* Pas d'installation simple
* Pas d'interface d'administration

Ceci dit, si tu vois d'autres fonctionnalités qu'ils proposent et qui pourraient nous intéresser, n'hésite pas ;-)

Re: Couper les articles trop long

Je ne connais pas le script en question ... J'ai juste vu la fonctionnalité de cut des feeds que je trouvait pratique (et que j'avais vu sur des planets powered by planet-planet) ...

Mais t'inquiète si j'ai d'autre idée, je te le signalerait (malheureusement ...  tongue )

Re: Couper les articles trop long

C'est bon, j'ai lu leur code. Ils utilisent une fonctionnalité de DOMDocument qui corrige automatiquement l'HTML. Ca leur permet de "reformer" l'HTML qui aurait été cassé en le tronquant !

J'implementerais ça sur le bilboplanet quand j'aurais un peu de temps

Re: Couper les articles trop long

yeah, merci!

Re: Couper les articles trop long

Voilà, j'ai fait un petit script au cas où ça intéresserait d'autres personnes. Je me suis basé sur le code de planet-php :

<?php
$doc = new DOMDocument();
$html = "<h1>Test</h1><p>This is a test of an incomplete text truncated in the middle of a tag</p><p><b>This is a bold";
$html = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body>'.$html.'</body>';
@$doc->loadHTML($html);

$xp = new domxpath($doc);
$res = $xp->query("/html/body/node()");
$body = "";
foreach ($res as $node) {
    $body .= $doc->saveXML($node);
}
$body .= " [...] ";
echo $body;
?>

Le script ferme donc les balises qui ont été ouvertes et puis tronquées.

Last edited by theClimber (2010-02-09 12:56:47)

Re: Couper les articles trop long

Bonjour,

Je me permet de déterrer le sujet car voilà plusieurs mois que je cherche une solution qui me permettrait de découper un texte HTML en plusieurs page tout en conservant son formatage.

J'utilise l'éditeur de texte tinymce et j'aimerais par exemple couper mon texte tous les 5000 caractères. S'il y a 50000 caractères, nous aurons donc 10 pages de créées. J'ai bien pris en compte l'utilisation de domdocument et votre exemple qui fonctionne. Cependant, j'aimerais savoir comment au préalable vous couper votre texte avant de le

Re: Couper les articles trop long

Votre texte a été coupé ... lol

Dans notre cas c'est différent. Nous n'essayons pas de diviser un texte en X parties. Ce que nous essayons de faire, c'est simplement de récupérer les X premiers caractères avec leur style. Le problème est donc différent : du moment que les balises sont fermées pour la première partie du texte, on est content.

Sinon, pour découper un texte complètement, je mettrais en place un compteur de balises. Lorsque dans le texte on observe à un moment donné un nombre de 0 balises ouvertes, on sait par définition qu'on peut couper le texte. Par exemple le texte suivant :

<h1>titre</h1>

<p>
Ici <b>du texte</b> qui raconte plein <i>de choses</i>
</p>

<p>Voici le second paragraphe
<ul>
<li>avec différents points</li>
</ul>
</p>

Quand on analyse ce texte, on voit clairement qu'on peut couper à 2 endroits : soit entre le titre et le premier paragraphe, soit entre les deux paragraphes. Le principe de compte le nombre de balises ouvrantes et fermantes permet de découper en plusieurs pages de manière +/- propre...

Re: Couper les articles trop long

lol... comme quoi cela me poursuit,  big_smile

Merci pour votre réponse.

En effet, ce que je demande n'est pas simple à mettre en oeuvre mais si je creuse en ce sens c'est pour éviter aux utilisateurs d'ajouter un séparateur qui me permettrait de découper un texte bien plus facilement. Au moins avec une méthode approuvée et testée on est sûr du résultat de la découpe...  En plus, il faudra bien-sûr éviter de couper un mot en deux.

Votre idée sur le fait de compter le nombre de balise est intéressante mais pas sûr que cela empêche tout de même la troncature de certaines d'entre elles.

Est-ce que vous pourriez me donner un coup de main pour mettre en oeuvre un système fonctionnel qui je suis sûr sera utile à beaucoup d'entre nous ?

Par avance, merci pour votre réponse  smile

Last edited by partirenvtt (2012-01-04 13:29:14)

Re: Couper les articles trop long

Bonjour,

Je viens de tomber sur ce code: http://code.google.com/p/cut-html-string/

Et celui-ci également: http://dodona.wordpress.com/2009/04/05/ … html-code/

NB: Non testé

Pour les bugs et la dernière version du code => https://github.com/theclimber/Bilboplanet

Re: Couper les articles trop long

Comme le montre Guillaume, je pense que le problème a déjà été traité et ça vaut la peine de voir s'il n'y a pas déjà des solutions à ce problème dans la litérature du web.

Ceci dit, je suis toujours dispo pour réfléchir sur le sujet wink

Bonne journée

Re: Couper les articles trop long

Bonjour,

J'ai déjà essayé  le code du second lien qui semble fonctionner assez bien pour la première page.

Parcontre, je n'ai pas essayé celui en python car je ne connais pas ce langage.

Maintenant, comment faire pour couper ensuite les pages suivantes et être sûr qu'il n'y a pas de souci de troncature de l'html ?

Voici comment je procédais de mon côté pour un résultat qui coupait les balises. Peut-être que j'utilisais mal la fonction.

Lien du fichier php à télécharger (format .zip) http://www.partir-en-vtt.com/stockage/h … _texte.zip

En éspérant que l'on puisse trouver une solution, je vous remercie pour votre sympathie et votre temps consacré à la résolution de mon problème.

Last edited by partirenvtt (2012-01-06 12:55:18)

Re: Couper les articles trop long

Bonjour,

Je me permet de vous relancer au cas où vous auriez quelques minutes pour m'aider dans mon problème.

Merci beaucoup et à bientôt.  smile

Re: Couper les articles trop long

En réflechissant, je me suis dit qu'il y a une autre manière plus astucieuse que celle proposée plus haut de couper uniquement lorsqu'on arrive à un total de 0 balises ouvertes.

L'idée est de couper à l'endroit voulu, mais afin de ne pas rencontrer de problème de balises, l'idée est de faire, à l'endroit où on coupe : fermer toutes les balises qui étaient ouvertes (attention à respecter l'ordre), à couper l'article, puis à ré-ouvrir toutes les balises qu'on avait fermées précédement.

De cette manière on aurait un résultat du genre :

<h1>titre</h1>
<p>imaginons un texte rempli de balises qu'on coupe en plein milieu
<b>
<ul>
<li>ceci est un point X</li>
<li>ceci <i>est un point y</i></li>
</ul>
</b>

Nous donnera donc le résultat suivant :

<h1>titre</h1>
<p>imaginons un texte rempli de balises qu'on coupe en plein milieu
<b>
<ul>
<li>ceci est 
</li></ul></b></p>
<p><b><ul><li>
un point X</li>
<li>ceci <i>est un point y</i></li>
</ul>
</b>
</p>

On voit évidement tout de suite dans mon exemple que ça peut poser un problème (j'ai fait exprès). C'est qu'on risque de couper au milieu d'une phrase ou au milieu d'un ensemble de balises qui faisaient un tout.

Je pense donc que pour bien traiter ce genre de cas, il faut établir des exceptions avec des balises qu'on ne peut pas couper en plein milieu. (typiquement les balises <li>, <ul>, <p>)

Mais j'irais même plus loin en disant qu'on ne peut couper qu'après quelques balises bien définies : </ul>, </p>, </code>, </bloquote>, ...
Ca me semble la meilleure manière de garder la consistance du texte.

Qu'en pensez-vous?

Re: Couper les articles trop long

Bonjour et merci pour votre réponse/proposition,

Ceci me paraît être une bonne idée.  smile Cependant, cCela vous paraît-il difficile/envisageable demettre en oeuvre cettefonction de découpage créatrice de page qui garde une structure html cohérente ?

Encore merci pour votre aide.

Re: Couper les articles trop long

Oui, c'est pas hyper compliqué à mettre en place comme algo... tout dépend de tes compétences en programmation. Mais tout ce qui est facile à exprimer est facile à coder wink

J'avoue ne pas avoir vraiment le temps pour l'instant ... mais si tu copie/colle ton code ici (ou si tu met ton code sur github) je suis prêt à y jeter un oeil et pour t'aider

Re: Couper les articles trop long

Bonjour,

Voici ma réflexion quant à la création de l'algorythme, qu'en pensez-vous ?

Algorythme :

On a un texte avec des balises html
On souhaite couper ce texte tous les x caractères en gardant le formatage HTML pour créer des pages

tant qu'il y a des caractères à couper
{
    si il n'y a plus assez de caracères à couper, on est en présence d'une seule page ou de la dernière page
    {
        si la variable incrementielle $page est supérieur à un, c'est la dernière page
        {
            $page = $page+1;
            on envoi en base la page
        }
        sinon c'est la première page
        {
            $page = 1;
            on envoi en base la page
        }
    }
    sinon
    {
        on regarde si on peut couper le texte en regardant si on est pas dans une balise non sécable
        {
            si on n'est pas dans une balise non sécable
            {
                $page++;
                on coupe, on envoi en base et on continue en déduisant les caractères enlevés
            }
            sinon
            {
                $page++;
                on cherche la balise fermante, on compte le nombre de caractère à ajouter aux caractères du départ
                on coupe on envoi en base et on continue en déduisant les caractères enlevés
            }
        }
    }
}

Merci !

Last edited by partirenvtt (2012-01-18 10:14:07)