OSDN Git Service

FIX: NP_AttachをNucleus 3.65/PHP5.4/MySQL5.5で動作するよう修正
[nucleus-jp/nucleus-plugins.git] / NP_admin / trunk / NP_SkinVarManager.php
1 <?php\r
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
11         }\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
23         }\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
30                 $type=$m[1];\r
31                 $p1=$m[2];\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
35         }\r
36         var $skinvars,$ifvars,$search,$replace;\r
37         function event_InitSkinParse(&$data) {\r
38                 global $manager;\r
39                 // Raise an event\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
53                 }\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
61                         }\r
62                 }\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
77         }\r
78         // Public properties\r
79         var $skin,$handler,$parser;\r
80         function event_PreSkinParse(&$data) {\r
81                 // Convert\r
82                 $contents=&$data['contents'];\r
83                 $contents=str_replace($this->search,$this->replace,$contents);\r
84         }\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
90                         $contents=false;\r
91                 } else {\r
92                         $fsize = filesize($filename);\r
93                         // nothing to include\r
94                         if ($fsize <= 0) {\r
95                                 $contents='';\r
96                         } else {\r
97                                 // read file\r
98                                 $fd = fopen ($filename, 'r');\r
99                                 $contents = fread ($fd, $fsize);\r
100                                 fclose ($fd);\r
101                         }\r
102                 }\r
103                 $this->parse($contents,$filename);\r
104         }\r
105         function parse(&$contents,$filename='') {\r
106                 global $manager;\r
107                 // Raise an event\r
108                 $manager->notify('PreParseContents',\r
109                         array('contents' => &$contents,\r
110                                 'filename' => $filename,\r
111                                 'skin' => &$this->skin));\r
112                 // convert\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
119                 }\r
120         }\r
121 }\r