Compare commits

...

No commits in common. 'master' and 'spip-3.2' have entirely different histories.

  1. 7
      .gitignore
  2. 7
      composer.json
  3. 70
      engine/textwheel.php
  4. 1
      engine/textwheelrule.php
  5. 66
      engine/textwheelruleset.php
  6. 26
      inc/autoliens.php
  7. 181
      inc/lien.php
  8. 57
      inc/notes.php
  9. 13
      inc/ressource.php
  10. 190
      inc/texte.php
  11. 71
      inc/textwheel.php
  12. 20
      inc/yaml-mini.php
  13. 17
      lang/paquet-tw.xml
  14. 15
      lang/paquet-tw_br.php
  15. 15
      lang/paquet-tw_eo.php
  16. 2
      lang/paquet-tw_fr.php
  17. 11
      lang/tw.xml
  18. 2
      lang/tw_fr.php
  19. 147
      lib/yaml/sfYaml.php
  20. 62
      lib/yaml/sfYamlDumper.php
  21. 426
      lib/yaml/sfYamlInline.php
  22. 542
      lib/yaml/sfYamlParser.php
  23. 6
      paquet.xml
  24. 15
      phpcs.xml.dist
  25. 442
      phpstan-baseline.neon
  26. 12
      phpstan.neon.dist
  27. 62
      tests/AutoliensTest.php
  28. 134
      tests/TextwheelPropreTest.php
  29. 99
      tests/TextwheelPropreTypoTest.php
  30. 6
      tests/data/base/atx_heading.html
  31. 6
      tests/data/base/atx_heading.txt
  32. 2
      tests/data/base/nested_block-level_html.html
  33. 4
      tests/data/base/unordered_list.html
  34. 6
      tests/data/modeles_block/atx_heading.html
  35. 6
      tests/data/modeles_block/atx_heading.txt
  36. 2
      tests/data/modeles_block/nested_block-level_html.html
  37. 4
      tests/data/modeles_block/unordered_list.html
  38. 6
      tests/data/modeles_inline/atx_heading.html
  39. 6
      tests/data/modeles_inline/atx_heading.txt
  40. 2
      tests/data/modeles_inline/nested_block-level_html.html
  41. 4
      tests/data/modeles_inline/unordered_list.html
  42. 6
      tests/data/typo/atx_heading.html
  43. 6
      tests/data/typo/atx_heading.txt
  44. 2
      tests/data/typo/nested_block-level_html.html
  45. 4
      tests/data/typo/unordered_list.html
  46. 15
      tests/simpletest/lanceur_spip.php
  47. 2
      tests/simpletest/nettoyer_raccourcis_typo.php
  48. 68
      tests/tw_propre.php
  49. 68
      tests/tw_propre_modeles_block.php
  50. 68
      tests/tw_propre_modeles_inline.php
  51. 68
      tests/tw_propre_typo.php
  52. BIN
      textwheel-32.png
  53. 6
      textwheel-xx.svg
  54. 24
      typographie/en.php
  55. 34
      typographie/fr.php
  56. 71
      wheels/spip/echappe-js.json
  57. 12
      wheels/spip/echappe-js.php
  58. 1
      wheels/spip/ecrire.json
  59. 31
      wheels/spip/interdire-scripts.json
  60. 38
      wheels/spip/spip-definitions.json
  61. 13
      wheels/spip/spip-definitions.php
  62. 28
      wheels/spip/spip-definitions.yaml
  63. 43
      wheels/spip/spip-listes.json
  64. 8
      wheels/spip/spip-listes.php
  65. 30
      wheels/spip/spip-listes.yaml
  66. 73
      wheels/spip/spip-paragrapher.json
  67. 44
      wheels/spip/spip-paragrapher.php
  68. 23
      wheels/spip/spip-poesie.json
  69. 19
      wheels/spip/spip-tableaux.json
  70. 299
      wheels/spip/spip.json
  71. 9
      wheels/spip/spip.php
  72. 4
      wheels/spip/spip.yaml

7
.gitignore

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

7
composer.json

@ -1,7 +0,0 @@
{
"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 = [];
protected static $subwheel = array();
// Experimental : projet de compilation PHP d'une wheel
// pour generation d'un fichier php execute a la place de ->text()
protected $compiled = [];
protected $compiled = array();
/**
* Constructor
@ -62,8 +62,9 @@ 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);
@ -78,21 +79,20 @@ class TextWheel {
$rules = &$this->ruleset->getRules();
## apply each in order
$pre = [];
$comp = [];
$pre = array();
$comp = array();
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,8 +256,7 @@ 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)
@ -275,7 +274,7 @@ class TextWheel {
break;
case 'split':
$rule->func_replace = 'replace_split';
$rule->match = [$rule->match, is_null($rule->glue) ? $rule->match : $rule->glue];
$rule->match = array($rule->match, is_null($rule->glue) ? $rule->match : $rule->glue);
break;
case 'preg':
default:
@ -286,7 +285,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';
}
@ -513,11 +512,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);
}
}
@ -530,10 +529,11 @@ 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,6 +546,7 @@ class TextWheelDebug extends TextWheel {
} else {
TextWheelDebug::$tnu[$name] += $v;
}
}
#foreach ($this->rules as &$rule) #smarter &reference, but php5 only
# $this->apply($rule, $t);
@ -581,19 +582,15 @@ 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";
@ -604,9 +601,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";
}
}
@ -634,6 +631,7 @@ class TextWheelDebug extends TextWheel {
protected function &createSubWheel(&$rules) {
return new TextWheelDebug($rules);
}
}

1
engine/textwheelrule.php

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

66
engine/textwheelruleset.php

@ -22,17 +22,11 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// Pour choisir le JSON ou le YAML
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 = [];
protected $data = array();
/**
* file finder : can be overloaded in order to use application dependant
@ -67,60 +61,46 @@ abstract class TextWheelDataSet {
}
/**
* Load a YAML/JSON file describing data
* Load a yaml file describing data
*
* @param string $file
* @param string $default_path
* @return array
*/
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') ? ['json', 'yaml'] : ['yaml', 'json'];
$name = $file;
foreach ($formats as $format) {
$file = $name . '.' . $format;
if ($file = $this->findFile($file, $default_path)) {
break;
}
}
} else {
$format = $matches[1];
}
if (
!$file
or (!$file = $this->findFile($file, $default_path))
if (!preg_match(',[.]yaml$,i', $file)
// external rules
or !$file = $this->findFile($file, $default_path)
) {
return [];
return array();
}
defined('_YAML_EVAL_PHP') || define('_YAML_EVAL_PHP', false);
if ($format == 'json') {
$dataset = json_decode(file_get_contents($file), true);
} elseif (defined('_DIR_PLUGIN_YAML')) {
include_spip('inc/yaml');
$dataset = yaml_decode(file_get_contents($file));
} else {
$dataset = [];
if (!function_exists('yaml_decode')) {
if (function_exists('include_spip')) {
include_spip('inc/yaml-mini');
} else {
require_once dirname(__FILE__) . '/../inc/yaml.php';
}
}
$dataset = yaml_decode(file_get_contents($file));
if (is_null($dataset)) {
$dataset = [];
$dataset = array();
}
# throw new DomainException('rule file is empty, unreadable or badly formed: '.$file.var_export($dataset,true));
# throw new DomainException('yaml 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$,i', '.php', $file)
and file_exists($f)
) {
$dataset[] = ['require' => $f, 'priority' => -1000];
$dataset[] = array('require' => $f, 'priority' => -1000);
}
return $dataset;
}
}
class TextWheelRuleSet extends TextWheelDataSet {
@ -133,7 +113,7 @@ class TextWheelRuleSet extends TextWheelDataSet {
* @param array|string $ruleset
* @param string $filepath
*/
public function __construct($ruleset = [], $filepath = '') {
public function __construct($ruleset = array(), $filepath = '') {
if ($ruleset) {
$this->addRules($ruleset, $filepath);
}
@ -218,7 +198,7 @@ class TextWheelRuleSet extends TextWheelDataSet {
return;
}
// rules can be a string : yaml or json filename
// rules can be a string : yaml filename
if (is_string($rules)) {
$file = $rules; // keep the real filename
$rules = $this->loadFile($file, $filepath);
@ -251,14 +231,14 @@ class TextWheelRuleSet extends TextWheelDataSet {
*/
protected function sort() {
if (!$this->sorted) {
$rulz = [];
$rulz = array();
foreach ($this->data as $index => $rule) {
if (!$rule->disabled) {
$rulz[intval($rule->priority)][$index] = $rule;
}
}
ksort($rulz);
$this->data = [];
$this->data = array();
foreach ($rulz as $rules) {
$this->data += $rules;
}

26
inc/autoliens.php

@ -1,5 +1,6 @@
<?php
// Les URLs brutes sont converties en <a href='url'>url</a>
// https://code.spip.net/@traiter_raccourci_liens
function tw_autoliens($t) {
@ -8,6 +9,11 @@ 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) {
$t = echappe_html($t);
}
return $t;
}
@ -37,18 +43,14 @@ function tw_traiter_autoliens($r) {
// en particulier le "|" quand elles sont dans un tableau a la SPIP
preg_match('/^(.*?)([,.;?|]?)$/', $l, $k);
$url = $protocol . '://' . $k[1];
// si l'original ne contenait pas le 'http:' on le supprime du clic
$url_echap = echappe_html("<html>". ($m ? $url : substr($url, strlen('http://'))) ."</html>");
$class = 'spip_url';
if (lien_is_url_externe($url)) {
$class .= ' spip_out';
}
$class .= ' auto';
$lien = charger_fonction('lien', 'inc');
$r = $lien($url, $url_echap, $class, '', '', 'nofollow') . $k[2];
// deux fois <html> car inc_lien echappe un coup et restaure ensuite
// => un perd 1 <html>
$r = $lien($url, "<html><html>$url</html></html>", '', '', '', 'nofollow') . $k[2];
return $r;
// ajouter la class auto
$r = inserer_attribut($r, 'class', trim(extraire_attribut($r, 'class') . ' auto'));
// si l'original ne contenait pas le 'http:' on le supprime du clic
return ($m ? $r : str_replace('>http://', '>', $r));
}

181
inc/lien.php

@ -1,13 +1,13 @@
<?php
/***************************************************************************\
* SPIP, Système de publication pour l'internet *
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright © avec tendresse depuis 2001 *
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James *
* Copyright (c) 2001-2020 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, 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. *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) {
@ -42,7 +42,7 @@ function inc_lien_dist(
$hlang = '',
$rel = '',
$connect = '',
$env = []
$env = array()
) {
static $u = null;
if (!$u) {
@ -71,11 +71,8 @@ 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";
@ -96,25 +93,31 @@ 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 (lien_is_url_externe($lien)) {
$class .= ' spip_out';
if (
preg_match(',^\w+://,iS', $lien)
and strncasecmp($lien, url_de_base(), strlen(url_de_base()))
) {
$class .= " spip_out";
}
} elseif (!$class) {
# spip_out sur les URLs externes
if (lien_is_url_externe($lien)) {
$class = 'spip_out';
if (
preg_match(',^\w+://,iS', $lien)
and strncasecmp($lien, url_de_base(), strlen(url_de_base()))
) {
$class = "spip_out"; # si pas spip_in|spip_glossaire
}
}
if ($class) {
@ -155,11 +158,8 @@ 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 +175,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;
@ -195,22 +195,6 @@ function inc_lien_dist(
return $res;
}
/**
* Detecter qu'une URL est externe pour poser une class en fonction
* @param string $url_lien
* @return bool
*/
function lien_is_url_externe($url_lien) {
if (
preg_match(',^\w+://,iS', $url_lien)
and strncasecmp($url_lien, url_de_base(), strlen(url_de_base()))
) {
return true;
}
return false;
}
/**
* Générer le HTML d'un lien quelconque
*
@ -225,7 +209,7 @@ function lien_is_url_externe($url_lien) {
* @return string
* Retourne une balise HTML de lien ou une chaîne vide.
*/
function balise_a($args = []) {
function balise_a($args = array()) {
$balise_a = '';
// Il faut soit au minimum un href OU un name pour réussir à générer quelque chose
@ -264,14 +248,14 @@ function balise_a($args = []) {
// 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 = []) {
function expanser_liens($t, $connect = '', $env = array()) {
$t = pipeline('pre_liens', $t);
if (strpos($t, '\[') !== false or strpos($t, '\]') !== false) {
$t = str_replace(['\[', '\]'], ["\x1\x5", "\x1\x6"], $t);
$t = str_replace(array('\[', '\]'), array("\x1\x5", "\x1\x6"), $t);
}
expanser_un_lien($connect, 'init', $env);
@ -285,7 +269,7 @@ function expanser_liens($t, $connect = '', $env = []) {
$t = traiter_modeles($t, false, false, $connect, expanser_un_lien('', 'sources'), $env);
if (strpos($t, "\x1") !== false) {
$t = str_replace(["\x1\x5", "\x1\x6"], ['[', ']'], $t);
$t = str_replace(array("\x1\x5", "\x1\x6"), array('[', ']'), $t);
}
$t = corriger_typo($t);
@ -297,14 +281,14 @@ function expanser_liens($t, $connect = '', $env = []) {
function expanser_un_lien($reg, $quoi = 'echappe', $env = null) {
static $pile = [];
static $pile = array();
static $inserts;
static $sources;
static $regs;
static $k = 0;
static $lien;
static $connect = '';
static $contexte = [];
static $contexte = array();
switch ($quoi) {
case 'init':
@ -314,8 +298,8 @@ function expanser_un_lien($reg, $quoi = 'echappe', $env = null) {
if (!is_null($env)) {
$contexte = $env;
}
array_push($pile, [$inserts, $sources, $regs, $connect, $k]);
$inserts = $sources = $regs = [];
array_push($pile, array($inserts, $sources, $regs, $connect, $k));
$inserts = $sources = $regs = array();
$connect = $reg; // stocker le $connect pour les appels a inc_lien_dist
$k = 0;
@ -351,7 +335,7 @@ function expanser_un_lien($reg, $quoi = 'echappe', $env = null) {
return $reg;
break;
case 'sources':
return [$inserts, $sources];
return array($inserts, $sources);
break;
}
}
@ -379,7 +363,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');
@ -407,13 +391,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(['}', '{'], '', $texte);
$texte = str_replace(array('}', '{'), '', $texte);
// supprimer les tableaux
$texte = preg_replace(",(?:^|\r|\n)\|.*\|(?:\r|\n|$),s", "\r", $texte);
@ -443,7 +427,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);
@ -489,7 +473,7 @@ function traiter_raccourci_lien_atts($texte) {
$bulle = corriger_typo($bulle);
}
return [trim($texte), $bulle, $hlang];
return array(trim($texte), $bulle, $hlang);
}
define('_EXTRAIRE_DOMAINE', '/^(?:(?:[^\W_]((?:[^\W_]|-){0,61}[^\W_,])?\.)+[a-z0-9]{2,6}|localhost)\b/Si');
@ -497,14 +481,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`
@ -547,12 +531,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') ? '' : ['', '', '', ''];
return ($pour != 'tout') ? '' : array('', '', '', '');
}
$lien = entites_html(trim($ref));
@ -567,19 +551,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;
}
}
@ -591,7 +575,7 @@ function traiter_lien_explicite($ref, $texte = '', $pour = 'url', $connect = '',
return $texte;
}
return ['url' => $lien, 'titre' => $texte];
return array('url' => $lien, 'titre' => $texte);
}
function liens_implicite_glose_dist($texte, $id, $type, $args, $ancre, $connect = '') {
@ -635,7 +619,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);
}
@ -678,16 +662,9 @@ 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;
}
@ -702,7 +679,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 [];
return array();
}
$f = $match[1];
@ -756,14 +733,14 @@ function traiter_raccourci_titre($id, $type, $connect = null) {
$desc = $trouver_table(table_objet($type));
if (!($desc and $s = $desc['titre'])) {
return [];
return array();
}
$_id = $desc['key']['PRIMARY KEY'];
$r = sql_fetsel($s, $desc['table'], "$_id=$id", '', '', '', '', $connect);
if (!$r) {
return [];
return array();
}
$r['titre'] = supprimer_numero($r['titre']);
@ -786,16 +763,14 @@ 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>
);
@ -803,19 +778,19 @@ define(
define('_RACCOURCI_MODELE_DEBUT', '@^' . _RACCOURCI_MODELE . '@isS');
// https://code.spip.net/@traiter_modeles
function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '', $liens = null, $env = []) {
function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '', $liens = null, $env = array()) {
// preserver la compatibilite : true = recherche des documents
if ($doublons === true) {
$doublons = ['documents' => ['doc', 'emb', 'img']];
$doublons = array('documents' => array('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) {
@ -824,7 +799,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;
@ -833,13 +808,13 @@ function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '',
$fin
and preg_match('/<a\s[^<>]*>\s*$/i', substr($texte, 0, $a), $r)
) {
$lien = [
$lien = array(
'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]);
@ -872,18 +847,18 @@ function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '',
$modele = str_replace($liens[0], $liens[1], $modele);
}
$contexte = array_merge($env, ['id' => $id, 'type' => $type, 'modele' => $modele]);
$contexte = array_merge($env, array('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, [], $connect);
$modele = recuperer_fond("modeles/dist", $contexte, array(), $connect);
}
// le remplacer dans le texte
if ($modele !== false) {
@ -900,7 +875,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 : ['documents' => ['doc', 'emb', 'img']] as $quoi => $modeles) {
foreach ($doublons ? $doublons : array('documents' => array('doc', 'emb', 'img')) as $quoi => $modeles) {
if (in_array(strtolower($type), $modeles)) {
$GLOBALS["doublons_{$quoi}_inclus"][] = $id;
}
@ -916,7 +891,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) {
@ -938,7 +913,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
@ -983,18 +958,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);
}

57
inc/notes.php

@ -1,13 +1,13 @@
<?php
/***************************************************************************\
* SPIP, Système de publication pour l'internet *
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright © avec tendresse depuis 2001 *
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James *
* Copyright (c) 2001-2020 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, 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. *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/**
@ -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 = [];
static $pile = array();
static $next_marqueur = 1;
static $marqueur = 1;
global $les_notes, $compt_note, $notes_vues;
@ -80,11 +80,12 @@ 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, [@$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, array(@$les_notes, @$compt_note, $notes_vues, 0));
} else {
// sinon on le stocke au chaud, et on en cree un nouveau
array_push($pile, [@$les_notes, @$compt_note, $notes_vues, $marqueur]);
array_push($pile, array(@$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
}
@ -94,7 +95,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) {
@ -111,33 +112,34 @@ 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 [$les_notes, $compt_note, $notes_vues, $marqueur, $next_marqueur];
return array($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 ["$compt_note:$marqueur:$next_marqueur"];
return array("$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 = [];
$pile = array();
$next_marqueur = 1;
$marqueur = 1;
$les_notes = '';
$compt_note = 0;
$notes_vues = [];
$notes_vues = array();
break;
}
}
@ -146,16 +148,15 @@ 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 [$letexte, []];
return array($letexte, array());
}
// quand il y a plusieurs series de notes sur une meme page
$mn = !$marqueur_notes ? '' : ($marqueur_notes . '-');
$mes_notes = [];
$mes_notes = array();
foreach ($m as $r) {
list($note_source, $note_all, $ref, $nom, $note_texte) = $r;
@ -164,8 +165,7 @@ 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[] = [$ancre, $nom, $note_texte];
$mes_notes[] = array($ancre, $nom, $note_texte);
}
// dans le texte, mettre l'appel de note a la place de la note
@ -202,9 +202,10 @@ function traiter_raccourci_notes($letexte, $marqueur_notes) {
$letexte = rtrim(substr($letexte, 0, $pos), ' ')
. code_echappement($nom)
. substr($letexte, $pos + strlen($note_source));
}
return [$letexte, $mes_notes];
return array($letexte, $mes_notes);
}
@ -217,9 +218,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,20 +40,21 @@ 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>"));
}
}
}

190
inc/texte.php

@ -1,13 +1,13 @@
<?php
/***************************************************************************\
* SPIP, Système de publication pour l'internet *
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright © avec tendresse depuis 2001 *
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James *
* Copyright (c) 2001-2020 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, 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. *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/**
@ -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'] = [];
$GLOBALS['spip_raccourcis_typo'] = array();
if (!isset($GLOBALS['toujours_paragrapher'])) {
$GLOBALS['toujours_paragrapher'] = true;
}
@ -90,19 +90,18 @@ function echappe_js($t) {
* Texte paragraphé
*/
function paragrapher($t, $toujours_paragrapher = null) {
static $wheel = [];
static $wheel = array();
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(['toujours-paragrapher' => $rule]);
$ruleset->addRules(array('toujours-paragrapher' => $rule));
}
$wheel[$toujours_paragrapher] = new TextWheel($ruleset);
}
@ -140,12 +139,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 = [];
static $wheel = [];
static $dejavu = array();
static $wheel = array();
if (is_null($mode_filtre) or !in_array($mode_filtre, [-1, 0, 1])) {
if (is_null($mode_filtre) or !in_array($mode_filtre, array(-1, 0, 1))) {
$mode_filtre = $GLOBALS['filtrer_javascript'];
}
@ -163,11 +162,10 @@ 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(['securite-js' => ['disabled' => true]]);
$ruleset->addRules(array('securite-js' => array('disabled' => true)));
}
$wheel[$mode_filtre] = new TextWheel($ruleset);
}
@ -182,10 +180,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;
@ -216,7 +214,7 @@ function interdire_scripts($arg, $mode_filtre = null) {
* @return string $t
* Texte transformé
**/
function typo($letexte, $echapper = true, $connect = null, $env = []) {
function typo($letexte, $echapper = true, $connect = null, $env = array()) {
// Plus vite !
if (!$letexte) {
return $letexte;
@ -270,10 +268,8 @@ function typo($letexte, $echapper = true, $connect = null, $env = []) {
// 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);
}
@ -285,7 +281,7 @@ function typo($letexte, $echapper = true, $connect = null, $env = []) {
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
@ -302,7 +298,7 @@ define('_TYPO_BALISE', ',</?[a-z!][^<>]*[' . preg_quote(_TYPO_PROTEGER) . '][^<>
* @return string Texte
*/
function corriger_typo($t, $lang = '') {
static $typographie = [];
static $typographie = array();
// Plus vite !
if (!$t) {
return $t;
@ -378,14 +374,14 @@ function traiter_tableau($bloc) {
// Decouper le tableau en lignes
preg_match_all(',([|].*)[|]\n,UmsS', $bloc, $regs, PREG_PATTERN_ORDER);
$lignes = [];
$lignes = array();
$debut_table = $summary = '';
$l = 0;
// Traiter chaque ligne
$reg_line1 = ',^(\|(' . _RACCOURCI_TH_SPAN . '))+$,sS';
$reg_line_all = ',^(' . _RACCOURCI_TH_SPAN . ')$,sS';
$hc = $hl = [];
$hc = $hl = array();
$thead_ok = false;
foreach ($regs[1] as $ligne) {
$l++;
@ -397,26 +393,10 @@ function traiter_tableau($bloc) {
if (preg_match(',^\|\|([^|]*)(\|(.*))?$,sS', rtrim($ligne, '|'), $cap)) {
$cap = array_pad($cap, 4, null);
$l = 0;
$summary = '';
if ($describedby = trim($cap[3])) {
if (!html5_permis()) {
$summary = ' summary="' . entites_html(trim($cap[3])) . '"';
$describedby = '';
}
else {
$iddescrib