3 Utility code for handling plugin .meta data files (pmd) and their
8 #-- read a single .meta file
9 function ewiki_pmd_read($fn) {
11 if ($src = file_get_contents($fn)) {
12 preg_match_all("/^(\w+):[ \t]*(([^\n]*(\n )?)+)/m", $src, $uu);
13 foreach ($uu[1] as $i=>$tmp) {
14 $info[$uu[1][$i]] = $uu[2][$i];
21 #-- scan all .meta files or read from cache file
22 function ewiki_pmd($read_cached=0, $else_write=1, $warn=0, $gauge_callback="") {
24 $basedir = dirname(dirname(__FILE__));
25 $metaf = "$basedir/meta.bin";
28 if ($read_cached && filesize($metaf)) {
29 $ewiki_pmd = unserialize((file_get_contents($metaf)));
31 #-- load from .meta files
34 $files = glob("$basedir/*.meta") + glob("$basedir/*/*.meta");
35 foreach ($files as $num=>$fn) {
36 if ($gauge_callback) {
37 $gauge_callback($num, count($files));
39 $id = basename($fn, ".meta");
42 $add = ewiki_pmd_read($fn);
46 $php = substr($fn, 0, -5) . ".php";
47 if (file_exists($php) && ($l = strpos($php, "/plugins/"))) {
48 $php = substr($php, 1 + $l);
58 foreach(explode(",", "$id,$add[provides],$add[delivers]") as $p) {
60 $ewiki_pmd[".provides"][$p][] = $id; // only the first gets used
65 if ($warn && isset($ewiki_pmd[$id])) {
66 echo "WARNING: a plugin with the name '$id' is already registered\n";
68 $ewiki_pmd[$id] = $add;
73 if ($else_write && is_writeable($metaf)) {
74 file_put_contents($metaf, (serialize($ewiki_pmd)));
77 return($ewiki_pmd); //redundant
81 #-- apply dependencies on plugin list
82 function ewiki_pmd_resolve_dependencies(&$list, $add_suggested=1) {
86 #-- how to handle fields
91 "recommends" => $add_suggested,
94 #-- check all entries in name list
95 foreach ($list as $list_i_id=>$id) {
97 foreach ($fields as $name=>$action) {
98 if ($action && !empty($ewiki_pmd[$id][$name]))
99 foreach (explode(",",$ewiki_pmd[$id][$name]) as $dep)
100 { // multiple dependencies may be given
105 if (!in_array($dep, $list)) {
106 if (!isset($ewiki_pmd[".provides"][$dep])) {
108 unset($list[$list_i_id]);
109 $error[$id] = "unmet dependency: $dep";
112 // always adds only the very first entry
113 $list[] = $ewiki_pmd[".provides"][$dep][0];
118 elseif ($action <= -1) {
119 foreach ($ewiki_pmd[".provides"][$dep] as $dep) {
120 if (in_array($dep, $list)) {
121 unset($list[array_search($dep, $list)]);
128 #-- does such a plugin exist at all?
129 if (!$ewiki_pmd[$id]) {
130 $error[$id] = "plugin '$id' does not exist";
134 return($error); //ouch, if you forget that this isn't a result
139 function ewiki_pmd_get_config_settings($list) {
143 #-- get include_once() filenames
144 function ewiki_pmd_get_plugin_files($list) {
148 foreach($list as $id) {
149 $fn = $ewiki_pmd[$id]["fn"];
150 $type = $ewiki_pmd[$id]["type"];
151 ($sort = $ewiki_pmd[$id]["sort"]) or ($sort = 0);
153 if ($fn && ($type != "R") && !in_array($fn, $r)) {
154 $r["$sort.$n"] = $fn;
158 # $r = array_values($r);
164 function ewiki_pmd_by_category() {
167 foreach ($ewiki_pmd as $id=>$row) {
169 ($cat = $row["category"]) or ($cat = "else");
170 $r[$cat][$id] = $row;
177 #-- flip array by entry
178 function ewiki_pmd_by($field) {
181 foreach ($ewiki_pmd as $id=>$row) {
182 if (isset($row[$field])) {
183 $r[$row[$field]] = $id;
191 function ewiki_pmd_hidden($row) {
193 !strlen($row["type"]) || ($row["type"] == "R")
194 || !strlen($row["title"])
195 || ($row["priority"] == "never")
196 || ($row["priority"] == "deprecated");