User:Gryllida/js/addWikiLinks-0.1.js

From Wikinews, the free news source you can write!
Jump to navigation Jump to search

Note: After saving, you may have to bypass your browser's cache to see the changes. Mozilla / Firefox / Safari: hold down Shift while clicking Reload, or press Ctrl-Shift-R (Cmd-Shift-R on Apple Mac); IE: hold Ctrl while clicking Refresh, or press Ctrl-F5; Konqueror: simply click the Reload button, or press F5; Opera users may need to completely clear their cache in Tools→Preferences. — More skins

/*
Author : Svetlana Tkachenko svetlana@members.fsf.org
Licence: GPLv3+
Description: [beta] wikilink buttons to local or wikipedia, or to an exact title match (auto-detect)
Version: 0.1
TODO: 
  [ ] suggest titles (autocomplete?)
  [ ] check for disambiguations (wikipedia)
See also <https://en.wikinews.org/wiki/User:Gryllida/Tasks>

* http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar customization
  technical details of customizing the toolbar
* http://www.mediawiki.org/wiki/Extension:WikiEditor/Toolbar customization/Library
  snippets of code for common additions to the toolbar

*/ 

mw.loader.using(['mediawiki.api'], function () {
	"use strict";
	var addWikipediaWikilink = function(context){
		var selection = context.$textarea.textSelection( 'getSelection' );
		var api = new mw.Api();
		var prefix = '';
		var postfix = '';
        var wikiUrl = "//en.wikipedia.org/w/api.php?action=query&titles="+selection+"&format=json";
        $.ajax(wikiUrl, {
            dataType: "jsonp",
            success: function( data ) {
				if(data.query.pages['-1']){// page does not exist locally
					prefix = '{' + '{W||';
					postfix = '}}';
					encapsulateMyLink(prefix, postfix, 4);
				} else {// page exists locally
					prefix = '{' + '{W|';
					postfix = '}}';
					encapsulateMyLink(prefix, postfix, 0);
				}
            }
        });
	};
	var addLocalWikilink = function(context){
		var selection = context.$textarea.textSelection( 'getSelection' );
		var api = new mw.Api();
		var prefix = '';
		var postfix = '';
		api.get({
			action: 'query',
			titles: selection
		}).done(function(data){
			if(data.query.pages['-1']){// page does not exist locally
				prefix = '[[|';
				postfix = ']]';
				encapsulateMyLink(prefix, postfix, 2);
			} else {// page exists locally
				prefix = '[[';
				postfix = ']]';
				encapsulateMyLink(prefix, postfix, 0);
			}
		});
	};
	var encapsulateMyLink= function(prefix, postfix, offset){
		var cursorPos = $( '#wpTextbox1' ).textSelection( 'getCaretPosition', { startAndEnd: true } );
		$( '#wpTextbox1' ).focus();
        $.wikiEditor.modules.toolbar.fn.doAction(
            $( '#wpTextbox1' ).data( 'wikiEditor-context' ),
            {
				'type': 'encapsulate',
				'options': {
					'pre': prefix,
					'peri': '',
					'post': postfix
				}
            },
            $( '#wpTextbox1' )
		);
		$( '#wpTextbox1' ).textSelection( 'setSelection', { start: cursorPos[ 0 ]+offset, end: cursorPos[ 0 ]+offset} );
	}
	var addSmartWikilink = function(context){
		var selection = context.$textarea.textSelection( 'getSelection' );
		var api = new mw.Api();
		var prefix = '';
		var postfix = '';
		// https://en.wikipedia.org/w/api.php?action=query&titles=User:Grjhyllida&format=json
		// query.pages['-1']
		api.get({
			action: 'query',
			titles: selection
		}).done(function(data){
			if(data.query.pages['-1']){ // page does not exist locally
		        var wikiUrl = "//en.wikipedia.org/w/api.php?action=query&titles="+selection+"&format=json";
		        $.ajax(wikiUrl, {
		            dataType: "jsonp",
		            success: function( data ) {
						if(!data.query.pages['-1']){ // exists at wikipedia
							prefix = '{' + '{W|';
							postfix = '}}';
							encapsulateMyLink(prefix, postfix, 0);
						} else {
							encapsulateMyLink('?', '', 0);
						}
		            }
		        });
			} else {
				prefix = '[['; // page exists locally
				postfix = ']]';
				encapsulateMyLink(prefix, postfix, 0);
			}
		});
	};
	// == WikiEditor codes ==
	var customizeToolbar = function () {
		// add buttons for {{tl|W|}} and [[]]
		$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
			'section': 'main',
			'group': 'insert',
			'tools': {
				'addWPLink': {
					label: 'Add a wikipedia wikilink',
					type: 'button',
					icon: '//upload.wikimedia.org/wikipedia/commons/8/8a/Wikilinkicon-p.png',
					'action': {
						'type': 'callback',
						execute: function(context){
							addWikipediaWikilink(context);
						}
					},
				},
				'addWNLink': {
					label: 'Add a local wikilink',
					type: 'button',
					icon: '//upload.wikimedia.org/wikipedia/commons/d/d3/Wikilinkicon-n.png',
					'action': {
						'type': 'callback',
						execute: function(context){
							addLocalWikilink(context);
						}
					},
				}
			}
		} );
		// remove the "add a [[]] or external link" button
		$( '#wpTextbox1' ).wikiEditor( 'removeFromToolbar',{ 
			section: 'main', 
			group: 'insert', 
			tool: 'link' 
		} );
		// remove reference button
		$( '#wpTextbox1' ).wikiEditor( 'removeFromToolbar',{ 
			section: 'main', 
			group: 'insert', 
			tool: 'reference' 
		} );
		// add a smart wikilink button
		$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
			'section': 'main',
			'group': 'insert',
			'tools': {
				'addSmartWikiLink': {
					label: 'Add a smart wikilink',
					type: 'button',
					icon: '//upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Link-icon.svg/22px-Link-icon.svg.png',
					action: {
						type: 'callback',
						execute: function(context){
							addSmartWikilink(context);
						}
					}
				}
			}
		} );
	};
	/* Check if view is in edit mode and that the required modules are available. Then, customize the toolbar … */
	if ( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) {
		mw.loader.using( 'user.options' ).then( function () {
			// This can be the string "0" if the user disabled the preference ([[phab:T54542#555387]])
			if ( mw.user.options.get( 'usebetatoolbar' ) == 1 ) {
				$.when(
					mw.loader.using( 'ext.wikiEditor' ), $.ready
				).then( customizeToolbar );
			}
		} );
	}
	// == WikiEditor codes end ==

});