User:BrandonXLF/TestWikitext.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/*** Test Wikitext ***/

// Adds a link to conveniently test wikitext
// Documentation at [[en:w:User:BrandonXLF/TestWikitext]]
// By [[en:w:User:BrandonXLF]]

$.when(mw.loader.using('oojs-ui'), $.ready).then(function() {
	mw.util.addPortletLink('p-cactions', mw.util.getUrl('Special:BlankPage/TestWikitext'), 'Test wikitext');

	if (mw.config.get('wgPageName') === 'Special:BlankPage/TestWikitext') {
		var preview = new OO.ui.ButtonInputWidget({
			label: 'Test',
			flags: [
				'primary',
				'progressive'
			]
		});

		preview.on('click', function() {
			output.empty().append(
				new OO.ui.ProgressBarWidget({
					progress: false
				}).$element.css('min-width', '100%')
			);

			$.post(mw.config.get('wgScriptPath') + '/api.php', {
				action: 'parse',
				pst: 'true',
				disableeditsection: 'true',
				title: title.getValue() || 'Test Wikitext',
				text: code.$input.textSelection('getContents'),
				format: 'json',
				prop: 'text|displaytitle|categorieshtml|limitreporthtml|indicators'
			}).done(function(r) {
				output.empty().append(
					$('<div>')
						.addClass('test-wikitext-header')
						.append(
							$('<div>')
								.addClass('test-wikitext-indicators')
								.append(
									$.map(r.parse.indicators, function(indicator) {
										return $('<div>')
											.attr('id', 'mw-indicator-' + indicator.name)
											.html(indicator['*']);
									})
								),
							$('<h1>').html(r.parse.displaytitle)
						),
					r.parse.text['*'],
					r.parse.categorieshtml['*'],
					new OO.ui.PanelLayout({
						expanded: false,
						framed: true,
						padded: true,
						$content: $(r.parse.limitreporthtml['*'])
					}).$element.css({
						marginTop: '2em',
						clear: 'both'
					})
				);
			});
		});

		var title = new OO.ui.TextInputWidget({
			value: localStorage.getItem('testwikitext-title'),
			name: 'title',
			placeholder: 'Title'
		});

		title.$element.css({
			width: '100%',
			maxWidth: '100%',
			marginBottom: '1em'
		});

		title.on('change', function(value) {
			localStorage.setItem('testwikitext-title', value);
		});

		var code = new OO.ui.MultilineTextInputWidget({
			rows: 10,
			maxRows: 20,
			autosize: true,
			name: 'wpTextbox1',
			value: localStorage.getItem('testwikitext'),
			placeholder: 'Wikitext'
		});

		code.$element.css({
			width: '100%',
			maxWidth: '100%',
			marginBottom: '1em'
		});

		code.on('change', function(value) {
			localStorage.setItem('testwikitext', value);
		});

		mw.hook('ext.CodeMirror.switch').add(function(enabled, el) {
			if (!enabled) return;

			el[0].CodeMirror.on('change', function(codeMirror) {
				localStorage.setItem('testwikitext', codeMirror.getValue());
			});
		});

		mw.loader.using('ext.wikiEditor', function() {
			mw.addWikiEditor(code.$input);
			mw.loader.load(['ext.TemplateWizard', 'ext.CodeMirror']);
		});

		var parent = $('<div>')
				.attr('id', 'testwikitext')
				.append(title.$element)
				.append(code.$element)
				.append(
					$('<div>').append(preview.$element)
				),
			panel = new OO.ui.PanelLayout({
				expanded: false,
				framed: true,
				padded: true,
				$content: parent
			}),
			output = $('<div>');

		document.title = 'Test Wikitext - ' + mw.config.get('wgSiteName');

		$('#firstHeading').text('Test Wikitext');
		$('#mw-content-text').empty().append(panel.$element, output);
	}

	mw.loader.addStyleTag(
		'#testwikitext .wikiEditor-ui-view { border: none; }' +
		'#testwikitext .wikiEditor-ui-top { border: 1px solid #a2a9b1; border-bottom: none; }' +
		'#testwikitext .wikiEditor-ui .oo-ui-textInputWidget .oo-ui-inputWidget-input { font-family: monospace; border-radius: 0; }' +
		'#testwikitext .CodeMirror { border: 1px solid #a2a9b1; }' +
		'.test-wikitext-header { position: relative; }' +
		'.test-wikitext-header .test-wikitext-indicators { position: absolute; right: 0; }'
	);
});