Page MenuHomePhabricator

sectionvars.php

Authored By
bzimport
Nov 21 2014, 8:15 PM
Size
3 KB
Referenced Files
None
Subscribers
None

sectionvars.php

<?php
$wgExtensionCredits['parserhook'][] = array(
'name' => 'SectionVariables',
'url' => 'http://meta.wikimedia.org/wiki/SectionVariables',
'author' => 'Kinsey Moore',
'description' => 'Enhance parser with ability to grab section headings and numbering.',
);
$wgHooks['ParserAfterStrip'][] = 'doSourceSectionVars';
$wgHooks['InternalParseBeforeLinks'][] = 'doSectionVars';
function doSourceSectionVars(&$parser, &$text, &$strip_state) {
global $action; // Access the global "action" variable
// Only do the replacement if the action is not edit or history
if(
$action !== 'edit'
&& $action !== 'history'
&& $action !== 'delete'
&& $action !== 'watch'
&& strpos( $parser->mTitle->mPrefixedText, 'Special:' ) === false
&& $parser->mTitle->mNamespace !== 8
) {
$text = doSectVars($text,true);
}
return true;
}
function doSectionVars(&$parser, &$text, &$strip_state) {
global $action; // Access the global "action" variable
// Only do the replacement if the action is not edit or history
if(
$action !== 'edit'
&& $action !== 'history'
&& $action !== 'delete'
&& $action !== 'watch'
&& strpos( $parser->mTitle->mPrefixedText, 'Special:' ) === false
&& $parser->mTitle->mNamespace !== 8
) {
$text = doSectVars($text);
}
return true;
}
function doSectVars( $text, $doSrc = false, $prefix = "") {
$srctext = "";
if ($doSrc == true) {
$srctext = "source";
}
# this function should probably take on the functions of formatHeadings
# split on header openings and on section specifiers
$blocks = preg_split( "/(^={1,6}.*={1,6}\\s*$|\\[\\[section::.*?\\]\\]|<H[1-6].*?>.*?<\/H[1-6] *>)/mi", $text, -1, PREG_SPLIT_DELIM_CAPTURE );
$outtext = '';
$hcurrdepth = -1;
$htext = '';
$hlengths = array();
$hlevels = array();
foreach ($blocks as $block) {
# take care of header generation
if (preg_match("/^(={1,6})(.*)\\1\\s*$/",$block,$matches)) {
$hdepth = strlen($matches[1]);
$htext = $matches[2];
$outtext .= $block;
$updatestatus = true;
# no modification takes place here
} elseif ($doSrc == false && preg_match("/^<H([1-6]).*?>(.*?)<\/H[1-6] *>$/i",$block,$matches)) {
$hdepth = $matches[1];
$htext = $matches[2];
$outtext .= $block;
$updatestatus = true;
# take care of context sensitive variable substitution
} elseif ($doSrc == false && preg_match("/^\\[\\[section::name\\]\\]$/i",$block,$matches)) {
$outtext .= $htext;
} elseif (preg_match("/^\\[\\[section::".$srctext."number\\]\\]$/i",$block,$matches)) {
$tmp = implode('.',$hlengths);
if ($tmp == "") {
$tmp = 0;
}
$outtext .= $prefix.$tmp;
} else {
$outtext .= $block;
}
# update status if necessary
if ($updatestatus == true) {
$updatestatus = false;
# starting a new sublevel
if ($hcurrdepth == -1 || $hdepth > $hlevels[$hcurrdepth]) {
$hcurrdepth++;
$hlevels[$hcurrdepth] = $hdepth;
$hlengths[$hcurrdepth] = 1;
# remaining in the current sublevel
} elseif ($hdepth <= $hlevels[$hcurrdepth] && ($hcurrdepth == 0 || $hdepth > $hlevels[$hcurrdepth-1])) {
$hlengths[$hcurrdepth]++;
$hlevels[$hcurrdepth] = $hdepth;
# jumping up sublevels
} else {
# in this case, look for the proper sublevel to jump out to
for($i = $hcurrdepth-1;$i>=0;$i--) {
if ($hdepth <= $hlevels[$i] && ($i == 0 || $hdepth > $hlevels[$i-1])) {
$hcurrdepth = $i;
break;
}
}
$hlengths[$hcurrdepth]++;
$hlevels[$hcurrdepth] = $hdepth;
# truncate sublevels
$hlengths = array_slice($hlengths,0,$hcurrdepth+1);
$hlevels = array_slice($hlevels,0,$hcurrdepth+1);
}
}
}
return $outtext;
}
?>

File Metadata

Mime Type
text/x-php
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1536
Default Alt Text
sectionvars.php (3 KB)

Event Timeline