diff options
Diffstat (limited to 'platform/www/lib/plugins/textinsert/syntax.php')
-rw-r--r-- | platform/www/lib/plugins/textinsert/syntax.php | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/textinsert/syntax.php b/platform/www/lib/plugins/textinsert/syntax.php new file mode 100644 index 0000000..82a60b6 --- /dev/null +++ b/platform/www/lib/plugins/textinsert/syntax.php @@ -0,0 +1,261 @@ +<?php +/** + * + * + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * @author Myron Turner <turnermm02@shaw.ca> + * + */ +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); +require_once(DOKU_PLUGIN.'syntax.php'); +define('REPLACE_DIR', DOKU_INC . 'data/meta/macros/'); +define('MACROS_FILE', REPLACE_DIR . 'macros.ser'); + + +/** + * All DokuWiki plugins to extend the parser/rendering mechanism + * need to inherit from this class + */ +class syntax_plugin_textinsert extends DokuWiki_Syntax_Plugin { + var $macros; + var $translations; + var $ns; + /** + * return some info + */ + + /** + * What kind of syntax are we? + */ + function getType(){ + return 'substition'; + } + + /** + * Where to sort in? + */ + function getSort(){ + return 155; + } + + + /** + * Connect pattern to lexer + */ + function connectTo($mode) { + $this->Lexer->addSpecialPattern('#@\!?[\w\-\._]+\!?@#',$mode,'plugin_textinsert'); + $this->Lexer->addSpecialPattern('#@\!\![\w\-\._]+@#',$mode,'plugin_textinsert'); + $this->Lexer->addSpecialPattern('#@[\w\-\._]+~.*?~@#',$mode,'plugin_textinsert'); + $this->Lexer->addSpecialPattern('#@[\w\-\._]+[\r\n]+~[^\r\n]+~@#',$mode,'plugin_textinsert'); + } + + + /** + * Handle the match + */ + function handle($match, $state, $pos, Doku_Handler $handler){ + + $html=false; + $translation = false; + $match = substr($match,2,-2); + $match = trim($match); + if(strpos($match, 'HTML')) $html=true; + if(strpos($match, 'LANG_') !== false) { + $translation=true; + list($prefix,$trans) = explode('_',$match,2); + } + + global $ID; + list($ns,$rest) = explode(':',$ID,2); + if(@file_exists($filename = DOKU_PLUGIN . "textinsert/lang/$ns/lang.php")) { + include $filename; + $this->translations = $lang; + + } + + if(@file_exists($filename = DOKU_PLUGIN . "textinsert/lang/$ns/macros.php")) { + include $filename; + $ar = 'lang_' .$ns; + $tr = $$ar; + if($this->translations) { + $this->translations = array_merge($lang,$tr); + } + else $this->translations = $tr; + } + + if(!empty($ns)) { + $this->ns = $ns; + } + $this->macros = $this->get_macros(); + + + + while(preg_match('#(\*\*|//|__|\'\').*?\1#m',$match )) { + $match = preg_replace_callback( + '#(\*\*|//|__|\'\')(.*?)(\1)#', + function($matches) { + $matches[1] = str_replace(array('**','//','__','\'\'',),array('<b>','<em>','<u>','<code>'),$matches[1]); + $matches[3] = str_replace(array('**','//','__','\'\''),array('</b>','</em>','</u>','</code>'),$matches[3]); + return $matches[1] . $matches[2] . $matches[3]; + },$match ); + } + + if(preg_match('/(.*?)~([\s\S]+)~$/',$match,$subtitution)) { + $match=$subtitution[1]; + $subtitution[2] = str_replace('\\,',',',$subtitution[2]); + $substitutions=explode(',',$subtitution[2]); + $substitutions = preg_replace('#\/\/.+#',"",$substitutions); + $substitutions = preg_replace('#\\\n#',"<br />",$substitutions); + } + + if(!array_key_exists($match, $this->macros) ) { + $err = $this->getLang('not_found'); + msg("$match $err", -1); + $match = ""; + } + else { + if($translation && isset($this->translations[$trans])){ + $match = $this->translations[$trans]; + } + else { + $match =$this->macros[$match]; + } + } + + if(!is_array($substitutions)) $substitutions = array(); + for($i=0; $i<count($substitutions); $i++) { + $search = '%' . ($i+1); + $match = str_replace ($search , trim($substitutions[$i]), $match); + } + + $match = $this->get_inserts($match,$translation); + + if($html) { + $match = str_replace('<','<',$match); + $match = str_replace('>','>',$match); + } + + return array($state,$match); + } + + /** + * Create output + */ + function render($mode, Doku_Renderer $renderer, $data) { + global $INFO; + if($mode == 'xhtml'){ + list($state, $word) = $data; + If(strpos($word,'_ID_') !== false ) { + $word = str_replace('_ID_',$INFO['id'], $word); + } + $renderer->doc .= $word; + return true; + } + return false; + } + + function get_macros() { + $a = array(); + if(file_exists(MACROS_FILE)) { + $a = unserialize(file_get_contents(MACROS_FILE)); + } + else if($this->getConf('farm')) { + $a = unserialize(file_get_contents(metaFN('macros','.ser'))); + } + $r = $this->get_std_replacements() ; + $result = array_merge($r,$a); + return array_merge($r,$a); + } + + function get_inserts($match,$translation) { + $inserts = array(); + + // replace embedded macros + if(preg_match_all('/#@(.*?)@#/',$match,$inserts)) { + $keys = $inserts[1]; + $pats = $inserts[0]; + + for($i=0; $i<count($keys); $i++) { + $insert = $this->macros[$keys[$i]]; + if($translation ||strpos($keys[$i], 'LANG_') !== false) { + list($prefix,$trans) = explode('_',$keys[$i],2); + $_insert = $this->translations[$trans]; + if($_insert) $insert =$_insert; + } + $match = str_replace($pats[$i],$insert,$match); + } + + } // end replace embedded macros + + + $entities = getEntities(); + $e_keys = array_keys($entities); + $e_values = array_values($entities); + $match = str_replace($e_keys,$e_values,$match); + + return $match; + } + + function get_std_replacements() { + if(!$this->getConf('stdreplace')) return array(); + global $conf; + global $INFO; + global $ID; + + $file = noNS($ID); + $page = cleanID($file) ; + + $names =array( + 'ID', + 'NS', + 'FILE', + '!FILE', + '!FILE!', + 'PAGE', + '!PAGE', + '!!PAGE', + '!PAGE!', + 'USER', + 'DATE', + '_ID_' + ); + + $values = array( + $ID, + getNS($ID), + $file, + utf8_ucfirst($file), + utf8_strtoupper($file), + $page, + utf8_ucfirst($page), + utf8_ucwords($page), + utf8_strtoupper($page), + $_SERVER['REMOTE_USER'], + strftime($conf['dformat'], time()), + '_ID_' + ); + $std_replacements = array(); + for($i=0; $i<count($names) ; $i++) { + $std_replacements[$names[$i]] = $values[$i]; + } + + return $std_replacements; +} + + function write_debug($what, $screen = false) { + return; + $what=print_r($what,true); + if($screen) { + msg('<pre>' . $what . '</pre>'); + return; + } + $handle=fopen("textinsert.txt",'a'); + fwrite($handle,"$what\n"); + fclose($handle); + } +} + + |