123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- <?php
- /*
- * TextWheel 0.1
- *
- * let's reinvent the wheel one last time
- *
- * This library of code is meant to be a fast and universal replacement
- * for any and all text-processing systems written in PHP
- *
- * It is dual-licensed for any use under the GNU/GPL2 and MIT licenses,
- * as suits you best
- *
- * (c) 2009 Fil - fil@rezo.net
- * Documentation & http://zzz.rezo.net/-TextWheel-
- *
- * Usage: $wheel = new TextWheel(); echo $wheel->text($text);
- *
- */
- if (!defined('_ECRIRE_INC_VERSION')) return;
- require_once dirname(__FILE__)."/textwheelrule.php";
- abstract class TextWheelDataSet {
- # list of data
- protected $data = array();
- /**
- * file finder : can be overloaded in order to use application dependant
- * path find method
- *
- * @param string $file
- * @param string $path
- * @return string
- */
- protected function findFile(&$file, $path=''){
- static $default_path;
- // absolute file path ?
- if (file_exists($file))
- return $file;
- // file embed with texwheels, relative to calling ruleset
- if ($path AND file_exists($f = $path.$file))
- return $f;
- // textwheel default path ?
- if (!$default_path)
- $default_path = dirname(__FILE__).'/../wheels/';
- if (file_exists($f = $default_path.$file))
- return $f;
- return false;
- }
-
- /**
- * 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$,i',$file)
- // external rules
- OR !$file = $this->findFile($file,$default_path))
- return array();
- defined('_YAML_EVAL_PHP') || define('_YAML_EVAL_PHP', false);
- 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 = array();
- # 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$,i','.php',$file)
- AND file_exists($f)) {
- $dataset[] = array('require' => $f, 'priority' => -1000);
- }
- return $dataset;
- }
- }
- class TextWheelRuleSet extends TextWheelDataSet {
- # sort flag
- protected $sorted = true;
- /**
- * Constructor
- *
- * @param array|string $ruleset
- * @param string $filepath
- */
- public function TextWheelRuleSet($ruleset = array(), $filepath='') {
- if ($ruleset)
- $this->addRules($ruleset, $filepath);
- }
- /**
- * public static loader
- * can be overloaded to use memoization
- *
- * @param array $ruleset
- * @param string $callback
- * @param string $class
- * @return class
- */
- public static function &loader($ruleset, $callback='', $class='TextWheelRuleSet'){
- $ruleset = new $class($ruleset);
- if ($callback)
- $callback($ruleset);
- return $ruleset;
- }
- /**
- * Get an existing named rule in order to override it
- *
- * @param string $name
- * @return string
- */
- public function &getRule($name){
- if (isset($this->data[$name]))
- return $this->data[$name];
- $result = null;
- return $result;
- }
-
- /**
- * get sorted Rules
- * @return array
- */
- public function &getRules(){
- $this->sort();
- return $this->data;
- }
- /**
- * add a rule
- *
- * @param TextWheelRule $rule
- */
- public function addRule($rule) {
- # cast array-rule to object
- if (is_array($rule))
- $rule = new TextWheelRule($rule);
- $this->data[] = $rule;
- $this->sorted = false;
- }
- /**
- * add an list of rules
- * can be
- * - an array of rules
- * - a string filename
- * - an array of string filename
- *
- * @param array|string $rules
- * @param string $filepath
- */
- public function addRules($rules, $filepath='') {
- // rules can be an array of filename
- if (is_array($rules) AND is_string(reset($rules))) {
- foreach($rules as $i=>$filename)
- $this->addRules($filename);
- return;
- }
- // rules can be a string : yaml filename
- if (is_string($rules)) {
- $file = $rules; // keep the real filename
- $rules = $this->loadFile($file, $filepath);
- $filepath = dirname($file).'/';
- }
- // rules can be an array of rules
- if (is_array($rules) AND count($rules)){
- # cast array-rules to objects
- foreach ($rules as $i => $rule) {
- if (is_array($rule))
- $rules[$i] = new TextWheelRule($rule);
- // load subwheels when necessary
- if ($rules[$i]->is_wheel){
- // subruleset is of the same class as current ruleset
- $class = get_class($this);
- $rules[$i]->replace = new $class($rules[$i]->replace, $filepath);
- }
- }
- $this->data = array_merge($this->data, $rules);
- $this->sorted = false;
- }
- }
- /**
- * Sort rules according to priority and
- * purge disabled rules
- *
- */
- protected function sort() {
- if (!$this->sorted) {
- $rulz = array();
- foreach($this->data as $index => $rule)
- if (!$rule->disabled)
- $rulz[intval($rule->priority)][$index] = $rule;
- ksort($rulz);
- $this->data = array();
- foreach($rulz as $rules)
- $this->data += $rules;
- $this->sorted = true;
- }
- }
- }
|