1 <?php
if (!defined('PmWiki')) exit();
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)
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);
31 foreach($vals as $v) {
32 if (($v['type'] == 'complete') && ($v['level'] == 2)) {
34 $t = $v['attributes']['time'];
35 $p = $v['attributes']['prev'];
39 if ($since > 0 && $t < $since) {
47 $page[$k] = $v['value'];
53 function read($pagename, $since=0) {
54 $pagefile = $this->pagefile($pagename);
55 if ($pagefile && ($fp=@fopen
($pagefile, "r"))) {
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
64 fseek($fp, 0, SEEK_SET
);
65 $pagefilesize = filesize($pagefile);
66 $data = fread($fp, $pagefilesize);
68 return $this->read_xml($data, $since);
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;
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');
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";
103 $x = "<$k>$v</$k>\n";
105 $s = $s && fputs($fp, $x); $sz +
= strlen($x);
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);
117 Abort("Cannot write page to $pagename ($pagefile)...changes not saved");
118 PCache($pagename, $page);
123 function ConvertXML() {
125 global $EnablePageStoreXML;
126 $pagelist = $WikiDir->ls();
127 $pagelist = array_unique($pagelist);
129 $pagecount = count($pagelist);
134 <title>Convert pages from/to XML</title>
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>";
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);
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>