[Résolu] remplacer | par @ dans un modele..proposition de solutions

bonjour
j’ai créé des modèles , que je partagerais des que suffisamment solide.
Il me reste un pb récurent : j’utilise insere_modele et une barre « edition » dans les textarea.
Si on inclus un | dans un modele … patatras.
cela empêche même l’enregistrement automatique du modèle si on l’a appelé par la barre edition.

Si on remplace ce | par @ avec [(#ENV*{letexte}|remplacerarobas|propre)] dans le squelette du modèle c’est ok ( merci pour la solution dans une précédente discussion).

par exemple pour centrer une partie du texte du modèle bla bla on doit écrire
<monmodele|letexte=debut tetxe [@lbla bla@] fin texte>
sinon le modele ne fonctionne pas (idem pour <doc1300@left@largeur=300>)

il est difficile de demander aux rédacteurs de faire eux même la modif.

comme j’utilise inserer_modele, j’ai trouvée deux solutions pour rendre cette manip automatique.
solution 1- en modifiant inserer_modele …

en rajoutant juste dans inserer_modele.php ligne 109
	 $champ=str_replace('|','@',_request($champ));	
ce qui donne 
foreach ($champs as $champ) {
				if ($champ != 'modele' && $champ != 'variante' && $champ != 'classe' && $champ != 'id_modele' && $champ != 'align' && _request($champ) && _request($champ) != '') {
					 $champ=str_replace('|','@',_request($champ));	
					if ($champ == _request($champ)) {
						$code .= "|$champ";
					} elseif (is_array(_request($champ))) {
						// On transforme les tableaux en une liste
						$code .= "|$champ=" . implode(',', _request($champ));
					} else {
						$code .= "|$champ=" . _request($champ);
					}
				}

solution 2- en créant pour mon plugin dans le répertoire saisie, une saisie « textarea_arobas » au lieu de « textarea » dans les fichiers yaml des modeles

textarea_arobas : devient

**[(#SET{valeur,#ENV*{valeur}|remplacerpipe|propre})]** 
#SET{valeur, #ENV{valeur_forcee,#GET{valeur,#ENV{defaut}}}}

#SET{valeur, #GET{valeur}|is_array|?{(#GET{valeur}|saisies_tableau2chaine), #GET{valeur}}}
#SET{valeur,#GET{valeur}|saisies_utf8_restaurer_planes}
**<textarea  onmouseout="changerPipe(this)"** name="#ENV{nom}" class="[(#ENV{class}) ][inserer_barre_(#ENV{inserer_barre}) ][(#ENV{previsualisation}|oui)inserer_previsualisation]" id="champ_[(#ENV{id,#ENV{nom}}|saisie_nom2classe)]" rows="[(#ENV{rows,20})]" [cols="(#ENV{cols})"] [ disabled="(#ENV{disable})"][ readonly="(#ENV{readonly})"][ placeholder="(#ENV{placeholder})"][(#ENV{obligatoire}|et{#ENV{obligatoire}|!={non}}|et{#HTML5}|oui) required="required"][ aria-describedby="(#ENV{describedby})"][  maxlength="(#ENV{longueur_max})"][ (#ENV*{attributs})]>
[(#GET{valeur})] 
</textarea>

**<script>**
**function changerPipe(arg) {**
**let text = arg.value;**
**arg.value = text.replaceAll("|","@");**
**  }**
**</script>**

Cette solution évite devoir modifier inserer_modele a chaque changement de version.
dans les deux cas il faut rajouter une fonction dans mes_fonctions.php

function remplacerarobas($texte,$separateur="@") {	
	$texte = str_replace($separateur,'|',$texte);
	return $texte;
}

et utiliser dans le squelette du modele
[(#ENV*{letexte}|remplacerarobas|propre)]

Dommage que cela ne soit pas pris en compte dans inserer_modele
que pensez vous des solutions ?

Mais solution à quoi ? Tu donnes plein de détail technique de ce que tu voudrais faire mais personnellement je n’ai pas réussi à comprendre déjà le problème d’origine que tu cherches à résoudre. Ça veut dire quoi « si on met un | dans un modèle » ? C’est le caractère de base pour séparer les paramètres d’un modèle donc bah c’est normal que ça soit dans un modèle…

@R l’a formulé peu aimablement, mais en effet, peux tu préciser ce que tu veux dire par « Si on inclus un | dans un modele » ?

dans un modèle on peut avoir un texte.
ce texte on peut le faire saisir par un textarea dans le .yaml du modele
on peut aussi mettre la barre édition sur ce textarea.

Des rédacteurs mettent une partie de ce textarea en centrer avec [| |] ou une image avec <docxx|largeur= 400> Cela induis un pb d’affichage et même d’enregistrement du modele si on l’appelle par la barre edition.
Dans un précédent post, une personne qui a le même problème, m’a donné la solution : leur demander de mettre un @ a la place d’un pipe et ajouter la fonction remplacerarobas puis mettre [(#ENV*{letexte}|remplacerarobas|propre)] pour récupérer le champ dans le squelette du modèle.
Cela marche bien mais les rédacteurs oublient de mettre @ et se plaignent ( 10 sites).
comme il y a beaucoup de pression pour wordpress de la part de décideurs… j’essaye de supprimer cet inconvenient aux rédacteurs.

exemple de modeles
image

avec un flip horizontal ou vertical ( non visible ici) :
image


image

bon moi j’ai la solution… je voulais juste partager car le fil ou la personne avait le même pb est clos…

Le raccourci que tu cites [| |] c’est pas du spip-dist et je ne l’ai jamais utilisé. C’est quel plugin qui le propose et le gère ? Peut être c’est dans ce plugin qu’il faudrait pouvoir paramétrer le caractère utilisé.
Il y a d’autres situations qui posent problème ?

pour le [| …|] c’est dans
Enluminures typographiques
on peut remplacerle | par @ dans enluminuretypo_pipeline et rajouter le traitement dans typoenlumine

mais il y a aussi et surtout les images mises dans le texte .
<docxx|largeur=400> est très utilisé directement dans les textarea des modeles et je tiens a garder cette fonctionnalité.

pour info … la barre edition appelée depuis le yaml d’ un modèle contient l’appel a la fenêtre modele etc …

Mais surtout le point principale c’est que ce n’est pas propre à Insérer modèle du tout : ce que tu décris, c’est le fait que SPIP ne permet pas et n’a jamais permis de mettre… des modèles DANS des modèles, notamment. Qu’on l’écrive à la main ou qu’on s’aide de Insérer modèle ne change strictement rien à l’affaire, c’est le principe même de cette imbrication qui n’a jamais été prévu.

Genre vouloir mettre :
<monmodele|titre=Truc|texte=Un texte plus long avec <autremodele|autreparam=machin|bidule=truc> à l'intérieur|largeur=1234>

Ça ça n’existe pas. Si jamais ça devait être corrigé, ou plutôt permis car c’est une évolution, c’est dans le noyau de SPIP directement, donc à ouvrir un ticket là bas.

Peut-être que ce que tu veux faire est plutôt à voir du côté de cibloc : mettre en forme le texte d'articles avec des blocs - SPIP-Contrib ?

non je n’utilise plus cibloc . J’ai l’équivalent avec des modèles et leur fichier yaml.
ce qui a l’avantage de permettre aux rédacteurs de remplir simplement ces « blocs ».
je ne veux pas inclure tous les modèles mais simplement doc img et [| |]
donc je vais simplement mettre une saisie particulière la ou j’ai besoin dans les yaml.
je vais essayer ciwidget … mais les modèles sont déjà utilises sur les sites