Skip to content

Instantly share code, notes, and snippets.

@insteps
Last active April 8, 2020 02:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save insteps/aa7e2d54da33ad257fae57a9b884d744 to your computer and use it in GitHub Desktop.
Save insteps/aa7e2d54da33ad257fae57a9b884d744 to your computer and use it in GitHub Desktop.
experimental, pagestore-plain for pmwiki
<?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
}
}
@insteps
Copy link
Author

insteps commented Dec 5, 2019

------------ 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 ---------------

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment