*
*/
// 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('','','',''),$matches[1]);
$matches[3] = str_replace(array('**','//','__','\'\''),array('
','','',''),$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#',"
",$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; $iget_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; $imacros[$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' . $what . '');
return;
}
$handle=fopen("textinsert.txt",'a');
fwrite($handle,"$what\n");
fclose($handle);
}
}