// ] - 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.orghttps://wiki386.com/en/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
// <pre><nowiki>
var autosummary = new Object();
// see also: ]
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(/<span class=user-sig.*?<\/span>/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);
// </nowiki></pre>