User:Lockal/rawedit.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.
function cleanJson(x) {
var r = /\\u([\d\w]{4})/gi;
x = x.replace(r, function (match, grp) { return String.fromCharCode(parseInt(grp, 16)); } );
x = unescape(x);
return x;
}
function formatJson(x) {
var r = '';
var noformat = false;
var spaces = 0;
for (var i = 0; i < x.length; i++) {
if (x[i] === '\\') { r += x[i]; i++; r += x[i]; }
else if (x[i] === '"') { noformat = !noformat; r += x[i]; }
else if (noformat) { r += x[i]; }
else if (x[i] === '{') { spaces++; r += '\n' + Array(spaces).join(" ") + x[i]; }
else if (x[i] === '}' && x[i+1] === ',') { spaces--; r += x[i] + x[i+1] + '\n' + Array(spaces).join(" "); i++; }
else if (x[i] === '}') { spaces--; r += x[i] + '\n' + Array(spaces).join(" "); }
else if (x[i] === ':' || x[i] === ',' ) { r += x[i] + ' '; }
else { r += x[i]; }
}
return r;
}
// cleanJson(mw.config.get('wbEntity'));
function rawEditSetup() {
importStylesheet( 'User:Lockal/jsoneditor.min.css' );
// mw.loader.load( 'https://cdn.rawgit.com/josdejong/jsoneditor/master/dist/jsoneditor.min.css', 'text/css' ); // we need svg with icons :(
var js, fjs = document.getElementsByTagName('script')[0];
if (document.getElementById('jsoneditor-minimalist')){ return; }
js = document.createElement('script'); js.id = 'jsoneditor-minimalist';
js.onload = rawEdit;
js.src = "https://www.wikidata.org/w/index.php?title=User:Lockal/jsoneditor-minimalist.min.js&action=raw&ctype=text/javascript";
fjs.parentNode.insertBefore(js, fjs);
}
function rawEdit() {
if ($(".articlepreview")) { $(".articlepreview").remove(); }
var $editbox = $('<textarea wrap="off" autocorrect="off" autocapitalize="off" spellcheck="false" id="#wpTextbox1" accesskey="," cols="80" rows="25" style=""></textarea>');
var $jsonbox = $('<div style="width: 500px;"></div>');
var editor = new JSONEditor($jsonbox[0], {});
var $betweenbox = $('<div style="align-self: center;"></div>');
var $text2json = $('<button style="display: block; margin: 2px 4px;">></button>').click(function(){ editor.set(JSON.parse($editbox.val())); });
var $json2text = $('<button style="display: block; margin: 2px 4px;"><</button>').click(function(){ $editbox.val(formatJson(JSON.stringify(editor.get()))); });
$betweenbox.append($text2json).append($betweenbox).append($json2text);
var $editwrapper = $('<div style="display: flex; width: 100%;"></div>').append($editbox).append($betweenbox).append($jsonbox);
// $editbox.val(formatJson(cleanJson(mw.config.get('wbEntity'))));
$.ajax({
type: 'GET',
url: mw.util.wikiScript('api'),
data: {
'format': 'json',
'formatversion': 2,
'action': 'query',
'prop': 'revisions',
'rvprop': 'content',
'titles': mw.config.get('wgPageName'),
}
})
.done(function(data) {
var content = data.query.pages[Object.keys(data.query.pages)[0]].revisions[0].content;
var cleaned = formatJson(cleanJson(content));
$editbox.val(cleaned);
editor.set(JSON.parse(cleaned));
})
.fail(function(data) {
console.error(data);
});
var $summary = $('<div class="oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-textInputWidget oo-ui-textInputWidget-type-text"><input class="mw-summary" id="wpSummary" maxlength="255" tabindex="1" size="60" spellcheck="true" accesskey="b"></div>');
var $save = $('<span class="oo-ui-widget oo-ui-widget-enabled oo-ui-flaggedElement-constructive oo-ui-flaggedElement-primary oo-ui-inputWidget oo-ui-buttonElement oo-ui-buttonElement-framed oo-ui-labelElement oo-ui-buttonInputWidget"><input type="button" class="oo-ui-inputWidget-input oo-ui-buttonElement-button" value="Save" /></span>').click(function() {
var summary = $summary.find('input').val();
if (summary.length) summary += ' ';
summary += '#rawedit';
$.ajax({
type: 'POST',
url: mw.util.wikiScript('api'),
data: {
'format': 'json',
'action': 'wbeditentity',
'clear': 1,
'id': mw.config.get('wbEntityId'),
'token': mw.user.tokens.get('csrfToken'),
'data': $editbox.val(),
'summary': summary,
'baserevid': mw.config.get('wgRevisionId'),
// 'exclude': 'pageid|ns|title|lastrevid|touched'
}
})
.done(function(data) {
if (data.success == 1) {
console.log(data);
location.reload();
} else {
console.error(data);
}
})
.fail(function(data) {
console.error(data);
});
});
$('#bodyContent').empty().append($editwrapper).append(
$('<div class="editOptions" />')
.append($summary)
.append(
$('<div class="editButtons" />').append($save)
)
);
}
$(function(){
if ((mw.config.get('wgNamespaceNumber') === 0 || mw.config.get('wgNamespaceNumber') === 120) &&
(mw.config.get('wgPageContentModel') === 'wikibase-item' || mw.config.get('wgPageContentModel') === 'wikibase-property') &&
mw.config.get('wgAction') === 'view' &&
mw.config.get('wgPageName')) {
mw.util.addPortletLink('p-cactions', '#', 'Raw Edit', 'rawedit');
document.getElementById('rawedit').setAttribute('onclick', 'rawEditSetup()');
}
});