]*> | \[\[[^]]*\]\] )*
\s* (.*?)
}sx', $this->body, $bodyp, 0)) {
return $bodyp[1];
}
}
function img()
{
$this->img = NULL;
$this->story;
return $this->img;
}
function image()
{
if ($override = @$this->meta['og:image']) {
# prefer specific page image if found in metadata
return $override;
}
if ( preg_match('/\bsrc="([^"]*)"/', $this->img, $src) ) {
return $src[1];
}
}
function thumb($size = '300x')
{
if (!$this->image or $this->image[0] !== '/') return;
if (preg_match('{^/thumb/\D}', $this->image)) {
return ltrim($this->image, '/');
}
return preg_replace(
['{^(?:/thumb/[^/]*)?}', '/\.groot(?=\.\w+$)/', '/(?:\.jpg)?$/'],
[ "thumb/$size", '', '.jpg' ],
$this->image, 1
);
}
function widget($name, $params = [])
{
$path = stream_resolve_include_path("widget/$name.php");
if (!file_exists($path)) {
return '
'.$name.' ontbreekt';
}
ob_start();
$Page = clone $this;
if (is_array($params)) {
$Page->place += $params;
}
else {
foreach (explode(' ', $params) as $param) {
if ($set = strpos($param, '=')) {
$Page->place[ substr($param, 0, $set) ] = urldecode(substr($param, $set + 1));
}
elseif (!empty($param)) {
$Page->place[] = $param;
}
}
}
try {
include "widget/$name.php";
return ob_get_clean();
}
catch (Exception $e) {
return sprintf('
%s',
"fout in
$name: {$e->getMessage()}"
);
}
}
function render()
{
$doc = $this->raw;
if (!empty($this->place['warn'])) {
$warn = '
[[warn]]
';
if ($offset = strpos($doc, '')) {
$doc = substr_replace($doc, "\n\n".$warn, $offset + 5, 0);
}
else {
$doc = $warn . "\n\n" . $doc;
}
}
# keep either login or logout parts depending on user level
global $User;
$userexists = $User && property_exists($User, 'login') && $User->login;
if (! ($userexists and !empty($this->editable)) ) {
# remove matching elements until first corresponding closing tag
$hideclass = $userexists ? 'logout' : 'login';
$tagmatch = '<([a-z]+) class="'.$hideclass.'"[^>]*>';
$doc = preg_replace("{\s*{$tagmatch}.*?\\1>}s", '', $doc);
}
return preg_replace_callback(
'{ \[\[ ([^] ]+) ([^]]*) \]\] }x',
function ($sub) {
list ($placeholder, $name, $params) = $sub;
$html = $this->place[$name] ??
$this->widget($name, $params);
if (empty($html) or $html[0] != '<') {
$html = "
$html";
}
$attr = sprintf(' data-dyn="%s"', is_numeric($name) ? '' : $name.$params);
# contents with identifier in first tag
return preg_replace( '/(?=>)/', $attr, $html, 1);
},
$doc
);
}
}
class PageSearch
{
public $handlers = [];
function __construct($path = '.')
{
$this->iterator = new RecursiveCallbackFilterIterator(
new RecursiveDirectoryIterator($path),
function ($current) {
if ($current->getFilename()[0] === '.') {
# skip hidden files and directories
return FALSE;
}
if (file_exists($current->getFilename() . '/index.php')) {
# contents better provided by handler code
$this->handlers[ $current->getPathname() ] = $current;
return FALSE;
}
if ($current->isLink()) {
# ignore symlinks, original contents only
return FALSE;
}
if ($current->isDir()) {
# traverse subdirectories unless untracked in any amount
return !file_exists("$current/.gitignore");
}
# match **/*.html
return preg_match('/(?getFilename());
}
);
}
function files()
{
# order alphabetically by link
$dir = [];
foreach (new RecursiveIteratorIterator($this->iterator) as $name) {
$article = new ArchiveArticle($name);
$dir[$article->link] = $article;
}
ksort($dir);
return $dir;
}
}