社区文档构建进行中,欢迎编辑。社区答疑群(非官方):717421103

全站通知:

帮助:解析函数/displaytitle

来自WIKI实验室WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

DISPLAYTITLE

设置页面显示的标题。MediaWiki原生支持。

允许你在页面中设置自定义的显示标题,而不是默认的页面标题。

比如一些情况下无法用预期的标题创建页面,需要额外的前后缀,或使用ID、英文作为页面名。此时可以通过DISPLAYTITLE使页面显示预期的标题。 此外,页面名有限制,一些符号无法使用。DISPLAYTITLE可用于显示正确的页面名。

语法

{{DISPLAYTITLE:文本|选项}}

  • 文本:你希望在页面上显示的标题内容。
  • 选项:
    • noerror:多次使用时,不显示错误信息。
    • noreplace:如果已经设置过DISPLAYTITLE,不会替换。

示例

  • {{DISPLAYTITLE:自定义标题}} 这将使页面的显示标题为“自定义标题”,而不是实际页面标题。
  • {{DISPLAYTITLE:自定义标题|noerror}} 如果是多次使用,不显示错误信息
  • {{DISPLAYTITLE:新标题|noreplace}} 如果之前已经设置DISPLAYTITLE,不替换它(防止覆盖)

底层代码

/** mediawiki-1.37.0\includes\parser\CoreParserFunctions.php
 * Override the title of the page when viewed, provided we've been given a
 * title which will normalise to the canonical title
 *
 * @param Parser $parser Parent parser
 * @param string $text Desired title text
 * @param string $uarg
 * @return string
 */
public static function displaytitle( $parser, $text = '', $uarg = '' ) {
	global $wgRestrictDisplayTitle;

	static $magicWords = null;
	if ( $magicWords === null ) {
		$magicWords = $parser->getMagicWordFactory()->newArray(
			[ 'displaytitle_noerror', 'displaytitle_noreplace' ] );
	}
	$arg = $magicWords->matchStartToEnd( $uarg );

	// parse a limited subset of wiki markup (just the single quote items)
	$text = $parser->doQuotes( $text );

	// remove stripped text (e.g. the UNIQ-QINU stuff) that was generated by tag extensions/whatever
	$text = $parser->killMarkers( $text );

	// list of disallowed tags for DISPLAYTITLE
	// these will be escaped even though they are allowed in normal wiki text
	$bad = [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'blockquote', 'ol', 'ul', 'li', 'hr',
		'table', 'tr', 'th', 'td', 'dl', 'dd', 'caption', 'p', 'ruby', 'rb', 'rt', 'rtc', 'rp', 'br' ];

	// disallow some styles that could be used to bypass $wgRestrictDisplayTitle
	if ( $wgRestrictDisplayTitle ) {
		$htmlTagsCallback = static function ( &$params ) {
			$decoded = Sanitizer::decodeTagAttributes( $params );

			if ( isset( $decoded['style'] ) ) {
				// this is called later anyway, but we need it right now for the regexes below to be safe
				// calling it twice doesn't hurt
				$decoded['style'] = Sanitizer::checkCss( $decoded['style'] );

				if ( preg_match( '/(display|user-select|visibility)\s*:/i', $decoded['style'] ) ) {
					$decoded['style'] = '/* attempt to bypass $wgRestrictDisplayTitle */';
				}
			}

			$params = Sanitizer::safeEncodeTagAttributes( $decoded );
		};
	} else {
		$htmlTagsCallback = null;
	}

	// only requested titles that normalize to the actual title are allowed through
	// if $wgRestrictDisplayTitle is true (it is by default)
	// mimic the escaping process that occurs in OutputPage::setPageTitle
	$text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags(
		$text,
		$htmlTagsCallback,
		[],
		[],
		$bad
	) );
	$title = Title::newFromText( Sanitizer::stripAllTags( $text ) );

	if ( !$wgRestrictDisplayTitle ||
		( $title instanceof Title
		&& !$title->hasFragment()
		&& $title->equals( $parser->getTitle() ) )
	) {
		$old = $parser->getOutput()->getProperty( 'displaytitle' );
		if ( $old === false || $arg !== 'displaytitle_noreplace' ) {
			$parser->getOutput()->setDisplayTitle( $text );
		}
		if ( $old !== false && $old !== $text && !$arg ) {

			$converter = self::getTargetLanguageConverter( $parser );
			return '<span class="error">' .
				wfMessage( 'duplicate-displaytitle',
					// Message should be parsed, but these params should only be escaped.
					$converter->markNoConversion( wfEscapeWikiText( $old ) ),
					$converter->markNoConversion( wfEscapeWikiText( $text ) )
				)->inContentLanguage()->text() .
				'</span>';
		} else {
			return '';
		}
	} else {
		$parser->getOutput()->addWarning(
			wfMessage( 'restricted-displaytitle',
				// Message should be parsed, but this param should only be escaped.
				wfEscapeWikiText( $text )
			)->text()
		);
		$parser->addTrackingCategory( 'restricted-displaytitle-ignored' );
	}
}
代码逻辑:
  • 处理标题,解析Wikitext,删除由扩展标签生成的UNIQ-QINU文本,排除一系列不允许出现在DISPLAYTITLE中的标签。
  • 根据条件设置新的页面标题,并处理重复标题或限制显示标题的警告信息。
实际用例
一些Wiki使用了相关特性,如下所示这个静态列表可能在下列页面更改后过时仅供批判性参考
碧蓝航线 - blhx

原神 - ys

战双帕弥什 - zspms

明日方舟 - arknights

崩坏:星穹铁道 - sr

赛马娘 - umamusume

第五人格 - dwrg

坎特伯雷公主与骑士唤醒冠军之剑的奇幻冒险 - gt

地下城堡2 - dxcb2

东方归言录 - touhoulostword

白荆回廊 - bjhl

重返未来:1999 - reverse1999

公主连结 - pcr

无期迷途 - wqmt

赛尔号 - seer