User:Quarl/auto summary.js
From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Firefox/Mozilla/Safari: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Internet Explorer: press Ctrl-F5, Opera/Konqueror: press F5.
// [[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 // <pre><nowiki> 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(/<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; } addOnloadHook(autosummary._load); // </nowiki></pre>