|
|
Line 14: |
Line 14: |
| ); | | ); |
|
| |
|
| /* ######################################################################## */
| | var ArchiveToolConfig = { |
| /* ### ARCHIVE TOOL ### */
| | archiveListTemplate: 'Archives', |
| /* ### ---------------------------------------------------------------- ### */
| | archivePageTemplate: 'Archivepage', |
| /* ### Description: AJAX-archiving of talk pages via GUI ### */
| | archiveSubpage: 'Archive', |
| /* ### Credit: User:Dantman (original) ### */
| | userLang: true |
| /* ### User:Porter21 (Oasis & Monobook support) ### */
| | }; |
| /* ######################################################################## */
| | var ArchiveToolConfig = { |
|
| | en: { |
| /*
| | buttonArchiveTool: "Archive", |
| * Copyright © 2009, Daniel Friesen
| | buttonArchiveToolTooltip: "Archive this page", |
| * All rights reserved.
| | buttonSelectAll: "Select all", |
| *
| | buttonDeselectAll: "Deselect all", |
| * Redistribution and use in source and binary forms, with or without
| | buttonSaveArchive: "Save archive", |
| * modification, are permitted provided that the following conditions are met:
| | buttonAbort: "Abort", |
| * * Redistributions of source code must retain the above copyright
| | labelLines: "Lines", |
| * notice, this list of conditions and the following disclaimer.
| | labelSections: "Sections", |
| * * Redistributions in binary form must reproduce the above copyright
| | summaryArchiveFrom: "ArchiveTool: Archiving from", |
| * notice, this list of conditions and the following disclaimer in the
| | summaryArchiveTo: "ArchiveTool: Archiving to" |
| * documentation and/or other materials provided with the distribution.
| |
| * * Neither the name of the script nor the
| |
| * names of its contributors may be used to endorse or promote products
| |
| * derived from this software without specific prior written permission.
| |
| *
| |
| * THIS SOFTWARE IS PROVIDED BY DANIEL FRIESEN ''AS IS'' AND ANY
| |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
| |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
| |
| * DISCLAIMED. IN NO EVENT SHALL DANIEL FRIESEN BE LIABLE FOR ANY
| |
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
| |
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
| |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
| |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
| |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
| |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
| |
| */
| |
|
| |
| function archiveTool () {
| |
| // Configuration
| |
| var config = window.ArchiveToolConfig = $.extend(true, {
| |
| archiveListTemplate: 'Archives',
| |
| archivePageTemplate: 'Archivepage',
| |
| archiveSubpage: 'Archive',
| |
| userLang: false,
| |
| // English
| |
| en: {
| |
| buttonArchiveTool: "Archive",
| |
| buttonArchiveToolTooltip: "Archive this page",
| |
| buttonSelectAll: "Select all",
| |
| buttonDeselectAll: "Deselect all",
| |
| buttonSaveArchive: "Save archive",
| |
| buttonAbort: "Abort",
| |
| labelLines: "Lines",
| |
| labelSections: "Sections",
| |
| summaryArchiveFrom: "ArchiveTool: Archiving from",
| |
| summaryArchiveTo: "ArchiveTool: Archiving to"
| |
| }
| |
| }, window.ArchiveToolConfig || {});
| |
|
| |
| // Function for multi-language support
| |
| function msg(name) {
| |
| if ( config.userLang && wgUserLanguage in config && name in config[wgUserLanguage] )
| |
| return config[wgUserLanguage][name];
| |
| if ( wgContentLanguage in config && name in config[wgContentLanguage] )
| |
| return config[wgContentLanguage][name];
| |
| return config.en[name];
| |
| } | | } |
|
| | } |
| if (skin != "monaco" && skin != 'monobook' && skin != 'oasis' && skin != 'wikia') {
| | importScriptPage('ArchiveTool/code.js', 'dev'); |
| return;
| | |
| }
| | /* Turning this off for now |
|
| | var OasisToolbarButtonsConfig = { |
| if ( wgNamespaceNumber % 2 === 1 && ( wgAction === "view" || wgAction === "purge" ) ) {
| | purgeOnly: false, |
| var pageBody, pageControls, pageControlHTML;
| | userLang: true |
| var buttonPrimary = buttonSecondary = ['', ''];
| | }; |
|
| | importScriptPage('OasisToolbarButtons/code.js', 'dev'); |
| switch(skin) {
| | var OasisToolbarButtonsConfig = { |
| case 'monaco':
| | en: { |
| pageBody = '#bodyContent';
| | addTopic: "Add topic", |
| pageControls = '#page_controls';
| | editwithform: "form", |
| pageControlHTML = '<li id="control_archive"><img src="/skins/common/blank.gif" class="sprite move" /><a id="ca-archive" title="' + msg('buttonArchiveToolTooltip') + '" href="#" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
| | deleteThis: "Del", |
| buttonPrimary = ['<a class="wikia-button">', '</a>'];
| | history: "Hist", |
| buttonSecondary = ['<a class="wikia-button secondary">', '</a>'];
| | move: "Move", |
| break;
| | protect: "Pro", |
| case 'monobook':
| | undelete: "Undel", |
| pageBody = '#bodyContent';
| | unprotect: "Unpro", |
| pageControls = '#p-cactions > div > ul';
| | viewsource: "Src", |
| pageControlHTML = '<li id="control_archive"><a id="ca-archive" title="' + msg('buttonArchiveToolTooltip') + '" href="#" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
| | whatlinkshere: "Link" |
| buttonPrimary = ['<input type="submit" style="font-weight: bold;" value="', '" />'];
| |
| buttonSecondary = ['<input type="submit" value="', '" />'];
| |
| break;
| |
| case 'oasis':
| |
| case 'wikia':
| |
| pageBody = '#WikiaArticle';
| |
| pageControls = (wgNamespaceNumber == 3) ? '#WikiaUserPagesHeader > ul.wikia-menu-button > li > ul' : '#WikiaPageHeader > ul.wikia-menu-button > li > ul';
| |
| pageControlHTML = '<li id="control_archive"><a id="ca-archive" rel="nofollow">' + msg('buttonArchiveTool') + '</a></li>';
| |
| buttonPrimary = ['<a class="wikia-button">', '</a>'];
| |
| buttonSecondary = ['<a class="wikia-button secondary">', '</a>'];
| |
| break;
| |
| }
| |
|
| |
| $(function() {
| |
| function api(q, fn) {
| |
| q.format = 'json';
| |
| return $.post(wgScriptPath + '/api.php', q, fn, "json");
| |
| }
| |
| function token(page, fn) {
| |
| api({
| |
| action: 'query',
| |
| query: 'prop',
| |
| prop: 'info',
| |
| titles: page,
| |
| intoken: 'edit'
| |
| }, function(q) {
| |
| for ( var k in q.query.pages )
| |
| return fn(q.query.pages[k]);
| |
| });
| |
| }
| |
|
| |
| function startArchiving() {
| |
| var c = config.archiveListTemplate.substr(0,1);
| |
| var archiveListRegex = '['+c.toUpperCase()+c.toLowerCase()+']'+config.archiveListTemplate.substr(1);
| |
| var bc = $(pageBody).addClass('va-archiving').empty();
| |
| $('<img class="ajax" alt="Loading..." />')
| |
| .attr({src: stylepath+'/common/progress-wheel.gif'}).appendTo(bc);
| |
| api({
| |
| action: 'query',
| |
| prop: 'revisions',
| |
| titles: wgPageName,
| |
| rvprop: 'timestamp|content'
| |
| }, function(q) {
| |
| bc.empty();
| |
| var rev = q.query.pages[wgArticleId].revisions[0];
| |
| var time = rev.timestamp;
| |
| var talkToken, tokenTime;
| |
| var content = rev['*'];
| |
| token(wgPageName, function(p) {
| |
| talkToken = p.edittoken;
| |
| tokenTime = p.starttimestamp;
| |
| });
| |
|
| |
| var lines = content.split('\n');
| |
|
| |
| var table = $('<table style="margin: 10px 0;"><thead><tr><th>' + msg('labelLines') + '</th><th title="' + msg('labelSections') + '">{…}</th></tr></thead></table>').appendTo(bc);
| |
| var ul = $('<tbody/>').appendTo(table);
| |
|
| |
| for ( var l = 0; l < lines.length; l++ ) {
| |
| var line = lines[l];
| |
| $('<tr/>').toggleClass('noarchive', (new RegExp('^\\{\\{'+archiveListRegex+'\}\}')).test(line))
| |
| .attr({line:line})
| |
| .append( $('<td class=line />').text(line).append(' ') ).appendTo(ul);
| |
| }
| |
|
| |
| var sections = [];
| |
| var sectionEnd = lines.length-1;
| |
| for ( var l = lines.length-1; l >= 0; l-- ) {
| |
| var line = lines[l];
| |
|
| |
| if ( /^=.+?=/.test(line) || l === 0 ) {
| |
| var section = { start: l, end: sectionEnd };
| |
| section.length = section.end - section.start + 1;
| |
| sections.unshift(section);
| |
|
| |
| sectionEnd = l-1;
| |
| }
| |
| }
| |
|
| |
| var section;
| |
| while( section = sections.shift() ) {
| |
| var tr = ul.children().eq(section.start);
| |
| $('<td class=section />').attr({rowspan: section.length}).appendTo(tr);
| |
| }
| |
|
| |
| $('<div class="buttons" style="text-align: right;" />').append(
| |
| $(buttonSecondary[0] + msg('buttonSelectAll') + buttonSecondary[1]).click(function(e) {
| |
| e.preventDefault();
| |
| ul.children('tr').addClass('archive');
| |
| }), ' ',
| |
| $(buttonSecondary[0] + msg('buttonDeselectAll') + buttonSecondary[1]).click(function(e) {
| |
| e.preventDefault();
| |
| ul.children('tr').removeClass('archive');
| |
| }), ' ',
| |
| $(buttonPrimary[0] + msg('buttonSaveArchive') + buttonPrimary[1]).click(function(e) {
| |
| archive();
| |
| }), ' ',
| |
| $(buttonPrimary[0] + msg('buttonAbort') + buttonPrimary[1]).click(function(e) {
| |
| bc.find('.ajax').remove();
| |
| location = wgServer+wgScript+'?title='+encodeURI(wgPageName)+'&action=purge';
| |
| })
| |
| ).prependTo(bc).clone(true).appendTo(bc);
| |
|
| |
| var click = false;
| |
| var add;
| |
| table.mousedown(function(e) {
| |
| e.preventDefault();
| |
| var $li = $(e.target).closest('tr');
| |
| if(!$li.length) return;
| |
| var $section = $(e.target).closest('.section');
| |
| if ( $section.length ) {
| |
| var slist = $li.nextAll(':lt('+(parseInt($section.attr('rowspan'),10)-1)+')').andSelf();
| |
| var sadd = slist.filter(function() { return !$(this).hasClass('archive') }).length;
| |
| slist.toggleClass('archive', !!sadd);
| |
| return;
| |
| }
| |
| click = true;
| |
| add = !$li.hasClass('archive');
| |
|
| |
| $li.toggleClass('archive', !!add);
| |
| });
| |
| table.mouseover(function(e) {
| |
| if (!click) return;
| |
| var $li = $(e.target).closest('tr');
| |
| if(!$li.length) return;
| |
|
| |
| $li.toggleClass('archive', !!add);
| |
| });
| |
| $('body').mouseup(function(e) {
| |
| click = false;
| |
| });
| |
|
| |
| function archive() {
| |
| var talkLines = [];
| |
| var archiveLines = [];
| |
| ul.children().each(function() {
| |
| var arr = $(this).hasClass('noarchive') || !$(this).hasClass('archive')
| |
| ? talkLines : archiveLines;
| |
|
| |
| arr.push( $(this).attr('line') );
| |
| });
| |
|
| |
| if ( !(new RegExp('^\\{\\{'+archiveListRegex+'\}\}')).test(talkLines[0]) )
| |
| talkLines = ['{{'+config.archiveListTemplate+'}}', ''].concat(talkLines);
| |
| archiveLines = ['{{'+config.archivePageTemplate+'}}', ''].concat(archiveLines);
| |
|
| |
| bc.empty();
| |
| $('<img class="ajax" alt="Loading..." />')
| |
| .attr({src: stylepath+'/common/progress-wheel.gif'}).appendTo(bc);
| |
|
| |
| //$('<pre/>').text(talkLines.join('\n')).appendTo(bc);
| |
| //$('<pre/>').text(archiveLines.join('\n')).appendTo(bc);
| |
| runArchive(talkLines.join('\n'), archiveLines.join('\n'));
| |
| }
| |
|
| |
| var archiveTitle;
| |
| function runArchive(talkContent, archiveContent) {
| |
| var archiveNo;
| |
| function findArchives() {
| |
| var m = $('<p>Finding archive id: </p>').appendTo(bc);
| |
| api({
| |
| action: 'query',
| |
| list: 'allpages',
| |
| apnamespace: wgNamespaceNumber,
| |
| apprefix: wgTitle+'/'+config.archiveSubpage,
| |
| aplimit: 1,
| |
| apdir: 'descending'
| |
| }, function(q) {
| |
| archiveNo = q.query.allpages.length ?
| |
| parseInt(q.query.allpages[0].title.substr(wgPageName.length+("/"+config.archiveSubpage).length),10)+1 :
| |
| 1;
| |
| archiveTitle = wgPageName+'/'+config.archiveSubpage+' '+archiveNo;
| |
| m.append('done... (using '+archiveNo+')');
| |
|
| |
| saveArchive();
| |
| });
| |
| }
| |
|
| |
| function saveArchive() {
| |
| var m = $('<p>Finding token for '+archiveTitle+': </p>').appendTo(bc);
| |
| token(archiveTitle, function(p) {
| |
| m.append('done...');
| |
| m = $('<p>Saving archive page: </p>').appendTo(bc);
| |
| api({
| |
| action: 'edit',
| |
| title: archiveTitle,
| |
| text: archiveContent,
| |
| token: p.edittoken,
| |
| summary: "''"+ msg('summaryArchiveFrom') + " [["+wgPageName+"]].''",
| |
| minor: true,
| |
| createonly: true
| |
| }, function(q) {
| |
| if ( q.error && q.error.code === "articleexists" ) {
| |
| m.append('failed...');
| |
| bc.append("<p>The archive page we tried to create already exists.</p>");
| |
| return abort();
| |
| }
| |
| m.append('done...');
| |
|
| |
| saveTalk();
| |
| });
| |
| });
| |
| }
| |
|
| |
| function saveTalk() {
| |
| var m = $('<p>Finding token for '+wgPageName+': </p>').appendTo(bc);
| |
| m.append('done...');
| |
| m = $('<p>Updating talk page: </p>').appendTo(bc);
| |
| api({
| |
| action: 'edit',
| |
| title: wgPageName,
| |
| text: talkContent,
| |
| token: talkToken,
| |
| summary: "''" + msg('summaryArchiveTo') + " [["+archiveTitle+"]].''",
| |
| minor: true,
| |
| basetimestamp: time,
| |
| starttimestamp: tokenTime
| |
| }, function(q) {
| |
| if ( q.edit.result === "Success" ) {
| |
| m.append('done...');
| |
| bc.find('.ajax').remove();
| |
| location = wgServer+wgScript+'?title='+encodeURI(wgPageName)+'&action=purge';
| |
| } else {
| |
| m.append('failed...');
| |
| bc.append("<p>Failed to update talkpage, you may wish to have the archive subpage we just created deleted.</p>");
| |
| return abort();
| |
| }
| |
| });
| |
| }
| |
|
| |
| function abort() {
| |
| bc.find('.ajax').remove();
| |
| bc.append("<p>Aborting...</p>");
| |
|
| |
| $("<p>You may want to </p>")
| |
| .append( $('<a>refresh</a>').attr({href: wgServer+wgArticlePath.replace('$1', encodeURI(wgPageName))}) )
| |
| .append(' and try again.')
| |
| .appendTo(bc);
| |
| }
| |
|
| |
| // start
| |
| findArchives();
| |
| }
| |
| });
| |
| }
| |
|
| |
| $(pageControlHTML)
| |
| .click(startArchiving)
| |
| .appendTo(pageControls);
| |
| });
| |
| } | | } |
| } | | } |
| | | ***** END ARCHIVE */ |
| | |
|
| |
|
| /*This comes from [[starwars:User:Sikon/preload.js]] and implements the preloadable template system at bottom of input page*/ | | /*This comes from [[starwars:User:Sikon/preload.js]] and implements the preloadable template system at bottom of input page*/ |