guiderdoni.net

Bloc notes : spip, css, xhtml, web, standards, mac ...

Accueil > Spip > Découper un article SPIP en plusieurs colonnes

Articles de cette rubrique

Articles

publie le lundi 15 décembre 2008 par Alexandra

Découper un article SPIP en plusieurs colonnes

XDjuj m’a concocté un petit filtre maison, qui fonctionne avec n’importe quel contenu texte :
- #INTRO
- #TEXTE
- #DESCRIPTIF
- #PS etc ...

Vous trouverez ce filtre en pièce jointe à l’article.

addidendum :
Prenez la version du filtre corrigée par Pierre dans le forum.
Elle résoud en effet les problèmes en coupant après un point.
Ca marche très bien sous un SPIP 2.0.9

Objet du filtre

Pour découper un contenu texte en X parties egale avec cesure mot entier.
Retourne la partie Y demandée.

Usage du filtre

- Dans le squelette :
[(#TEXTE*|decouper_en_XD_parties{X,Y}|propre)]

- Mettre une étoile sur la balise que l’on découpe.
- Appliquer le filtre
- remettre le filtre SPIP propre

Mise en pratique

<div id="colonne1">
[<div class="#EDIT{texte} texte">(#TEXTE*|decouper_en_XD_parties{3,1}|propre)</div>]
</div>

<div id="colonne2">
[<div class="#EDIT{texte} texte">(#TEXTE*|decouper_en_XD_parties{3,2}|propre)</div>]
</div>

<div id="colonne3">
[<div class="#EDIT{texte} texte">(#TEXTE*|decouper_en_XD_parties{3,3}|propre)</div>]
</div>

- Et au niveau de sa css

Mettre un float par exemple

- Contenu du filtre à glisser dans squelettes/mes_options.php :

Ps : ce filtre marchait sur les versions 1.9.2 de SPIP.
Ca devrait fonctionner aussi en SPIP 2.

titre documents joints

filtre mes_fonctions pour découper en plusieurs colonnes filtre mes_fonctions pour découper en plusieurs colonnes Zip 1.5 ko

Forum

Répondre à cet article

7 commentaires

Découper un article SPIP en plusieurs colonnes

salut

Pour info :

J’ai testé cette fonction (filtre) sur la version 2.0.5 de spip et il a tendance à faire planter le serveur apache...

yanik

19 mars 2009, par yanik - repondre message

Je ne peux pas confirmer. Pas de plantage chez moi, le filtre fonctionne parfaitement.

Il a un petit défaut de conception : ne faisant pas d’analyse des balises dans le texte on a de drôles de pépins. Quand j’écris {{Ceci est du texte gras}} et le filtre coupe entre deux mots en gras, le deuxième paragraphe est entièrement en gras.

Alors il faudrait ou introduire une fonction d’analyse de balises ou vérifier pour chaque article qu’on ne coupe pas au mauvais endroit.

Merci pour ce code très utile !

1er avril 2009, par klaus++ - repondre message

je viens de remarquer une chose.
Si vous utilisé un php 4, la fonction de Pierre plante. En effet, la fonction str_word_count() n’introduit le troisième paramètre uniquement sur php 5.1.0.

9 octobre 2009 - repondre message

Découper un article SPIP en plusieurs colonnes

Bonjour et merci pour cette contribution !
Il y a t-il un moyen d’avoir une césure de paragraphe entier ?

22 juillet 2009, par Didico - repondre message

Bonjour, j’ai trouvé cette solution pour couper en deux colonnes après un point (donc à la fin d’une phrase).

<?php

/*######
#
# Filtre SPIP 'decouper_en_XD_parties'
# 4 Alexandra By Apsulis
# 14 janvier 2007
#
# OBJET :
# -------
# Pour decouper un contenu texte en X parties egale avec cesure mot entier.
# Retourne la partie Y demandee.
#
# USAGE :
# -------
# Dans le squelette :
# [(#TEXTE*|decouper_en_XD_parties{X,Y}|propre)]
#
# Dans le fichier mes_fonctions.php (a ranger par exemple dans votre dossier de squelettes) :
# placer la fonction qui suit depuis "function decouper"... jusqu'a "return $partie_isolee; }"
#
#
# Remarque :
# ----------
# - Fonctionne avec n'importe quel contenu texte : #INTRO, #TEXTE, #DESCRIPTIF, #PS, etc...
# - Pour remplir X colonnes, dans le cadre d'une boucle (ou pas, vous faites ce que vous voulez),
# utiliser X fois le filtre en changeant la partie Y demandee.
#
#######*/



function decouper_en_XD_parties($texte,$nb_parties,$partie_a_retourner){

        /* On traite les erreurs positives et negatives au cas ou */
        if($partie_a_retourner > $nb_parties){
                $partie_a_retourner = $nb_parties;
        }
        if($partie_a_retourner == 0){
                $partie_a_retourner = 1;
        }

       
//var_dump($nb_parties);
        $longueur = strlen($texte);                                                                 // Longueur totale de la chaine de caractere
        $partie = $longueur/$nb_parties;                                        // Taille en caracteres d'une partie
        $decoupe = str_word_count($texte, 2, '.&<|>');                        // On decoupe le texte par mot pour savoir a quels mots couper les parties

//print_r(str_word_count($texte, 2, '.&'));

        $mots_cesure[0] = 0;                                                                                        // Premiere borne = 0
        $j = 1;

       
                        while($j < $nb_parties){                                                                        // On recherche la fin du dernier mot de la partie pour ne pas le couper (=cesure)
                $i = $partie*($j);                                                                                        // On debute la recherche a partie, et ensuite on incremente de la taille d'une partie pour trouver le mot suivant                         
                while(!isset($decoupe[$i])){                                                // On part du caractere ou on devrait couper,
                        $i++;                                                                                                                                        // et on avance jusqu'a trouver la fin du mot
                }
        /*###
        # CORRECTIF par Pierre
        # Pour eviter de couper les colonnes au milieu d'une ligne (par exemple une ligne de un ou deux mots)
        # La coupure se fait  la fin d'une phrase, aprs le point.
        # (ligne 49)"$decoupe = str_word_count($texte, 2, '.&');" ici le troisime parametre est l'ensemble des caracteres autorises dans un mot dont le point ce qui permet la coupure.
        ###*/
                while(!preg_match('`\.$`',"$decoupe[$i]")){   //tant que le mot ne se termine pas par un point...
                        $i++;                                                                                                                                                                //incrementation d'un caractere
                        while(!isset($decoupe[$i])){                                               
                        $i++;                                                                                                                               
                        }
                }
                $i++;
                        while(!isset($decoupe[$i])){                                               
                        $i++;                                                                                                                               
                        }
        //echo $decoupe[$i];
               
        /*### FIN DU CORRECTIF ###*/       
               
               
                $mots_cesure[$j] = $i;                                                                        // On range la valeur en caractere du mot clef pour la cesure
                $j++;                                                                                                                                                // On passe a la partie suivante
        }
        $mots_cesure[$j] = $longueur;                                                        // Derniere borne = fin du texte

        // On isole la partie qu'on renvoi pour affichage par SPIP
        $partie_isolee = substr($texte, $mots_cesure[$partie_a_retourner-1], $mots_cesure[$partie_a_retourner]-$mots_cesure[$partie_a_retourner-1]);

        return propre($partie_isolee);
}
?>
25 août 2009, par Pierre - repondre message

Super ! Je vais tester merci beaucoup Pierre

25 août 2009, par Alexandra - repondre message

Ca marche en SPIP 2.0.9 et la coupe après un point de paragraphe résout tous les problèmes que j’avais pu rencontrer. Un grand merci donc à toi Pierre pour avoir pris le temps de poster ta modification.

31 août 2009, par Alexandra - repondre message
2005-2017 - Contenu en GPL http://www.guiderdoni.net - Site réalisé avec SPIP 
rechercher - plan du site - prive - alexandra.guiderdoni@gmail.com
CSS - XHTML - squelette