<?php if (!defined('PmWiki')) exit(); /* Copyright 2006-2025 John Rankin (john.rankin@affinity.co.nz) This program is free software; 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. 2025-02-11 finalised for release //# 2020-04 added $SubpageTitle and $SubpageParentspaced page variables April 2020 //# 2019-04 added $EnableSubpageHeader suggested by Simon, April 2019 2017-03 updated for php 5.5 by John Rankin, March 2017 2010-10 minor tweaks by Anke Wehner */ # Version date $RecipeInfo['SubgroupMarkup']['Version'] = '2025-02-11'; //# update $FmtPV['$SubgroupMarkupVersion'] = "'SubgroupMarkup version {$RecipeInfo['SubgroupMarkup']['Version']}'"; // return version as a custom page variable SDV($EnableDisambiguation,2); SDV($EnableSubpageHeader, 1); $oldAsSpacedFunction = $AsSpacedFunction; $AsSpacedFunction = 'SpaceAfterComma'; function SpaceAfterComma($text) { global $oldAsSpacedFunction; $text = preg_replace('/^(\d{4})(\d{2})(\d{2}(?:,|$))/','\1-\2-\3',$text); return str_replace(',',', ',$oldAsSpacedFunction($text)); } # rewrite {$var} substitutions rule Markup('{$var}', '>$[phrase]', '/\\{(\\*|!?[-~,\\w.\\/\\x80-\\xff]*)(\\$:?\\w[-\\w]*)\\}/', function ($m) use (&$pagename) { return PRR(PVSE(PageVar($pagename, $m[2], $m[1]))); }); ## [[,subpage]] $HTMLStylesFmt['subpage'] = " .subpage h1, h1.subpage { margin:0px; margin-top:1.2em; margin-bottom:8px; color: #006633; font-size: 150%; } p.subpage { float: right; } "; #$SearchPatterns['normal'][] = '!,del-\d+$!'; if ($Charset == 'UTF-8') { $PageNameChars = '-~,[:alnum:]\\x80-\\xfe'; $SubNamePattern = '[[:upper:]\\d][\\w\\x80-\\xfe]*(?:[-~][\\w\\x80-\\xfe]+)*'; } else { $PageNameChars = '-~,[:alnum:]'; $SubNamePattern = '[[:upper:]\\d]\\w*(?:[-~]\\w+)*'; } $NamePattern = "$NamePattern(?:,$SubNamePattern)?"; Markup('[[,','<links','/\[\[,([^\|\]]+)(?:\|\s*([^\]]+))?\]\]/', function ($m) use(&$pagename) { return '[[' . preg_replace('/,.*$/','',FmtPageName('$Name',$pagename)) . ", $m[1] |" . ((empty($m[2])) ? $m[1] : $m[2]) . ']]'; //# }); ## escaped `SubPages Markup('`subpage', '<`wikiword', "/`(($GroupPattern([\\/.]))?$NamePattern)/", function ($m) { return Keep($m[1]); }); # if ($EnableDisambiguation==1) Markup('[[(,)','<links','/\[\[([^,#\]\(\|]+),\s*([^\|\]]+)\]\]/', function ($m) { return SubpageMismatch($m[2]) ? $m[0] : "[[$m1](, $m[2])]]"; }); elseif ($EnableDisambiguation==2) Markup('[[(,)','<links','/\[\[([^,#\]\(\|]+),\s*([^\|\]]+)\]\]/', function ($m) { return SubpageMismatch($m[2]) ? $m[0] : "[[$m[1], $m[2] | $m[2]]] ([[$m[1]]])"; }); //# $FmtPV['$SubpageParent'] = '$name'; # always return a parent page name $FmtPV['$SubpageParentspaced'] = # always return a spaced parent page name '$AsSpacedFunction($name)'; //# if (preg_match('/^([^\/.]+[\/.]([^,]+)),[^,]+$/',$pagename,$parent_child)) { SDV($SubpageTitleFmt, '(:title $SubpageTitle:)$[Subpage of]'); $FmtPV['$SubpageTitle'] = # spaced subpage name including comma as Title //# '$AsSpacedFunction(preg_replace("/^[^,]+,/",",",$name))'; $FmtPV['$SubpageParent'] = 'preg_replace("/,[^,]+$/","",$name)'; # parent page name //# $FmtPV['$SubpageParentspaced'] = # spaced parent page name //# '$AsSpacedFunction(preg_replace("/,[^,]+$/","",$name))'; if ($EnableSubpageHeader==1) { # insert sub page header in group header SDV($SubpageHeaderFmt, '!%block class=subpage%$SubpageTitleTxt [[$ParentNameTxt |$ParentLinkTxt]]'); $GroupHeaderFmt = str_replace(array('$SubpageTitleTxt', '$ParentNameTxt', '$ParentLinkTxt'), array(FmtPageName($SubpageTitleFmt,$pagename), $parent_child[1], $AsSpacedFunction($parent_child[2])), $SubpageHeaderFmt). '(:nl:)' . $GroupHeaderFmt; } if (IsEnabled($EnablePGCust,1) && file_exists("local/$parent_child[1].php")) include_once("local/$parent_child[1].php"); } function SubpageMismatch($txt) { return strstr($txt, '->'); } function SubpageToggle($pagename, $opt) { global $SubpageToggleFmt, $SubpageToggleOpt, $PDFCheckboxFmt, $PDFTypesetFmt; if (isset($SubpageToggleFmt)) return Keep(FmtPageName($SubpageToggleFmt, $pagename)); SDVA($SubpageToggleOpt, array('subpage' => (@$_GET['subpage']=='show') ? 'hide' : 'show', 'show' => FmtPageName('$[Show subpages]', $pagename), 'hide' => FmtPageName('$[Hide subpages]', $pagename), 'reverse' => FmtPageName('$[Reverse order]', $pagename), 'print' => FmtPageName('$[Print]', $pagename))); $opt = array_merge($SubpageToggleOpt, (array)$opt); $out[] = FmtPageName("class='publish' action='\$ScriptUrl' method='get'>", $pagename); $out[] = FmtPageName("<input type='hidden' name='n' value='\$FullName' />", $pagename); $out[] = "<input type='hidden' name='subpage' value=\"{$opt['subpage']}\" />"; $pdf = ''; //# initialise if (@$opt['action']=='print') $out[] = "<input type='checkbox' name='action' value='print' /> {$opt['print']} "; elseif (@$opt['action']=='publish') { SDV($PrintTagFmt,"<form class='publish' action='\$ScriptUrl' method='get'> <input type='hidden' name='n' value='\$FullName' /> <input type='hidden' name='action' value='print' /> <input type='hidden' name='ptype' value='print' /> <input type='hidden' name='subpage' value='show' /> $PDFCheckboxFmt $PDFTypesetFmt $PDFOptionsFmt</form>"); $pdf = Keep(FmtPageName($PrintTagFmt, $pagename)); } SDV($PrintTagFmt, ''); //# initialise if not set prior $out[] = "<input class='pubbutton' type='submit' value=\"{$opt[$opt['subpage']]}\" />"; if (@$_GET['subpage']=='hide') { //# $out[] = "<input type='checkbox' name='reverse' /> {$opt['reverse']}"; } //# elseif (isset ($_GET['reverse'])) { //# $out[] = "<input type='hidden' name='reverse' value=\"{$_GET['reverse']}\" />". ($_GET['reverse'] ? ' '.$opt['reverse'] : ''); } return '<form '.Keep(implode('',$out))."</form>$pdf"; } Markup('subpage', 'directives', '/^\(:subpage\s*(.*?):\)/', $action=='print' ? "" : function ($m) use(&$pagename) { return SubpageToggle($pagename, ParseArgs($m[1])); }); if (@$_GET['subpage']=='show') { if (@$_GET['reverse']) { Markup('switchsub', '<showsubpage', "/((?:\*\s*\[\[,[^\|\]]+(?:\|\s*[^\]]+)?\]\][^\n]*\n)+)". "(\n?\*\s*\[\[,[^\|\]]+(?:\|\s*[^\]]+)?\]\][^\n]*\n)/si", '$2$1'); } Markup('showsubpage','fulltext', "/(\n?\*\s*(\[\[,([^\|\]]+)(?:\|\s*([^\]]+))?\]\])([^\n]*)\n)(.*)$/si", ($action=='print') ? function ($m) use(&$pagename) { return str_replace(",$m[3]",'#'.FmtPageName('$Name',MakePageName($pagename,$m[3])). (($m[4]=='') ? '|'.$m[3] : ''),$m[1]).$m[6]. "\n>>class=subpage<<". "\n![[#".FmtPageName('$Name',MakePageName($pagename,$m[3])).']]'.$m[2]. "\n(:include ".MakePageName($pagename,$pagename.",$m[3]").':)'. "\n(:title {\$Title}:)". "\n>><<\n"; } : function ($m) use(&$pagename) { return str_replace(",$m[3]",'#'.FmtPageName('$Name',MakePageName($pagename,$m[3])). (($m[4]=='') ? '|'.$m[3] : ''),$m[1]).$m[6]. "\n>>class=subpage<<". "\n%block class=subpage%[[$pagename,$m[3]?action=edit|edit ,$m[3]]]". "\n![[#".FmtPageName('$Name',MakePageName($pagename,$m[3])).']]'.$m[2]. "\n(:include ".MakePageName($pagename,$pagename.",$m[3]").':)'. "\n(:title {\$Title}:)". "\n>><<\n"; } ); } elseif (@$_GET['reverse']) Markup('switchsub', '>include', "/(?:\n?\*\s*\[\[,[^\|\]]+(?:\|\s*[^\]]+)?\]\][^\n]*\n)+/si", function ($m) { return implode("\n",array_reverse(explode("\n",$m[0])))."\n"; }); ?>