mediawiki-extensions-Visual.../modules/ve/ui/inspectors/ve.ui.MWLinkInspector.js
Ed Sanders 14fa3b0999 Fix comparison of MW internal links
We need to normalise titles so 'user:foo_bar' == 'User:Foo bar', and
we also need to some HTML attribute removal as links from Parsoid
will have href and rel set (again, this should be fixed in by Parsoid
when the do the merging at their end).

Bug: 49985
Change-Id: I5fb5bfc69c344ca4ce4803d7b6116074648a8d7e
2013-06-27 17:43:34 +01:00

88 lines
2.3 KiB
JavaScript

/*!
* VisualEditor UserInterface LinkInspector class.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/*global mw */
/**
* MediaWiki link inspector.
*
* @class
* @extends ve.ui.LinkInspector
*
* @constructor
* @param {ve.ui.Surface} surface
* @param {Object} [config] Config options
*/
ve.ui.MWLinkInspector = function VeUiMWLinkInspector( surface, config ) {
// Parent constructor
ve.ui.LinkInspector.call( this, surface, config );
};
/* Inheritance */
ve.inheritClass( ve.ui.MWLinkInspector, ve.ui.LinkInspector );
/* Static properties */
ve.ui.MWLinkInspector.static.modelClasses = [
ve.dm.MWExternalLinkAnnotation, ve.dm.MWInternalLinkAnnotation
];
ve.ui.MWLinkInspector.static.linkTargetInputWidget = ve.ui.MWLinkTargetInputWidget;
/* Methods */
/**
* Gets an annotation object from a target.
*
* The type of link is automatically detected based on some crude heuristics.
*
* @method
* @param {string} target Link target
* @returns {ve.dm.MWInternalLinkAnnotation|ve.dm.MWExternalLinkAnnotation}
*/
ve.ui.MWLinkInspector.prototype.getAnnotationFromTarget = function ( target ) {
var title;
// Figure out if this is an internal or external link
if ( ve.init.platform.getExternalLinkUrlProtocolsRegExp().test( target ) ) {
// External link
return new ve.dm.MWExternalLinkAnnotation( {
'type': 'link/mwExternal',
'attributes': {
'href': target
}
} );
} else {
// Internal link
// TODO: In the longer term we'll want to have autocompletion and existence and validity
// checks using AJAX
try {
title = new mw.Title( target );
if ( title.getNamespaceId() === 6 || title.getNamespaceId() === 14 ) {
// File: or Category: link
// We have to prepend a colon so this is interpreted as a link
// rather than an image inclusion or categorization
target = ':' + target;
}
} catch ( e ) { }
return new ve.dm.MWInternalLinkAnnotation( {
'type': 'link/mwInternal',
'attributes': {
'title': target,
'normalizedTitle': ve.dm.MWInternalLinkAnnotation.static.normalizeTitle( target )
}
} );
}
};
/* Registration */
ve.ui.inspectorFactory.register( 'mwLink', ve.ui.MWLinkInspector );
ve.ui.viewRegistry.register( 'mwLink', ve.ui.MWLinkInspector );