User:Rillke/acewiki.js

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: press Ctrl-F5, Mozilla: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Opera/Konqueror: press F5, Safari: hold down Shift + Alt while clicking Reload, Chrome: hold down Shift while clicking Reload.
(function() {
	var tb1 = document.getElementById('wpTextbox1'),
		fileExtRegExp = /\S+\.(\S{2,5})/,
		page = mw.config.get( 'wgPageName' ),
		ns = mw.config.get( 'wgNamespaceNumber' ),
		customScripts = $.noop,
		codeNS = [ 8, 2 ],
		extensionMap = {
			'py': 'python',
			'rb': 'ruby',
			'cpp': 'c_cpp'
		},
		deps = [
			"ext.codeEditor.ace"
		],
		deps2 = ["jquery.ui"],
		deps3 = ["ext.codeEditor", "ext.wikiEditor", "jquery.client"],
		wikiace = 'ext.codeEditor.ace.wiki',
		wikiacecodebase = 'https://de.wikipedia.org/w/index.php?title=Benutzer:Matthias_M./AceWiki/$1&action=raw&ctype=text/javascript',
		$tb1, type, ext;
	
	ext = page.match(fileExtRegExp);
	if (!ext || !($.inArray( ns, codeNS ) > -1)) {
		type = 'wiki';
	} else {
		ext = ext[1].toLowerCase();
		if (ext in extensionMap) {
			deps2.push('ext.codeEditor.ace.modes');
			type = extensionMap[ext];
		}
	}
	if (/\.js(?:\/.+)?$/.test(page) && ($.inArray( ns, codeNS ) > -1)) {
		type = 'javascript';
	}
	
	switch (type) {
		case 'css':
			importScript('MediaWiki:Gadget-CSSValidate.js');
			break;
		case 'javascript':
			break;
		case 'wiki':
			if (null === mw.loader.getState(wikiace))
				customScripts = function() {
					mw.loader.implement(wikiace, [wikiacecodebase.replace('$1', 'ace/mode-wiki.js'), wikiacecodebase.replace('$1', 'ace/theme-wiki.js')], 
						{ /*no styles*/	}, { /*no messages*/ });
					deps2.push(wikiace);
				};
			break;
	}
	
	if (!tb1) return;
	$tb1 = $(tb1);
	
	if ($tb1.attr('readonly')) return;
	
	function allLoaded() {
		mw.hook( "codeEditor.configure" ).add(function() {
				var ce,
					we = $(tb1).data('wikiEditor-context');
	 
				// Wiki editor?
				if (!we) return;
	 
				// Code editor pluggedIn?
				ce = we.codeEditor;
				if (!ce) return;
				
				var profile = jQuery.client.profile(),
					inCompat = $.inArray(profile.name, ['chrome', 'firefox']) < 0;
				
				if (inCompat && we.api && we.fn) {
					we.fn.disableCodeEditor();
					we.api.removeFromToolbar(context, {
						'section': 'main',
						'group': 'format',
						'tools': 'codeEditor'
						});
				}
				ce.getSession().setUseSoftTabs(false);
				
				if ('wiki' === type) ce.getSession().setUseWrapMode(true);
		});
	}
	
	mw.config.set('wgCodeEditorCurrentLanguage', type);
	mw.loader.using( deps, function() {
		customScripts();
		mw.loader.using( deps2, function() {
			mw.loader.using( deps3, function() {
				allLoaded();
			});
		});
	} );
})();