summaryrefslogtreecommitdiff
path: root/includes/parser/Preprocessor_DOM.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/parser/Preprocessor_DOM.php')
-rw-r--r--includes/parser/Preprocessor_DOM.php90
1 files changed, 62 insertions, 28 deletions
diff --git a/includes/parser/Preprocessor_DOM.php b/includes/parser/Preprocessor_DOM.php
index 673ac241..2b635f7c 100644
--- a/includes/parser/Preprocessor_DOM.php
+++ b/includes/parser/Preprocessor_DOM.php
@@ -1,5 +1,11 @@
<?php
-
+/**
+ * Preprocessor using PHP's dom extension
+ *
+ * @file
+ * @ingroup Parser
+ */
+
/**
* @ingroup Parser
*/
@@ -29,6 +35,30 @@ class Preprocessor_DOM implements Preprocessor {
return new PPCustomFrame_DOM( $this, $args );
}
+ function newPartNodeArray( $values ) {
+ //NOTE: DOM manipulation is slower than building & parsing XML! (or so Tim sais)
+ $xml = "";
+ $xml .= "<list>";
+
+ foreach ( $values as $k => $val ) {
+
+ if ( is_int( $k ) ) {
+ $xml .= "<part><name index=\"$k\"/><value>" . htmlspecialchars( $val ) ."</value></part>";
+ } else {
+ $xml .= "<part><name>" . htmlspecialchars( $k ) . "</name>=<value>" . htmlspecialchars( $val ) . "</value></part>";
+ }
+ }
+
+ $xml .= "</list>";
+
+ $dom = new DOMDocument();
+ $dom->loadXML( $xml );
+ $root = $dom->documentElement;
+
+ $node = new PPNode_DOM( $root->childNodes );
+ return $node;
+ }
+
function memCheck() {
if ( $this->memoryLimit === false ) {
return;
@@ -45,8 +75,8 @@ class Preprocessor_DOM implements Preprocessor {
* Preprocess some wikitext and return the document tree.
* This is the ghost of Parser::replace_variables().
*
- * @param string $text The text to parse
- * @param integer flags Bitwise combination of:
+ * @param $text String: the text to parse
+ * @param $flags Integer: bitwise combination of:
* Parser::PTD_FOR_INCLUSION Handle <noinclude>/<includeonly> as if the text is being
* included. Default is to assume a direct page view.
*
@@ -443,7 +473,7 @@ class Preprocessor_DOM implements Preprocessor {
$count = $piece->count;
$equalsLength = strspn( $revText, '=', strlen( $text ) - $searchStart );
if ( $equalsLength > 0 ) {
- if ( $i - $equalsLength == $piece->startPos ) {
+ if ( $searchStart - $equalsLength == $piece->startPos ) {
// This is just a single string of equals signs on its own line
// Replicate the doHeadings behaviour /={count}(.+)={count}/
// First find out how many equals signs there really are (don't stop at 6)
@@ -481,9 +511,7 @@ class Preprocessor_DOM implements Preprocessor {
// another heading. Infinite loops are avoided because the next iteration MUST
// hit the heading open case above, which unconditionally increments the
// input pointer.
- }
-
- elseif ( $found == 'open' ) {
+ } elseif ( $found == 'open' ) {
# count opening brace characters
$count = strspn( $text, $curChar, $i );
@@ -506,9 +534,7 @@ class Preprocessor_DOM implements Preprocessor {
$accum .= htmlspecialchars( str_repeat( $curChar, $count ) );
}
$i += $count;
- }
-
- elseif ( $found == 'close' ) {
+ } elseif ( $found == 'close' ) {
$piece = $stack->top;
# lets check if there are enough characters for closing brace
$maxCount = $piece->count;
@@ -516,7 +542,6 @@ class Preprocessor_DOM implements Preprocessor {
# check for maximum matching characters (if there are 5 closing
# characters, we will probably need only 3 - depending on the rules)
- $matchingCount = 0;
$rule = $rules[$piece->open];
if ( $count > $rule['max'] ) {
# The specified maximum exists in the callback array, unless the caller
@@ -561,7 +586,7 @@ class Preprocessor_DOM implements Preprocessor {
$element = "<$name$attr>";
$element .= "<title>$title</title>";
$argIndex = 1;
- foreach ( $parts as $partIndex => $part ) {
+ foreach ( $parts as $part ) {
if ( isset( $part->eqpos ) ) {
$argName = substr( $part->out, 0, $part->eqpos );
$argValue = substr( $part->out, $part->eqpos + 1 );
@@ -822,7 +847,7 @@ class PPFrame_DOM implements PPFrame {
/**
* Construct a new preprocessor frame.
- * @param Preprocessor $preprocessor The parent preprocessor
+ * @param $preprocessor Preprocessor: The parent preprocessor
*/
function __construct( $preprocessor ) {
$this->preprocessor = $preprocessor;
@@ -877,12 +902,12 @@ class PPFrame_DOM implements PPFrame {
return $root;
}
- if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->mMaxPPNodeCount )
+ if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() )
{
return '<span class="error">Node-count limit exceeded</span>';
}
- if ( $expansionDepth > $this->parser->mOptions->mMaxPPExpandDepth ) {
+ if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
return '<span class="error">Expansion depth limit exceeded</span>';
}
wfProfileIn( __METHOD__ );
@@ -932,7 +957,9 @@ class PPFrame_DOM implements PPFrame {
$iteratorStack[$level] = false;
}
- if ( $contextNode instanceof PPNode_DOM ) $contextNode = $contextNode->node;
+ if ( $contextNode instanceof PPNode_DOM ) {
+ $contextNode = $contextNode->node;
+ }
$newIterator = false;
@@ -951,7 +978,7 @@ class PPFrame_DOM implements PPFrame {
$titles = $xpath->query( 'title', $contextNode );
$title = $titles->item( 0 );
$parts = $xpath->query( 'part', $contextNode );
- if ( $flags & self::NO_TEMPLATES ) {
+ if ( $flags & PPFrame::NO_TEMPLATES ) {
$newIterator = $this->virtualBracketedImplode( '{{', '|', '}}', $title, $parts );
} else {
$lineStart = $contextNode->getAttribute( 'lineStart' );
@@ -972,7 +999,7 @@ class PPFrame_DOM implements PPFrame {
$titles = $xpath->query( 'title', $contextNode );
$title = $titles->item( 0 );
$parts = $xpath->query( 'part', $contextNode );
- if ( $flags & self::NO_ARGS ) {
+ if ( $flags & PPFrame::NO_ARGS ) {
$newIterator = $this->virtualBracketedImplode( '{{{', '|', '}}}', $title, $parts );
} else {
$params = array(
@@ -990,13 +1017,13 @@ class PPFrame_DOM implements PPFrame {
# Remove it in HTML, pre+remove and STRIP_COMMENTS modes
if ( $this->parser->ot['html']
|| ( $this->parser->ot['pre'] && $this->parser->mOptions->getRemoveComments() )
- || ( $flags & self::STRIP_COMMENTS ) )
+ || ( $flags & PPFrame::STRIP_COMMENTS ) )
{
$out .= '';
}
# Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
# Not in RECOVER_COMMENTS mode (extractSections) though
- elseif ( $this->parser->ot['wiki'] && ! ( $flags & self::RECOVER_COMMENTS ) ) {
+ elseif ( $this->parser->ot['wiki'] && ! ( $flags & PPFrame::RECOVER_COMMENTS ) ) {
$out .= $this->parser->insertStripItem( $contextNode->textContent );
}
# Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
@@ -1008,7 +1035,7 @@ class PPFrame_DOM implements PPFrame {
# OT_WIKI will only respect <ignore> in substed templates.
# The other output types respect it unless NO_IGNORE is set.
# extractSections() sets NO_IGNORE and so never respects it.
- if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] ) || ( $flags & self::NO_IGNORE ) ) {
+ if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] ) || ( $flags & PPFrame::NO_IGNORE ) ) {
$out .= $contextNode->textContent;
} else {
$out .= '';
@@ -1112,7 +1139,9 @@ class PPFrame_DOM implements PPFrame {
$first = true;
$s = '';
foreach ( $args as $root ) {
- if ( $root instanceof PPNode_DOM ) $root = $root->node;
+ if ( $root instanceof PPNode_DOM ) {
+ $root = $root->node;
+ }
if ( !is_array( $root ) && !( $root instanceof DOMNodeList ) ) {
$root = array( $root );
}
@@ -1136,9 +1165,11 @@ class PPFrame_DOM implements PPFrame {
$args = array_slice( func_get_args(), 1 );
$out = array();
$first = true;
- if ( $root instanceof PPNode_DOM ) $root = $root->node;
foreach ( $args as $root ) {
+ if ( $root instanceof PPNode_DOM ) {
+ $root = $root->node;
+ }
if ( !is_array( $root ) && !( $root instanceof DOMNodeList ) ) {
$root = array( $root );
}
@@ -1163,7 +1194,9 @@ class PPFrame_DOM implements PPFrame {
$first = true;
foreach ( $args as $root ) {
- if ( $root instanceof PPNode_DOM ) $root = $root->node;
+ if ( $root instanceof PPNode_DOM ) {
+ $root = $root->node;
+ }
if ( !is_array( $root ) && !( $root instanceof DOMNodeList ) ) {
$root = array( $root );
}
@@ -1239,7 +1272,8 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
var $numberedExpansionCache, $namedExpansionCache;
function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
- PPFrame_DOM::__construct( $preprocessor );
+ parent::__construct( $preprocessor );
+
$this->parent = $parent;
$this->numberedArgs = $numberedArgs;
$this->namedArgs = $namedArgs;
@@ -1310,7 +1344,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
}
if ( !isset( $this->numberedExpansionCache[$index] ) ) {
# No trimming for unnamed arguments
- $this->numberedExpansionCache[$index] = $this->parent->expand( $this->numberedArgs[$index], self::STRIP_COMMENTS );
+ $this->numberedExpansionCache[$index] = $this->parent->expand( $this->numberedArgs[$index], PPFrame::STRIP_COMMENTS );
}
return $this->numberedExpansionCache[$index];
}
@@ -1322,7 +1356,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
if ( !isset( $this->namedExpansionCache[$name] ) ) {
# Trim named arguments post-expand, for backwards compatibility
$this->namedExpansionCache[$name] = trim(
- $this->parent->expand( $this->namedArgs[$name], self::STRIP_COMMENTS ) );
+ $this->parent->expand( $this->namedArgs[$name], PPFrame::STRIP_COMMENTS ) );
}
return $this->namedExpansionCache[$name];
}
@@ -1351,7 +1385,7 @@ class PPCustomFrame_DOM extends PPFrame_DOM {
var $args;
function __construct( $preprocessor, $args ) {
- PPFrame_DOM::__construct( $preprocessor );
+ parent::__construct( $preprocessor );
$this->args = $args;
}