phraser_html.php
SPIP, Système de publication pour l'internet
Copyright © avec tendresse depuis 2001 Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
Ce programme est un logiciel libre distribué sous licence GNU/GPL.
Table of Contents
Constants
- BALISE_ALT_BOUCLE = '<//B'
- Fin de la partie alternative après d'une boucle
- BALISE_BOUCLE = '<BOUCLE'
- Début de la partie principale d'une boucle
- BALISE_FIN_BOUCLE = '</BOUCLE'
- Fin de la partie principale d'une boucle
- BALISE_IDIOMES = ',<:(([a-z0-9_]+):)?([a-z0-9_]*)({([^\|=>]*=[^\|>]*)})?((\|[^>]*)?:/?>),iS'
- BALISE_IDIOMES_ARGS = '@^\s*([^= ]*)\s*=\s*((' . \NOM_DE_CHAMP . '[{][^}]*})?[^,]*)\s*,?\s*@s'
- BALISE_INCLURE = '/<INCLU[DR]E[[:space:]]*/S'
- BALISE_POLYGLOTTE = ',<multi>(.*)</multi>,Uims'
- BALISE_POSTAFF_BOUCLE = '</BB'
- Fin de la partie après non optionnelle d'une boucle (toujours affichee)
- BALISE_POSTCOND_BOUCLE = '</B'
- Fin de la partie optionnelle après d'une boucle
- BALISE_PREAFF_BOUCLE = '<BB'
- Début de la partie avant non optionnelle d'une boucle (toujours affichee)
- BALISE_PRECOND_BOUCLE = '<B'
- Début de la partie optionnelle avant d'une boucle
- CHAMP_ETENDU = '/\[([^\[]*?)\(' . \NOM_DE_CHAMP . '([^)]*\)[^]]*)\]/S'
- Balise complète [...(#TOTO) ... ]
- CHAMP_SQL_PLUS_FONC = '`?([A-Z_\/][A-Z_\/0-9.]*)' . \SQL_ARGS . '?`?'
- Fonction SQL sur un champ ex: SUM(visites)
- NOM_DE_BOUCLE = '[0-9]+|[-_][-_.a-zA-Z0-9]*'
- Expression pour trouver un identifiant de boucle
- NOM_DE_CHAMP = '#((' . \NOM_DE_BOUCLE . "):)?(([A-F]*[G-Z_][A-Z_0-9]*)|[A-Z_]+)\\b(\\*{0,2})"
- Nom d'une balise #TOTO
- SPEC_BOUCLE = '/\s*\(\s*([^\s?)]+)(\s*[^)?]*)([?]?)\)/'
- Expression pour trouver le type de boucle (TABLE autre_table ?)
- SQL_ARGS = '(\([^)]*\))'
- Champ sql dans parenthèse ex: (id_article)
- TYPE_RECURSIF = 'boucle'
- Indique un début de boucle récursive
Functions
- phraser_inclure() : array<string|int, mixed>
- Parser les <INCLURE> dans le texte
- phraser_polyglotte() : array<string|int, mixed>
- Phraser les <multi>...</multi> on passe en dernier de toutes les analyses : a ce stade il ne reste que des morceaux de texte entre balises/boucles, donc une <multi> ne peut pas contenir de balises
- phraser_preparer_idiomes() : string
- Repérer les balises de traduction (idiomes)
- phraser_champs() : array<string|int, mixed>
- Repère et phrase les balises SPIP tel que `#NOM` dans un texte
- phraser_champs_etendus() : array<string|int, mixed>
- Phraser les champs etendus
- phraser_args() : array<string|int, mixed>
- Analyse les filtres d'un champ etendu et affecte le resultat renvoie la liste des lexemes d'origine augmentee de ceux trouves dans les arguments des filtres (rare) sert aussi aux arguments des includes et aux criteres de boucles Tres chevelu
- phraser_arg() : mixed
- phraser_champs_exterieurs() : array<string|int, mixed>
- Reconstruire un tableau de resultat ordonné selon l'ordre d'apparition dans le texte issu de phraser_champs_interieurs() et phraser les inclure sur les morceaux intermédiaires
- phraser_champs_interieurs() : array<string|int, mixed>
- Parser un texte pour trouver toutes les balises complètes `[...(#TRUC)...]` en gérant les imbrications possibles
- phraser_vieux() : mixed
- Gerer les derogations de syntaxe historiques Ne concerne plus que #MODELE et <INCLURE> / #INCLURE
- phraser_criteres() : mixed
- Analyse les critères de boucle
- phraser_critere_infixe() : mixed
- public_compte_ligne() : int
- Compter le nombre de lignes dans une partie texte
- public_trouver_premiere_boucle() : array<string|int, mixed>|null
- Trouver la boucle qui commence en premier dans un texte On repere les boucles via <BOUCLE_xxx( et ensuite on regarde son vrai debut soit <B_xxx> soit <BB_xxx>
- public_trouver_fin_boucle() : array<string|int, mixed>
- Trouver la fin de la boucle (balises </B <//B </BB) en faisant attention aux boucles anonymes qui ne peuvent etre imbriquees
- phraser_placeholder_hash() : string
- Définir un placeholder avec un hash unique pour substitution dans un texte donné on s'assure de n'avoir aucune occurence existante dans le texte
- phraser_placeholder_memoriser() : mixed
- Memoriser un champ ou une boucle associé a son placeholder
- phraser_placeholder_reinjecter() : mixed
- Reinejcter un champ ou une boucle associé a son placeholder
- public_placeholder_generer() : string
- Generer une balise placeholder qui prend la place d'une boucle ou d'un champ pour continuer le parsing des balises utilisé pour remplacer une boucle ou un idiome
- public_phraser_html_dist() : array<string|int, mixed>
- Analyseur syntaxique des squelettes HTML SPIP On commence par analyser les boucles, les mémoriser, et les remplacer dans le texte par des placeholder qui ne genent pas la suite de l'analyse des balises et autres
Constants
BALISE_ALT_BOUCLE
Fin de la partie alternative après d'une boucle
    public
        mixed
    BALISE_ALT_BOUCLE
    = '<//B'
    
    
    
    
BALISE_BOUCLE
Début de la partie principale d'une boucle
    public
        mixed
    BALISE_BOUCLE
    = '<BOUCLE'
    
    
    
    
BALISE_FIN_BOUCLE
Fin de la partie principale d'une boucle
    public
        mixed
    BALISE_FIN_BOUCLE
    = '</BOUCLE'
    
    
    
    
BALISE_IDIOMES
    public
        mixed
    BALISE_IDIOMES
    = ',<:(([a-z0-9_]+):)?([a-z0-9_]*)({([^\|=>]*=[^\|>]*)})?((\|[^>]*)?:/?>),iS'
    
    
    
    
BALISE_IDIOMES_ARGS
    public
        mixed
    BALISE_IDIOMES_ARGS
    = '@^\s*([^= ]*)\s*=\s*((' . \NOM_DE_CHAMP . '[{][^}]*})?[^,]*)\s*,?\s*@s'
    
    
    
    
BALISE_INCLURE
    public
        mixed
    BALISE_INCLURE
    = '/<INCLU[DR]E[[:space:]]*/S'
    
    
    
    
BALISE_POLYGLOTTE
    public
        mixed
    BALISE_POLYGLOTTE
    = ',<multi>(.*)</multi>,Uims'
    
    
    
    
BALISE_POSTAFF_BOUCLE
Fin de la partie après non optionnelle d'une boucle (toujours affichee)
    public
        mixed
    BALISE_POSTAFF_BOUCLE
    = '</BB'
    
    
    
    
BALISE_POSTCOND_BOUCLE
Fin de la partie optionnelle après d'une boucle
    public
        mixed
    BALISE_POSTCOND_BOUCLE
    = '</B'
    
    
    
    
BALISE_PREAFF_BOUCLE
Début de la partie avant non optionnelle d'une boucle (toujours affichee)
    public
        mixed
    BALISE_PREAFF_BOUCLE
    = '<BB'
    
    
    
    
BALISE_PRECOND_BOUCLE
Début de la partie optionnelle avant d'une boucle
    public
        mixed
    BALISE_PRECOND_BOUCLE
    = '<B'
    
    
    
    
CHAMP_ETENDU
Balise complète [...(#TOTO) ... ]
    public
        mixed
    CHAMP_ETENDU
    = '/\[([^\[]*?)\(' . \NOM_DE_CHAMP . '([^)]*\)[^]]*)\]/S'
    
    
    
    
CHAMP_SQL_PLUS_FONC
Fonction SQL sur un champ ex: SUM(visites)
    public
        mixed
    CHAMP_SQL_PLUS_FONC
    = '`?([A-Z_\/][A-Z_\/0-9.]*)' . \SQL_ARGS . '?`?'
    
    
    
    
NOM_DE_BOUCLE
Expression pour trouver un identifiant de boucle
    public
        mixed
    NOM_DE_BOUCLE
    = '[0-9]+|[-_][-_.a-zA-Z0-9]*'
    
    
    
    
NOM_DE_CHAMP
Nom d'une balise #TOTO
    public
        mixed
    NOM_DE_CHAMP
    = '#((' . \NOM_DE_BOUCLE . "):)?(([A-F]*[G-Z_][A-Z_0-9]*)|[A-Z_]+)\\b(\\*{0,2})"
        Écriture alambiquée pour rester compatible avec les hexadecimaux des vieux squelettes
SPEC_BOUCLE
Expression pour trouver le type de boucle (TABLE autre_table ?)
    public
        mixed
    SPEC_BOUCLE
    = '/\s*\(\s*([^\s?)]+)(\s*[^)?]*)([?]?)\)/'
    
    
    
    
SQL_ARGS
Champ sql dans parenthèse ex: (id_article)
    public
        mixed
    SQL_ARGS
    = '(\([^)]*\))'
    
    
    
    
TYPE_RECURSIF
Indique un début de boucle récursive
    public
        mixed
    TYPE_RECURSIF
    = 'boucle'
    
    
    
    
Functions
phraser_inclure()
Parser les <INCLURE> dans le texte
    
                    phraser_inclure(string $texte, int $ligne, array<string|int, mixed> $result) : array<string|int, mixed>
    
        Parameters
- $texte : string
- $ligne : int
- $result : array<string|int, mixed>
Return values
array<string|int, mixed>phraser_polyglotte()
Phraser les <multi>...</multi> on passe en dernier de toutes les analyses : a ce stade il ne reste que des morceaux de texte entre balises/boucles, donc une <multi> ne peut pas contenir de balises
    
                    phraser_polyglotte(string $texte, int $ligne, array<string|int, mixed> $result) : array<string|int, mixed>
    
        Parameters
- $texte : string
- $ligne : int
- $result : array<string|int, mixed>
Tags
Return values
array<string|int, mixed>phraser_preparer_idiomes()
Repérer les balises de traduction (idiomes)
    
                    phraser_preparer_idiomes(string $texte, int $ligne, string $sep, array<string|int, mixed> $result) : string
        Phrase les idiomes tel que
- <:chaine:>
- <:module:chaine:>
- <:module:chaine{arg1=texte1,arg2=#BALISE}|filtre1{texte2,#BALISE}|filtre2:>
- <:module:chaine{arg1=texte1,arg2=[(#BALISE)]}|filtre1{texte2,#BALISE}|filtre2:>
- <:module:{=#VAL{chaine},arg1=texte1,arg2=[(#BALISE)]}|filtre1{texte2,#BALISE}|filtre2:>
- <:{=#VAL{module:chaine},arg1=texte1,arg2=[(#BALISE)]}|filtre1{texte2,#BALISE}|filtre2:>
Pour permettre une syntaxe complète dans les arguments, on transforme la syntaxe <:..:> en une syntaxe standard de balises
[(#TRAD_IDIOME{module:chaine,arg1=texte1,arg2=[(#BALISE)]}|filtre1{texte2,#BALISE}|filtre2)]
qui est ensuite parsée comme une balise standard
Parameters
- $texte : string
- $ligne : int
- $sep : string
- $result : array<string|int, mixed>
Tags
Return values
stringphraser_champs()
Repère et phrase les balises SPIP tel que `#NOM` dans un texte
    
                    phraser_champs(string $texte, int $ligne, array<string|int, mixed> $result) : array<string|int, mixed>
        Phrase également ses arguments si la balise en a (#NOM{arg, ...})
Parameters
- $texte : string
- $ligne : int
- $result : array<string|int, mixed>
Tags
Return values
array<string|int, mixed>phraser_champs_etendus()
Phraser les champs etendus
    
                    phraser_champs_etendus(string $texte, int $ligne, array<string|int, mixed> $result) : array<string|int, mixed>
    
        Parameters
- $texte : string
- $ligne : int
- $result : array<string|int, mixed>
Tags
Return values
array<string|int, mixed>phraser_args()
Analyse les filtres d'un champ etendu et affecte le resultat renvoie la liste des lexemes d'origine augmentee de ceux trouves dans les arguments des filtres (rare) sert aussi aux arguments des includes et aux criteres de boucles Tres chevelu
    
                    phraser_args(string $texte, string $fin, string $sep, array<string|int, mixed> $result, Champ|Inclure|Boucle &$pointeur_champ, int &$pos_debut) : array<string|int, mixed>
    
        Parameters
- $texte : string
- $fin : string
- $sep : string
- $result : array<string|int, mixed>
- $pointeur_champ : Champ|Inclure|Boucle
- $pos_debut : int
Tags
Return values
array<string|int, mixed>phraser_arg()
    
                    phraser_arg(mixed &$texte, mixed $sep, mixed $result, mixed &$pointeur_champ) : mixed
    
        Parameters
- $texte : mixed
- $sep : mixed
- $result : mixed
- $pointeur_champ : mixed
phraser_champs_exterieurs()
Reconstruire un tableau de resultat ordonné selon l'ordre d'apparition dans le texte issu de phraser_champs_interieurs() et phraser les inclure sur les morceaux intermédiaires
    
                    phraser_champs_exterieurs(string $texte, int $ligne, string $sep, array<string|int, mixed> $nested_res) : array<string|int, mixed>
    
        Parameters
- $texte : string
- $ligne : int
- $sep : string
- $nested_res : array<string|int, mixed>
Return values
array<string|int, mixed>phraser_champs_interieurs()
Parser un texte pour trouver toutes les balises complètes `[...(#TRUC)...]` en gérant les imbrications possibles
    
                    phraser_champs_interieurs(string $texte, int $no_ligne, string $sep) : array<string|int, mixed>
        Pour cela on commence par les plus profondes, sans rien dedans,
on les remplace par un placehoder inactif %###N@ ou N indexe un tableau comportant le resultat de leur analyse
et on recommence jusqu'à ce qu'on ne trouve plus rien
Parameters
- $texte : string
- $no_ligne : int
- $sep : string
Return values
array<string|int, mixed>phraser_vieux()
Gerer les derogations de syntaxe historiques Ne concerne plus que #MODELE et <INCLURE> / #INCLURE
    
                    phraser_vieux(Champ|Inclure &$champ) : mixed
    
        Parameters
- $champ : Champ|Inclure
Tags
phraser_criteres()
Analyse les critères de boucle
    
                    phraser_criteres(array<string|int, mixed> $params, Boucle &$result) : mixed
        Chaque paramètre de la boucle (tel que {id_article>3}) est analysé pour construire un critère (objet Critere) de boucle.
Un critère a une description plus fine que le paramètre original car on en extrait certaines informations tel que la négation et l'opérateur utilisé s'il y a.
La fonction en profite pour déclarer des modificateurs de boucles en présence de certains critères (tout, plat) ou initialiser des variables de compilation (doublons)...
Parameters
- $params : array<string|int, mixed>
- 
                    Tableau de description des paramètres passés à la boucle. Chaque paramètre deviendra un critère 
- $result : Boucle
- 
                    Description de la boucle Elle sera complété de la liste de ses critères 
phraser_critere_infixe()
    
                    phraser_critere_infixe(mixed $arg1, mixed $arg2, mixed $args, mixed $op, mixed $not, mixed $cond) : mixed
    
        Parameters
- $arg1 : mixed
- $arg2 : mixed
- $args : mixed
- $op : mixed
- $not : mixed
- $cond : mixed
public_compte_ligne()
Compter le nombre de lignes dans une partie texte
    
                    public_compte_ligne(string $texte[, int $debut = 0 ][, int|null $fin = null ]) : int
    
        Parameters
- $texte : string
- $debut : int = 0
- $fin : int|null = null
Return values
intpublic_trouver_premiere_boucle()
Trouver la boucle qui commence en premier dans un texte On repere les boucles via <BOUCLE_xxx( et ensuite on regarde son vrai debut soit <B_xxx> soit <BB_xxx>
    
                    public_trouver_premiere_boucle(string $texte, string $id_parent, array<string|int, mixed> $descr[, int $pos_debut_texte = 0 ]) : array<string|int, mixed>|null
    
        Parameters
- $texte : string
- $id_parent : string
- $descr : array<string|int, mixed>
- $pos_debut_texte : int = 0
Return values
array<string|int, mixed>|nullpublic_trouver_fin_boucle()
Trouver la fin de la boucle (balises </B <//B </BB) en faisant attention aux boucles anonymes qui ne peuvent etre imbriquees
    
                    public_trouver_fin_boucle(string $texte, string $id_parent, array<string|int, mixed> $boucle, int $pos_debut_texte, object $result) : array<string|int, mixed>
    
        Parameters
- $texte : string
- $id_parent : string
- $boucle : array<string|int, mixed>
- $pos_debut_texte : int
- $result : object
Return values
array<string|int, mixed> —la description de la boucle dans un tableau associatif
phraser_placeholder_hash()
Définir un placeholder avec un hash unique pour substitution dans un texte donné on s'assure de n'avoir aucune occurence existante dans le texte
    
                    phraser_placeholder_hash(string &$texte, string $placeholder_prefixe) : string
    
        Parameters
- $texte : string
- $placeholder_prefixe : string
Return values
stringphraser_placeholder_memoriser()
Memoriser un champ ou une boucle associé a son placeholder
    
                    phraser_placeholder_memoriser(string $champ, string $nom_champ_placeholder, mixed $boucle_ou_champ) : mixed
    
        Parameters
- $champ : string
- $nom_champ_placeholder : string
- $boucle_ou_champ : mixed
Tags
phraser_placeholder_reinjecter()
Reinejcter un champ ou une boucle associé a son placeholder
    
                    phraser_placeholder_reinjecter(mixed &$champ) : mixed
    
        Parameters
- $champ : mixed
Tags
public_placeholder_generer()
Generer une balise placeholder qui prend la place d'une boucle ou d'un champ pour continuer le parsing des balises utilisé pour remplacer une boucle ou un idiome
    
                    public_placeholder_generer(string $nom_structure, mixed &$boucle_ou_champ, string $placeholder_pattern, int $nb_lignes[, bool $force_balise_etendue = false ]) : string
    
        Parameters
- $nom_structure : string
- $boucle_ou_champ : mixed
- $placeholder_pattern : string
- $nb_lignes : int
- $force_balise_etendue : bool = false
Return values
stringpublic_phraser_html_dist()
Analyseur syntaxique des squelettes HTML SPIP On commence par analyser les boucles, les mémoriser, et les remplacer dans le texte par des placeholder qui ne genent pas la suite de l'analyse des balises et autres
    
                    public_phraser_html_dist(string $texte, string $id_parent, array<string|int, mixed> &$boucles, array<string|int, mixed> $descr[, int $ligne_debut_texte = 1 ][, string|null $boucle_placeholder = null ]) : array<string|int, mixed>
    
        Parameters
- $texte : string
- $id_parent : string
- $boucles : array<string|int, mixed>
- $descr : array<string|int, mixed>
- $ligne_debut_texte : int = 1
- $boucle_placeholder : string|null = null