Browse Source

feat(dev-tools): Mise en place phpcs+phpstan (#4837)

Co-authored-by: JamesRezo <james@rezo.net>
Reviewed-on: #4837
Co-authored-by: JamesRezo <jamesrezo@noreply.git.spip.net>
Co-committed-by: JamesRezo <jamesrezo@noreply.git.spip.net>
master
JamesRezo 3 months ago
parent
commit
2d03d6681c
  1. 7
      .gitignore
  2. 7
      composer.json
  3. 70
      engine/textwheel.php
  4. 1
      engine/textwheelrule.php
  5. 24
      engine/textwheelruleset.php
  6. 3
      inc/autoliens.php
  7. 145
      inc/lien.php
  8. 47
      inc/notes.php
  9. 13
      inc/ressource.php
  10. 163
      inc/texte.php
  11. 43
      inc/textwheel.php
  12. 15
      phpcs.xml.dist
  13. 442
      phpstan-baseline.neon
  14. 12
      phpstan.neon.dist
  15. 14
      typographie/en.php
  16. 24
      typographie/fr.php
  17. 12
      wheels/spip/echappe-js.php
  18. 8
      wheels/spip/spip-listes.php
  19. 40
      wheels/spip/spip-paragrapher.php
  20. 6
      wheels/spip/spip.php

7
.gitignore

@ -0,0 +1,7 @@
/vendor/
/composer.phar
/composer.lock
/phpcs.xml
/phpstan.neon
/.php_cs.cache
/.php_cs.txt

7
composer.json

@ -0,0 +1,7 @@
{
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.1",
"spip/coding-standards": "^1.2",
"phpstan/phpstan": "^0.12.98"
}
}

70
engine/textwheel.php

@ -22,15 +22,15 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
require_once dirname(__FILE__) . "/textwheelruleset.php";
require_once dirname(__FILE__) . '/textwheelruleset.php';
class TextWheel {
protected $ruleset;
protected static $subwheel = array();
protected static $subwheel = [];
// Experimental : projet de compilation PHP d'une wheel
// pour generation d'un fichier php execute a la place de ->text()
protected $compiled = array();
protected $compiled = [];
/**
* Constructor
@ -62,9 +62,8 @@ class TextWheel {
public function text($t) {
$rules = &$this->ruleset->getRules();
## apply each in order
foreach ($rules as $name => $rule) #php4+php5
{
$this->apply($rules[$name], $t);
foreach ($rules as $name => $rule) { #php4+php5
$this->apply($rules[$name], $t);
}
#foreach ($this->rules as &$rule) #smarter &reference, but php5 only
# $this->apply($rule, $t);
@ -79,20 +78,21 @@ class TextWheel {
$rules = &$this->ruleset->getRules();
## apply each in order
$pre = array();
$comp = array();
$pre = [];
$comp = [];
foreach ($rules as $name => $rule) {
$rule->name = $name;
$this->initRule($rule);
if ($rule->replace
if (
$rule->replace
and $compiledEntry = $this->ruleCompiledEntryName($rule->replace)
and isset($this->compiled[$compiledEntry])
and $fun = $this->compiled[$compiledEntry]
) {
$pre[] = "\n###\n## $name\n###\n" . $fun;
preg_match(',function (\w+), ', $fun, $r);
$rule->compilereplace = "'".$r[1]."'"; # ne pas modifier ->replace sinon on casse l'execution...
$rule->compilereplace = "'" . $r[1] . "'"; # ne pas modifier ->replace sinon on casse l'execution...
}
$r = "\t/* $name */\n";
@ -226,7 +226,7 @@ class TextWheel {
elseif ($rule->is_wheel) {
$rule_number = count(TextWheel::$subwheel);
TextWheel::$subwheel[] = $this->createSubWheel($rule->replace);
$cname = 'compiled_' . str_replace('-', '_', $rule->name) . '_' . substr(md5(spl_object_hash($rule)),0,7);
$cname = 'compiled_' . str_replace('-', '_', $rule->name) . '_' . substr(md5(spl_object_hash($rule)), 0, 7);
if ($rule->type == 'all' or $rule->type == 'str' or $rule->type == 'split' or !isset($rule->match)) {
$rule->replace = function ($m) use ($rule_number) {
return TextWheel::getSubWheel($rule_number)->text($m);
@ -238,7 +238,7 @@ class TextWheel {
$rule->replace = function ($m) use ($rule_number, $pick_match) {
return TextWheel::getSubWheel($rule_number)->text($m[$pick_match]);
};
$rule->compilereplace = 'function ($m) { return '.$cname.'($m['.$pick_match.']) }';
$rule->compilereplace = 'function ($m) { return ' . $cname . '($m[' . $pick_match . ']) }';
}
$rule->is_wheel = false;
$rule->is_callback = true;
@ -256,7 +256,8 @@ class TextWheel {
case 'str':
$rule->func_replace = 'replace_str';
// test if quicker strtr usable
if (!$rule->is_callback
if (
!$rule->is_callback
and is_array($rule->match) and is_array($rule->replace)
and $c = array_map('strlen', $rule->match)
and $c = array_unique($c)
@ -274,7 +275,7 @@ class TextWheel {
break;
case 'split':
$rule->func_replace = 'replace_split';
$rule->match = array($rule->match, is_null($rule->glue) ? $rule->match : $rule->glue);
$rule->match = [$rule->match, is_null($rule->glue) ? $rule->match : $rule->glue];
break;
case 'preg':
default:
@ -285,7 +286,7 @@ class TextWheel {
$rule->func_replace .= '_cb';
}
}
if (!method_exists("TextWheel", $rule->func_replace)) {
if (!method_exists('TextWheel', $rule->func_replace)) {
$rule->disabled = true;
$rule->func_replace = 'replace_identity';
}
@ -512,11 +513,11 @@ class TextWheelDebug extends TextWheel {
if ($p < 1000) {
$s = '';
} else {
$s = sprintf("%d ", $x = floor($p / 1000));
$s = sprintf('%d ', $x = floor($p / 1000));
$p -= ($x * 1000);
}
return $s . sprintf("%.3f ms", $p);
return $s . sprintf('%.3f ms', $p);
}
}
@ -529,11 +530,10 @@ class TextWheelDebug extends TextWheel {
public function text($t) {
$rules = &$this->ruleset->getRules();
## apply each in order
foreach ($rules as $name => $rule) #php4+php5
{
if (is_int($name)) {
foreach ($rules as $name => $rule) { #php4+php5
if (is_int($name)) {
$name .= ' ' . $rule->match;
}
}
$this->timer($name);
$b = $t;
$this->apply($rule, $t);
@ -546,7 +546,6 @@ class TextWheelDebug extends TextWheel {
} else {
TextWheelDebug::$tnu[$name] += $v;
}
}
#foreach ($this->rules as &$rule) #smarter &reference, but php5 only
# $this->apply($rule, $t);
@ -582,15 +581,19 @@ class TextWheelDebug extends TextWheel {
$total += $t;
if (intval($t * 10)) {
echo "<tr>
<td class='number strong'>" . number_format(round($t * 10) / 10, 1) . "</td><td> " . spip_htmlspecialchars($r) . "</td>
<td"
. (!$applications ? " class='zero'" : "")
. ">" . $applications . "/" . intval(TextWheelDebug::$w[$r]) . "</td>
<td class='number'>" . ($applications ? number_format(round(TextWheelDebug::$tu[$r] / $applications * 100) / 100,
2) : "") . "</td>
<td class='number'>" . (($nu = intval(TextWheelDebug::$w[$r]) - $applications) ? number_format(round(TextWheelDebug::$tnu[$r] / $nu * 100) / 100,
2) : "") . "</td>
</tr>";
<td class='number strong'>" . number_format(round($t * 10) / 10, 1) . '</td><td> ' . spip_htmlspecialchars($r) . '</td>
<td'
. (!$applications ? " class='zero'" : '')
. '>' . $applications . '/' . intval(TextWheelDebug::$w[$r]) . "</td>
<td class='number'>" . ($applications ? number_format(
round(TextWheelDebug::$tu[$r] / $applications * 100) / 100,
2
) : '') . "</td>
<td class='number'>" . (($nu = intval(TextWheelDebug::$w[$r]) - $applications) ? number_format(
round(TextWheelDebug::$tnu[$r] / $nu * 100) / 100,
2
) : '') . '</td>
</tr>';
}
}
echo "</table>\n";
@ -601,9 +604,9 @@ class TextWheelDebug extends TextWheel {
<thead><tr><th>temps</th><th>rule</th></tr></thead>\n";
ksort($GLOBALS['totaux']);
TextWheelDebug::outputTotal($GLOBALS['totaux']);
echo "</table>";
echo '</table>';
# somme des temps des rules, ne tient pas compte des subwheels
echo "<p>temps total rules: " . round($total) . "&nbsp;ms</p>\n";
echo '<p>temps total rules: ' . round($total) . "&nbsp;ms</p>\n";
echo "</div>\n";
}
}
@ -631,7 +634,6 @@ class TextWheelDebug extends TextWheel {
protected function &createSubWheel(&$rules) {
return new TextWheelDebug($rules);
}
}

1
engine/textwheelrule.php

@ -103,5 +103,4 @@ class TextWheelRule {
}
}
}
}

24
engine/textwheelruleset.php

@ -28,11 +28,11 @@ if (!defined('_WHEELS_FORMAT_DEFAUT')) {
define('_WHEELS_FORMAT_DEFAUT', 'json');
}
require_once dirname(__FILE__) . "/textwheelrule.php";
require_once dirname(__FILE__) . '/textwheelrule.php';
abstract class TextWheelDataSet {
# list of data
protected $data = array();
protected $data = [];
/**
* file finder : can be overloaded in order to use application dependant
@ -76,7 +76,7 @@ abstract class TextWheelDataSet {
protected function loadFile(&$file, $default_path = '') {
if (!preg_match(',[.](yaml|json)$,i', $file, $matches)) {
// Le fichier est fourni sans son extension, on essaie avec le json puis le yaml sinon.
$formats = (_WHEELS_FORMAT_DEFAUT === 'json') ? array('json', 'yaml') : array('yaml', 'json');
$formats = (_WHEELS_FORMAT_DEFAUT === 'json') ? ['json', 'yaml'] : ['yaml', 'json'];
$name = $file;
foreach ($formats as $format) {
$file = $name . '.' . $format;
@ -92,7 +92,7 @@ abstract class TextWheelDataSet {
!$file
or (!$file = $this->findFile($file, $default_path))
) {
return array();
return [];
}
defined('_YAML_EVAL_PHP') || define('_YAML_EVAL_PHP', false);
@ -102,25 +102,25 @@ abstract class TextWheelDataSet {
include_spip('inc/yaml');
$dataset = yaml_decode(file_get_contents($file));
} else {
$dataset = array();
$dataset = [];
}
if (is_null($dataset)) {
$dataset = array();
$dataset = [];
}
# throw new DomainException('rule file is empty, unreadable or badly formed: '.$file.var_export($dataset,true));
// if a php file with same name exists
// include it as it contains callback functions
if ($f = preg_replace(',[.](yaml|json)$,i', '.php', $file)
if (
$f = preg_replace(',[.](yaml|json)$,i', '.php', $file)
and file_exists($f)
) {
$dataset[] = array('require' => $f, 'priority' => -1000);
$dataset[] = ['require' => $f, 'priority' => -1000];
}
return $dataset;
}
}
class TextWheelRuleSet extends TextWheelDataSet {
@ -133,7 +133,7 @@ class TextWheelRuleSet extends TextWheelDataSet {
* @param array|string $ruleset
* @param string $filepath
*/
public function __construct($ruleset = array(), $filepath = '') {
public function __construct($ruleset = [], $filepath = '') {
if ($ruleset) {
$this->addRules($ruleset, $filepath);
}
@ -251,14 +251,14 @@ class TextWheelRuleSet extends TextWheelDataSet {
*/
protected function sort() {
if (!$this->sorted) {
$rulz = array();
$rulz = [];
foreach ($this->data as $index => $rule) {
if (!$rule->disabled) {
$rulz[intval($rule->priority)][$index] = $rule;
}
}
ksort($rulz);
$this->data = array();
$this->data = [];
foreach ($rulz as $rules) {
$this->data += $rules;
}

3
inc/autoliens.php

@ -1,6 +1,5 @@
<?php
// Les URLs brutes sont converties en <a href='url'>url</a>
// https://code.spip.net/@traiter_raccourci_liens
function tw_autoliens($t) {
@ -10,7 +9,7 @@ function tw_autoliens($t) {
$t = preg_replace_callback(_EXTRAIRE_LIENS, 'tw_traiter_autoliens', $t);
// echapper les autoliens eventuellement inseres (en une seule fois)
if (strpos($t, "<html>") !== false) {
if (strpos($t, '<html>') !== false) {
$t = echappe_html($t);
}

145
inc/lien.php

@ -42,7 +42,7 @@ function inc_lien_dist(
$hlang = '',
$rel = '',
$connect = '',
$env = array()
$env = []
) {
static $u = null;
if (!$u) {
@ -71,8 +71,11 @@ function inc_lien_dist(
$row = sql_fetsel('*', $table_objet_sql, "$id_table_objet=" . intval($id))
and isset($row['id_trad'])
and isset($row['lang'])
and $id_dest = sql_getfetsel($id_table_objet, $table_objet_sql,
"id_trad=" . intval($row['id_trad']) . " AND lang=" . sql_quote($hlang))
and $id_dest = sql_getfetsel(
$id_table_objet,
$table_objet_sql,
'id_trad=' . intval($row['id_trad']) . ' AND lang=' . sql_quote($hlang)
)
and objet_test_si_publie($type, $id_dest)
) {
$lien = "$type$id_dest";
@ -93,23 +96,23 @@ function inc_lien_dist(
$class = $lien['class'];
}
$lang = isset($lien['lang']) ? $lien['lang'] : '';
$mime = isset($lien['mime']) ? " type='" . $lien['mime'] . "'" : "";
$mime = isset($lien['mime']) ? " type='" . $lien['mime'] . "'" : '';
$lien = $lien['url'];
}
$lien = trim($lien);
if (strncmp($lien, "#", 1) == 0) { # ancres pures (internes a la page)
if (strncmp($lien, '#', 1) == 0) { # ancres pures (internes a la page)
$class = 'spip_ancre';
} elseif (strncasecmp($lien, 'mailto:', 7) == 0) { # pseudo URL de mail
$class = "spip_mail";
$class = 'spip_mail';
} elseif (strncmp($texte, '<html>', 6) == 0) { # cf traiter_lien_explicite
$class = "spip_url";
$class = 'spip_url';
# spip_out sur les URLs externes
if (
preg_match(',^\w+://,iS', $lien)
and strncasecmp($lien, url_de_base(), strlen(url_de_base()))
) {
$class .= " spip_out";
$class .= ' spip_out';
}
} elseif (!$class) {
# spip_out sur les URLs externes
@ -117,7 +120,7 @@ function inc_lien_dist(
preg_match(',^\w+://,iS', $lien)
and strncasecmp($lien, url_de_base(), strlen(url_de_base()))
) {
$class = "spip_out"; # si pas spip_in|spip_glossaire
$class = 'spip_out'; # si pas spip_in|spip_glossaire
}
}
if ($class) {
@ -158,8 +161,11 @@ function inc_lien_dist(
// les rares cas de lien qui encapsule un modele passe en dessous, c'est plus lent
if (traiter_modeles($texte, false, '', $connect, null, $env) == $texte) {
$texte = typo($texte, true, $connect, $env);
$lien = "<a href=\"" . str_replace('"', '&quot;',
$lien) . "\"$class$lang$title$rel" . (isset($mime) ? $mime : '') . ">$texte</a>";
$lien = '<a href="' . str_replace(
'"',
'&quot;',
$lien
) . "\"$class$lang$title$rel" . (isset($mime) ? $mime : '') . ">$texte</a>";
if ($lang_objet_prev !== '') {
if ($lang_objet_prev) {
$GLOBALS['lang_objet'] = $lang_objet_prev;
@ -175,7 +181,7 @@ function inc_lien_dist(
# Attention, le texte initial est deja echappe mais pas forcement
# celui retourne par calculer_url.
# Penser au cas [<imgXX|right>->URL], qui exige typo('<a>...</a>')
$lien = "<a href=\"" . str_replace('"', '&quot;', $lien) . "\"$class$lang$title$rel$mime>$texte</a>";
$lien = '<a href="' . str_replace('"', '&quot;', $lien) . "\"$class$lang$title$rel$mime>$texte</a>";
#$res = typo($lien, true, $connect, $env);
$p = $GLOBALS['toujours_paragrapher'];
$GLOBALS['toujours_paragrapher'] = false;
@ -209,7 +215,7 @@ function inc_lien_dist(
* @return string
* Retourne une balise HTML de lien ou une chaîne vide.
*/
function balise_a($args = array()) {
function balise_a($args = []) {
$balise_a = '';
// Il faut soit au minimum un href OU un name pour réussir à générer quelque chose
@ -248,14 +254,14 @@ function balise_a($args = array()) {
// Laisser passer des paires de crochets pour la balise multi
// mais refuser plus d'imbrications ou de mauvaises imbrications
// sinon les crochets ne peuvent plus servir qu'a ce type de raccourci
define('_RACCOURCI_LIEN', "/\[([^][]*?([[][^]>-]*[]][^][]*)*)->(>?)([^]]*)\]/msS");
define('_RACCOURCI_LIEN', '/\[([^][]*?([[][^]>-]*[]][^][]*)*)->(>?)([^]]*)\]/msS');
// https://code.spip.net/@expanser_liens
function expanser_liens($t, $connect = '', $env = array()) {
function expanser_liens($t, $connect = '', $env = []) {
$t = pipeline('pre_liens', $t);
if (strpos($t, '\[') !== false or strpos($t, '\]') !== false) {
$t = str_replace(array('\[', '\]'), array("\x1\x5", "\x1\x6"), $t);
$t = str_replace(['\[', '\]'], ["\x1\x5", "\x1\x6"], $t);
}
expanser_un_lien($connect, 'init', $env);
@ -269,7 +275,7 @@ function expanser_liens($t, $connect = '', $env = array()) {
$t = traiter_modeles($t, false, false, $connect, expanser_un_lien('', 'sources'), $env);
if (strpos($t, "\x1") !== false) {
$t = str_replace(array("\x1\x5", "\x1\x6"), array('[', ']'), $t);
$t = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], $t);
}
$t = corriger_typo($t);
@ -281,14 +287,14 @@ function expanser_liens($t, $connect = '', $env = array()) {
function expanser_un_lien($reg, $quoi = 'echappe', $env = null) {
static $pile = array();
static $pile = [];
static $inserts;
static $sources;
static $regs;
static $k = 0;
static $lien;
static $connect = '';
static $contexte = array();
static $contexte = [];
switch ($quoi) {
case 'init':
@ -298,8 +304,8 @@ function expanser_un_lien($reg, $quoi = 'echappe', $env = null) {
if (!is_null($env)) {
$contexte = $env;
}
array_push($pile, array($inserts, $sources, $regs, $connect, $k));
$inserts = $sources = $regs = array();
array_push($pile, [$inserts, $sources, $regs, $connect, $k]);
$inserts = $sources = $regs = [];
$connect = $reg; // stocker le $connect pour les appels a inc_lien_dist
$k = 0;
@ -335,7 +341,7 @@ function expanser_un_lien($reg, $quoi = 'echappe', $env = null) {
return $reg;
break;
case 'sources':
return array($inserts, $sources);
return [$inserts, $sources];
break;
}
}
@ -363,7 +369,7 @@ function nettoyer_raccourcis_typo($texte, $connect = '') {
$texte = preg_replace("/(^|\r|\n)(-[-#\*]*\s?|_ )/", "\n", $texte);
// travailler en accents charset
$texte = unicode2charset(html2unicode($texte, true /* secure */ ));
$texte = unicode2charset(html2unicode($texte, true /* secure */));
if (preg_match_all(_RACCOURCI_LIEN, $texte, $regs, PREG_SET_ORDER)) {
include_spip('inc/texte');
@ -391,13 +397,13 @@ function nettoyer_raccourcis_typo($texte, $connect = '') {
}
// supprimer les ancres
$texte = preg_replace(_RACCOURCI_ANCRE, "", $texte);
$texte = preg_replace(_RACCOURCI_ANCRE, '', $texte);
// supprimer les notes
$texte = preg_replace(",\[\[.*\]\],UimsS", "", $texte);
$texte = preg_replace(',\[\[.*\]\],UimsS', '', $texte);
// supprimer les codes typos
$texte = str_replace(array('}', '{'), '', $texte);
$texte = str_replace(['}', '{'], '', $texte);
// supprimer les tableaux
$texte = preg_replace(",(?:^|\r|\n)\|.*\|(?:\r|\n|$),s", "\r", $texte);
@ -427,7 +433,7 @@ function traiter_raccourci_lien_atts($texte) {
// title et hreflang donnes par le raccourci ?
if (
strpbrk($texte, "|{") !== false
strpbrk($texte, '|{') !== false
and preg_match(_RACCOURCI_ATTRIBUTS, $texte, $m)
) {
$n = count($m);
@ -473,7 +479,7 @@ function traiter_raccourci_lien_atts($texte) {
$bulle = corriger_typo($bulle);
}
return array(trim($texte), $bulle, $hlang);
return [trim($texte), $bulle, $hlang];
}
define('_EXTRAIRE_DOMAINE', '/^(?:(?:[^\W_]((?:[^\W_]|-){0,61}[^\W_,])?\.)+[a-z0-9]{2,6}|localhost)\b/Si');
@ -481,14 +487,14 @@ define('_RACCOURCI_CHAPO', '/^(\W*)(\W*)(\w*\d+([?#].*)?)$/');
/**
* Retourne la valeur d'un champ de redirection (articles virtuels)
*
* L'entrée accepte plusiers types d'écritures :
* - une URL compète,
* - un lien SPIP tel que `[Lien->article23]`,
*
* L'entrée accepte plusiers types d'écritures :
* - une URL compète,
* - un lien SPIP tel que `[Lien->article23]`,
* - ou un raccourcis SPIP comme `rub2` ou `rubrique2`
*
* @param string $virtuel
* Texte qui définit la redirection, à analyser.
* Texte qui définit la redirection, à analyser.
* Plusieurs types peuvent être acceptés :
* - un raccourci Spip habituel, tel que `[texte->TYPEnnn]`
* - un ultra raccourci Spip, tel que `TYPEnnn`
@ -531,12 +537,12 @@ function calculer_url($ref, $texte = '', $pour = 'url', $connect = '', $echappe_
return $r;
}
define('_EXTRAIRE_LIEN', ",^\s*(http:?/?/?|mailto:?)\s*$,iS");
define('_EXTRAIRE_LIEN', ',^\s*(http:?/?/?|mailto:?)\s*$,iS');
// https://code.spip.net/@traiter_lien_explicite
function traiter_lien_explicite($ref, $texte = '', $pour = 'url', $connect = '', $echappe_typo = true) {
if (preg_match(_EXTRAIRE_LIEN, $ref)) {
return ($pour != 'tout') ? '' : array('', '', '', '');
return ($pour != 'tout') ? '' : ['', '', '', ''];
}
$lien = entites_html(trim($ref));
@ -551,19 +557,19 @@ function traiter_lien_explicite($ref, $texte = '', $pour = 'url', $connect = '',
}
$texte = $lien_court($texte);
if ($echappe_typo) {
$texte = "<html>" . quote_amp($texte) . "</html>";
$texte = '<html>' . quote_amp($texte) . '</html>';
}
}
// petites corrections d'URL
if (preg_match('/^www\.[^@]+$/S', $lien)) {
$lien = "http://" . $lien;
$lien = 'http://' . $lien;
} else {
if (strpos($lien, "@") && email_valide($lien)) {
if (strpos($lien, '@') && email_valide($lien)) {
if (!$texte) {
$texte = $lien;
}
$lien = "mailto:" . $lien;
$lien = 'mailto:' . $lien;
}
}
@ -575,7 +581,7 @@ function traiter_lien_explicite($ref, $texte = '', $pour = 'url', $connect = '',
return $texte;
}
return array('url' => $lien, 'titre' => $texte);
return ['url' => $lien, 'titre' => $texte];
}
function liens_implicite_glose_dist($texte, $id, $type, $args, $ancre, $connect = '') {
@ -619,7 +625,7 @@ function traiter_lien_implicite($ref, $texte = '', $pour = 'url', $connect = '')
# attention dans le cas des sites le lien doit pointer non pas sur
# la page locale du site, mais directement sur le site lui-meme
$url = '';
if ($f = charger_fonction("implicite_$type", "liens", true)) {
if ($f = charger_fonction("implicite_$type", 'liens', true)) {
$url = $f($texte, $id, $type, $args, $ancre, $connect);
}
@ -662,9 +668,16 @@ function traiter_lien_implicite($ref, $texte = '', $pour = 'url', $connect = '')
// dans le cas d'un lien vers un doc, ajouter le type='mime/type'
if (
$type == 'document'
and $mime = sql_getfetsel('mime_type', 'spip_types_documents',
"extension IN (" . sql_get_select("extension", "spip_documents", "id_document=" . sql_quote($id)) . ")",
'', '', '', '', $connect)
and $mime = sql_getfetsel(
'mime_type',
'spip_types_documents',
'extension IN (' . sql_get_select('extension', 'spip_documents', 'id_document=' . sql_quote($id)) . ')',
'',
'',
'',
'',
$connect
)
) {
$r['mime'] = $mime;
}
@ -679,7 +692,7 @@ define('_RACCOURCI_URL', '/^\s*(\w*?)\s*(\d+)(\?(.*?))?(#([^\s]*))?\s*$/S');
// https://code.spip.net/@typer_raccourci
function typer_raccourci($lien) {
if (!preg_match(_RACCOURCI_URL, $lien, $match)) {
return array();
return [];
}
$f = $match[1];
@ -733,14 +746,14 @@ function traiter_raccourci_titre($id, $type, $connect = null) {
$desc = $trouver_table(table_objet($type));
if (!($desc and $s = $desc['titre'])) {
return array();
return [];
}
$_id = $desc['key']['PRIMARY KEY'];
$r = sql_fetsel($s, $desc['table'], "$_id=$id", '', '', '', '', $connect);
if (!$r) {
return array();
return [];
}
$r['titre'] = supprimer_numero($r['titre']);
@ -763,14 +776,16 @@ function traiter_raccourci_titre($id, $type, $connect = null) {
// Si $doublons==true, on repere les documents sans calculer les modeles
// mais on renvoie les params (pour l'indexation par le moteur de recherche)
// https://code.spip.net/@traiter_modeles
define('_PREG_MODELE',
define(
'_PREG_MODELE',
'(<([a-z_-]{3,})' # <modele
. '\s*([0-9]*)\s*' # id
. '([|](?:<[^<>]*>|[^>])*?)?' # |arguments (y compris des tags <...>)
. '\s*/?' . '>)' # fin du modele >
);
define('_RACCOURCI_MODELE',
define(
'_RACCOURCI_MODELE',
_PREG_MODELE
. '\s*(<\/a>)?' # eventuel </a>
);
@ -778,19 +793,19 @@ define('_RACCOURCI_MODELE',
define('_RACCOURCI_MODELE_DEBUT', '@^' . _RACCOURCI_MODELE . '@isS');
// https://code.spip.net/@traiter_modeles
function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '', $liens = null, $env = array()) {
function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '', $liens = null, $env = []) {
// preserver la compatibilite : true = recherche des documents
if ($doublons === true) {
$doublons = array('documents' => array('doc', 'emb', 'img'));
$doublons = ['documents' => ['doc', 'emb', 'img']];
}
// detecter les modeles (rapide)
if (
strpos($texte, "<") !== false
strpos($texte, '<') !== false
and preg_match_all('/<[a-z_-]{3,}\s*[0-9|]+/iS', $texte, $matches, PREG_SET_ORDER)
) {
include_spip('public/assembler');
$wrap_embed_html = charger_fonction("wrap_embed_html", "inc", true);
$wrap_embed_html = charger_fonction('wrap_embed_html', 'inc', true);
// Recuperer l'appel complet (y compris un eventuel lien)
foreach ($matches as $match) {
@ -799,7 +814,7 @@ function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '',
// s'assurer qu'il y a toujours un 5e arg, eventuellement vide
while (count($regs) < 6) {
$regs[] = "";
$regs[] = '';
}
list(, $mod, $type, $id, $params, $fin) = $regs;
@ -808,13 +823,13 @@ function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '',
$fin
and preg_match('/<a\s[^<>]*>\s*$/i', substr($texte, 0, $a), $r)
) {
$lien = array(
$lien = [
'href' => extraire_attribut($r[0], 'href'),
'class' => extraire_attribut($r[0], 'class'),
'mime' => extraire_attribut($r[0], 'type'),
'title' => extraire_attribut($r[0], 'title'),
'hreflang' => extraire_attribut($r[0], 'hreflang')
);
];
$n = strlen($r[0]);
$a -= $n;
$cherche = $n + strlen($regs[0]);
@ -847,18 +862,18 @@ function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '',
$modele = str_replace($liens[0], $liens[1], $modele);
}
$contexte = array_merge($env, array('id' => $id, 'type' => $type, 'modele' => $modele));
$contexte = array_merge($env, ['id' => $id, 'type' => $type, 'modele' => $modele]);
if ($lien) {
# un eventuel guillemet (") sera reechappe par #ENV
$contexte['lien'] = str_replace("&quot;", '"', $lien['href']);
$contexte['lien'] = str_replace('&quot;', '"', $lien['href']);
$contexte['lien_class'] = $lien['class'];
$contexte['lien_mime'] = $lien['mime'];
$contexte['lien_title'] = $lien['title'];
$contexte['lien_hreflang'] = $lien['hreflang'];
}
$modele = recuperer_fond("modeles/dist", $contexte, array(), $connect);
$modele = recuperer_fond('modeles/dist', $contexte, [], $connect);
}
// le remplacer dans le texte
if ($modele !== false) {
@ -875,7 +890,7 @@ function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '',
// hack pour tout l'espace prive
if (((!_DIR_RESTREINT) or ($doublons)) and ($id)) {
foreach ($doublons ? $doublons : array('documents' => array('doc', 'emb', 'img')) as $quoi => $modeles) {
foreach ($doublons ? $doublons : ['documents' => ['doc', 'emb', 'img']] as $quoi => $modeles) {
if (in_array(strtolower($type), $modeles)) {
$GLOBALS["doublons_{$quoi}_inclus"][] = $id;
}
@ -891,7 +906,7 @@ function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '',
// Raccourcis ancre [#ancre<-]
//
define('_RACCOURCI_ANCRE', "/\[#?([^][]*)<-\]/S");
define('_RACCOURCI_ANCRE', '/\[#?([^][]*)<-\]/S');
// https://code.spip.net/@traiter_raccourci_ancre
function traiter_raccourci_ancre($letexte) {
@ -913,7 +928,7 @@ function traiter_raccourci_ancre($letexte) {
// Wikipedia par defaut, avec ses contraintes techniques
// cf. http://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Conventions_sur_les_titres
define('_RACCOURCI_GLOSSAIRE', "/\[\?+\s*([^][<>]+)\]/S");
define('_RACCOURCI_GLOSSAIRE', '/\[\?+\s*([^][<>]+)\]/S');
define('_RACCOURCI_GLOSES', '/^([^|#{]*\w[^|#{]*)([^#]*)(#([^|{}]*))?(.*)$/S');
// https://code.spip.net/@traiter_raccourci_glossaire
@ -958,18 +973,18 @@ function glossaire_std($terme) {
if ($pcre === null) {
$pcre = isset($GLOBALS['meta']['pcre_u']) ? $GLOBALS['meta']['pcre_u'] : '';
if (strpos($url_glossaire_externe, "%s") === false) {
if (strpos($url_glossaire_externe, '%s') === false) {
$url_glossaire_externe .= '%s';
}
}
$glosateur = str_replace(
"@lang@",
'@lang@',
$GLOBALS['spip_lang'],
$GLOBALS['url_glossaire_externe']
);
$terme = rawurlencode(preg_replace(',\s+,' . $pcre, '_', $terme));
return str_replace("%s", $terme, $glosateur);
return str_replace('%s', $terme, $glosateur);
}

47
inc/notes.php

@ -16,7 +16,7 @@
* @package SPIP\Textwheel\Notes
**/
if (!defined("_ECRIRE_INC_VERSION")) {
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
@ -67,7 +67,7 @@ if (!defined('_NOTES_RACCOURCI')) {
* @return string|array
**/
function inc_notes_dist($arg, $operation = 'traiter', $ignorer_autobr = false) {
static $pile = array();
static $pile = [];
static $next_marqueur = 1;
static $marqueur = 1;
global $les_notes, $compt_note, $notes_vues;
@ -80,12 +80,11 @@ function inc_notes_dist($arg, $operation = 'traiter', $ignorer_autobr = false) {
}
break;
case 'empiler':
if ($compt_note == 0) // si le marqueur n'a pas encore ete utilise, on le recycle dans la pile courante
{
array_push($pile, array(@$les_notes, @$compt_note, $notes_vues, 0));
if ($compt_note == 0) { // si le marqueur n'a pas encore ete utilise, on le recycle dans la pile courante
array_push($pile, [@$les_notes, @$compt_note, $notes_vues, 0]);
} else {
// sinon on le stocke au chaud, et on en cree un nouveau
array_push($pile, array(@$les_notes, @$compt_note, $notes_vues, $marqueur));
array_push($pile, [@$les_notes, @$compt_note, $notes_vues, $marqueur]);
$next_marqueur++; // chaque fois qu'on rempile on incremente le marqueur general
$marqueur = $next_marqueur; // et on le prend comme marqueur courant
}
@ -95,7 +94,7 @@ function inc_notes_dist($arg, $operation = 'traiter', $ignorer_autobr = false) {
case 'depiler':
#$prev_notes = $les_notes;
if (strlen($les_notes)) {
spip_log("notes perdues");
spip_log('notes perdues');
}
// si le marqueur n'a pas servi, le liberer
if (!strlen($les_notes) and $marqueur == $next_marqueur) {
@ -112,34 +111,33 @@ function inc_notes_dist($arg, $operation = 'traiter', $ignorer_autobr = false) {
break;
case 'sauver_etat':
if ($compt_note or $marqueur > 1 or $next_marqueur > 1) {
return array($les_notes, $compt_note, $notes_vues, $marqueur, $next_marqueur);
return [$les_notes, $compt_note, $notes_vues, $marqueur, $next_marqueur];
} else {
return '';
} // rien a sauver
break;
case 'restaurer_etat':
if ($arg and is_array($arg)) // si qqchose a restaurer
{
list($les_notes, $compt_note, $notes_vues, $marqueur, $next_marqueur) = $arg;
if ($arg and is_array($arg)) { // si qqchose a restaurer
list($les_notes, $compt_note, $notes_vues, $marqueur, $next_marqueur) = $arg;
}
break;
case 'contexter_cache':
if ($compt_note or $marqueur > 1 or $next_marqueur > 1) {
return array("$compt_note:$marqueur:$next_marqueur");
return ["$compt_note:$marqueur:$next_marqueur"];
} else {
return '';
}
break;
case 'reset_all': // a n'utiliser qu'a fins de test
if (strlen($les_notes)) {
spip_log("notes perdues [reset_all]");
spip_log('notes perdues [reset_all]');
}
$pile = array();
$pile = [];
$next_marqueur = 1;
$marqueur = 1;
$les_notes = '';
$compt_note = 0;
$notes_vues = array();
$notes_vues = [];
break;
}
}
@ -148,15 +146,16 @@ function inc_notes_dist($arg, $operation = 'traiter', $ignorer_autobr = false) {
function traiter_raccourci_notes($letexte, $marqueur_notes) {
global $compt_note, $notes_vues;
if (strpos($letexte, '[[') === false
if (
strpos($letexte, '[[') === false
or !preg_match_all(_NOTES_RACCOURCI, $letexte, $m, PREG_SET_ORDER)
) {
return array($letexte, array());
return [$letexte, []];
}
// quand il y a plusieurs series de notes sur une meme page
$mn = !$marqueur_notes ? '' : ($marqueur_notes . '-');
$mes_notes = array();
$mes_notes = [];
foreach ($m as $r) {
list($note_source, $note_all, $ref, $nom, $note_texte) = $r;
@ -165,7 +164,8 @@ function traiter_raccourci_notes($letexte, $marqueur_notes) {
// si la balise fermante correspondante existe
// Cas pathologique: [[ <a> <a href="x">x</a>]]
if (!(isset($nom) and $ref
if (
!(isset($nom) and $ref
and ((strpos($note_texte, '</' . $nom . '>') === false)
or preg_match(",<$nom\W.*</$nom>,", $note_texte)))
) {
@ -190,7 +190,7 @@ function traiter_raccourci_notes($letexte, $marqueur_notes) {
// ajouter la note aux notes precedentes
if ($note_texte) {
$mes_notes[] = array($ancre, $nom, $note_texte);
$mes_notes[] = [$ancre, $nom, $note_texte];
}
// dans le texte, mettre l'appel de note a la place de la note
@ -202,10 +202,9 @@ function traiter_raccourci_notes($letexte, $marqueur_notes) {
$letexte = rtrim(substr($letexte, 0, $pos), ' ')
. code_echappement($nom)
. substr($letexte, $pos + strlen($note_source));
}
return array($letexte, $mes_notes);
return [$letexte, $mes_notes];
}
@ -218,9 +217,9 @@ function traiter_les_notes($notes, $ignorer_autobr) {
list($ancre, $nom, $texte) = $r;
$atts = " href='#nh$ancre' class='spip_note' title='$title $ancre' rev='appendix'";
$mes_notes .= "\n\n"
. "<div id='nb$ancre'><p" . ($GLOBALS['class_spip'] ? " class='spip_note'" : "") . ">"
. "<div id='nb$ancre'><p" . ($GLOBALS['class_spip'] ? " class='spip_note'" : '') . '>'
. code_echappement($nom
? _NOTES_OUVRE_NOTE . "<a" . $atts . ">$nom</a>" . _NOTES_FERME_NOTE
? _NOTES_OUVRE_NOTE . '<a' . $atts . ">$nom</a>" . _NOTES_FERME_NOTE
: '')
. trim($texte)
. '</div>';

13
inc/ressource.php

@ -2,7 +2,7 @@
/*
* transforme un raccourci de ressource en un lien minimaliste
*
*
*
*/
@ -24,7 +24,7 @@ function tw_pre_liens($t) {
$t = preg_replace_callback(_EXTRAIRE_RESSOURCES, 'tw_traiter_ressources', $t);
// echapper les autoliens eventuellement inseres (en une seule fois)
if (strpos($t, "<html>") !== false) {
if (strpos($t, '<html>') !== false) {
$t = echappe_html($t);
}
}
@ -40,21 +40,20 @@ function tw_traiter_ressources($r) {
$url = $url[0];
# <http://url/absolue>
if (preg_match(',^https?://,i', $url)) {
$html = PtoBR(propre("<span class='ressource spip_out'>&lt;[->" . $url . "]&gt;</span>"));
$html = PtoBR(propre("<span class='ressource spip_out'>&lt;[->" . $url . ']&gt;</span>'));
} # <url/relative>
else {
if (false !== strpos($url, '/')) {
$html = PtoBR(propre("<span class='ressource spip_in'>&lt;[->" . $url . "]&gt;</span>"));
$html = PtoBR(propre("<span class='ressource spip_in'>&lt;[->" . $url . ']&gt;</span>'));
} # <fichier.rtf>
else {
if (
preg_match(',\.([^.]+)$,', $url, $regs)
and file_exists($f = _DIR_IMG . $regs[1] . '/' . $url)
) {
$html = PtoBR(propre("<span class='ressource spip_in'>&lt;[" . $url . "->" . $f . "]&gt;</span>"));
$html = PtoBR(propre("<span class='ressource spip_in'>&lt;[" . $url . '->' . $f . ']&gt;</span>'));
} else {
$html = PtoBR(propre("<span class='ressource'>&lt;" . $url . "&gt;</span>"));
$html = PtoBR(propre("<span class='ressource'>&lt;" . $url . '&gt;</span>'));
}
}
}

163
inc/texte.php

@ -29,10 +29,10 @@ include_spip('inc/textwheel');
defined('_AUTOBR') || define('_AUTOBR', "<br class='autobr' />");
define('_AUTOBR_IGNORER', _AUTOBR ? "<!-- ig br -->" : "");
define('_AUTOBR_IGNORER', _AUTOBR ? '<!-- ig br -->' : '');
// Avec cette surcharge, cette globale n'est plus définie, et du coup ça plante dans les plugins qui font un foreach dessus comme ZPIP
$GLOBALS['spip_raccourcis_typo'] = array();
$GLOBALS['spip_raccourcis_typo'] = [];
if (!isset($GLOBALS['toujours_paragrapher'])) {
$GLOBALS['toujours_paragrapher'] = true;
}
@ -90,18 +90,19 @@ function echappe_js($t) {
* Texte paragraphé
*/
function paragrapher($t, $toujours_paragrapher = null) {
static $wheel = array();
static $wheel = [];
if (is_null($toujours_paragrapher)) {
$toujours_paragrapher = $GLOBALS['toujours_paragrapher'];
}
if (!isset($wheel[$toujours_paragrapher])) {
$ruleset = SPIPTextWheelRuleset::loader($GLOBALS['spip_wheels']['paragrapher']);
if (!$toujours_paragrapher
if (
!$toujours_paragrapher
and $rule = $ruleset->getRule('toujours-paragrapher')
) {
$rule->disabled = true;
$ruleset->addRules(array('toujours-paragrapher' => $rule));
$ruleset->addRules(['toujours-paragrapher' => $rule]);
}
$wheel[$toujours_paragrapher] = new TextWheel($ruleset);
}
@ -139,12 +140,12 @@ function paragrapher($t, $toujours_paragrapher = null) {
* @return string
* Code protégé
**/
function interdire_scripts($arg, $mode_filtre=null) {
function interdire_scripts($arg, $mode_filtre = null) {
// on memorise le resultat sur les arguments non triviaux
static $dejavu = array();
static $wheel = array();
static $dejavu = [];
static $wheel = [];
if (is_null($mode_filtre) or !in_array($mode_filtre, array(-1, 0, 1))) {
if (is_null($mode_filtre) or !in_array($mode_filtre, [-1, 0, 1])) {
$mode_filtre = $GLOBALS['filtrer_javascript'];
}
@ -162,10 +163,11 @@ function interdire_scripts($arg, $mode_filtre=null) {
);
// Pour le js, trois modes : parano (-1), prive (0), ok (1)
// desactiver la regle echappe-js si besoin
if ($mode_filtre == 1
if (
$mode_filtre == 1
or ($mode_filtre == 0 and !test_espace_prive())
) {
$ruleset->addRules(array('securite-js' => array('disabled' => true)));
$ruleset->addRules(['securite-js' => ['disabled' => true]]);
}
$wheel[$mode_filtre] = new TextWheel($ruleset);
}
@ -180,10 +182,10 @@ function interdire_scripts($arg, $mode_filtre=null) {
// Reinserer les echappements des modeles
if (defined('_PROTEGE_JS_MODELES')) {
$t = echappe_retour($t, "javascript" . _PROTEGE_JS_MODELES);
$t = echappe_retour($t, 'javascript' . _PROTEGE_JS_MODELES);
}
if (defined('_PROTEGE_PHP_MODELES')) {
$t = echappe_retour($t, "php" . _PROTEGE_PHP_MODELES);
$t = echappe_retour($t, 'php' . _PROTEGE_PHP_MODELES);
}
return $dejavu[$mode_filtre][$arg] = $t;
@ -214,7 +216,7 @@ function interdire_scripts($arg, $mode_filtre=null) {
* @return string $t
* Texte transformé
**/
function typo($letexte, $echapper = true, $connect = null, $env = array()) {
function typo($letexte, $echapper = true, $connect = null, $env = []) {
// Plus vite !
if (!$letexte) {
return $letexte;
@ -268,8 +270,10 @@ function typo($letexte, $echapper = true, $connect = null, $env = array()) {
// https://core.spip.net/issues/3371
// et aussi dans l'espace public si la globale filtrer_javascript = -1
// https://core.spip.net/issues/4166
if ($GLOBALS['filtrer_javascript'] == -1
or (isset($env['espace_prive']) and $env['espace_prive'] and $GLOBALS['filtrer_javascript']<=0)) {
if (
$GLOBALS['filtrer_javascript'] == -1
or (isset($env['espace_prive']) and $env['espace_prive'] and $GLOBALS['filtrer_javascript'] <= 0)
) {
$letexte = echapper_html_suspect($letexte);
}
@ -281,7 +285,7 @@ function typo($letexte, $echapper = true, $connect = null, $env = array()) {
define('_TYPO_PROTEGER', "!':;?~%-");
define('_TYPO_PROTECTEUR', "\x1\x2\x3\x4\x5\x6\x7\x8");
define('_TYPO_BALISE', ",</?[a-z!][^<>]*[" . preg_quote(_TYPO_PROTEGER) . "][^<>]*>,imsS");
define('_TYPO_BALISE', ',</?[a-z!][^<>]*[' . preg_quote(_TYPO_PROTEGER) . '][^<>]*>,imsS');
/**
* Corrige la typographie
@ -298,7 +302,7 @@ define('_TYPO_BALISE', ",</?[a-z!][^<>]*[" . preg_quote(_TYPO_PROTEGER) . "][^<>
* @return string Texte
*/
function corriger_typo($t, $lang = '') {
static $typographie = array();
static $typographie = [];
// Plus vite !
if (!$t) {
return $t;
@ -374,14 +378,14 @@ function traiter_tableau($bloc) {
// Decouper le tableau en lignes
preg_match_all(',([|].*)[|]\n,UmsS', $bloc, $regs, PREG_PATTERN_ORDER);
$lignes = array();
$lignes = [];
$debut_table = $summary = '';
$l = 0;
// Traiter chaque ligne
$reg_line1 = ',^(\|(' . _RACCOURCI_TH_SPAN . '))+$,sS';
$reg_line_all = ',^(' . _RACCOURCI_TH_SPAN . ')$,sS';
$hc = $hl = array();
$hc = $hl = [];
$thead_ok = false;
foreach ($regs[1] as $ligne) {
$l++;
@ -400,18 +404,18 @@ function traiter_tableau($bloc) {
$describedby = '';
}
else {
$iddescribedby = 'dby'.$tabid;
$summary = ' aria-describedby="'.$iddescribedby.'"';
$iddescribedby = 'dby' . $tabid;
$summary = ' aria-describedby="' . $iddescribedby . '"';
}
}
if ($caption = trim($cap[1])) {
if ($describedby) {
$caption .= '<br /> <small id="'.$iddescribedby.'" class="summary offscreen">' . $describedby . '</small>';
$caption .= '<br /> <small id="' . $iddescribedby . '" class="summary offscreen">' . $describedby . '</small>';
}
$debut_table .= "<caption>" . $caption . "</caption>\n";
$debut_table .= '<caption>' . $caption . "</caption>\n";
}
elseif ($describedby) {
$debut_table .= '<caption id="'.$iddescribedby.'" class="summary offscreen"><small>' . $describedby . "</small></caption>\n";
$debut_table .= '<caption id="' . $iddescribedby . '" class="summary offscreen"><small>' . $describedby . "</small></caption>\n";
}
}
// - <thead> sous la forme |{{titre}}|{{titre}}|
@ -432,7 +436,7 @@ function traiter_tableau($bloc) {
$colspan = 1;
}
// inutile de garder le strong qui n'a servi que de marqueur
$cols[$c] = str_replace(array('{', '}'), '', $cols[$c]);
$cols[$c] = str_replace(['{', '}'], '', $cols[$c]);
$ligne = "<th id='id{$tabid}_c$c'$attr>$cols[$c]</th>$ligne";
$hc[$c] = "id{$tabid}_c$c"; // pour mettre dans les headers des td
}
@ -461,7 +465,7 @@ function traiter_tableau($bloc) {
// Pas de paragraphes dans les cellules
foreach ($cols[1] as &$col) {
if (strlen($col = trim($col))) {
$col = preg_replace("/\n{2,}/S", "<br /> <br />", $col);
$col = preg_replace("/\n{2,}/S", '<br /> <br />', $col);
if (_AUTOBR) {
$col = str_replace("\n", _AUTOBR . "\n", $col);
}
@ -477,16 +481,16 @@ function traiter_tableau($bloc) {
// on prepare une liste de rowspan par defaut, a partir
// du nombre de colonnes dans la premiere ligne.
// Reperer egalement les colonnes numeriques pour les cadrer a droite
$rowspans = $numeric = array();
$rowspans = $numeric = [];
$n = $lignes ? count($lignes[0]) : 0;
$k = count($lignes);
// distinguer les colonnes numeriques a point ou a virgule,
// pour les alignements eventuels sur "," ou "."
$numeric_class = array(
$numeric_class = [
'.' => 'point',
',' => 'virgule',
true => ''
);
];
for ($i = 0; $i < $n; $i++) {
$align = true;
for ($j = 0; $j < $k; $j++) {
@ -509,7 +513,7 @@ function traiter_tableau($bloc) {
}
}
if (!isset($hl[0])) {
$hl = array();
$hl = [];
} // toute la colonne ou rien
// et on parcourt le tableau a l'envers pour ramasser les
@ -526,10 +530,8 @@ function traiter_tableau($bloc) {
$cell = trim($cols[$c]);
if ($cell == '<') {
$colspan++;
} elseif ($cell == '^') {
$rowspans[$l - 1][$c] += $rowspans[$l][$c];
} else {
if ($colspan > 1) {
$attr .= " colspan='$colspan'";
@ -546,7 +548,7 @@ function traiter_tableau($bloc) {
// inutile de garder le strong qui n'a servi que de marqueur
if ($b == 'th') {
$attr .= " id='" . $hl[$l] . "'";
$cols[$c] = str_replace(array('{', '}'), '', $cols[$c]);
$cols[$c] = str_replace(['{', '}'], '', $cols[$c]);
}
$ligne = "\n<$b" . $attr . '>' . $cols[$c] . "</$b>" . $ligne;
}
@ -558,12 +560,12 @@ function traiter_tableau($bloc) {
}
$class = $GLOBALS['class_spip_plus'];
if (!$class or strpos($GLOBALS['class_spip_plus'],'class=') === false) {
if (!$class or strpos($GLOBALS['class_spip_plus'], 'class=') === false) {
$class = ' ' . trim('class="table" ' . $class);
}
else {
$class = str_replace('class="','class="table ', $class);
$class = str_replace("class='","class='table ", $class);
$class = str_replace('class="', 'class="table ', $class);
$class = str_replace("class='", "class='table ", $class);
}
return "\n\n<table" . $class . $summary . ">\n"
. $debut_table
@ -604,10 +606,10 @@ function traiter_listes($t) {
// Ces deux constantes permettent de proteger certains caracteres
// en les remplacanat par des caracteres "illegaux". (cf corriger_caracteres)
define('_RACCOURCI_PROTEGER', "{}_-");
define('_RACCOURCI_PROTEGER', '{}_-');
define('_RACCOURCI_PROTECTEUR', "\x1\x2\x3\x4");
define('_RACCOURCI_BALISE', ",</?[a-z!][^<>]*[" . preg_quote(_RACCOURCI_PROTEGER) . "][^<>]*>,imsS");
define('_RACCOURCI_BALISE', ',</?[a-z!][^<>]*[' . preg_quote(_RACCOURCI_PROTEGER) . '][^<>]*>,imsS');
/**
* mais d'abord, une callback de reconfiguration des raccourcis
@ -622,44 +624,46 @@ function personnaliser_raccourcis(&$ruleset) {
if (isset($GLOBALS['debut_intertitre']) and $rule = $ruleset->getRule('intertitres')) {
$rule->replace[0] = preg_replace(',<[^>]*>,Uims', $GLOBALS['debut_intertitre'], $rule->replace[0]);
$rule->replace[1] = preg_replace(',<[^>]*>,Uims', $GLOBALS['fin_intertitre'], $rule->replace[1]);
$ruleset->addRules(array('intertitres' => $rule));
$ruleset->addRules(['intertitres' => $rule]);
if ($rule = $ruleset->getRule('intertitres-compliques')) {
$rule->replace[0] = preg_replace(',<[^>]*>,Uims', $GLOBALS['debut_intertitre'], $rule->replace[0]);
$rule->replace[1] = preg_replace(',<[^>]*>,Uims', $GLOBALS['fin_intertitre'], $rule->replace[1]);
$ruleset->addRules(array('intertitres-compliques' => $rule));
$ruleset->addRules(['intertitres-compliques' => $rule]);
}
}
if (isset($GLOBALS['debut_gras']) and $rule = $ruleset->getRule('gras')) {
$rule->replace[0] = preg_replace(',<[^>]*>,Uims', $GLOBALS['debut_gras'], $rule->replace[0]);
$rule->replace[1] = preg_replace(',<[^>]*>,Uims', $GLOBALS['fin_gras'], $rule->replace[1]);
$ruleset->addRules(array('gras' => $rule));
$ruleset->addRules(['gras' => $rule]);
}
if (isset($GLOBALS['debut_italique']) and $rule = $ruleset->getRule('italiques')) {
$rule->replace[0] = preg_replace(',<[^>]*>,Uims', $GLOBALS['debut_italique'], $rule->replace[0]);
$rule->replace[1] = preg_replace(',<[^>]*>,Uims', $GLOBALS['fin_italique'], $rule->replace[1]);
$ruleset->addRules(array('italiques' => $rule));
$ruleset->addRules(['italiques' => $rule]);
}
if (isset($GLOBALS['ligne_horizontale']) and $rule = $ruleset->getRule('ligne-horizontale')) {
$rule->replace = preg_replace(',<[^>]*>,Uims', $GLOBALS['ligne_horizontale'], $rule->replace);
$ruleset->addRules(array('ligne-horizontale' => $rule));
$ruleset->addRules(['ligne-horizontale' => $rule]);
}
if (isset($GLOBALS['toujours_paragrapher']) and !$GLOBALS['toujours_paragrapher']
if (
isset($GLOBALS['toujours_paragrapher']) and !$GLOBALS['toujours_paragrapher']
and $rule = $ruleset->getRule('toujours-paragrapher')
) {
$rule->disabled = true;
$ruleset->addRules(array('toujours-paragrapher' => $rule));
$ruleset->addRules(['toujours-paragrapher' => $rule]);
}
}
// retourner une signature de l'etat de la fonction, pour la mise en cache
return implode("/",
array(
isset($GLOBALS['debut_intertitre']) ? $GLOBALS['debut_intertitre'] : "",
isset($GLOBALS['debut_gras']) ? $GLOBALS['debut_gras'] : "",
isset($GLOBALS['debut_italique']) ? $GLOBALS['debut_italique'] : "",
isset($GLOBALS['ligne_horizontale']) ? $GLOBALS['ligne_horizontale'] : "",
return implode(
'/',
[
isset($GLOBALS['debut_intertitre']) ? $GLOBALS['debut_intertitre'] : '',
isset($GLOBALS['debut_gras']) ? $GLOBALS['debut_gras'] : '',
isset($GLOBALS['debut_italique']) ? $GLOBALS['debut_italique'] :