Last active
April 8, 2020 02:00
-
-
Save insteps/aa7e2d54da33ad257fae57a9b884d744 to your computer and use it in GitHub Desktop.
experimental, pagestore-plain for pmwiki
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php if (!defined('PmWiki')) exit(); | |
/** | |
* pagestore-plain.php | |
* @author V.Krishn (vkrishn@insteps.net), Copyright 2019-2020 | |
* @note This file is part of Cookbook recipe "Pagestore-plain" for PmWiki; | |
* You can redistribute it and/or modify it under the terms of the | |
* GNU General Public License as published by the Free Software | |
* Foundation; either version 2 of the License, or (at your option) | |
* any later version. @see pmwiki.php for full details. | |
* | |
* @category pmwiki/cookbook | |
* @package pagestore-plain | |
* @copyright Copyright (c) 2019-2020 V.Krishn (vkrishn@insteps.net) | |
* @license GPL | |
* @version 0.0.1 | |
*/ | |
## class PageStore holds objects that store pages via the native | |
## filesystem. PageStorePlain replaces some functions in order | |
## to use Plain text to store wiki, and, the related attributes | |
## in .hist/<pagename>. (based on pmwiki-2.2.122) | |
class PageStorePlain extends PageStore { | |
function read($pagename, $since=0) { | |
$newline = ''; | |
$urlencoded = false; | |
$pagefile = $this->pagefile($pagename); | |
// Read file meta/attributes and history | |
$dir = dirname($pagefile); | |
$pagenm=basename($pagefile); | |
$pagefile=$dir.'/.hist/'.$pagenm; | |
if ($pagefile && ($fp=@fopen($pagefile, "r"))) { | |
$page = $this->attr; | |
while (!feof($fp)) { | |
$line = fgets($fp, 4096); | |
while (substr($line, -1, 1) != "\n" && !feof($fp)) | |
{ $line .= fgets($fp, 4096); } | |
$line = rtrim($line); | |
if ($urlencoded) $line = urldecode(str_replace('+', '%2b', $line)); | |
@list($k,$v) = explode('=', $line, 2); | |
if (!$k) continue; | |
if ($k == 'version') { | |
$ordered = (strpos($v, 'ordered=1') !== false); | |
$urlencoded = (strpos($v, 'urlencoded=1') !== false); | |
if (strpos($v, 'pmwiki-0.')!==false) $newline="\262"; | |
} | |
if ($k == 'newline') { $newline = $v; continue; } | |
if ($since > 0 && preg_match('/:(\\d+)/', $k, $m) && $m[1] < $since) { | |
if ($ordered) break; | |
continue; | |
} | |
if ($newline) $v = str_replace($newline, "\n", $v); | |
$page[$k] = $v; | |
} | |
fclose($fp); | |
} | |
// Read text and set into $page['text'] | |
$pagefile = $this->pagefile($pagename); | |
if ($pagefile && ($fp=@fopen($pagefile, "r"))) { | |
$line=''; | |
while (!feof($fp)) { | |
$line .= fgets($fp, 4096); | |
} | |
$page['text'] = $line; | |
fclose($fp); | |
} | |
return $this->recode($pagename, @$page); | |
} | |
function write($pagename,$page) { | |
global $Now, $Version, $Charset, $EnableRevUserAgent, $PageExistsCache, $DenyHtaccessContent; | |
$page['charset'] = $Charset; | |
$page['name'] = $pagename; | |
$page['time'] = $Now; | |
$page['host'] = $_SERVER['REMOTE_ADDR']; | |
$page['agent'] = @$_SERVER['HTTP_USER_AGENT']; | |
if(IsEnabled($EnableRevUserAgent, 0)) $page["agent:$Now"] = $page['agent']; | |
$page['rev'] = @$page['rev']+1; | |
unset($page['version']); unset($page['newline']); | |
uksort($page, 'CmpPageAttr'); | |
$pagefile = $this->pagefile($pagename); | |
$dir = dirname($pagefile); mkdirp($dir.'/.hist'); | |
if (!file_exists("$dir/.htaccess") && $fp = @fopen("$dir/.htaccess", "w")) | |
{ fwrite($fp, $DenyHtaccessContent); fclose($fp); } | |
// Write page history/attributes | |
$s = false; | |
$pagenm=basename($pagefile); | |
$pagefile=$dir.'/.hist/'.$pagenm; | |
if ($pagefile && ($fp=fopen("$pagefile,new","w"))) { | |
$r0 = array('%', "\n", '<'); | |
$r1 = array('%25', '%0a', '%3c'); | |
$x = "version=$Version ordered=1 urlencoded=1\n"; | |
$s = true && fputs($fp, $x); $sz = strlen($x); | |
$text=$page['text']; $page['text']=''; | |
foreach($page as $k=>$v) | |
if ($k > '' && $k[0] != '=') { | |
$x = str_replace($r0, $r1, "$k=$v") . "\n"; | |
$s = $s && fputs($fp, $x); $sz += strlen($x); | |
} | |
$s = fclose($fp) && $s; | |
$s = $s && (filesize("$pagefile,new") > $sz * 0.95); | |
if (file_exists($pagefile)) $s = $s && unlink($pagefile); | |
$s = $s && rename("$pagefile,new", $pagefile); | |
} | |
$s && fixperms($pagefile); | |
if (!$s) | |
Abort("Cannot write page to $pagename ($pagefile)...changes not saved"); | |
// Write page text | |
$s = false; | |
$pagefile = $this->pagefile($pagename); | |
if ($pagefile && ($fp=fopen("$pagefile,new","w"))) { | |
$page['text']=$text; # re-add text | |
$x = $text; | |
$s = true && fputs($fp, $x); $sz = strlen($x); | |
$s = fclose($fp) && $s; | |
$s = $s && (filesize("$pagefile,new") > $sz * 0.95); | |
if (file_exists($pagefile)) $s = $s && unlink($pagefile); | |
$s = $s && rename("$pagefile,new", $pagefile); | |
} | |
$s && fixperms($pagefile); | |
if (!$s) | |
Abort("Cannot write page to $pagename ($pagefile)...changes not saved"); | |
PCache($pagename, $page); | |
unset($PageExistsCache[$pagename]); # PITS:01401 | |
} | |
function delete($pagename) { | |
global $Now, $PageExistsCache; | |
$pagefile = $this->pagefile($pagename); | |
$dir = dirname($pagefile); | |
$pagenm=basename($pagefile); | |
$pagefile=$dir.'/.hist/'.$pagenm; | |
@rename($pagefile,"$pagefile,del-$Now"); | |
$pagefile = $this->pagefile($pagename); | |
@rename($pagefile,"$pagefile,del-$Now"); | |
unset($PageExistsCache[$pagename]); # PITS:01401 | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
------------ config.php ---------------
include_once('cookbook/pagestore-plain.php');
$WikiDir = new PageStorePlain('wiki.d/{$FullName}');
$WikiLibDirs = array(
&$WikiDir,
new PageStore('wiki.d/{$FullName}'),
new PageStore('$FarmD/wikilib.d/{$FullName}')
);
------------ config.php ---------------