=2.1 on utilise l'astuce [XX]... pour beneficier ensuite de la typo appropriee $BT[] = array($racc, true, $div); $aide[] = $racc; $trouve[] = "<$racc>"; $trouve[] = ""; $remplace[] = $a = "[$valeur]"; $remplace[] = $b = ""; } else { $attr="$attr=\"$valeur\""; $BT[] = array($racc, $auto, $div); if ($auto) { $auto_balises[] = $racc; $auto_remplace[$racc] = "$attr>"; } else { $aide[] = $racc; $trouve[] = "<$racc>"; $trouve[] = ""; $trouve[] = "<$racc/>"; $remplace[] = $a = "<$div $attr>"; $remplace[] = $b = ""; $remplace[] = $a.$b; } } } elseif (preg_match('/^(span|div|auto)\.([^=]+)=(.+)$/', $balise, $regs)) { // les styles inline list($auto, $div, $racc, $style) = array($regs[1]=='auto', $regs[1], trim($regs[2]), trim($regs[3])); $BT[] = array($racc, $auto, $div); $attr="style=\"$style\""; if ($auto) { $auto_balises[] = $racc; $auto_remplace[$racc] = "$attr>"; } else { $aide[] = $racc; $trouve[] = "<$racc>"; $trouve[] = ""; $trouve[] = "<$racc/>"; $remplace[] = $a = "<$div $attr>"; $remplace[] = $b = ""; $remplace[] = $a.$b; } } elseif (preg_match('/^([^=]+)=(.+)$/', $balise, $regs)) { // les alias $alias[trim($regs[1])] = trim($regs[2]); } } // ajout des alias qu'on a trouves foreach ($alias as $a=>$v) if(($i=array_search("<$v>", $trouve, true))!==false) { $aide[] = $a; $trouve[] = "<$a>"; $trouve[] = ""; $trouve[] = "<$a/>"; $remplace[] = $remplace[$i]; $remplace[] = $remplace[$i+1]; $remplace[] = $remplace[$i+2]; } elseif(array_search($v, $auto_balises, true)!==false) { $auto_balises[] = $a; $auto_remplace[$a] = $auto_remplace[$v]; } // liste des balises disponibles $aide = array_merge($aide, $auto_balises); $n = count($auto_balises); // protection $auto_balises pour la future regExpr array_walk($auto_balises, 'cs_preg_quote'); // renvoi des donnees compilees return array( array( // balises fixes a trouver $trouve, // remplacement des balises fixes $remplace, // RegExpr pour les balises automatiques $n?($n==1?",<($auto_balises[0])>(.*?),ms":',<('.join('|', $auto_balises).')>(.*?),ms'):'', // association pour les balises automatiques $auto_remplace, // balises disponibles $BT), // casier special pour l'aide 'racc' => $aide, ); } // liste des nouveaux raccourcis ajoutes par l'outil // si cette fonction n'existe pas, le plugin cherche alors _T('couteauprive:un_outil:aide'); function decoration_raccourcis() { $racc = cs_lire_data_outil('decoration', 'racc'); return _T('couteauprive:decoration:aide', array('liste' => ''.join(', ', $racc).'')); } function decoration_callback($matches) { global $deco_balises; return cs_block($matches[2]) ?'
' :''; } // cette fonction n'est pas appelee dans les balises html : html|code|cadre|frame|script function decoration_rempl($texte) { if (strpos($texte, '<')===false) return $texte; // reecrire les raccourcis du type $texte = preg_replace(', +/>,', '/>', $texte); global $deco_balises; // balises fixes, facile : on remplace tout d'un coup ! $texte = str_replace($deco_balises[0], $deco_balises[1], $texte); // balises automatiques, plus long : il faut un callback pour analyser l'interieur du texte return strlen($deco_balises[2]) ?preg_replace_callback($deco_balises[2], 'decoration_callback', $texte) :$texte; } // fonction pipeline function decoration_pre_typo($texte) { if (strpos($texte, '<')===false || !function_exists('_decoration_BALISES')) return $texte; // pour les callbacks global $deco_balises; // lecture des balises et des remplacements $deco_balises = cs_lire_data_outil('decoration'); // on remplace apres echappement $texte = cs_echappe_balises('', 'decoration_rempl', $texte); // menage unset($deco_balises); return $texte; } // cette fonction renvoie une ligne de tableau entre afin de l'inserer dans la Barre Typo V2, si elle est presente function decoration_BarreTypo($tr) { $balises = cs_lire_data_outil('decoration'); $res = array(); foreach($balises[4] as $v) { $tmp = $v[1]?"('<$v[0]>',''":"_etendu('<$v[0]>','','<$v[0]/>'"; $res[] = "$v[0]"; } $res = join(' ', $res); return $tr.'

'._T('couteauprive:decoration:nom')." $res

"; } // les 2 fonctions suivantes inserent les boutons pour le plugin Porte Plume, s'il est present (SPIP>=2.0) function decoration_PP_pre_charger($flux) { $balises = cs_lire_data_outil('decoration'); $max = count($balises[4]); $r = array(); foreach($balises[4] as $b) { $id = 'decoration_'.$b[0]; $r[] = array( "id" => $id, "name" => _T('couteau:pp_decoration_inserer', array('racc'=>$b[0], 'balise'=>$b[2])), "className" => $id, "selectionType" => $b[2]=='div'?"line":"word", // $b[1] est vrai si la balise est interdite "replaceWith" => "function(h){ return outil_decoration(h.selection, '$b[0]', '$b[2]', '".($b[1]?'':"<$b[0]/>")."'); }", "display" => true); } $r = array( "id" => 'cs_decoration_drop', "name" => _T('couteau:pp_decoration_inserer_drop'), "className" => 'cs_decoration_drop', "replaceWith" => '', "display" => true, "dropMenu" => $r, ); foreach(cs_pp_liste_barres('decoration') as $b) { $flux[$b]->ajouterApres('stroke_through', $r); $flux[$b]->ajouterFonction("function outil_decoration(sel, racc, balise, defaut) { if(sel) { r='<'+racc+'>'+sel+''; return balise=='span'?r.replace(/(\\n\\n|\\r\\n\\r\\n|\\r\\r)/g,'\$1<'+racc+'>'):r; } return defaut; }"); } return $flux; } function decoration_PP_icones($flux){ $balises = cs_lire_data_outil('decoration'); // icones utilisees. Attention : mettre les drop-boutons en premier !! $flux['cs_decoration_drop'] = 'decoration_div.png'; foreach($balises[4] as $b) { $id = 'decoration_'.$b[0]; $flux[$id] = find_in_path("icones_barre/{$id}.png")?$id.'.png' :"decoration_{$b[2]}.png"; } return $flux; } ?>