$v) { unset(${$k}); } $UnsafeGlobals = array_keys($GLOBALS); $GCount=0; $FmtV=array(); SDV($FarmD,dirname(__FILE__)); SDV($WorkDir,'wiki.d'); define('PmWiki',1); @include_once('scripts/version.php'); $GroupPattern = '[[:upper:]][\\w]*(?:-\\w+)*'; $NamePattern = '[[:upper:]\\d][\\w]*(?:-\\w+)*'; $WikiWordPattern = '[[:upper:]][[:alnum:]]*(?:[[:upper:]][[:lower:]0-9]|[[:lower:]0-9][[:upper:]])[[:alnum:]]*'; $WikiDir = new PageStore('wiki.d/$FullName'); $WikiLibDirs = array(&$WikiDir,new PageStore('$FarmD/wikilib.d/$FullName')); $InterMapFiles = array("$FarmD/scripts/intermap.txt", "$FarmD/local/farmmap.txt", 'local/localmap.txt'); $KeepToken = "\235\235"; $K0=array('='=>'','@'=>''); $K1=array('='=>'','@'=>''); $Now=time(); $TimeFmt = '%B %d, %Y, at %I:%M %p'; $Newline="\262"; $PageEditFmt = "

$[Editing \$FullName]

\$EditMessageFmt
$[Author]: $[This is a minor edit]
"; $PagePreviewFmt = "

$[Preview \$FullName]

$[Page is unsaved]

\$PreviewText

$[End of preview -- remember to save]
$[Top]

"; $EditMessageFmt = ''; $BlockMessageFmt = "

$[This post has been blocked by the administrator]

"; $EditFields = array('text'); $EditFunctions = array('RestorePage','ReplaceOnSave','SaveAttributes', 'PostPage','PostRecentChanges','PreviewPage'); $AsSpacedFunction = 'AsSpaced'; $SpaceWikiWords = 0; $LinkWikiWords = 1; $RCDelimPattern = ' '; $RecentChangesFmt = array( 'Main.AllRecentChanges' => '* [[$Group.$Name]] . . . $CurrentTime $[by] $AuthorLink', '$Group.RecentChanges' => '* [[$Group/$Name]] . . . $CurrentTime $[by] $AuthorLink'); $DefaultPageTextFmt = '$[Describe $Name here.]'; $ScriptUrl = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']; $PubDirUrl = preg_replace('#/[^/]*$#','/pub',$ScriptUrl,1); $HTMLVSpace = "

"; $HTMLPNewline = ''; $MarkupFrame = array(); $MarkupFrameBase = array('cs' => array(), 'vs' => '', 'ref' => 0, 'posteval' => array('block' => "\$out .= Block('block');")); $WikiWordCountMax = 1000000; $WikiWordCount['PmWiki'] = 1; $UrlExcludeChars = '<>"{}|\\\\^`()[\\]\''; $QueryFragPattern = "[?#][^\\s$UrlExcludeChars]*"; $SuffixPattern = '(?:-?[[:alnum:]]+)*'; $LinkPageSelfFmt = "\$LinkText"; $LinkPageExistsFmt = "\$LinkText"; $LinkPageCreateFmt = "\$LinkText?"; $UrlLinkFmt = "\$LinkText"; umask(0); $DefaultGroup = 'Main'; $DefaultName = 'HomePage'; $GroupHeaderFmt = '(:include $Group.GroupHeader:)(:nl:)'; $GroupFooterFmt = '(:nl:)(:include $Group.GroupFooter:)'; $PagePathFmt = array('$Group.$1','$1.$1','$1.$DefaultName'); $PageAttributes = array( 'passwdread' => '$[Set new read password:]', 'passwdedit' => '$[Set new edit password:]', 'passwdattr' => '$[Set new attribute password:]'); $XLLangs = array('en'); if (preg_match('/^C$|\.UTF-?8/i',setlocale(LC_ALL,NULL))) setlocale(LC_ALL,'en_US'); $FmtP = array( '/\\$PageUrl/' => '$ScriptUrl/$Group/$Name', '/\\$FullName/' => '$Group.$Name', '/\\$PageName/' => '$Group.$Name', # deprecated, 2.0.devel14 '/\\$Titlespaced/e' => '(@$PCache[$pagename]["title"]) ? $PCache[$pagename]["title"] : \'$Namespaced\'', '/\\$Title/e' => '(@$PCache[$pagename]["title"]) ? $PCache[$pagename]["title"] : (($GLOBALS["SpaceWikiWords"]) ? \'$Namespaced\' : \'$Name\')', '/\\$Groupspaced/e' => '$AsSpacedFunction(@$match[1])', '/\\$Group/e' => '@$match[1]', '/\\$Namespaced/e' => '$AsSpacedFunction(@$match[2])', '/\\$Name/e' => '@$match[2]', '/\\$LastModifiedBy/e' => '@$PCache[$pagename]["author"]', '/\\$LastModifiedHost/e' => '@$PCache[$pagename]["host"]', '/\\$LastModified/e' => 'strftime($GLOBALS["TimeFmt"],$PCache[$pagename]["time"])', ); $WikiTitle = 'PmWiki'; $HTTPHeaders = array( "Expires: Tue, 01 Jan 2002 00:00:00 GMT", "Cache-Control: no-store, no-cache, must-revalidate", "Content-type: text/html; charset=iso-8859-1;"); $CacheActions = array('browse','diff','print'); $HTMLDoctypeFmt = " \n"; $HTMLStylesFmt['pmwiki'] = " ul, ol, pre, dl, p { margin-top:0px; margin-bottom:0px; } code { white-space: nowrap; } .vspace { margin-top:1.33em; } .indent { margin-left:40px; } .outdent { margin-left:40px; text-indent:-40px; } a.createlinktext { text-decoration:none; border-bottom:1px dotted gray; } a.createlink { text-decoration:none; position:relative; top:-0.5em; font-weight:bold; font-size:smaller; border-bottom:none; } "; $HTMLHeaderFmt = array( ""); $HTMLBodyFmt = "\n"; $HTMLStartFmt = array('headers:',&$HTMLDoctypeFmt,&$HTMLHeaderFmt, &$HTMLBodyFmt); $HTMLEndFmt = "\n\n"; $PageStartFmt = array(&$HTMLStartFmt,"\n
\n"); $PageEndFmt = array('
',&$HTMLEndFmt); $HandleActions = array( 'browse' => 'HandleBrowse', 'edit' => 'HandleEdit', 'source' => 'HandleSource', 'attr'=>'HandleAttr', 'postattr' => 'HandlePostAttr'); $ActionTitleFmt = array( 'edit' => '| $[Edit]', 'attr' => '| $[Attributes]'); $DefaultPasswords = array('admin'=>'*','read'=>'','edit'=>'','attr'=>''); $Conditions['false'] = 'false'; $Conditions['true'] = 'true'; $Conditions['group'] = "FmtPageName('\$Group',\$pagename)==\$condparm"; $Conditions['name'] = "FmtPageName('\$Name',\$pagename)==\$condparm"; $Conditions['match'] = 'preg_match("!$condparm!",$pagename)'; $MarkupTable['_begin']['seq'] = 'B'; $MarkupTable['_end']['seq'] = 'E'; Markup('fulltext','>_begin'); Markup('split','>fulltext',"\n", '$RedoMarkupLine=1; return explode("\n",$x);'); Markup('directives','>split'); Markup('inline','>directives'); Markup('links','>inline'); Markup('block','>links'); Markup('style','>block'); $ImgExtPattern="\\.(?:gif|jpg|jpeg|png|GIF|JPG|JPEG|PNG)"; $ImgTagFmt="\$LinkAlt"; $BlockMarkups = array( 'block' => array('','','',0), 'ul' => array('',1), 'dl' => array('
','','
',1), 'ol' => array('
  1. ','
  2. ','
',1), 'p' => array('

','','

',0), 'indent' => array("
","
",'
',1), 'outdent' => array("
","
",'
',1), 'pre' => array('
 ',' ','
',0), 'table' => array("",'','
',0)); foreach(array('http:','https:','mailto:','ftp:','news:','gopher:','nap:', 'file:') as $m) { $LinkFunctions[$m] = 'LinkIMap'; $IMap[$m]="$m$1"; } $LinkFunctions['<:page>'] = 'LinkPage'; if (strpos(@$_SERVER['QUERY_STRING'],'?')!==false) { unset($_GET); parse_str(str_replace('?','&',$_SERVER['QUERY_STRING']),$_GET); $_REQUEST = array_merge($_REQUEST, $_GET, $_POST); } foreach(array('action','text') as $v) { if (isset($_GET[$v])) $$v=$_GET[$v]; elseif (isset($_POST[$v])) $$v=$_POST[$v]; else $$v=''; } if ($action=='') $action='browse'; $pagename = $_REQUEST['n']; if (!$pagename) $pagename = $_REQUEST['pagename']; if (!$pagename && preg_match('!^'.preg_quote($_SERVER['SCRIPT_NAME'],'!').'/?([^?]*)!', $_SERVER['REQUEST_URI'],$match)) $pagename = urldecode($match[1]); if (preg_match('/[\\x80-\\xbf]/',$pagename)) $pagename=utf8_decode($pagename); $pagename = preg_replace('![^[:alnum:]\\x80-\\xff]+$!','',$pagename); if (file_exists("$FarmD/local/farmconfig.php")) include_once("$FarmD/local/farmconfig.php"); if (IsEnabled($EnableLocalConfig,1)) { if (file_exists('local/config.php')) include_once('local/config.php'); elseif (file_exists('config.php')) include_once('config.php'); } SDV($CurrentTime,strftime($TimeFmt,$Now)); SDV($DefaultPage,"$DefaultGroup.$DefaultName"); SDV($UrlPage,'{$UrlPage}'); if ($pagename && !preg_match("/^$GroupPattern([\/.])$NamePattern$/i", $pagename)) { $UrlPage = $pagename; $p = MakePageName($DefaultPage,$pagename); if (PageExists($p)) { Redirect($p); exit(); } SDV($PageNotFound,"$DefaultGroup.PageNotFound"); $pagename = $PageNotFound; } else $pagename=MakePageName($DefaultPage,$pagename); if (IsEnabled($EnableStdConfig,1)) include_once("$FarmD/scripts/stdconfig.php"); foreach((array)$InterMapFiles as $f) { if (@!($mapfd=fopen($f,"r"))) continue; while ($mapline=fgets($mapfd,1024)) { if (preg_match('/^\\s*$/',$mapline)) continue; list($imap,$url) = preg_split('/\\s+/',$mapline); if (strpos($url,'$1')===false) $url.='$1'; $LinkFunctions["$imap:"] = 'LinkIMap'; $IMap["$imap:"] = $url; } } $LinkPattern = implode('|',array_keys($LinkFunctions)); SDV($LinkPageCreateSpaceFmt,$LinkPageCreateFmt); $Action = FmtPageName(@$ActionTitleFmt[$action],$pagename); if (!function_exists(@$HandleActions[$action])) $action='browse'; $HandleActions[$action]($pagename); Lock(0); exit; ## helper functions function stripmagic($x) { return get_magic_quotes_gpc() ? stripslashes($x) : $x; } function PSS($x) { return str_replace('\\"','"',$x); } function PZZ($x,$y='') { return ''; } function PRR($x='') { $GLOBALS['RedoMarkupLine']++; return $x; } function PUE($x) { return preg_replace('/[\\x80-\\xff ]/e', "'%'.dechex(ord('$0'))", $x); } function PQA($x) { return preg_replace('/([a-zA-Z])\\s*=\\s*([^\'">][^\\s>]*)/', "$1='$2'", $x); } function SDV(&$v,$x) { if (!isset($v)) $v=$x; } function SDVA(&$var,$val) { foreach($val as $k=>$v) if (!isset($var[$k])) $var[$k]=$v; } function IsEnabled(&$var,$f=0) { return (isset($var)) ? $var : $f; } function StopWatch($x) { global $StopWatch, $EnableStopWatch; if (!$EnableStopWatch) return; static $wstart = 0, $ustart = 0; list($usec,$sec) = explode(' ',microtime()); $wtime = ($sec+$usec); if (!$wstart) $wstart = $wtime; if ($EnableStopWatch != 2) { $StopWatch[] = sprintf("%05.2f %s", $wtime-$wstart, $x); return; } $dat = getrusage(); $utime = ($dat['ru_utime.tv_sec']+$dat['ru_utime.tv_usec']/1000000); if (!$ustart) $ustart=$utime; $StopWatch[] = sprintf("%05.2f %05.2f %s", $wtime-$wstart, $utime-$ustart, $x); } ## AsSpaced converts a string with WikiWords into a spaced version ## of that string. (It can be overridden via $AsSpacedFunction.) function AsSpaced($text) { $text = preg_replace("/([[:lower:]\\d])([[:upper:]])/", '$1 $2', $text); $text = preg_replace('/(?$dir/ directory before it can continue. You can create the directory manually by executing the following commands on your server:
    mkdir $parent/$dir\n    chmod 777 $parent/$dir
Then, reload this page."; if (!$safemode) $msg .= "

Or, for a slightly more secure installation, try executing
    chmod 2777 $parent
on your server and following this link. Afterwards you can restore the permissions to their current setting by executing
    chmod $perms $parent
."; Abort($msg); } ## fixperms attempts to correct permissions on a file or directory ## so that both PmWiki and the account (current dir) owner can manipulate it function fixperms($fname, $add = 0) { clearstatcache(); if (!file_exists($fname)) Abort('no such file'); $bp = 0; if (fileowner($fname)!=fileowner('.')) $bp = (is_dir($fname)) ? 007 : 006; if (filegroup($fname)==filegroup('.')) $bp <<= 3; $bp |= $add; if ($bp && (fileperms($fname) & $bp) != $bp) @chmod($fname,fileperms($fname)|$bp); } ## MakePageName is used to convert a string into a valid pagename. ## If no group is supplied, then it uses $PagePathFmt to look ## for the page in other groups, or else uses the group of the ## pagename passed as an argument. function MakePageName($basepage,$x) { global $MakePageNameFunction, $PageNameChars, $PagePathFmt; if (@$MakePageNameFunction) return $MakePageNameFunction($basepage,$x); SDV($PageNameChars,'-[:alnum:]'); if (!preg_match('/(?:([^.\\/]+)[.\\/])?([^.\\/]+)$/',$x,$m)) return ''; $name=str_replace(' ', '', preg_replace("/\\b(\\w)/e", "strtoupper('$1')", preg_replace("/[^$PageNameChars]+/", ' ', $m[2]))); if ($m[1]) { $group = str_replace(' ','', preg_replace("/\\b(\\w)/e", "strtoupper('$1')", preg_replace("/[^$PageNameChars]+/", ' ', $m[1]))); return "$group.$name"; } foreach((array)$PagePathFmt as $pg) { $pn = FmtPageName(str_replace('$1',$name,$pg),$basepage); if (PageExists($pn)) return $pn; } $group=preg_replace('/[\\/.].*$/','',$basepage); return "$group.$name"; } ## PCache caches basic information about a page and its attributes-- ## usually everything except page text and page history. This makes ## for quicker access to certain values in FmtPageName below. function PCache($pagename,$page) { global $PCache; foreach($page as $k=>$v) if ($k!='text' && strpos($k,':')===false) $PCache[$pagename][$k]=$v; } ## FmtPageName handles $[internationalization] and $Variable ## substitutions in strings based on the $pagename argument. function FmtPageName($fmt,$pagename) { # Perform $-substitutions on $fmt relative to page given by $pagename global $GroupPattern, $NamePattern, $EnablePathInfo, $GCount, $UnsafeGlobals, $FmtV, $FmtP, $PCache, $AsSpacedFunction; if (strpos($fmt,'$')===false) return $fmt; $fmt = preg_replace('/\\$([A-Z]\\w*Fmt)\\b/e','$GLOBALS[\'$1\']',$fmt); $fmt = preg_replace('/\\$\\[(?>([^\\]]+))\\]/e',"XL(PSS('$1'))",$fmt); $match = array('','$Group','$Name'); if (preg_match("/^($GroupPattern)[\\/.]($NamePattern)\$/", $pagename, $m)) $match = $m; $fmt = preg_replace(array_keys($FmtP),array_values($FmtP),$fmt); $fmt = preg_replace('!\\$ScriptUrl/([^?#\'"\\s<>]+)!e', (@$EnablePathInfo) ? "'\$ScriptUrl/'.PUE('$1')" : "'\$ScriptUrl?n='.str_replace('/','.',PUE('$1'))", $fmt); if (strpos($fmt,'$')===false) return $fmt; static $g; if ($GCount != count($GLOBALS)+count($FmtV)) { $g = array(); foreach($GLOBALS as $n=>$v) { if (is_array($v) || is_object($v) || isset($FmtV["\$$n"]) || in_array($n,$UnsafeGlobals)) continue; $g["\$$n"] = $v; } $GCount = count($GLOBALS)+count($FmtV); krsort($g); reset($g); } $fmt = str_replace(array_keys($g),array_values($g),$fmt); $fmt = str_replace(array_keys($FmtV),array_values($FmtV),$fmt); return $fmt; } ## The XL functions provide translation tables for $[i18n] strings ## in FmtPageName(). function XL($key) { global $XL,$XLLangs; foreach($XLLangs as $l) if (isset($XL[$l][$key])) return $XL[$l][$key]; return $key; } function XLSDV($lang,$a) { global $XL; foreach($a as $k=>$v) { if (!isset($XL[$lang][$k])) $XL[$lang][$k]=$v; } } function XLPage($lang,$p) { global $TimeFmt,$XLLangs,$FarmD; $page = ReadPage($p); if (!$page) return; $text = preg_replace("/=>\\s*\n/",'=> ',@$page['text']); foreach(explode("\n",$text) as $l) if (preg_match('/^\\s*[\'"](.+?)[\'"]\\s*=>\\s*[\'"](.+)[\'"]/',$l,$match)) $xl[stripslashes($match[1])] = stripslashes($match[2]); if (isset($xl)) { if (@$xl['xlpage-i18n']) { $i18n = preg_replace('/[^-\\w]/','',$xl['xlpage-i18n']); include_once("$FarmD/scripts/xlpage-$i18n.php"); } if ($xl['Locale']) setlocale(LC_ALL,$xl['Locale']); if ($xl['TimeFmt']) $TimeFmt=$xl['TimeFmt']; array_unshift($XLLangs,$lang); XLSDV($lang,$xl); } } ## class PageStore holds objects that store pages via the native ## filesystem. class PageStore { var $dirfmt; function PageStore($d='$WorkDir/$FullName') { $this->dirfmt=$d; } function read($pagename) { $newline = "\262"; $pagefile = FmtPageName($this->dirfmt,$pagename); if ($pagefile && $fp=@fopen($pagefile,"r")) { while (!feof($fp)) { $line = fgets($fp,4096); while (substr($line,-1,1)!="\n" && !feof($fp)) { $line .= fgets($fp,4096); } @list($k,$v) = explode('=',rtrim($line),2); if ($k=='newline') { $newline=$v; continue; } $page[$k] = str_replace($newline,"\n",$v); } fclose($fp); } return @$page; } function write($pagename,$page) { global $Now,$Version,$Newline; $page['name'] = $pagename; $page['time'] = $Now; $page['host'] = $_SERVER['REMOTE_ADDR']; $page['agent'] = @$_SERVER['HTTP_USER_AGENT']; $page['rev'] = @$page['rev']+1; unset($page['version']); unset($page['newline']); $s = false; $pagefile = FmtPageName($this->dirfmt,$pagename); $dir = dirname($pagefile); mkdirp($dir); if (!file_exists("$dir/.htaccess") && $fp = @fopen("$dir/.htaccess", "w")) { fwrite($fp, "Order Deny,Allow\nDeny from all\n"); fclose($fp); } if ($pagefile && ($fp=fopen("$pagefile,new","w"))) { $s = true && fputs($fp,"version=$Version\nnewline=$Newline\n"); foreach($page as $k=>$v) if ($k>'') $s = $s&&fputs($fp,str_replace("\n",$Newline,"$k=$v")."\n"); $s = fclose($fp) && $s; 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"); } function exists($pagename) { $pagefile = FmtPageName($this->dirfmt,$pagename); return ($pagefile && file_exists($pagefile)); } function delete($pagename) { global $Now; $pagefile = FmtPageName($this->dirfmt,$pagename); @rename($pagefile,"$pagefile,$Now"); } function ls($pats=NULL) { global $GroupPattern, $NamePattern; $pats=(array)$pats; array_unshift($pats, "/^$GroupPattern\.$NamePattern$/"); $dir = FmtPageName($this->dirfmt,''); $dirlist = array(preg_replace('!/?[^/]*\$.*$!','',$dir)); $out = array(); while (count($dirlist)>0) { $dir = array_shift($dirlist); $dfp = opendir($dir); if (!$dfp) continue; while (($pagefile=readdir($dfp))!=false) { if ($pagefile{0} == '.') continue; if (is_dir("$dir/$pagefile")) { array_push($dirlist,"$dir/$pagefile"); continue; } if (@$seen[$pagefile]++) continue; foreach($pats as $p) { if ($p{0} == '!') { if (preg_match($p,$pagefile)) continue 2; } else if (!preg_match($p,$pagefile)) continue 2; } $out[] = $pagefile; } } return $out; } } function ReadPage($pagename) { # read a page from the appropriate directories given by $WikiReadDirsFmt. global $WikiLibDirs,$Now; Lock(1); foreach ($WikiLibDirs as $dir) { $page = $dir->read($pagename); if ($page) break; } if (@!$page['time']) $page['time']=$Now; return $page; } function WritePage($pagename,$page) { global $WikiDir,$LastModFile; $WikiDir->write($pagename,$page); if ($LastModFile) { touch($LastModFile); fixperms($LastModFile); } } function PageExists($pagename) { global $WikiLibDirs; static $pe; if (!isset($pe[$pagename])) { $pe[$pagename] = false; foreach((array)$WikiLibDirs as $dir) if ($dir->exists($pagename)) { $pe[$pagename] = true; break; } } return $pe[$pagename]; } function ListPages($pat=NULL) { global $WikiLibDirs; foreach((array)$WikiLibDirs as $dir) $out = array_unique(array_merge($dir->ls($pat),(array)@$out)); return $out; } function RetrieveAuthPage($pagename,$level,$authprompt=true) { global $AuthFunction; SDV($AuthFunction,'BasicAuth'); if (!function_exists($AuthFunction)) return ReadPage($pagename); return $AuthFunction($pagename,$level,$authprompt); } function Abort($msg) { # exit pmwiki with an abort message echo "

PmWiki can't process your request

$msg

We are sorry for any inconvenience.

"; exit; } function Redirect($pagename,$urlfmt='$PageUrl') { # redirect the browser to $pagename global $EnableRedirect,$RedirectDelay; Lock(0); SDV($RedirectDelay,0); clearstatcache(); #if (!PageExists($pagename)) $pagename=$DefaultPage; $pageurl = FmtPageName($urlfmt,$pagename); if (IsEnabled($EnableRedirect,1) && (!isset($_REQUEST['redirect']) || $_REQUEST['redirect'])) { header("Location: $pageurl"); header("Content-type: text/html"); echo " Redirect"; } else echo "Redirect to $pageurl"; exit; } function PrintFmt($pagename,$fmt) { global $HTTPHeaders,$FmtV; if (is_array($fmt)) { foreach($fmt as $f) PrintFmt($pagename,$f); return; } if ($fmt == 'headers:') { foreach($HTTPHeaders as $h) (@$sent++) ? @header($h) : header($h); return; } $x = FmtPageName($fmt,$pagename); if (strncmp($fmt, 'function:', 9) == 0 && preg_match('/^function:(\S+)\s*(.*)$/s', $x, $match) && function_exists($match[1])) { $match[1]($pagename,$match[2]); return; } if (strncmp($fmt, 'file:', 5) == 0 && preg_match("/^file:(.+)/s",$x,$match)) { $filelist = preg_split('/[\\s]+/',$match[1],-1,PREG_SPLIT_NO_EMPTY); foreach($filelist as $f) { if (file_exists($f)) { include($f); return; } } return; } Lock(0); if (preg_match("/^markup:(.*)$/",$x,$match)) { print MarkupToHTML($pagename,$match[1]); return; } if (preg_match('/^wiki:(.+)$/',$x,$match)) { PrintWikiPage($pagename,$match[1]); return; } echo $x; } function PrintWikiPage($pagename,$wikilist=NULL) { if (is_null($wikilist)) $wikilist=$pagename; $pagelist = preg_split('/\s+/',$wikilist,-1,PREG_SPLIT_NO_EMPTY); foreach($pagelist as $p) { if (PageExists($p)) { $page = RetrieveAuthPage($p,'read',false); if ($page['text']) echo MarkupToHTML($pagename,$page['text']); return; } } } function Keep($x,$level='') { # Keep preserves a string from being processed by wiki markups global $KeepToken,$KPV,$KPCount; $KPCount++; $KPV[$KPCount.$level]=$x; return $KeepToken.$KPCount.$level.$KeepToken; } function CondText($pagename,$condspec,$condtext) { global $Conditions; if (!preg_match("/^(\\S+)\\s*(!?)\\s*(\\S+)?\\s*(.*?)\\s*$/", $condspec,$match)) return ''; @list($condstr,$condtype,$not,$condname,$condparm) = $match; if (isset($Conditions[$condname])) { $tf = @eval("return (".$Conditions[$condname].");"); if (!$tf xor $not) $condtext=''; } return $condtext; } function IncludeText($pagename,$inclspec) { global $MaxIncludes,$IncludeBadAnchorFmt,$InclCount,$FmtV; SDV($MaxIncludes,50); SDV($IncludeBadAnchorFmt,"include:\$FullName - #\$BadAnchor \$[not found]\n"); $npat = '[[:alpha:]][-\\w]*'; if ($InclCount++>=$MaxIncludes) return Keep($inclspec); if (preg_match("/^include\\s+([^#\\s]+)(.*)$/",$inclspec,$match)) { @list($inclstr,$inclname,$opts) = $match; $inclname = MakePageName($pagename,$inclname); if ($inclname==$pagename) return ''; $inclpage=RetrieveAuthPage($inclname,'read',false); $itext=@$inclpage['text']; foreach(preg_split('/\\s+/',$opts) as $o) { if (preg_match("/^#($npat)?(\\.\\.)?(#($npat)?)?$/",$o,$match)) { @list($x,$aa,$dots,$b,$bb)=$match; if (!$dots && !$b) $bb=$npat; if ($b=='#') $bb=$npat; if ($aa) $itext=preg_replace("/^.*?([^\n]*\\[\\[#$aa\\]\\])/s",'$1',$itext,1); if ($bb) $itext=preg_replace("/(.)[^\n]*\\[\\[#$bb\\]\\].*$/s",'$1',$itext,1); continue; } if (preg_match('/^(lines?|paras?)=(\\d*)(\\.\\.(\\d*))?$/', $o,$match)) { @list($x,$unit,$a,$dots,$b) = $match; $upat = ($unit{0} == 'p') ? ".*?(\n\\s*\n|$)" : "[^\n]*\n"; if (!$dots) { $b=$a; $a=0; } if ($a>0) $a--; $itext=preg_replace("/^(($upat)\{0,$b}).*$/s",'$1',$itext,1); $itext=preg_replace("/^($upat)\{0,$a}/s",'',$itext,1); continue; } } return htmlspecialchars($itext,ENT_NOQUOTES); } return Keep($inclspec); } function Block($b) { global $BlockMarkups,$HTMLVSpace,$HTMLPNewline,$MarkupFrame; $cs = &$MarkupFrame[0]['cs']; $vspaces = &$MarkupFrame[0]['vs']; if (!$b) $b='p,1'; @list($code,$depth) = explode(',',$b); $out = ($code=='p' && @$cs[0]=='p') ? $HTMLPNewline : ''; if ($code=='vspace') { $vspaces.="\n"; if (@$cs[0]!='p') return; } if ($depth==0) $depth=strlen($depth); while (count($cs)>$depth) { $c = array_pop($cs); $out .= $BlockMarkups[$c][2]; } if ($depth>0 && $depth==count($cs) && $cs[$depth-1]!=$code) { $c = array_pop($cs); $out .= $BlockMarkups[$c][2]; } while (count($cs)>0 && $cs[count($cs)-1]!=$code && @$BlockMarkups[$cs[count($cs)-1]][3]==0) { $c = array_pop($cs); $out .= $BlockMarkups[$c][2]; } if ($vspaces) { $out .= (@$cs[0]=='pre') ? $vspaces : $HTMLVSpace; $vspaces=''; } if ($depth==0) { return $out; } if ($depth==count($cs)) { return $out.$BlockMarkups[$code][1]; } while (count($cs)<$depth-1) { array_push($cs,'dl'); $out .= $BlockMarkups['dl'][0].'
'; } if (count($cs)<$depth) { array_push($cs,$code); $out .= $BlockMarkups[$code][0]; } return $out; } function FormatTableRow($x) { global $Block, $TableCellAttrFmt, $MarkupFrame, $TableRowAttrFmt, $TableRowIndexMax, $FmtV; static $rowcount; $x = preg_replace('/\\|\\|$/','',$x); $td = explode('||',$x); $y=''; for($i=0;$i1) { $attr .= " colspan='$colspan'"; } $y .= "<$t $attr>".$td[$i].""; } if ($t=='caption') return "<:table,1>$y"; if ($MarkupFrame[0]['cs'][0] != 'table') $rowcount = 0; else $rowcount++; $FmtV['$TableRowCount'] = $rowcount + 1; $FmtV['$TableRowIndex'] = ($rowcount % $TableRowIndexMax) + 1; $trattr = FmtPageName($TableRowAttrFmt, $pagename); return "<:table,1>$y"; } function WikiLink($pagename, $word) { global $LinkWikiWords, $SpaceWikiWords, $AsSpacedFunction, $MarkupFrame, $WikiWordCountMax; $text = ($SpaceWikiWords) ? $AsSpacedFunction($word) : $word; if (!$LinkWikiWords) return $text; $text = preg_replace('!.*/!', '', $text); if (!isset($MarkupFrame[0]['wwcount'][$word])) $MarkupFrame[0]['wwcount'][$word] = $WikiWordCountMax; if ($MarkupFrame[0]['wwcount'][$word]-- < 1) return $text; return MakeLink($pagename, $word, $text); } function LinkIMap($pagename,$imap,$path,$title,$txt,$fmt=NULL) { global $FmtV, $IMap, $IMapLinkFmt, $UrlLinkFmt; $FmtV['$LinkUrl'] = PUE(str_replace('$1',$path,$IMap[$imap])); $FmtV['$LinkText'] = $txt; $FmtV['$LinkAlt'] = str_replace(array('"',"'"),array('"','''),$title); if (!$fmt) $fmt = (isset($IMapLinkFmt[$imap])) ? $IMapLinkFmt[$imap] : $UrlLinkFmt; return str_replace(array_keys($FmtV),array_values($FmtV),$fmt); } function LinkPage($pagename,$imap,$path,$title,$txt,$fmt=NULL) { global $QueryFragPattern,$LinkPageExistsFmt,$LinkPageSelfFmt, $LinkPageCreateSpaceFmt,$LinkPageCreateFmt,$FmtV,$LinkTargets; if (!$fmt && $path{0} == '#') { $path = preg_replace("/[^-.:\\w]/", '', $path); return "$txt"; } if (!preg_match("/^([^#?]+)($QueryFragPattern)?$/",$path,$match)) return ''; $tgtname = MakePageName($pagename,$match[1]); $qf=@$match[2]; @$LinkTargets[$tgtname]++; if (!$fmt) { if (PageExists($tgtname)) $fmt = ($tgtname==$pagename && $qf=='') ? $LinkPageSelfFmt : $LinkPageExistsFmt; elseif (preg_match('/\\s/',$txt)) $fmt=$LinkPageCreateSpaceFmt; else $fmt=$LinkPageCreateFmt; } $FmtV['$LinkUrl'] = PUE(FmtPageName("\$PageUrl$qf",$tgtname)); $FmtV['$LinkText'] = $txt; return FmtPageName($fmt,$tgtname); } function MakeLink($pagename,$tgt,$txt=NULL,$suffix=NULL,$fmt=NULL) { global $LinkPattern,$LinkFunctions,$UrlExcludeChars,$ImgExtPattern,$ImgTagFmt; $t = preg_replace('/[()]/','',trim($tgt)); $t = preg_replace('/<[^>]*>/','',$t); preg_match("/^($LinkPattern)?(.+?)(\"(.*)\")?$/",$t,$m); if (!$m[1]) $m[1]='<:page>'; if (preg_match("/(($LinkPattern)([^$UrlExcludeChars]+$ImgExtPattern))(\"(.*)\")?$/",$txt,$tm)) $txt = $LinkFunctions[$tm[2]]($pagename,$tm[2],$tm[3],@$tm[5], $tm[1],$ImgTagFmt); else { if (is_null($txt)) { $txt = preg_replace('/\\([^)]*\\)/','',$tgt); if ($m[1]=='<:page>') $txt = preg_replace('!^.*[^<]/!','',$txt); $txt = $txt; } $txt .= $suffix; } $out = $LinkFunctions[$m[1]]($pagename,$m[1],$m[2],@$m[4],$txt,$fmt); return $out; } function Markup($id,$cmd,$pat=NULL,$rep=NULL) { global $MarkupTable,$MarkupRules; unset($MarkupRules); if (preg_match('/^([<>])?(.+)$/',$cmd,$m)) { $MarkupTable[$id]['cmd']=$cmd; $MarkupTable[$m[2]]['dep']=array($id=>$m[1]); if (!$m[1]) $m[1]='='; if (@$MarkupTable[$m[2]]['seq']) { $MarkupTable[$id]['seq'] = $MarkupTable[$m[2]]['seq'].$m[1]; foreach((array)@$MarkupTable[$id]['dep'] as $i=>$m) Markup($i,"$m$id"); unset($MarkupTable[$id]['dep']); } } if ($pat && !isset($MarkupTable[$id]['pat'])) { $MarkupTable[$id]['pat']=$pat; $MarkupTable[$id]['rep']=$rep; } } function mpcmp($a,$b) { return @strcmp($a['seq'].'=',$b['seq'].'='); } function BuildMarkupRules() { global $MarkupTable,$MarkupRules,$LinkPattern; if (!$MarkupRules) { uasort($MarkupTable,'mpcmp'); foreach($MarkupTable as $id=>$m) if (isset($m['pat'])) $MarkupRules[str_replace('\\L',$LinkPattern,$m['pat'])]=$m['rep']; } return $MarkupRules; } function MarkupToHTML($pagename,$text) { # convert wiki markup text to HTML output global $MarkupRules, $MarkupFrame, $MarkupFrameBase, $WikiWordCount, $K0, $K1, $RedoMarkupLine; StopWatch('MarkupToHTML begin'); array_unshift($MarkupFrame,$MarkupFrameBase); $MarkupFrame[0]['wwcount'] = $WikiWordCount; $markrules = BuildMarkupRules(); foreach((array)$text as $l) $lines[] = htmlspecialchars($l,ENT_NOQUOTES); $out = array(); while (count($lines)>0) { $x = array_shift($lines); $RedoMarkupLine=0; foreach($markrules as $p=>$r) { if ($p{0} == '/') $x=preg_replace($p,$r,$x); elseif (strstr($x,$p)!==false) $x=eval($r); if (isset($php_errormsg)) { echo "pat=$p"; unset($php_errormsg); } if ($RedoMarkupLine) { $lines=array_merge((array)$x,$lines); continue 2; } } if ($x>'') $out[] = "$x\n"; } $out = implode('',(array)$out); foreach((array)($MarkupFrame[0]['posteval']) as $v) eval($v); array_shift($MarkupFrame); StopWatch('MarkupToHTML end'); return $out; } function HandleBrowse($pagename) { # handle display of a page global $DefaultPageTextFmt,$FmtV,$HandleBrowseFmt,$PageStartFmt, $PageEndFmt,$PageRedirectFmt; Lock(1); $page = RetrieveAuthPage($pagename,'read'); if (!$page) Abort('?cannot read $pagename'); PCache($pagename,$page); SDV($PageRedirectFmt,"

($[redirected from] \$FullName)

\$HTMLVSpace\n"); if (isset($page['text'])) $text=$page['text']; else $text = FmtPageName($DefaultPageTextFmt,$pagename); if (@!$_GET['from']) { $PageRedirectFmt = ''; if (preg_match('/\\(:redirect\\s+(.+?):\\)/',$text,$match)) { $rname = MakePageName($pagename,$match[1]); if (PageExists($rname)) Redirect($rname,"\$PageUrl?from=$pagename"); } } else $PageRedirectFmt=FmtPageName($PageRedirectFmt,$_GET['from']); $text = '(:groupheader:)'.@$text.'(:groupfooter:)'; $FmtV['$PageText'] = MarkupToHTML($pagename,$text); SDV($HandleBrowseFmt,array(&$PageStartFmt,&$PageRedirectFmt,'$PageText', &$PageEndFmt)); PrintFmt($pagename,$HandleBrowseFmt); } function RestorePage($pagename,&$page,&$new,$restore=NULL) { if (is_null($restore)) $restore=@$_REQUEST['restore']; if (!$restore) return; $t = $page['text']; $nl = (substr($t,-1)=="\n"); $t = explode("\n",$t); if ($nl) array_pop($t); krsort($page); reset($page); foreach($page as $k=>$v) { if ($k<$restore) break; foreach(explode("\n",$v) as $x) { if (preg_match('/^(\\d+)(,(\\d+))?([adc])(\\d+)/',$x,$match)) { $a1 = $a2 = $match[1]; if ($match[3]) $a2=$match[3]; $b1 = $match[5]; if ($match[4]=='d') array_splice($t,$b1,$a2-$a1+1); if ($match[4]=='c') array_splice($t,$b1-1,$a2-$a1+1); continue; } if (strncmp($x,'< ',2) == 0) { $nlflag=true; continue; } if (preg_match('/^> (.*)$/',$x,$match)) { $nlflag=false; array_splice($t,$b1-1,0,$match[1]); $b1++; } if ($x=='\\ No newline at end of file') $nl=$nlflag; } } if ($nl) $t[]=''; $new['text']=implode("\n",$t); return $new['text']; } ## ReplaceOnSave performs any text replacements (held in $ROSPatterns) ## on the new text prior to saving the page. function ReplaceOnSave($pagename,&$page,&$new) { global $ROSPatterns; if (!@$_POST['post']) return; foreach((array)$ROSPatterns as $pat=>$repfmt) $new['text'] = preg_replace($pat,FmtPageName($repfmt,$pagename),$new['text']); } function SaveAttributes($pagename,&$page,&$new) { global $LinkTargets; if (!@$_REQUEST['post']) return; unset($new['title']); $text = preg_replace('/\\[([=@]).*?\\1\\]/s',' ',$new['text']); if (preg_match('/\\(:title\\s(.+?):\\)/',$text,$match)) $new['title'] = $match[1]; MarkupToHTML($pagename,preg_replace('/\\(:(.*?):\\)/s',' ',$text)); $new['targets'] = implode(',',array_keys((array)$LinkTargets)); } function PostPage($pagename, &$page, &$new) { global $DiffKeepDays, $DiffFunction, $DeleteKeyPattern, $Now, $Author, $WikiDir, $IsPagePosted, $Newline; SDV($DiffKeepDays,3650); SDV($DeleteKeyPattern,"^\\s*delete\\s*$"); $IsPagePosted = false; if (@$_POST['post']) { $new['text'] = str_replace($Newline, "\n", $new['text']); if ($new['text']==@$page['text']) { Redirect($pagename); return; } $new["author"]=@$Author; $new["author:$Now"] = @$Author; $new["host:$Now"] = $_SERVER['REMOTE_ADDR']; $diffclass = preg_replace('/\\W/','',@$_POST['diffclass']); if ($page["time"]>0 && function_exists(@$DiffFunction)) $new["diff:$Now:{$page['time']}:$diffclass"] = $DiffFunction($new['text'],@$page['text']); $keepgmt = $Now-$DiffKeepDays * 86400; $keys = array_keys($new); foreach($keys as $k) if (preg_match("/^\\w+:(\\d+)/",$k,$match) && $match[1]<$keepgmt) unset($new[$k]); if (preg_match("/$DeleteKeyPattern/",$new['text'])) $WikiDir->delete($pagename); else WritePage($pagename,$new); $IsPagePosted = true; } } function PostRecentChanges($pagename,&$page,&$new) { global $IsPagePosted,$RecentChangesFmt,$RCDelimPattern; if (!$IsPagePosted) return; foreach($RecentChangesFmt as $rcfmt=>$pgfmt) { $rcname = FmtPageName($rcfmt,$pagename); if (!$rcname) continue; $pgtext = FmtPageName($pgfmt,$pagename); if (!$pgtext) continue; if (@$seen[$rcname]++) continue; $rcpage = ReadPage($rcname); $rcelim = preg_quote(preg_replace("/$RCDelimPattern.*$/",' ',$pgtext),'/'); $rcpage['text'] = preg_replace("/[^\n]*$rcelim.*\n/","",@$rcpage['text']); if (!preg_match("/$RCDelimPattern/",$rcpage['text'])) $rcpage['text'] .= "$pgtext\n"; else $rcpage['text'] = preg_replace("/([^\n]*$RCDelimPattern.*\n)/", "$pgtext\n$1",$rcpage['text'],1); WritePage($rcname,$rcpage); } } function PreviewPage($pagename,&$page,&$new) { global $IsPageSaved,$FmtV,$PagePreviewFmt; if (!$IsPageSaved && @$_POST['preview']) { $text = '(:groupheader:)'.$new['text'].'(:groupfooter:)'; $FmtV['$PreviewText'] = MarkupToHTML($pagename,$text); } else $PagePreviewFmt = ''; } function HandleEdit($pagename) { global $IsPagePosted,$EditFields,$EditFunctions,$FmtV,$Now, $HandleEditFmt,$PageStartFmt,$PageEditFmt,$PagePreviewFmt,$PageEndFmt; $IsPagePosted = false; Lock(2); $page = RetrieveAuthPage($pagename,'edit'); if (!$page) Abort("?cannot edit $pagename"); PCache($pagename,$page); $new = $page; foreach((array)$EditFields as $k) if (isset($_POST[$k])) $new[$k]=str_replace("\r",'',stripmagic($_POST[$k])); foreach((array)$EditFunctions as $fn) $fn($pagename,$page,$new); if ($IsPagePosted) { Redirect($pagename); return; } $FmtV['$DiffClassMinor'] = (@$_POST['diffclass']=='minor') ? "checked='checked'" : ''; $FmtV['$EditText'] = str_replace('$','$',htmlspecialchars(@$new['text'],ENT_NOQUOTES)); $FmtV['$EditBaseTime'] = $Now; SDV($HandleEditFmt,array(&$PageStartFmt, &$PageEditFmt,'wiki:$[PmWiki.EditQuickReference]',&$PagePreviewFmt, &$PageEndFmt)); PrintFmt($pagename,$HandleEditFmt); } function HandleSource($pagename) { Lock(1); $page = RetrieveAuthPage($pagename,'read'); if (!$page) Abort("?cannot source $pagename"); header("Content-type: text/plain"); echo @$page['text']; } ## BasicAuth provides password-protection of pages using PHP sessions. ## It is normally called from RetrieveAuthPage. function BasicAuth($pagename,$level,$authprompt=true) { global $DefaultPasswords,$AllowPassword,$GroupAttributesFmt,$SessionAuthFmt, $HTMLStartFmt,$HTMLEndFmt; SDV($GroupAttributesFmt,'$Group/GroupAttributes'); SDV($AllowPassword,'nopass'); $page = ReadPage($pagename); if (!$page) { return false; } $passwd = @$page["passwd$level"]; if ($passwd=="") { $grouppg = ReadPage(FmtPageName($GroupAttributesFmt,$pagename)); $passwd = @$grouppg["passwd$level"]; if ($passwd=='') $passwd = @$DefaultPasswords[$level]; if ($passwd=='') $passwd = @$page["passwdread"]; if ($passwd=='') $passwd = @$grouppg["passwdread"]; if ($passwd=='') $passwd = @$DefaultPasswords['read']; } if ($passwd=='') return $page; if (crypt($AllowPassword,$passwd)==$passwd) return $page; @session_start(); if (@$_POST['authpw']) @$_SESSION['authpw'][$_POST['authpw']]++; $authpw = array_keys((array)@$_SESSION['authpw']); foreach (array_merge((array)$DefaultPasswords['admin'],(array)$passwd) as $pwchal) foreach($authpw as $pwresp) if (@crypt($pwresp,$pwchal)==$pwchal) return $page; if (!$authprompt) return false; SDV($SessionAuthFmt,array(&$HTMLStartFmt, "

To edit this wiki, you must provide a valid password.

To request a password, contact ksulliv at cs.gmu.edu and indicate your reason for editing the wiki.

Password:
", &$HTMLEndFmt)); PrintFmt($pagename,$SessionAuthFmt); exit; } function PrintAttrForm($pagename) { global $PageAttributes; echo FmtPageName("
",$pagename); $page = ReadPage($pagename); foreach($PageAttributes as $attr=>$p) { $value = (strncmp($attr, 'passwd', 6) == 0) ? '' : $page[$attr]; $prompt = FmtPageName($p,$pagename); echo ""; } echo "
$prompt
"; } function HandleAttr($pagename) { global $PageAttrFmt,$PageStartFmt,$PageEndFmt; $page = RetrieveAuthPage($pagename,'attr'); if (!$page) { Abort("?unable to read $pagename"); } PCache($pagename,$page); SDV($PageAttrFmt,"

$[\$FullName Attributes]

Enter new attributes for this page below. Leaving a field blank will leave the attribute unchanged. To clear an attribute, enter 'clear'.

"); SDV($HandleAttrFmt,array(&$PageStartFmt,&$PageAttrFmt, 'function:PrintAttrForm',&$PageEndFmt)); PrintFmt($pagename,$HandleAttrFmt); } function HandlePostAttr($pagename) { global $PageAttributes; $page = RetrieveAuthPage($pagename,'attr'); if (!$page) { Abort("?unable to read $pagename"); } foreach($PageAttributes as $attr=>$p) { $newpw = @$_POST[$attr]; if ($newpw=='clear') unset($page[$attr]); else if ($newpw>'') $page[$attr]=crypt($newpw); } WritePage($pagename,$page); Redirect($pagename); exit; } ?>