/** * Nettoie un texte, traite les raccourcis autre qu'URL, la typo, etc. * * http://code.spip.net/@traiter_raccourcis * * @param string $t * @param bool $show_autobr * @return string */ function traiter_raccourcis($t, $show_autobr = false) { static $wheel, $notes; static $img_br_auto, $img_br_manuel, $img_br_no; // hack1: respecter le tag ignore br if (_AUTOBR_IGNORER and strncmp($t, _AUTOBR_IGNORER, strlen(_AUTOBR_IGNORER)) == 0) { $ignorer_autobr = true; $t = substr($t, strlen(_AUTOBR_IGNORER)); } else { $ignorer_autobr = false; } // Appeler les fonctions de pre_traitement $t = pipeline('pre_propre', $t); if (!isset($wheel)) { $ruleset = SPIPTextWheelRuleset::loader($GLOBALS['spip_wheels']['raccourcis'], 'personnaliser_raccourcis'); $wheel = new TextWheel($ruleset); if (_request('var_mode') == 'wheel' and autoriser('debug')) { $f = $wheel->compile(); echo "<pre>\n" . spip_htmlspecialchars($f) . "</pre>\n"; exit; } $notes = charger_fonction('notes', 'inc'); } // Gerer les notes (ne passe pas dans le pipeline) list($t, $mes_notes) = $notes($t); $t = $wheel->text($t); // Appeler les fonctions de post-traitement $t = pipeline('post_propre', $t); if ($mes_notes) { $notes($mes_notes, 'traiter', $ignorer_autobr); } // hack2: wrap des autobr dans l'espace prive, pour affichage css // car en css on ne sait pas styler l'element BR if ($ignorer_autobr and _AUTOBR) { if (is_null($img_br_no)) { $img_br_no = $show_autobr ? http_img_pack("br-no-10.png", _T("tw:retour_ligne_ignore"), "class='br-no'", _T("tw:retour_ligne_ignore")) : ""; } $t = str_replace(_AUTOBR, $img_br_no, $t); } if ($show_autobr and _AUTOBR) { if (is_null($img_br_manuel)) { $img_br_manuel = http_img_pack("br-manuel-10.png", _T("tw:retour_ligne_manuel"), "class='br-manuel'", _T("tw:retour_ligne_manuel")); } if (is_null($img_br_auto)) { $img_br_auto = http_img_pack("br-auto-10.png", _T("tw:retour_ligne_auto"), "class='br-auto'", _T("tw:retour_ligne_auto")); } if (false !== strpos(strtolower($t), '<br')) { $t = preg_replace("/<br\\b.*>/UiS", "{$img_br_manuel}\\0", $t); $t = str_replace($img_br_manuel . _AUTOBR, $img_br_auto . _AUTOBR, $t); } } return $t; }
/** * Initializing a rule a first call * including file, creating function or wheel * optimizing tests * * @param TextWheelRule $rule */ protected function initRule(&$rule) { # language specific if ($rule->require) { require_once $rule->require; } # optimization: strpos or stripos? if (isset($rule->if_str)) { if (strtolower($rule->if_str) !== strtoupper($rule->if_str)) { $rule->if_stri = $rule->if_str; $rule->if_str = null; } } if ($rule->create_replace) { $compile = $rule->replace . '($t)'; $rule->replace = create_function('$m', $rule->replace); $this->compiled[$rule->replace] = $compile; $rule->create_replace = false; $rule->is_callback = true; } elseif ($rule->is_wheel) { $n = count(TextWheel::$subwheel); TextWheel::$subwheel[] = $this->createSubWheel($rule->replace); $var = '$m[' . intval($rule->pick_match) . ']'; if ($rule->type == 'all' or $rule->type == 'str' or $rule->type == 'split' or !isset($rule->match)) { $var = '$m'; } $code = 'return TextWheel::getSubWheel(' . $n . ')->text(' . $var . ');'; $rule->replace = create_function('$m', $code); $cname = 'compiled_' . str_replace('-', '_', $rule->name); $compile = TextWheel::getSubWheel($n)->compile($cname); $this->compiled[$rule->replace] = $compile; $rule->is_wheel = false; $rule->is_callback = true; } # optimization $rule->func_replace = ''; if (isset($rule->replace)) { switch ($rule->type) { case 'all': $rule->func_replace = 'replace_all'; break; case 'str': $rule->func_replace = 'replace_str'; // test if quicker strtr usable 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) and count($c) == 1 and reset($c) == 1 and $c = array_map('strlen', $rule->replace) and $c = array_unique($c) and count($c) == 1 and reset($c) == 1) { $rule->match = implode('', $rule->match); $rule->replace = implode('', $rule->replace); $rule->func_replace = 'replace_strtr'; } break; case 'split': $rule->func_replace = 'replace_split'; $rule->match = array($rule->match, is_null($rule->glue) ? $rule->match : $rule->glue); break; case 'preg': default: $rule->func_replace = 'replace_preg'; break; } if ($rule->is_callback) { $rule->func_replace .= '_cb'; } } if (!method_exists("TextWheel", $rule->func_replace)) { $rule->disabled = true; $rule->func_replace = 'replace_identity'; } # /end }
public function compile() { $rules =& $this->ruleset->getRules(); ## apply each in order $comp = array(); foreach ($rules as $name => $rule) { $this->initRule($rule); $r = "/* {$name} */\n"; if ($rule->require) { $r .= 'require_once ' . TextWheel::export($rule->require) . ';' . "\n"; } if ($rule->if_str) { $r .= 'if_str(' . TextWheel::export($rule->if_str) . ', $t)' . "\n"; } if ($rule->if_stri) { $r .= 'if_stri(' . TextWheel::export($rule->if_stri) . ', $t)' . "\n"; } if ($rule->if_match) { $r .= 'if_match(' . TextWheel::export($rule->if_match) . ', $t)' . "\n"; } if ($rule->func_replace !== 'replace_identity') { $fun = 'TextWheel::' . $rule->func_replace; $r .= '$t = ' . $fun . '(' . TextWheel::export($rule->match) . ', ' . TextWheel::export($rule->replace) . ', $t);' . "\n"; } $comp[] = $r; } return join("\n", $comp); }
/** * Apply all rules of RuleSet to a text * * @param string $t * @return string */ public function &test() { $tests =& $this->testset->getTests(); $results = array(); ## apply each in order foreach ($tests as $i => $test) { #php4+php5 if (!$test->disabled) { $results[$i] = array('test' => &$tests[$i]); $w = new TextWheel($test->ruleset); $output = $w->text($test->input); if ($output == $test->output) { $results[$i]['result'] = true; } else { $results[$i]['result'] = false; $results[$i]['output'] = $output; } } } return $results; }