* @ingroup Parser
*/
class LinkHolderArray {
- public $internals = array();
- public $interwikis = array();
+ public $internals = [];
+ public $interwikis = [];
public $size = 0;
/**
}
unset( $entry );
- return array( 'internals', 'interwikis', 'size' );
+ return [ 'internals', 'interwikis', 'size' ];
}
/**
}
}
$texts = preg_replace_callback( '/(<!--LINK \d+:)(\d+)(-->)/',
- array( $this, 'mergeForeignCallback' ), $texts );
+ [ $this, 'mergeForeignCallback' ], $texts );
# Renumber interwiki links
foreach ( $other->interwikis as $key => $entry ) {
$maxId = $newKey > $maxId ? $newKey : $maxId;
}
$texts = preg_replace_callback( '/(<!--IWLINK )(\d+)(-->)/',
- array( $this, 'mergeForeignCallback' ), $texts );
+ [ $this, 'mergeForeignCallback' ], $texts );
# Set the parent link ID to be beyond the highest used ID
$this->parent->setLinkID( $maxId + 1 );
* Make sure you don't have any text left using these link holders, before you call this
*/
public function clear() {
- $this->internals = array();
- $this->interwikis = array();
+ $this->internals = [];
+ $this->interwikis = [];
$this->size = 0;
}
* @param string $prefix [optional]
* @return string
*/
- public function makeHolder( $nt, $text = '', $query = array(), $trail = '', $prefix = '' ) {
+ public function makeHolder( $nt, $text = '', $query = [], $trail = '', $prefix = '' ) {
if ( !is_object( $nt ) ) {
# Fail gracefully
$retVal = "<!-- ERROR -->{$prefix}{$text}{$trail}";
# Separate the link trail from the rest of the link
list( $inside, $trail ) = Linker::splitTrail( $trail );
- $entry = array(
+ $entry = [
'title' => $nt,
'text' => $prefix . $text . $inside,
'pdbk' => $nt->getPrefixedDBkey(),
- );
- if ( $query !== array() ) {
+ ];
+ if ( $query !== [] ) {
$entry['query'] = $query;
}
return;
}
- global $wgContLang, $wgContentHandlerUseDB;
+ global $wgContLang;
- $colours = array();
+ $colours = [];
$linkCache = LinkCache::singleton();
$output = $this->parent->getOutput();
+ $linkRenderer = $this->parent->getLinkRenderer();
$dbr = wfGetDB( DB_SLAVE );
- $threshold = $this->parent->getOptions()->getStubThreshold();
# Sort by namespace
ksort( $this->internals );
- $linkcolour_ids = array();
+ $linkcolour_ids = [];
# Generate query
- $queries = array();
+ $lb = new LinkBatch();
+ $lb->setCaller( __METHOD__ );
+
foreach ( $this->internals as $ns => $entries ) {
foreach ( $entries as $entry ) {
/** @var Title $title */
} else {
$id = $linkCache->getGoodLinkID( $pdbk );
if ( $id != 0 ) {
- $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
+ $colours[$pdbk] = $linkRenderer->getLinkClasses( $title );
$output->addLink( $title, $id );
$linkcolour_ids[$id] = $pdbk;
} elseif ( $linkCache->isBadLink( $pdbk ) ) {
$colours[$pdbk] = 'new';
} else {
# Not in the link cache, add it to the query
- $queries[$ns][] = $title->getDBkey();
+ $lb->addObj( $title );
}
}
}
}
- if ( $queries ) {
- $where = array();
- foreach ( $queries as $ns => $pages ) {
- $where[] = $dbr->makeList(
- array(
- 'page_namespace' => $ns,
- 'page_title' => array_unique( $pages ),
- ),
- LIST_AND
- );
- }
-
- $fields = array( 'page_id', 'page_namespace', 'page_title',
- 'page_is_redirect', 'page_len', 'page_latest' );
-
- if ( $wgContentHandlerUseDB ) {
- $fields[] = 'page_content_model';
- }
+ if ( !$lb->isEmpty() ) {
+ $fields = array_merge(
+ LinkCache::getSelectFields(),
+ [ 'page_namespace', 'page_title' ]
+ );
$res = $dbr->select(
'page',
$fields,
- $dbr->makeList( $where, LIST_OR ),
+ $lb->constructSet( 'page', $dbr ),
__METHOD__
);
$pdbk = $title->getPrefixedDBkey();
$linkCache->addGoodLinkObjFromRow( $title, $s );
$output->addLink( $title, $s->page_id );
- # @todo FIXME: Convoluted data flow
- # The redirect status and length is passed to getLinkColour via the LinkCache
- # Use formal parameters instead
- $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
+ $colours[$pdbk] = $linkRenderer->getLinkClasses( $title );
// add id to the extension todolist
$linkcolour_ids[$s->page_id] = $pdbk;
}
}
if ( count( $linkcolour_ids ) ) {
// pass an array of page_ids to an extension
- Hooks::run( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
+ Hooks::run( 'GetLinkColours', [ $linkcolour_ids, &$colours ] );
}
# Do a second query for different language variants of links and categories
}
# Construct search and replace arrays
- $replacePairs = array();
+ $replacePairs = [];
foreach ( $this->internals as $ns => $entries ) {
foreach ( $entries as $index => $entry ) {
$pdbk = $entry['pdbk'];
$title = $entry['title'];
- $query = isset( $entry['query'] ) ? $entry['query'] : array();
+ $query = isset( $entry['query'] ) ? $entry['query'] : [];
$key = "$ns:$index";
$searchkey = "<!--LINK $key-->";
$displayText = $entry['text'];
}
if ( $displayText === '' ) {
$displayText = null;
+ } else {
+ $displayText = new HtmlArmor( $displayText );
}
if ( !isset( $colours[$pdbk] ) ) {
$colours[$pdbk] = 'new';
}
- $attribs = array();
+ $attribs = [];
if ( $colours[$pdbk] == 'new' ) {
$linkCache->addBadLinkObj( $title );
$output->addLink( $title, 0 );
- $type = array( 'broken' );
+ $link = $linkRenderer->makeBrokenLink(
+ $title, $displayText, $attribs, $query
+ );
} else {
- if ( $colours[$pdbk] != '' ) {
- $attribs['class'] = $colours[$pdbk];
- }
- $type = array( 'known', 'noclasses' );
+ $link = $linkRenderer->makePreloadedLink(
+ $title, $displayText, $colours[$pdbk], $attribs, $query
+ );
}
- $replacePairs[$searchkey] = Linker::link( $title, $displayText,
- $attribs, $query, $type );
+
+ $replacePairs[$searchkey] = $link;
}
}
$replacer = new HashtableReplacer( $replacePairs, 1 );
# Make interwiki link HTML
$output = $this->parent->getOutput();
- $replacePairs = array();
+ $replacePairs = [];
+ $linkRenderer = $this->parent->getLinkRenderer();
foreach ( $this->interwikis as $key => $link ) {
- $replacePairs[$key] = Linker::link( $link['title'], $link['text'] );
+ $replacePairs[$key] = $linkRenderer->makeLink(
+ $link['title'],
+ new HtmlArmor( $link['text'] )
+ );
$output->addInterwikiLink( $link['title'] );
}
$replacer = new HashtableReplacer( $replacePairs, 1 );
* @param array $colours
*/
protected function doVariants( &$colours ) {
- global $wgContLang, $wgContentHandlerUseDB;
+ global $wgContLang;
$linkBatch = new LinkBatch();
- $variantMap = array(); // maps $pdbkey_Variant => $keys (of link holders)
+ $variantMap = []; // maps $pdbkey_Variant => $keys (of link holders)
$output = $this->parent->getOutput();
$linkCache = LinkCache::singleton();
- $threshold = $this->parent->getOptions()->getStubThreshold();
$titlesToBeConverted = '';
- $titlesAttrs = array();
+ $titlesAttrs = [];
// Concatenate titles to a single string, thus we only need auto convert the
// single string to all variants. This would improve parser's performance
$pdbk = $entry['pdbk'];
// we only deal with new links (in its first query)
if ( !isset( $colours[$pdbk] ) || $colours[$pdbk] === 'new' ) {
- $titlesAttrs[] = array( $index, $entry['title'] );
+ $titlesAttrs[] = [ $index, $entry['title'] ];
// separate titles with \0 because it would never appears
// in a valid title
$titlesToBeConverted .= $entry['title']->getText() . "\0";
}
$variantTitle = Title::makeTitle( $ns, $textVariant );
- if ( is_null( $variantTitle ) ) {
- continue;
- }
// Self-link checking for mixed/different variant titles. At this point, we
// already know the exact title does not exist, so the link cannot be to a
}
// process categories, check if a category exists in some variant
- $categoryMap = array(); // maps $category_variant => $category (dbkeys)
- $varCategories = array(); // category replacements oldDBkey => newDBkey
+ $categoryMap = []; // maps $category_variant => $category (dbkeys)
+ $varCategories = []; // category replacements oldDBkey => newDBkey
foreach ( $output->getCategoryLinks() as $category ) {
$categoryTitle = Title::makeTitleSafe( NS_CATEGORY, $category );
$linkBatch->addObj( $categoryTitle );
continue;
}
$linkBatch->addObj( $variantTitle );
- $categoryMap[$variant] = array( $category, $categoryTitle );
+ $categoryMap[$variant] = [ $category, $categoryTitle ];
}
}
}
if ( !$linkBatch->isEmpty() ) {
// construct query
$dbr = wfGetDB( DB_SLAVE );
- $fields = array( 'page_id', 'page_namespace', 'page_title',
- 'page_is_redirect', 'page_len', 'page_latest' );
-
- if ( $wgContentHandlerUseDB ) {
- $fields[] = 'page_content_model';
- }
+ $fields = array_merge(
+ LinkCache::getSelectFields(),
+ [ 'page_namespace', 'page_title' ]
+ );
$varRes = $dbr->select( 'page',
$fields,
__METHOD__
);
- $linkcolour_ids = array();
+ $linkcolour_ids = [];
+ $linkRenderer = $this->parent->getLinkRenderer();
// for each found variants, figure out link holders and replace
foreach ( $varRes as $s ) {
$varPdbk = $variantTitle->getPrefixedDBkey();
$vardbk = $variantTitle->getDBkey();
- $holderKeys = array();
+ $holderKeys = [];
if ( isset( $variantMap[$varPdbk] ) ) {
$holderKeys = $variantMap[$varPdbk];
$linkCache->addGoodLinkObjFromRow( $variantTitle, $s );
$entry['pdbk'] = $varPdbk;
// set pdbk and colour
- # @todo FIXME: Convoluted data flow
- # The redirect status and length is passed to getLinkColour via the LinkCache
- # Use formal parameters instead
- $colours[$varPdbk] = Linker::getLinkColour( $variantTitle, $threshold );
+ $colours[$varPdbk] = $linkRenderer->getLinkClasses( $variantTitle );
$linkcolour_ids[$s->page_id] = $pdbk;
}
}
}
}
}
- Hooks::run( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
+ Hooks::run( 'GetLinkColours', [ $linkcolour_ids, &$colours ] );
// rebuild the categories in original order (if there are replacements)
if ( count( $varCategories ) > 0 ) {
- $newCats = array();
+ $newCats = [];
$originalCats = $output->getCategories();
foreach ( $originalCats as $cat => $sortkey ) {
// make the replacement
$text = preg_replace_callback(
'/<!--(LINK|IWLINK) (.*?)-->/',
- array( &$this, 'replaceTextCallback' ),
+ [ &$this, 'replaceTextCallback' ],
$text );
return $text;