Difference between revisions of "Document.php"
(allow __NOTOC__ for outline numbered headings too) |
({{legacy}}) |
||
(3 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | <? | + | {{legacy}} |
+ | <php><? | ||
# General structured document transform | # General structured document transform | ||
# TODO: handle external embeds and applies | # TODO: handle external embeds and applies | ||
Line 12: | Line 13: | ||
xwSetProperty( $properties, 'xpath:/properties:data', $tTitle ); | xwSetProperty( $properties, 'xpath:/properties:data', $tTitle ); | ||
xwSetProperty( $properties, 'xpath:/properties:view', $tTitle ); | xwSetProperty( $properties, 'xpath:/properties:view', $tTitle ); | ||
− | |||
# Declare callback funtion for replacing embeds [[+link]] and outline-number pre-processing | # Declare callback funtion for replacing embeds [[+link]] and outline-number pre-processing | ||
Line 22: | Line 22: | ||
$apply = $operator == '*'; | $apply = $operator == '*'; | ||
$embed = ($apply && !$pipe) ? '' : $embedTitle ? xwArticleContent($embedTitle) : ''; | $embed = ($apply && !$pipe) ? '' : $embedTitle ? xwArticleContent($embedTitle) : ''; | ||
− | $embedProperties = $GLOBALS['xwDefaultPropertiesXML']; | + | $embedProperties = str_replace('categories.php','',$GLOBALS['xwDefaultPropertiesXML']); |
xwDomificateArticle($embedProperties); | xwDomificateArticle($embedProperties); | ||
if ($embedTitle) xwMergeDOM($embedProperties, xwArticleProperties($embedTitle, false)); | if ($embedTitle) xwMergeDOM($embedProperties, xwArticleProperties($embedTitle, false)); | ||
Line 105: | Line 105: | ||
$article = str_replace( "\n</p>", "</p>\n", $article ); | $article = str_replace( "\n</p>", "</p>\n", $article ); | ||
# Add table of contents | # Add table of contents | ||
− | if ((count($GLOBALS['toc'])>3) && !ereg('__NOTOC__',$article) { | + | if ((count($GLOBALS['toc'])>3) && !ereg('__NOTOC__',$article)) { |
$tocHTML = '<table border="0" id="toc"><tr id="toctitle"><td align="center">'; | $tocHTML = '<table border="0" id="toc"><tr id="toctitle"><td align="center">'; | ||
$tocHTML .= '<b>Table of contents</b> '; | $tocHTML .= '<b>Table of contents</b> '; | ||
Line 120: | Line 120: | ||
# Ensure declarations don't occur again | # Ensure declarations don't occur again | ||
if ( !isset( $GLOBALS[$tTitle] ) ) $GLOBALS[$tTitle] = 1; | if ( !isset( $GLOBALS[$tTitle] ) ) $GLOBALS[$tTitle] = 1; | ||
− | ?> | + | ?></php> |
Latest revision as of 22:06, 4 December 2007
<php><?
- General structured document transform
- TODO: handle external embeds and applies
xwGetProperty( $properties, 'language', $language );
- On first document.php execution,
if ( !isset( $GLOBALS[$tTitle] ) ) { # Keep track of include depth for outline numbering $GLOBALS['incDepth'] = ; # Add this transform and document.css to the view and data stack xwSetProperty( $properties, 'xpath:/properties:data', $tTitle ); xwSetProperty( $properties, 'xpath:/properties:view', $tTitle );
# Declare callback funtion for replacing embeds +link and outline-number pre-processing function xwRE( $matches ) { list(, $num, $operator, $embedTitle, $pipe, $anchor ) = $matches; $oldDepth = $GLOBALS['incDepth']; $num = $GLOBALS['incDepth'] .= $num; # Get embed-article content & properties (merged over defaults) $apply = $operator == '*'; $embed = ($apply && !$pipe) ? : $embedTitle ? xwArticleContent($embedTitle) : ; $embedProperties = str_replace('categories.php',,$GLOBALS['xwDefaultPropertiesXML']); xwDomificateArticle($embedProperties); if ($embedTitle) xwMergeDOM($embedProperties, xwArticleProperties($embedTitle, false)); # If embedding, deal with heading, else split pipe list if ($apply) { # Add transforms from pipe to embed's data-transform stack $transforms = $pipe ? explode('|', $anchor) : array($embedTitle); foreach ($transforms as $transformTitle) xwSetProperty($embedProperties, 'xpath:/properties:data', $transformTitle); $anchor = ; } else if (!$pipe) $anchor = $embedTitle; # If no language specified in properties, guess from name and content xwGetProperty($embedProperties, 'language', $embedLang); if (!$embedLang) xwSetProperty($embedProperties, 'language', xwArticleType($embedTitle, $embed)); # Transform the content before embedding it xwReduceTransformStack($embed, $embedProperties, $embedTitle, 'data', "EMBED$operator"); $GLOBALS['incDepth'] = $oldDepth; # If there's a heading, surround it in an element for view-transform to match
if ($anchor) $embed = "
<tmp num=\"$num\" title=\"$embedTitle\" anchor=\"$anchor\"/>
\n$embed";
return $embed; }
# Declare callback function for replacing the tmp elements with final html heading function xwOL( $matches ) { global $seq, $xwScript, $toc; list(, $num, $title, $anchor ) = $matches; # Calculate outline numbering string $depth = strlen( $num ); $onum = array(); for ( $i = 1; $i <= $depth; $i++ ) $onum[$i] = $i < $depth ? $seq[$i] : ++$seq[$i] + ($seq[$i+1] = 0); if ( count($onum) == 1 ) array_push( $onum, ); # Add numbering and heading if there's an anchor if ( $anchor ) { if ( $depth ) { $s = ' '; $anchor = join( '.', $onum )."$s$s$anchor"; if ( $depth && $depth < 3 ) $toc[] = array( urlencode($anchor), $depth > 1 ? "$s$s$s$s$s$anchor" : "$anchor" ); } else $depth = 1; $heading = "<h$depth class=\"document\">$anchor</h$depth>"; # Make the heading into an edit link to the source if there's an article title if ( $title ) { $title = str_replace( '&', '%26', $title ); $heading = "<a class=\"document\" href=\"$xwScript?title=$title&action=edit\">$heading</a>"; } if ( $anchor ) $heading = '<a name="'.urlencode($anchor)."\"></a>$heading"; } return "\n$heading"; }
}
- If called from data-list, do embeds, applies and outline-preparation
- - doesn't run on first data call (ie pushed to end of data-stack on first data call)
if ( $GLOBALS[$tTitle] and $event == 'data' and $language == ) { # Render next level or bail out if too deep if ( ++$GLOBALS[$tTitle] < 10 ) { xwUndomificateArticle( $article, $tTitle ); # Replace all embeds and applies with transformed content $article = preg_replace_callback( '/(#*)\\[{2}([+*])(.*?)(\\|(.*?))?\\]{2}/s', 'xwRE', $article );
$article = preg_replace( '/^(#+)(.+?)$/m', '
<tmp num="'.$GLOBALS['incDepth'].'$1" title="" anchor="$2"/>
', $article );
} else $GLOBALS['tooDeep'] = true; --$GLOBALS[$tTitle]; # Clear article content if bailed if ( $GLOBALS[$tTitle] == 1 and $GLOBALS['tooDeep'] ) { xwMessage( 'Structure too deep! (probably circular)', 'red' ); $article = '(Content could not be rendered)'; } }
- If called from view-list, do outline numbering and edit links
if ( $event == 'view' and $language == ) { if ( $GLOBALS[$tTitle] < 10 ) { $GLOBALS['seq'] = array( 0,0,0,0,0,0,0,0,0,0 ); $GLOBALS['toc'] = array(); # Apply view transforms to the tmp elements generated by data iteration
$article = preg_replace_callback( '/
<tmp num="(.*?)" title="(.*?)" anchor="(.*?)" *\\/><\\/h1 >/ms', 'xwOL', $article ); # Tidy up source a bit $article = str_replace( "\n
", "\n", $article );# Add table of contents if ((count($GLOBALS['toc'])>3) && !ereg(,$article)) {
$tocHTML = '';
$tocHTML .= 'Table of contents '; $tocHTML .= '<script type="text/javascript">showTocToggle("show","hide")</script>'; $tocHTML .= ' |
';
foreach ( $GLOBALS['toc'] as $anchor ) $tocHTML .= "<a href=\"#$anchor[0]\">$anchor[1]</a> ";
$tocHTML .= ' |
$article = str_replace( , "$tocHTML", $article ); } } }
- Ensure declarations don't occur again
if ( !isset( $GLOBALS[$tTitle] ) ) $GLOBALS[$tTitle] = 1; ?></php>