MediaWiki:Gadget-wm-portal-preview.js
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);
}());