User:Quarl/auto summary.js

// User:Quarl/auto_summary.js - automatically fill in edit summary based on diff; short cuts

// depends: wikipage.js, wikiedit.js, util.js, diff.js, shortcuts.js

// recommends: smartsubmit.js

// originally based on http://en.wikipedia.org/wiki/Wikipedia:WikiProject_User_scripts/Scripts/Force_edit_summary

// quarl 2006-01-26 added shortcuts

// quarl 2006-01-30 auto diff

// TODO: add a checkbox for "auto" next to summary, to disable auto diff

//

var autosummary = new Object();

// see also: Wikipedia:Edit_summary_legend

autosummary.shortcuts = Shortcuts({

'ed' : 'editing', // 'edit'

'cped,cpediting,cpyed,copyed,copyedit' : 'copy-editing',

'mn ' : 'minor',

'mnf ' : 'minor fixes',

'fmt' : 'formatting',

'mfmt ' : 'minor formatting',

'rv' : 'reverting',

'rvv' : 'reverting vandalism',

'gr' : 'grammar',

'sp' : 'spelling',

'rd ' : 'redirect',

'cmt' : 'commenting',

'cla' : 'clarifying',

'xl,xlink' : 'external link',

'sa' : 'see also',

'cap' : 'capitalization',

'catz' : 'categorizing',

'cl,cu' : 'cleaning up',

'newart,creat' : 'creating new article',

'dab,disamb,disam,disambig' : 'disambiguating',

'rddab' : 'replacing redirect with disambiguation page',

//'st' : 'see Talk page',

'style' : 'style',

'punc,punct,pnct' : 'punctuation',

'wfy,wkfy' : 'wikifying'

});

autosummary.prompt = 'Enter edit summary. ' + autosummary.shortcuts.msg();

// whether to query even when filled via auto diff

autosummary.query = true;

// whether to default edit summary to diff (not needed if

// autosummary.auto_diff is enabled)

autosummary.diff = true;

// whether to automatically prepend "(auto diff)" to edit summary while

// editing. Use integer number of seconds for update interval (in sec), or

// false to disable.

autosummary.auto_diff = 3;

// whether to automatically select text after the /* section */ and « diff »

autosummary.auto_select = true;

autosummary._load = function()

{

if (!WikiPage.editingP) return;

if (WikiPage.newSectionP) return;

if (autosummary.auto_diff) {

autosummary._autoDiffSetup();

}

if (autosummary.auto_select) {

hookEventObj(document.editform.wpSummary, 'focus', autosummary._focusSummaryEvent);

}

hookEventObj(document.editform.wpSave, 'click', autosummary._preSubmitEvent);

}

autosummary._autoDiffSetup = function() {

hookEventObj(document.editform.wpTextbox1, 'blur', autosummary._updateAutoDiff);

autosummary._autoDiffTimerUpdate();

}

autosummary._autoDiffTimerUpdate = function() {

autosummary._updateAutoDiff();

setTimeout(autosummary._autoDiffTimerUpdate, 1000*autosummary.auto_diff);

}

autosummary._textFilter = function(s) {

// ignore signature when diffing

return s.replace(/~~~~/g,).replace(//g, );

}

autosummary._diffStrings = function(s1,s2) {

return diffSummary(autosummary._textFilter(s1), autosummary._textFilter(s2));

}

autosummary.diffTextbox = function() {

var editor = wikiPage.getEditor();

return autosummary._diffStrings(editor.wpTextbox1_orig, editor.wpTextbox1);

}

// update the edit summary with diff

autosummary._updateAutoDiff = function() {

var editor = wikiPage.getEditor();

editor.updateThis();

if (editor.wpTextbox1_prev == editor.wpTextbox1) {

// no change since last update

return;

}

editor.wpTextbox1_prev = editor.wpTextbox1;

var s = autosummary.diffTextbox();

if (s) {

s = "«" + s + "» ";

}

if (editor.wpSummary.match(/\«/)) {

editor.wpSummary = editor.wpSummary.replace(/«.*?» */, s);

} else if (s && !autosummary._pruneSection(editor.wpSummary)) {

editor.wpSummary = trimspaces(editor.wpSummary);

if (editor.wpSummary) editor.wpSummary += ' ';

editor.wpSummary += s;

}

editor.updateForm();

}

autosummary._preSubmitEvent = function(event)

{

if (autosummary.auto_diff) autosummary._updateAutoDiff();

var editor = wikiPage.getEditor();

editor.updateThis();

var r = autosummary._edit(editor);

editor.updateForm();

if (!r) {

event.preventDefault();

event.stopPropagation();

}

}

// auto focus

autosummary._focusSummaryEvent = function(event) {

var sumField = document.editform.wpSummary;

if (sumField.value.match(/^(?:\/\*.*?\*\/)?\s*(?:«(?:.*)»)? ?/)) {

var n = RegExp.lastMatch.length;

var m = sumField.value.length;

// apparently you can't setSelectionRange in an onFocus handler, but

// you can set a timer to do it 0 seconds from now.

setTimeout(function() { sumField.setSelectionRange(n, m) }, 0);

}

}

autosummary._pruneSection = function(s) {

return trimspaces(s.replace(/^\/\\*.*?\\*\//,''));

}

autosummary._edit = function(editor)

{

if (editor.wpTextbox1_orig == editor.wpTextbox1) {

// no change

return true;

}

var auto = false;

if (!editor.wpSummary.match(/REDIRECT/i) &&

editor.wpTextbox1.match(/^#REDIRECT/i))

{

// it's a redirect. Annotate with REDIRECT.

if (autosummary.auto_diff) {

// don't need auto diff

// editor.wpSummary = editor.wpSummary.replace(/^〈.*?〉 */, '');

}

editor.wpSummary += editor.wpTextbox1;

auto = true;

} else if (autosummary._pruneSection(editor.wpSummary)) {

// non-negligible summary exists; continue with submission

editor.wpSummary = autosummary.shortcuts.substWords(editor.wpSummary);

return true;

} else if (autosummary.diff) {

// if we get here then we're not using auto diff, or user manually

// removed it

var s = autosummary.diffTextbox();

if (s) {

editor.wpSummary += s;

auto = true;

}

}

if (!auto || autosummary.query) {

var r = prompt(autosummary.prompt, editor.wpSummary);

if(r == null) { return false; } // cancel

editor.wpSummary = autosummary.shortcuts.substWords(r);

}

return true;

}

$(autosummary._load);

//