Browse Source

refactor: utiliser un CollecteurIdiomes pour collecter/echapper/retablir et traiter les idiomes <:ecrire:bouton_valider:>

pull/5339/head
Cerdic 4 months ago
parent
commit
dbef8c3acb
  1. 41
      ecrire/inc/filtres.php
  2. 139
      ecrire/src/Texte/CollecteurIdiomes.php

41
ecrire/inc/filtres.php

@ -1657,13 +1657,6 @@ function post_autobr($texte, $delim = "\n_ ") {
}
/**
* Expression régulière pour obtenir le contenu des extraits idiomes `<:module:cle:>`
*
* @var string
*/
define('_EXTRAIRE_IDIOME', '@<:(?:([a-z0-9_]+):)?([a-z0-9_]+):>@isS');
/**
* Extrait une langue des extraits idiomes (`<:module:cle_de_langue:>`)
*
@ -1694,15 +1687,11 @@ define('_EXTRAIRE_IDIOME', '@<:(?:([a-z0-9_]+):)?([a-z0-9_]+):>@isS');
* @return string
**/
function extraire_idiome($letexte, $lang = null, $options = []) {
static $traduire = false;
if (
$letexte
and preg_match_all(_EXTRAIRE_IDIOME, $letexte, $regs, PREG_SET_ORDER)
and strpos($letexte, '<:') !== false
) {
if (!$traduire) {
$traduire = charger_fonction('traduire', 'inc');
include_spip('inc/lang');
}
if (!$lang) {
$lang = $GLOBALS['spip_lang'];
}
@ -1713,26 +1702,14 @@ function extraire_idiome($letexte, $lang = null, $options = []) {
if (!isset($options['echappe_span'])) {
$options = array_merge($options, ['echappe_span' => false]);
}
$options['lang'] = $lang;
include_spip("src/Texte/Utils/Collecteur");
include_spip("src/Texte/CollecteurIdiomes");
$CollecteurIdiomes = new Spip\Texte\CollecteurIdiomes();
$letexte = $CollecteurIdiomes->traiter($letexte, $options);
foreach ($regs as $reg) {
$cle = ($reg[1] ? $reg[1] . ':' : '') . $reg[2];
$desc = $traduire($cle, $lang, true);
$l = $desc->langue;
// si pas de traduction, on laissera l'écriture de l'idiome entier dans le texte.
if (strlen($desc->texte ?? '')) {
$trad = code_echappement($desc->texte, 'idiome', false);
if ($l !== $lang) {
$trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
}
if (lang_dir($l) !== lang_dir($lang)) {
$trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
}
if (!$options['echappe_span']) {
$trad = echappe_retour($trad, 'idiome');
}
$letexte = str_replace($reg[0], $trad, $letexte);
}
}
}
return $letexte;
}

139
ecrire/src/Texte/CollecteurIdiomes.php

@ -0,0 +1,139 @@
<?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. *
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
* \***************************************************************************/
namespace Spip\Texte;
use Spip\Texte\Utils\Collecteur;
/**
* Extrait une langue des extraits idiomes (`<:module:cle_de_langue:>`)
*
* Retrouve les balises `<:cle_de_langue:>` d'un texte et remplace son contenu
* par l'extrait correspondant à la langue demandée (si possible), sinon dans la
* langue par défaut du site.
*
* Ne pas mettre de span@lang=fr si on est déjà en fr.
*/
class CollecteurIdiomes extends Collecteur {
protected static string $markPrefix = 'IDIOME';
/**
* La preg pour découper et collecter les modèles
* @var string
*/
protected string $preg_idiome;
public function __construct(?string $preg = null) {
$this->preg_idiome = ($preg ?: '@<:(?:([a-z0-9_]+):)?([a-z0-9_]+):>@isS');
}
/**
* Sanitizer une collection d'occurences d'idiomes : on ne fait rien
*
* @param array $collection
* @param string $sanitize_callback
* @return array
*/
protected function sanitizer_collection(array $collection, string $sanitize_callback): array {
return $collection;
}
/**
* @param string $texte
* @param array $options
* bool $collecter_liens
* @return array
*/
public function collecter(string $texte, array $options = []): array {
if (!$texte) {
return [];
}
// collecter les matchs de la preg
$idiomes = $this->collecteur($texte, '', '<:', $this->preg_idiome, empty($options['detecter_presence']) ? 0 : 1);
// si on veut seulement detecter la présence, on peut retourner tel quel
if (empty($options['detecter_presence'])) {
$pos_prev = 0;
foreach ($idiomes as $k => &$idiome) {
$idiome['module'] = $idiome['match'][1];
$idiome['chaine'] = $idiome['match'][2];
}
}
return $idiomes;
}
/**
* Traiter les idiomes d'un texte
*
* @uses inc_traduire_dist()
* @uses code_echappement()
* @uses echappe_retour()
*
* @param string $texte
* @param array $options
* ?string $lang
* ?bool echappe_span
* @return string
*/
public function traiter(string $texte, array $options) {
static $traduire;
if ($texte) {
$idiomes = $this->collecter($texte);
if (!empty($idiomes)) {
$lang = $options['lang'] ?? $GLOBALS['spip_lang'];
$echappe_span = $options['echappe_span'] ?? false;
if (is_null($traduire)) {
$traduire = charger_fonction('traduire', 'inc');
include_spip('inc/lang');
}
$offset_pos = 0;
foreach ($idiomes as $idiome) {
$cle = ($idiome['module'] ? $idiome['module'] . ':' : '') . $idiome['chaine'];
$desc = $traduire($cle, $lang, true);
$l = $desc->langue;
// si pas de traduction, on laissera l'écriture de l'idiome entier dans le texte.
if (strlen($desc->texte ?? '')) {
$trad = code_echappement($desc->texte, 'idiome', false);
if ($l !== $lang) {
$trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l));
}
if (lang_dir($l) !== lang_dir($lang)) {
$trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l)));
}
if (!$echappe_span) {
$trad = echappe_retour($trad, 'idiome');
}
$texte = substr_replace($texte, $trad, $idiome['pos'] + $offset_pos, $idiome['length']);
$offset_pos += strlen($trad) - $idiome['length'];
}
}
}
}
return $texte;
}
}
Loading…
Cancel
Save