<?php
/**
* File for magic words
+ *
* See docs/magicword.txt
*
* @file
'numberofarticles',
'numberoffiles',
'numberofedits',
+ 'articlepath',
'sitename',
'server',
'servername',
'revisionday',
'revisionday2',
'revisionmonth',
+ 'revisionmonth1',
'revisionyear',
'revisiontimestamp',
'revisionuser',
* Add a magic word by name
*/
public function add( $name ) {
- global $wgContLang;
$this->names[] = $name;
$this->hash = $this->baseRegex = $this->regex = null;
}
}
/**
- * Get an unanchored regex
+ * Get an unanchored regex that does not match parameters
*/
function getRegex() {
if ( is_null( $this->regex ) ) {
}
/**
- * Get a regex for matching variables
+ * Get a regex for matching variables with parameters
*/
function getVariableRegex() {
return str_replace( "\\$1", "(.*?)", $this->getRegex() );
}
/**
- * Get a regex for matching a prefix. Does not match parameters.
+ * Get a regex anchored to the start of the string that does not match parameters
*/
function getRegexStart() {
$base = $this->getBaseRegex();
$newRegex = array( '', '' );
if ( $base[0] !== '' ) {
- $newRegex[0] = str_replace( "\\$1", "", "/^(?:{$base[0]})/iuS" );
+ $newRegex[0] = "/^(?:{$base[0]})/iuS";
}
if ( $base[1] !== '' ) {
- $newRegex[1] = str_replace( "\\$1", "", "/^(?:{$base[1]})/S" );
+ $newRegex[1] = "/^(?:{$base[1]})/S";
}
return $newRegex;
}
/**
- * Get an anchored regex for matching variables
+ * Get an anchored regex for matching variables with parameters
*/
function getVariableStartToEndRegex() {
$base = $this->getBaseRegex();
}
// This shouldn't happen either
throw new MWException( __METHOD__.': parameter not found' );
- return array( false, false );
}
/**
* Both elements are false if there was no match.
*/
public function matchVariableStartToEnd( $text ) {
- global $wgContLang;
$regexes = $this->getVariableStartToEndRegex();
foreach ( $regexes as $regex ) {
if ( $regex !== '' ) {
}
/**
- * Returns the magic word id removed from the start, or false
- * does not match parameters.
+ * Return the ID of the magic word at the start of $text, and remove
+ * the prefix from $text.
+ * Return false if no match found and $text is not modified.
+ * Does not match parameters.
*/
public function matchStartAndRemove( &$text ) {
- $found = FALSE;
$regexes = $this->getRegexStart();
foreach ( $regexes as $regex ) {
if ( $regex === '' ) {
continue;
}
- preg_match_all( $regex, $text, $matches, PREG_SET_ORDER );
- foreach ( $matches as $m ) {
- list( $found, $param ) = $this->parseMatch( $m );
+ if ( preg_match( $regex, $text, $m ) ) {
+ list( $id, ) = $this->parseMatch( $m );
+ if ( strlen( $m[0] ) >= strlen( $text ) ) {
+ $text = '';
+ } else {
+ $text = substr( $text, strlen( $m[0] ) );
+ }
+ return $id;
}
- $text = preg_replace( $regex, '', $text );
}
- return $found;
+ return false;
}
}