MediaWiki:Gadget-wm-portal-preview.js

From Meta, a Wikimedia project coordination wiki

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/**
 * Wikimedia Portal Template Previewer.
 * See also [[m:Project portals]].
 *
 * @author Splarka, 2008
 * @author Krinkle, 2012–2020
 * @source meta.wikimedia.org/wiki/MediaWiki:Gadget-wm-portal-preview.js
 */
/*global mw, $, window*/
(function () {
	"use strict";
	var link,
		pageName = mw.config.get('wgPageName'),
		action = mw.config.get('wgAction');

	function createPopup(html) {
		var popupWindow = window.open('', 'portal_preview', 'scrollbars=1,height=600,width=800,toolbar=0,menubar=0,location=1,directories=0,status=0,resizable=1');
		popupWindow.document.write(html);
		popupWindow.document.close();
	}

	function previewTextareaContents() {
		var html = $('#wpTextbox1').data('wikiEditor-context')
			.$textarea.textSelection('getContents');
		if (html.match(/^\{\{\s*subst:\s*#invoke:\s*[Pp]roject[ _]portal\s*\|\s*(?:generated|minified)Portal\s*[}|]/)) {
			previewParsedWikitext(html);
		} else {
			createPopup(html);
		}
	}

	function previewWikitextFromApi() {
		(new mw.Api()).get({
			action: 'query',
			prop: 'revisions',
			rvprop: 'content',
			indexpageids: '',
			titles: pageName
		}).done(function (obj) {
			var page, html;

			if (obj.query && obj.query.pageids && obj.query.pages) {
				page = obj.query.pages[obj.query.pageids[0]];
				if (page && page.revisions && page.revisions[0] && page.revisions[0]['*']) {
					html = page.revisions[0]['*'];
					createPopup(html);
					return;
				}
			}

			// Error
			mw.notify('Portal preview could not be rendered.');
		}).fail(function (err) {
			mw.notify('Portal preview could not be rendered:\n\n' + err);
		});
	}

	function previewParsedWikitext(wikitext) {
		wikitext = wikitext || '{' + '{subst:#invoke:Project portal|generatedPortal|template=' + pageName + '}}';
		(new mw.Api()).get({
			action: 'parse',
			format: 'json',
			title: pageName.match("^[^/]+")[0],
			text: wikitext,
			prop: 'text',
			onlypst: true,
			disabletidy: true,
			contentmodel: 'wikitext'
		}).done(function (obj) {
			var html = obj.parse && obj.parse.text && obj.parse.text["*"];
			if (html) {
				createPopup(html);
			} else {
				mw.notify('Portal preview could not be rendered.');
			}
		}).fail(function (err) {
			mw.notify('Portal preview could not be rendered:\n\n' + err);
		});
	}

	function init() {
		// Determine if this page is likely to be a project portal
		if (
			(pageName.indexOf('Www.') === 0 || pageName.indexOf('Secure.') === 0 || pageName.indexOf('Wikimedia_missing_site') === 0 || pageName.indexOf('API_listing') === 0)
				&& pageName.indexOf('_template') > 0
		) {
			if (action === 'edit' || action === 'submit') {
				link = mw.util.addPortletLink(
					'p-cactions',
					'#',
					'Preview HTML',
					'ca-portalpreview',
					'Render contents of the textarea as HTML (Warning: may contain arbitrary javascript)'
				);
				$(link).add("#wpPreview").click(function (e) {
					e.preventDefault();
					previewTextareaContents();
				});
			} else {
				link = mw.util.addPortletLink(
					'p-cactions',
					'#',
					'Preview HTML',
					'ca-portalpreview',
					'Render contents of this wikipage as HTML (Warning: may contain arbitrary javascript)'
				);
				$(link).click(function (e) {
					e.preventDefault();
					if (pageName.indexOf('/') === -1) {
						previewWikitextFromApi();
					} else {
						previewParsedWikitext();
					}
				});
			}
		}
	}

	$(init);

}());