Hey all,
Last Friday, the mw.Title rewrite landed in master. Here's a brief summary of the changes.
TL:DR; * New static constructor mw.Title.newFromText (returns mw.Title or null). * New internal title parser (uses wgLegalTitleChars and mirrors most of Title::secureAndSplit). * Bugs like [[.com]] throwing have been fixed. * Big thanks to David Chan!
New: Static constructor mw.Title.newFromText
Unlike the regular constructor, this one does not throw exceptions on invalid input. Instead it returns null. This should make using mw.Title less awkward.
As a reminder, you are still required to account for invalid input. Where you previously wrapped `new mw.Title` it in a try/catch (which many users forgot), one may now use mw.Title.newFromText and check the result for truthiness.
Examples:
```php $title = Title::newFromText( $input ); if ( $title ) { .. } ```
```js title = mw.Title.newFromText( input ); if ( title ) { .. } ```
Regular constructor (old pattern): ```js try { title = new mw.Title( input ); } catch ( e ) { .. }
if ( title ) { .. } ```
New: Title parser
Previously mw.Title had a very basic processor for the text input. It was designed to be looser than its PHP counterpart so that it is fast and defaults to considering something valid. It is indeed more important to not consider something invalid when it is is in fact valid, than the other way around. Clients should never be blocking an action and it'll have to go through the server anyway at some point. Though that design is good, it is not what it really was.
In practice mw.Title's old processor considered various things invalid that were valid. And it had certain side-effects that weren't very intuitive (it removed certain invalid characters so that the title would become valid;in other cases it would throw an exception).
The new parser uses wgLegalTitleChars [2] and mirrors most of Title::secureAndSplit. For this we had to convert the character sequences in wgLegalTitleChars from bytes to Unicode. Big thanks to David Chan for making this work!
A full list of bugs fixed and patterns now properly recognised as valid and invalid can be found in the commit message[1] and by examining the added test cases.
Various bugs have been fixed (e.g. titles starting with dots, such as [[.com]], throwing an exception).
Documentation: https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.Title
-- Timo
[1] https://gerrit.wikimedia.org/r/#/c/83047/ https://github.com/wikimedia/mediawiki-core/commit/4894793ab60ea0a245372cb47... [2] https://gerrit.wikimedia.org/r/#/c/82040/ https://github.com/wikimedia/mediawiki-core/commit/dc9c9ee7fc6d96f957e15b4f5... [3] https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw.Title