Browse Source

PSR et sécurité de la wheel

master
Eric Lupinacci 4 months ago
parent
commit
340040b92b
  1. 7
      faq_options.php
  2. 88
      faq_pipelines.php
  3. 14
      inc/faq_formater_tag.php
  4. 29
      lang/faq_fr.php
  5. 10
      lang/paquet-faq_fr.php
  6. 90
      wheels/faq.php

7
faq_options.php

@ -1,9 +1,8 @@
<?php
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) return;
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// Ajout des raccourcis dans la liste des wheels
$GLOBALS['spip_wheels']['raccourcis'][] = 'faq';
?>

88
faq_pipelines.php

@ -1,66 +1,71 @@
<?php
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) return;
function faq_insert_head_css($flux){
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function faq_insert_head_css($flux) {
// On inclut systématiquement les CSS de base
$flux .= '<link rel="stylesheet" href="'.find_in_path('css/faq.css').'" type="text/css" media="all" />';
$flux .= '<link rel="stylesheet" href="' . find_in_path('css/faq.css') . '" type="text/css" media="all" />';
// On ajoute si la config le demande les CSS propres aux dl
include_spip('inc/config');
$charger_css = lire_config('faq/charger_css') ? true : false;
if ($charger_css)
$flux .= '<link rel="stylesheet" href="'.find_in_path('css/faq_dl.css').'" type="text/css" media="all" />';
if ($charger_css) {
$flux .= '<link rel="stylesheet" href="' . find_in_path('css/faq_dl.css') . '" type="text/css" media="all" />';
}
return $flux;
}
function faq_insert_head($flux){
function faq_insert_head($flux) {
include_spip('inc/config');
$charger_js = lire_config('faq/charger_js') ? true : false;
if ($charger_js)
$flux .= '<script src="'.find_in_path('js/faq.js').'" type="text/javascript"></script>';
if ($charger_js) {
$flux .= '<script src="' . find_in_path('js/faq.js') . '" type="text/javascript"></script>';
}
return $flux;
}
function faq_porte_plume_barre_pre_charger($barres){
function faq_porte_plume_barre_pre_charger($barres) {
// on ajoute les boutons dans la barre d'édition seulement
foreach (array('edition') as $nom) {
$barre = &$barres[$nom];
$barre->ajouterPlusieursApres('grpCaracteres', array(
array(
"id" => "faq_sep",
"separator" => "---------------",
"display" => true,
'id' => 'faq_sep',
'separator' => '---------------',
'display' => true,
),
array(
"id" => 'faq',
"name" => _T('faq:outil_inserer_faq'),
"className" => 'outil_faq',
"openBlockWith" => "<faq>\n",
"closeBlockWith" => "\n</faq>",
"replaceWith" => "function(h){ return outil_faq(h, '?', true);}",
"selectionType" => "line",
"display" => true,
"dropMenu" => array(
'id' => 'faq',
'name' => _T('faq:outil_inserer_faq'),
'className' => 'outil_faq',
'openBlockWith' => "<faq>\n",
'closeBlockWith' => "\n</faq>",
'replaceWith' => "function(h){ return outil_faq(h, '?', true);}",
'selectionType' => 'line',
'display' => true,
'dropMenu' => array(
// bouton ?
array(
"id" => 'faq_question',
"name" => _T('faq:outil_inserer_question'),
"replaceWith" => "function(h){ return outil_faq(h, '?');}",
"className" => 'outil_faq_question',
"selectionType" => "line",
"forceMultiline" => true,
"display" => true,
'id' => 'faq_question',
'name' => _T('faq:outil_inserer_question'),
'replaceWith' => "function(h){ return outil_faq(h, '?');}",
'className' => 'outil_faq_question',
'selectionType' => 'line',
'forceMultiline' => true,
'display' => true,
),
array(
"id" => 'faq_titre',
"name" => _T('faq:outil_inserer_titre'),
"replaceWith" => "function(h){ return outil_faq(h, ':Nouveau titre');}",
"className" => 'outil_faq_titre',
"selectionType" => "line",
"forceMultiline" => true,
"display" => true,
'id' => 'faq_titre',
'name' => _T('faq:outil_inserer_titre'),
'replaceWith' => "function(h){ return outil_faq(h, ':Nouveau titre');}",
'className' => 'outil_faq_titre',
'selectionType' => 'line',
'forceMultiline' => true,
'display' => true,
),
)
)
@ -97,15 +102,14 @@ function faq_porte_plume_barre_pre_charger($barres){
return s;
}");
}
return $barres;
}
function faq_porte_plume_lien_classe_vers_icone($flux){
function faq_porte_plume_lien_classe_vers_icone($flux) {
return array_merge($flux, array(
'outil_faq'=>'faq-16.png',
'outil_faq_question'=>'faq_question-16.png',
'outil_faq_titre'=>'faq_titre-16.png'
'outil_faq' => 'faq-16.png',
'outil_faq_question'=> 'faq_question-16.png',
'outil_faq_titre' => 'faq_titre-16.png'
));
}
?>

14
inc/faq_formater_tag.php

@ -1,22 +1,22 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Transforme la chaine représentant le nom du tag en un lien vers la page du mot-clé
* le cas échéans ou renvoie la chaine fournie en entrée.
*
* @param string $valeur
* Le nom du tag qui peut coincinder avec le titre d'un mot-clé
* Le nom du tag qui peut coincinder avec le titre d'un mot-clé
*
* @return string
* La valeur formatée en lien vers le mot-clé ou la valeur d'entrée sinon.
* La valeur formatée en lien vers le mot-clé ou la valeur d'entrée sinon.
*/
function inc_faq_formater_tag_dist($valeur) {
$tag = $valeur;
if ($id = sql_getfetsel('id_mot', 'spip_mots', 'titre='. sql_quote($tag))) {
if ($id = sql_getfetsel('id_mot', 'spip_mots', 'titre=' . sql_quote($tag))) {
include_spip('inc/utils');
$url = generer_url_entite($id, 'mots');
$tag = '<a href="' . $url . '" class="spip_in">' . $valeur . '</a>';
@ -24,5 +24,3 @@ function inc_faq_formater_tag_dist($valeur) {
return $tag;
}
?>

29
lang/faq_fr.php

@ -1,30 +1,29 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) return;
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// I
'info_config_faq' => 'Cette configuration s\'applique aux squelettes d\'affichage des FAQ proposés par le plugin, et plus particulièrement aux listes de définitions. Si vous souhaitez définir vos propres affichages pensez à tenir compte de ces paramètres.' ,
'info_config_faq' => 'Cette configuration s\'applique aux squelettes d\'affichage des FAQ proposés par le plugin, et plus particulièrement aux listes de définitions. Si vous souhaitez définir vos propres affichages pensez à tenir compte de ces paramètres.',
// L
'label_charger_css' => 'Utiliser les styles proposés par défaut par le plugin pour les listes de définitions',
'label_charger_js' => 'Utiliser la fonction permettant de plier et déplier les listes de définitions',
'label_iconifier_js' => 'Ajouter des puces en début de chaque question pour matérialiser la fonction de pliage/dépliage',
'label_charger_css' => 'Utiliser les styles proposés par défaut par le plugin pour les listes de définitions',
'label_charger_js' => 'Utiliser la fonction permettant de plier et déplier les listes de définitions',
'label_iconifier_js' => 'Ajouter des puces en début de chaque question pour matérialiser la fonction de pliage/dépliage',
'label_ancrer_question' => 'Attacher une ancre à chaque question',
'label_lier_faq' => 'Insérer un lien vers le début de la FAQ en fin de chaque réponse',
'legende_ancre_lien' => 'Ancres, liens et tables des matières',
'legende_comportement' => 'Comportement dynamique',
'legende_css' => 'Styles',
'lien_debut_faq' => 'Retour au début de la FAQ',
'label_lier_faq' => 'Insérer un lien vers le début de la FAQ en fin de chaque réponse',
'legende_ancre_lien' => 'Ancres, liens et tables des matières',
'legende_comportement' => 'Comportement dynamique',
'legende_css' => 'Styles',
'lien_debut_faq' => 'Retour au début de la FAQ',
// O
'outil_inserer_faq' => 'Insérer une nouvelle FAQ',
'outil_inserer_faq' => 'Insérer une nouvelle FAQ',
'outil_inserer_question' => 'Insérer une nouvelle question',
'outil_inserer_titre' => 'Insérer un titre pour la FAQ',
'outil_inserer_titre' => 'Insérer un titre pour la FAQ',
// T
'titre_page_configurer' => 'Configurer le plugin FAQ',
'titre_form_configurer' => 'Affichages des FAQ',
);
?>

10
lang/paquet-faq_fr.php

@ -1,16 +1,14 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) return;
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// T
'faq_description' => 'Ajoute de nouveaux raccourcis typographiques permettant de décrire de manière simple des <abbr title="Foire Aux Questions">FAQ</abbr> dans un contenu SPIP.
Les raccourcis doivent être utilisés à l\'intérieur de la balise <code><faq></faq></code>. Une configuration permet d\'ajouter des ancres, de rendre la FAQ dépliable, de charger des styles par défaut...
La structure HTML produite est, par défaut, toujours basée sur une liste de définitions.',
'faq_nom' => 'FAQ',
'faq_nom' => 'FAQ',
'faq_slogan' => 'Créer simplement une FAQ'
);
?>

90
wheels/faq.php

@ -1,17 +1,22 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// Regexp permettant de récupérer chacune des informations additionnelles qui peuvent compléter le titre de la tâche :
// - #tag, tag étant un mot. Exemple : #courses ou #перевод-шаблон
// - type:valeur ou type et valeur sont des mots. Pas utilisé pour l'instant
if (!defined('_FAQ_REGEXP_INFOS_COMPLEMENTAIRES'))
if (!defined('_FAQ_REGEXP_INFOS_COMPLEMENTAIRES')) {
define('_FAQ_REGEXP_INFOS_COMPLEMENTAIRES', '%([\w-]+:|#)([\w.-]+)(?:\s|$)%Uu');
}
// Regexp permettant de supprimer les inclusions typographiques d'espace avant le caractère "?" :
// - &nbsp; selon la règle typographique par défaut de SPIP
// - <small class="fine">\xc2\xa0</small> selon la règle typographique du plugin orthotypo
if (!defined('_FAQ_REGEXP_ESPACE_INTERROGATION'))
if (!defined('_FAQ_REGEXP_ESPACE_INTERROGATION')) {
define('_FAQ_REGEXP_ESPACE_INTERROGATION', '#^(&nbsp;|<small[^?]+)(\?.+)#is');
}
/**
* Analyse du contenu d'un bloc FAQ inclu entre les marqueurs de début (<faq>) et de fin (</faq>)
@ -23,8 +28,9 @@ if (!defined('_FAQ_REGEXP_ESPACE_INTERROGATION'))
* qui suivent la question jusqu'à la prochaine question, le prochain titre ou la fin du bloc.
* Il est possible de choisir le squelette de sortie en utilisant l'attribut format dans la balise <code><faq></code>.
*
* @param array $t l'index 4 représente le contenu du bloc, l'index 3 la valeur du format si il existe.
* @return string le html généré à partir d'un squelette
* @param array $t l'index 4 représente le contenu du bloc, l'index 3 la valeur du format si il existe.
*
* @return string le html généré à partir d'un squelette
*/
function tw_faq($t) {
// Numéro d'appel de la fonction tw_faq dans le hit.
@ -47,17 +53,17 @@ function tw_faq($t) {
// Initialisation des variables propres à l'ensemble des faqs du bloc
$faqs = array();
$types_info = array();
$types_info = array();
$index_faq = 0;
$index_qr = 0;
$index_ligne = 0;
$question_en_cours = false;
// Analyse de chaque ligne du bloc
while ($index_ligne <= count($lignes)){
while ($index_ligne <= count($lignes)) {
// Initialisation des variables de la faq en cours
// (pour un bloc faq contenant plusieurs faq séparées par des titres)
if (($index_qr == 0) AND !$question_en_cours) {
if (($index_qr == 0) and !$question_en_cours) {
$types_info[$index_faq] = array();
}
@ -68,14 +74,13 @@ function tw_faq($t) {
if ($question_en_cours) {
$faqs[$index_faq][$index_qr] = array(
'question' => $question,
'reponse' => trim($reponse),
'tags' => $tags,
'infos' => $infos,
'reponse' => trim($reponse),
'tags' => $tags,
'infos' => $infos,
);
$question_en_cours = false;
}
}
else {
} else {
// Extraction de la nouvelle ligne à traiter
$texte = trim($lignes[$index_ligne]);
@ -93,23 +98,23 @@ function tw_faq($t) {
$premier = substr($texte, 0, 1);
if (($premier != '?')
AND ($premier != ':')) {
and ($premier != ':')) {
// La ligne correspond à un texte de réponse non vide si une question est en cours
if ($question_en_cours)
if ($question_en_cours) {
$reponse .= $reponse ? "\n" . $texte : $texte;
}
else {
}
} else {
// Il faut tester si une question est en cours. Si c'est le cas il faut clore la question en cours
// avant de commencer la nouvelle question ('?') ou la nouvelle faq par son titre (':').
if ($question_en_cours) {
$faqs[$index_faq][$index_qr] = array(
'question' => $question,
'reponse' => trim($reponse),
'tags' => $tags,
'infos' => $infos,
'reponse' => trim($reponse),
'tags' => $tags,
'infos' => $infos,
);
$question_en_cours = false;
$index_qr += 1;
++$index_qr;
}
if ($premier == '?') {
@ -118,7 +123,7 @@ function tw_faq($t) {
$tags = $infos = array();
$question_en_cours = true;
$reponse = '';
$texte = trim(substr($texte, 1, strlen($texte)-1));
$texte = trim(substr($texte, 1, strlen($texte) - 1));
// -- le texte de la question, que l'on sépare du reste des informations complémentaires éventuelles
if (preg_match_all(_FAQ_REGEXP_INFOS_COMPLEMENTAIRES, $texte, $infos_complementaires)) {
@ -126,40 +131,39 @@ function tw_faq($t) {
$question = trim(str_replace($infos_complementaires[0], '', $texte));
// Extraction des informations complémentaires
foreach($infos_complementaires[1] as $_cle => $_prefixe) {
foreach ($infos_complementaires[1] as $_cle => $_prefixe) {
$type = rtrim($_prefixe, ':');
$valeur = $infos_complementaires[2][$_cle];
if ($type == '#') {
// -- les étiquettes
if ($formater = charger_fonction("faq_formater_tag", 'inc', true))
if ($formater = charger_fonction('faq_formater_tag', 'inc', true)) {
$tags[] = $formater($valeur);
else
} else {
$tags[] = $valeur;
}
else {
}
} else {
// -- les informations typées
if ($formater = charger_fonction("faq_formater_${type}", 'inc', true)) {
$infos[$type] = $formater($valeur);
}
else
} else {
$infos[$type] = $valeur;
if (!in_array($type, $types_info[$index_faq]))
}
if (!in_array($type, $types_info[$index_faq])) {
$types_info[$index_faq][] = $type;
}
}
}
}
else
} else {
$question = $texte;
}
elseif ($premier == ':') {
}
} elseif ($premier == ':') {
// Titre d'une nouvelle faq incluse dans le bloc faq en cours de traitement
$index_faq += 1;
$titres[$index_faq] = trim(substr($texte, 1, strlen($texte)-1));
++$index_faq;
$titres[$index_faq] = trim(substr($texte, 1, strlen($texte) - 1));
$index_qr = 0;
}
}
}
elseif ($question_en_cours) {
} elseif ($question_en_cours) {
// Ligne vide. Comme elle est incluse dans le texte de la réponse on la conserve
$reponse .= $reponse ? "\n" . $texte : $texte;
}
@ -172,14 +176,14 @@ function tw_faq($t) {
if ($faqs) {
$html = '';
$format = $t[3] ? $t[3] : 'dl';
foreach($faqs as $_cle => $_faq) {
foreach ($faqs as $_cle => $_faq) {
if ($_faq) {
$html .= recuperer_fond(
"inclure/faq_${format}",
array(
'titre' => (isset($titres[$_cle]) ? $titres[$_cle] : ''),
'ancre' => "faq_${no_bloc}_${_cle}",
'faq' => $_faq,
'titre' => (isset($titres[$_cle]) ? $titres[$_cle] : ''),
'ancre' => "faq_${no_bloc}_${_cle}",
'faq' => $_faq,
'types_info' => $types_info[$_cle]
),
array(
@ -193,5 +197,3 @@ function tw_faq($t) {
return $html;
}
?>
Loading…
Cancel
Save