dev-util/idea-* minor fixes
[anomen-overlay.git] / www-apps / pmwiki / cookbook / XMLPageStore / XMLPageStore.php
blobea958c0846c2f89a64e1a745f36073da7a253ee9
1 <?php if (!defined('PmWiki')) exit();
3 /*
4 XMLPageStore
6 Copyright 2011 Anomen (ludek_h@seznam.cz)
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published
9 by the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 $RecipeInfo['XMLPageStore']['Version'] = '2012-12-27';
14 SDV($EnablePageStoreXML,false);
17 class XMLPageStore extends PageStore {
19 function read_xml($data, $since=0)
21 global $Charset;
22 $p = xml_parser_create();
23 xml_parser_set_option($p,XML_OPTION_CASE_FOLDING, false);
24 xml_parser_set_option($p,XML_OPTION_TARGET_ENCODING, $Charset);
26 # bug http://bugs.php.net/bug.php?id=33240
27 # xml_parser_set_option($p,XML_OPTION_SKIP_WHITE, true);
29 xml_parse_into_struct($p, $data, $vals, $index);
30 xml_parser_free($p);
31 foreach($vals as $v) {
32 if (($v['type'] == 'complete') && ($v['level'] == 2)) {
33 $k = $v['tag'];
34 $t = $v['attributes']['time'];
35 $p = $v['attributes']['prev'];
38 if (!empty($t)) {
39 if ($since > 0 && $t < $since) {
40 continue;
42 $k = "$k:$t";
44 if (!empty($p)) {
45 $k = "$k:$p:";
47 $page[$k] = $v['value'];
50 return @$page;
53 function read($pagename, $since=0) {
54 $pagefile = $this->pagefile($pagename);
55 if ($pagefile && ($fp=@fopen($pagefile, "r"))) {
56 while (!feof($fp)) {
57 $line = fgets($fp, 512);
58 $isXML = (substr($line,0,5) == '<?xml') || (substr(ltrim($line),0,5) == '<page');
59 if (trim($line) != '') {
60 break; // we found non-empty line
63 if ($isXML) {
64 fseek($fp, 0, SEEK_SET);
65 $pagefilesize = filesize($pagefile);
66 $data = fread($fp, $pagefilesize);
67 @fclose($fp);
68 return $this->read_xml($data, $since);
69 } else {
70 @fclose($fp);
71 return parent::read($pagename,$page);
76 function write($pagename,$page) {
77 global $EnablePageStoreXML;
78 ($EnablePageStoreXML == true) ? $this->write_xml($pagename,$page) : parent::write($pagename,$page);
81 function write_xml($pagename,$page) {
82 global $Now, $Version, $Charset;
83 $page['name'] = $pagename;
84 $page['time'] = $Now;
85 $page['host'] = $_SERVER['REMOTE_ADDR'];
86 $page['agent'] = @$_SERVER['HTTP_USER_AGENT'];
87 $page['rev'] = @$page['rev']+1;
88 unset($page['version']); unset($page['newline']);
89 uksort($page, 'CmpPageAttr');
90 $s = false;
91 $pagefile = $this->pagefile($pagename);
92 $dir = dirname($pagefile); mkdirp($dir);
93 if ($pagefile && ($fp=fopen("$pagefile,new","w"))) {
94 $x = "<?xml version=\"1.0\" encoding=\"$Charset\"?>\n<page xmlns=\"http://www.pmwiki.org/cookbook/xmlpage\" version=\"$Version\">\n";
95 $s = true && fputs($fp, $x); $sz = strlen($x);
96 foreach($page as $k=>$v)
97 if ($k > '' && $k{0} != '=') {
98 $v = htmlspecialchars($v, ENT_NOQUOTES, $Charset);
99 if (preg_match("/^([a-z]+)(?::(\d+))(?::(\d+):)?$/", $k, $m)) {
100 $p = empty($m[3]) ? "" : " prev=\"${m[3]}\"";
101 $x = "<${m[1]} time=\"${m[2]}\"$p>$v</${m[1]}>\n";
102 } else {
103 $x = "<$k>$v</$k>\n";
105 $s = $s && fputs($fp, $x); $sz += strlen($x);
107 $x = "</page>\n";
108 $s = $s && fputs($fp, $x); $sz += strlen($x);
110 $s = fclose($fp) && $s;
111 $s = $s && (filesize("$pagefile,new") > $sz * 0.95);
112 if (file_exists($pagefile)) $s = $s && unlink($pagefile);
113 $s = $s && rename("$pagefile,new", $pagefile);
115 $s && fixperms($pagefile);
116 if (!$s)
117 Abort("Cannot write page to $pagename ($pagefile)...changes not saved");
118 PCache($pagename, $page);
123 function ConvertXML() {
124 global $WikiDir;
125 global $EnablePageStoreXML;
126 $pagelist = $WikiDir->ls();
127 $pagelist = array_unique($pagelist);
128 sort($pagelist);
129 $pagecount = count($pagelist);
131 echo "
132 <html>
133 <head>
134 <title>Convert pages from/to XML</title>
135 </head>
136 <body>
137 <h2>Convert existing pages</h2>
138 <p>I'm now converting ";
139 echo ($EnablePageStoreXML) ? "<b>to</b> " : "<b>from</b> ";
140 echo "XML the files (pages) you have stored in your wiki. When this is finished
141 you can get rid of the <tt>ConvertXML();</tt> line in your
142 local/config.php</p>";
143 if ($pagelist) {
144 foreach($pagelist as $p) {
145 echo ($EnablePageStoreXML) ? "<li>Converting to XML: $p</li>\n" : "<li>Converting from XML: $p</li>\n";
146 $page = ReadPage($p);
147 WritePage($p,$page);
150 echo "<p>Converted $pagecount pages.</p>\n";
151 echo "<p>Now you can get rid of the <tt>ConvertXML();</tt> line in your local/config.php</p>
152 </body></html>\n";
153 exit(0);