2 class NP_SkinVarManager extends NucleusPlugin {
\r
3 function getName() { return 'NP_SkinVarManager'; }
\r
4 function getMinNucleusVersion() { return 330; }
\r
5 function getAuthor() { return 'Katsumi'; }
\r
6 function getVersion() { return '0.1.1'; }
\r
7 function getURL() {return 'http://japan.nucleuscms.org/wiki/plugins:authors:katsumi';}
\r
8 function getDescription() {
\r
9 return 'This plugin raises RegisterSkinVars event for overriding skinvars and ifvars.<br />
\r
10 Also raises PreParseCentents event for tracking what will be parsed as skin.';
\r
12 function supportsFeature($what) { return ($what=='SqlTablePrefix')?1:0; }
\r
13 function getEventList() { return array('InitSkinParse','PreSkinParse'); }
\r
14 function doSkinVar($skinType,$type,$p2='') {
\r
15 // The first argument shows what skinver is overrided.
\r
16 // The method that override core's function is defined in $this->skinvars.
\r
17 $args=func_get_args();
\r
18 $skinType=array_shift($args);
\r
19 $type=array_shift($args);
\r
20 array_unshift($args,$skinType);
\r
21 $function=@$this->skinvars[$type];
\r
22 if ($function) call_user_func_array($function,$args);
\r
24 function doIf($p1='',$p2=''){
\r
25 // The first argument contains two things. One is what ifver is overrided.
\r
26 // The other is what is the first argument used in overrided method.
\r
27 // These are connected by ":" as delimiter.
\r
28 // The method that override core's function is defined in $this->ifvars.
\r
29 if (!preg_match('/^([a-zA-Z_0-9]+):([\s\S]*)$/',$p1,$m)) exit('Fatal error when parsing if skinvar');
\r
32 $function=@$this->ifvars[$type];
\r
33 if ($function) return call_user_func($function,$p1,$p2);
\r
34 else exit('Fatal error when parsing if skinvar');
\r
36 var $skinvars,$ifvars,$search,$replace;
\r
37 function event_InitSkinParse(&$data) {
\r
40 $skinvars=$ifvars=array();
\r
41 $manager->notify('RegisterSkinVars',array('skinvars' => &$skinvars, 'ifvars' => &$ifvars));
\r
42 // parsedinclude is overrided by this plugin's method.
\r
43 // The other plugin's method cannot override parsedinclude.
\r
44 $skinvars['parsedinclude']=array(&$this,'parse_parsedinclude');
\r
45 // Construct search and replace arrays.
\r
46 $search=$replace=array();
\r
47 foreach($skinvars as $key=>$function){
\r
48 if (!preg_match('/^[a-zA-Z0-9_]+$/',$key)) continue;
\r
49 $search[]="<%$key%>";
\r
50 $replace[]="<%SkinVarManager($key)%>";
\r
51 $search[]="<%$key(";
\r
52 $replace[]="<%SkinVarManager($key,";
\r
54 foreach($ifvars as $key=>$function){
\r
55 if (!preg_match('/^[a-zA-Z0-9_]+$/',$key)) continue;
\r
56 foreach(array('if','ifnot','elseif','elseifnot') as $if){
\r
57 $search[]="<%$if($key)%>";
\r
58 $replace[]="<%$if(SkinVarManager,$key:)%>";
\r
59 $search[]="<%$if($key,";
\r
60 $replace[]="<%$if(SkinVarManager,$key:";
\r
63 // Set the object properties
\r
64 $this->skinvars=$skinvars;
\r
65 $this->ifvars=$ifvars;
\r
66 $this->search=$search;
\r
67 $this->replace=$replace;
\r
68 // Set handler and parser
\r
69 $this->skin=&$data['skin'];
\r
70 $skin=&$data['skin'];
\r
71 $type=&$data['type'];
\r
72 $actions = $skin->getAllowedActionsForType($type);
\r
73 $this->handler =& new ACTIONS($type, $skin);
\r
74 $this->parser =& new PARSER($actions, $this->handler);
\r
75 $this->handler->setParser($this->parser);
\r
76 $this->handler->setSkin($skin);
\r
78 // Public properties
\r
79 var $skin,$handler,$parser;
\r
80 function event_PreSkinParse(&$data) {
\r
82 $contents=&$data['contents'];
\r
83 $contents=str_replace($this->search,$this->replace,$contents);
\r
85 function parse_parsedinclude($skintype,$filename) {
\r
86 // check current level
\r
87 if ($this->handler->level > 3) return; // max. depth reached (avoid endless loop)
\r
88 $filename = $this->handler->getIncludeFileName($filename);
\r
89 if (!file_exists($filename)) {
\r
92 $fsize = filesize($filename);
\r
93 // nothing to include
\r
98 $fd = fopen ($filename, 'r');
\r
99 $contents = fread ($fd, $fsize);
\r
103 $this->parse($contents,$filename);
\r
105 function parse(&$contents,$filename='') {
\r
108 $manager->notify('PreParseContents',
\r
109 array('contents' => &$contents,
\r
110 'filename' => $filename,
\r
111 'skin' => &$this->skin));
\r
113 $contents=str_replace($this->search,$this->replace,$contents);
\r
114 // parse file contents
\r
115 if (is_string($contents) && strlen($contents)) {
\r
116 $this->handler->level++;
\r
117 $this->parser->parse($contents);
\r
118 $this->handler->level--;
\r