protected $nsInfo;
/**
- * @param Language $language The language object to use for localizing namespace names.
+ * @param Language $language The language object to use for localizing namespace names,
+ * capitalization, etc.
* @param GenderCache $genderCache The gender cache for generating gendered namespace names
* @param string[]|string $localInterwikis
* @param InterwikiLookup|null $interwikiLookup
);
}
+ /**
+ * Given a namespace and title, return a TitleValue if valid, or null if invalid.
+ *
+ * @param int $namespace
+ * @param string $text
+ * @param string $fragment
+ * @param string $interwiki
+ *
+ * @return TitleValue|null
+ */
+ public function makeTitleValueSafe( $namespace, $text, $fragment = '', $interwiki = '' ) {
+ if ( !$this->nsInfo->exists( $namespace ) ) {
+ return null;
+ }
+
+ $canonicalNs = $this->nsInfo->getCanonicalName( $namespace );
+ $fullText = $canonicalNs == '' ? $text : "$canonicalNs:$text";
+ if ( strval( $interwiki ) != '' ) {
+ $fullText = "$interwiki:$fullText";
+ }
+ if ( strval( $fragment ) != '' ) {
+ $fullText .= '#' . $fragment;
+ }
+
+ try {
+ $parts = $this->splitTitleString( $fullText );
+ } catch ( MalformedTitleException $e ) {
+ return null;
+ }
+
+ return new TitleValue(
+ $parts['namespace'], $parts['dbkey'], $parts['fragment'], $parts['interwiki'] );
+ }
+
/**
* @see TitleFormatter::getText()
*
# and [[Foo]] point to the same place. Don't force it for interwikis, since the
# other site might be case-sensitive.
$parts['user_case_dbkey'] = $dbkey;
- if ( $parts['interwiki'] === '' ) {
- $dbkey = Title::capitalize( $dbkey, $parts['namespace'] );
+ if ( $parts['interwiki'] === '' && $this->nsInfo->isCapitalized( $parts['namespace'] ) ) {
+ $dbkey = $this->language->ucfirst( $dbkey );
}
# Can't make a link to a namespace alone... "empty" local links can only be