<?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, '-&gt;'); }

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&gt;&gt;class=subpage&lt;&lt;".
   "\n![[#".FmtPageName('$Name',MakePageName($pagename,$m[3])).']]'.$m[2].
   "\n(:include ".MakePageName($pagename,$pagename.",$m[3]").':)'.
   "\n(:title {\$Title}:)".
   "\n&gt;&gt;&lt;&lt;\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&gt;&gt;class=subpage&lt;&lt;".
    "\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&gt;&gt;&lt;&lt;\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";
   });

?>