Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

MediaWiki:Gadget-Twinkle.js

    From Wikipedia, the free encyclopedia
    This page is loaded as a part of theTwinkle gadget, used by 49,558 users. There seems to be an accompanying .css page atMediaWiki:Gadget-Twinkle.css.
    Note: After saving, you have to bypass your browser's cache to see the changes.Google Chrome,Firefox,Microsoft Edge andSafari: Hold down the⇧ Shift key and click theReload toolbar button. For details and instructions about other browsers, seeWikipedia:Bypass your cache.
    /** * +-------------------------------------------------------------------------+ * |                  === WARNING: GLOBAL GADGET FILE ===                    | * |                Changes to this page affect many users.                  | * |           Please discuss changes at [[WT:TW]] before editing.           | * +-------------------------------------------------------------------------+ * * Imported from github [https://github.com/wikimedia-gadgets/twinkle]. * All changes should be made in the repository, otherwise they will be lost. * * ---------- * * This is AzaToth's Twinkle, the popular script sidekick for newbies, admins, and * every Wikipedian in between. Visit [[WP:TW]] for more information. */// <nowiki>/* global Morebits */(function(){// Check if account is experienced enough to use Twinkleif(!Morebits.userIsInGroup('autoconfirmed')&&!Morebits.userIsInGroup('confirmed')){return;}constTwinkle={};window.Twinkle=Twinkle;// allow global accessTwinkle.initCallbacks=[];/** * Adds a callback to execute when Twinkle has loaded. * * @param {Function} func * @param {string} [name] - name of module used to check if is disabled. * If name is not given, module is loaded unconditionally. */Twinkle.addInitCallback=functiontwinkleAddInitCallback(func,name){Twinkle.initCallbacks.push({func:func,name:name});};Twinkle.defaultConfig={};/** * This holds the default set of preferences used by Twinkle. * It is important that all new preferences added here, especially admin-only ones, are also added to * |Twinkle.config.sections| in twinkleconfig.js, so they are configurable via the Twinkle preferences panel. * For help on the actual preferences, see the comments in twinkleconfig.js. */Twinkle.defaultConfig={// GeneraluserTalkPageMode:'tab',dialogLargeFont:false,disabledModules:[],disabledSysopModules:[],// ARVspiWatchReport:'yes',// BlockdefaultToBlock64:false,defaultToPartialBlocks:false,blankTalkpageOnIndefBlock:false,// RollbackautoMenuAfterRollback:false,openTalkPage:['agf','norm','vand'],openTalkPageOnAutoRevert:false,rollbackInPlace:false,markRevertedPagesAsMinor:['vand'],watchRevertedPages:['agf','norm','vand','torev'],watchRevertedExpiry:'1 month',offerReasonOnNormalRevert:true,confirmOnRollback:false,confirmOnMobileRollback:true,showRollbackLinks:['diff','others'],// DI (twinkleimage)notifyUserOnDeli:true,deliWatchPage:'1 month',deliWatchUser:'1 month',// ProtectwatchRequestedPages:'yes',watchPPTaggedPages:'default',watchProtectedPages:'default',// PRODwatchProdPages:'1 month',markProdPagesAsPatrolled:false,prodReasonDefault:'',logProdPages:false,prodLogPageName:'PROD log',// CSDspeedySelectionStyle:'buttonClick',watchSpeedyPages:['g3','g5','g10','g11','g12'],watchSpeedyExpiry:'1 month',markSpeedyPagesAsPatrolled:false,watchSpeedyUser:'1 month',// these next two should probably be identical by defaultwelcomeUserOnSpeedyDeletionNotification:['db','g1','g2','g3','g4','g5','g6','g10','g11','g12','g13','g14','g15','a1','a2','a3','a7','a9','a10','a11','c1','f1','f2','f3','f7','f9','r3','u6','u7'],notifyUserOnSpeedyDeletionNomination:['db','g1','g2','g3','g4','g5','g6','g10','g11','g12','g13','g14','g15','a1','a2','a3','a7','a9','a10','a11','c1','f1','f2','f3','f7','f9','r3','u6','u7'],warnUserOnSpeedyDelete:['db','g1','g2','g3','g4','g5','g6','g10','g11','g12','g13','g14','g15','a1','a2','a3','a7','a9','a10','a11','c1','f1','f2','f3','f7','f9','r3','u6','u7'],promptForSpeedyDeletionSummary:[],deleteTalkPageOnDelete:true,deleteRedirectsOnDelete:true,deleteSysopDefaultToDelete:false,speedyWindowHeight:500,speedyWindowWidth:800,logSpeedyNominations:false,speedyLogPageName:'CSD log',noLogOnSpeedyNomination:['u1'],// UnlinkunlinkNamespaces:['0','10','100','118'],// WarndefaultWarningGroup:'10',combinedSingletMenus:false,watchWarnings:'1 month',oldSelect:false,customWarningList:[],// XfDlogXfdNominations:false,xfdLogPageName:'XfD log',noLogOnXfdNomination:[],xfdWatchDiscussion:'default',xfdWatchList:'no',xfdWatchPage:'1 month',xfdWatchUser:'1 month',xfdWatchRelated:'1 month',markXfdPagesAsPatrolled:true,// Hidden preferencesautolevelStaleDays:3,// Huggle is 3, CBNG is 2revertMaxRevisions:50,// intentionally limitedbatchMax:5000,batchChunks:50,// Deprecated options, as a fallback for add-on scripts/modulessummaryAd:' ([[WP:TW|TW]])',deletionSummaryAd:' ([[WP:TW|TW]])',protectionSummaryAd:' ([[WP:TW|TW]])',// TaggroupByDefault:true,watchTaggedVenues:['articles','drafts','redirects','files'],watchTaggedPages:'1 month',watchMergeDiscussions:'1 month',markTaggedPagesAsMinor:false,markTaggedPagesAsPatrolled:false,tagArticleSortOrder:'cat',customTagList:[],customFileTagList:[],customRedirectTagList:[],// WelcometopWelcomes:false,watchWelcomes:'3 months',insertUsername:true,quickWelcomeMode:'norm',quickWelcomeTemplate:'welcome',customWelcomeList:[],customWelcomeSignature:true,// TalkbackmarkTalkbackAsMinor:false,insertTalkbackSignature:true,// always sign talkback templatestalkbackHeading:'New message from '+mw.config.get('wgUserName'),mailHeading:"You've got mail!"};Twinkle.getPref=functiontwinkleGetPref(name){if(typeofTwinkle.prefs==='object'&&Twinkle.prefs[name]!==undefined){returnTwinkle.prefs[name];}// Old preferences format, used before twinkleoptions.js was a thingif(typeofwindow.TwinkleConfig==='object'&&window.TwinkleConfig[name]!==undefined){returnwindow.TwinkleConfig[name];}if(typeofwindow.FriendlyConfig==='object'&&window.FriendlyConfig[name]!==undefined){returnwindow.FriendlyConfig[name];}// Backwards compatibility code because we renamed confirmOnFluff to confirmOnRollback, and confirmOnMobileFluff to confirmOnMobileRollbackif(name==='confirmOnRollback'&&typeofTwinkle.prefs==='object'&&Twinkle.prefs.confirmOnFluff!==undefined){returnTwinkle.prefs.confirmOnFluff;}elseif(name==='confirmOnMobileRollback'&&typeofTwinkle.prefs==='object'&&Twinkle.prefs.confirmOnMobileFluff!==undefined){returnTwinkle.prefs.confirmOnMobileFluff;}returnTwinkle.defaultConfig[name];};/** * Adds a portlet menu to one of the navigation areas on the page. * * @return {string} portletId */Twinkle.addPortlet=function(){/** @type {string} id of the target navigation area (skin dependent, on vector either of "#left-navigation", "#right-navigation", or "#mw-panel") */letnavigation;/** @type {string} id of the portlet menu to create, preferably start with "p-". */letid;/** @type {string} name of the portlet menu to create. Visibility depends on the class used. */lettext;/** @type {Node} the id of the node before which the new item should be added, should be another item in the same list, or undefined to place it at the end. */letnextnodeid;switch(mw.config.get('skin')){case'vector':case'vector-2022':navigation='#right-navigation';id='p-twinkle';text='TW';// In order to get mw.util.addPortlet to generate a dropdown menu in vector and vector-2022, the nextnodeid must be p-cactions. Any other nextnodeid will generate a non-dropdown portlet instead.nextnodeid='p-cactions';break;case'timeless':navigation='#page-tools .sidebar-inner';id='p-twinkle';text='Twinkle';nextnodeid='p-userpagetools';break;default:navigation=null;id='p-cactions';}if(navigation===null){returnid;}// make sure navigation is a valid CSS selectorconstroot=document.querySelector(navigation);if(!root){returnid;}// if we already created the portlet, return early. we don't want to create it again.constitem=document.getElementById(id);if(item){returnid;}mw.util.addPortlet(id,text,'#'+nextnodeid);// The Twinkle dropdown menu has been added to the left of p-cactions, since that is the only spot that will create a dropdown menu. But we want it on the right. Move it to the right.if(mw.config.get('skin')==='vector'){$('#p-twinkle').insertAfter('#p-cactions');}elseif(mw.config.get('skin')==='vector-2022'){const$landmark=$('#right-navigation > .vector-page-tools-landmark');$('#p-twinkle-dropdown').insertAfter($landmark);// .vector-page-tools-landmark is unstable and could change. If so, log it to console, to hopefully get someone's attention.if(!$landmark){mw.log.warn('Unexpected change in DOM');}}returnid;};/** * Builds a portlet menu if it doesn't exist yet, and adds a portlet link. This function runs at the top of every Twinkle module, ensuring that the first module to be loaded adds the portlet, and that every module can add a link to itself to the portlet. * * @param {string|Function} task Either a URL for the portlet link or a function to execute. */Twinkle.addPortletLink=function(task,text,id,tooltip){// Create a portlet to hold all the portlet links (if not created already). And get the portletId.constportletId=Twinkle.addPortlet();// Create a portlet link and add it to the portlet.constlink=mw.util.addPortletLink(portletId,typeoftask==='string'?task:'#',text,id,tooltip);// Related to the hidden peer gadget that prevents jumpiness when the page first loads$('.client-js .skin-vector #p-cactions').css('margin-right','initial');// Add a click listener for the portlet linkif(typeoftask==='function'){$(link).on('click',(ev)=>{task();ev.preventDefault();});}// $.collapsibleTabs is a feature of Vector 2010if($.collapsibleTabs){// Manually trigger a recalculation of what tabs to put where. This is to account for the space that the TW menu we just added is taking up.$.collapsibleTabs.handleResize();}returnlink;};/** * **************** General initialization code **************** */constscriptpathbefore=mw.util.wikiScript('index')+'?title=',scriptpathafter='&action=raw&ctype=text/javascript&happy=yes';// Retrieve the user's Twinkle preferences$.ajax({url:scriptpathbefore+'User:'+encodeURIComponent(mw.config.get('wgUserName'))+'/twinkleoptions.js'+scriptpathafter,dataType:'text'}).fail(()=>{console.log('Could not load your Twinkle preferences, resorting to default preferences');// eslint-disable-line no-console}).done((optionsText)=>{// Quick pass if user has no optionsif(optionsText===''){return;}// Twinkle options are basically a JSON object with some comments. Strip those:optionsText=optionsText.replace(/(?:^(?:\/\/[^\n]*\n)*\n*|(?:\/\/[^\n]*(?:\n|$))*$)/g,'');// First version of options had some boilerplate code to make it eval-able -- strip that too. This part may become obsolete down the line.if(optionsText.lastIndexOf('window.Twinkle.prefs = ',0)===0){optionsText=optionsText.replace(/(?:^window.Twinkle.prefs = |;\n*$)/g,'');}try{constoptions=JSON.parse(optionsText);if(options){if(options.twinkle||options.friendly){// Old preferences formatTwinkle.prefs=$.extend(options.twinkle,options.friendly);}else{Twinkle.prefs=options;}// v2 established after unification of Twinkle/Friendly objectsTwinkle.prefs.optionsVersion=Twinkle.prefs.optionsVersion||1;}}catch(e){mw.notify('Could not parse your Twinkle preferences',{type:'error'});}}).always(()=>{$(Twinkle.load);});// Developers: you can import custom Twinkle modules here// For example, mw.loader.load(scriptpathbefore + "User:UncleDouggie/morebits-test.js" + scriptpathafter);Twinkle.load=function(){// Don't activate on special pages other than those listed here, so// that others load faster, especially the watchlist.letactiveSpecialPageList=['Block','Contributions','IPContributions','Recentchanges','Recentchangeslinked'];// wgRelevantUserName defined for non-sysops on Special:Blockif(Morebits.userIsSysop){activeSpecialPageList=activeSpecialPageList.concat(['DeletedContributions','Prefixindex']);}if(mw.config.get('wgNamespaceNumber')===-1&&!activeSpecialPageList.includes(mw.config.get('wgCanonicalSpecialPageName'))){return;}// Prevent clickjackingif(window.top!==window.self){return;}// Set custom Api-User-Agent header, for server-side logging purposesMorebits.wiki.Api.setApiUserAgent('Twinkle ('+mw.config.get('wgWikiID')+')');Twinkle.disabledModules=Twinkle.getPref('disabledModules').concat(Twinkle.getPref('disabledSysopModules'));// Redefine addInitCallback so that any modules being loaded now on are directly// initialised rather than added to initCallbacks arrayTwinkle.addInitCallback=function(func,name){if(!name||!Twinkle.disabledModules.includes(name)){func();}};// Initialise modules that were saved in initCallbacks arrayTwinkle.initCallbacks.forEach((module)=>{Twinkle.addInitCallback(module.func,module.name);});// Increases text size in Twinkle dialogs, if so configuredif(Twinkle.getPref('dialogLargeFont')){mw.util.addCSS('.morebits-dialog-content, .morebits-dialog-footerlinks { font-size: 100% !important; } '+'.morebits-dialog input, .morebits-dialog select, .morebits-dialog-content button { font-size: inherit !important; }');}// Hide the lingering space if the TW menu is emptyconstisVector=mw.config.get('skin')==='vector'||mw.config.get('skin')==='vector-2022';if(isVector&&Twinkle.getPref('portletType')==='menu'&&$('#p-twinkle').length===0){$('#p-cactions').css('margin-right','initial');}// If using a skin with space for lots of modules, display a link to Twinkle PreferencesconstusingSkinWithDropDownMenu=mw.config.get('skin')==='vector'||mw.config.get('skin')==='vector-2022'||mw.config.get('skin')==='timeless';if(usingSkinWithDropDownMenu){Twinkle.addPortletLink(mw.util.getUrl('Wikipedia:Twinkle/Preferences'),'Config','tw-config','Open Twinkle preferences page');}};/** * Twinkle-specific data shared by multiple modules * Likely customized per installation */// Custom change tag(s) to be applied to all Twinkle actions, create at Special:TagsTwinkle.changeTags='twinkle';// Available for actions that don't (yet) support tags// currently: FlaggedRevs and PageTriageTwinkle.summaryAd=' ([[WP:TW|TW]])';// Various hatnote templates, used when tagging (csd/xfd/tag/prod/protect) to// ensure MOS:ORDERTwinkle.hatnoteRegex='short description|hatnote|main|correct title|dablink|distinguish|for|further|selfref|year dab|similar names|highway detail hatnote|broader|about(?:-distinguish| other people)?|other\\s?(?:hurricane(?: use)?s|people|persons|places|ships|uses(?: of)?)|redirect(?:-(?:distinguish|synonym|multi))?|see\\s?(?:wiktionary|also(?: if exists)?)';/* Twinkle-specific utility functions shared by multiple modules *//** * When performing rollbacks with [rollback] links, then visiting a user talk page, some data such as page name can be prefilled into Wel/AIV/Warn. Twinkle calls this a "prefill". This method gets a prefill, either from URL parameters (e.g. &vanarticle=Test) or from data previously stored using Twinkle.setPrefill() */Twinkle.getPrefill=function(key){Twinkle.prefill=Twinkle.prefill||{};if(!Object.prototype.hasOwnProperty.call(Twinkle.prefill,key)){Twinkle.prefill[key]=mw.util.getParamValue(key);}returnTwinkle.prefill[key];};/** * When performing rollbacks with [rollback] links, then visiting a user talk page, some data such as page name can be prefilled into Wel/AIV/Warn. Twinkle calls this a "prefill". This method sets a prefill. This data will be lost if the page is refreshed, unless it is added to the URL as a parameter. */Twinkle.setPrefill=function(key,value){Twinkle.prefill=Twinkle.prefill||{};Twinkle.prefill[key]=value;};/* * Used in XFD and PROD */Twinkle.makeFindSourcesDiv=functionmakeSourcesDiv(divID){if(!$(divID).length){return;}if(!Twinkle.findSources){constparser=newMorebits.wiki.Preview($(divID)[0]);parser.beginRender('({{Find sources|'+Morebits.pageNameNorm+'}})','WP:AFD').then(()=>{// Save for second-time aroundTwinkle.findSources=parser.previewbox.innerHTML;$(divID).removeClass('morebits-previewbox');});}else{$(divID).html(Twinkle.findSources);}};/** * Used in batch, unlink, and deprod to sort pages by namespace, as * json formatversion=2 sorts by pageid instead (#1251) */Twinkle.sortByNamespace=function(first,second){returnfirst.ns-second.ns||(first.title>second.title?1:-1);};/** * Used in batch listings to link to the page in question with > */Twinkle.generateArrowLinks=function(checkbox){constlink=Morebits.htmlNode('a',' >');link.setAttribute('class','tw-arrowpage-link');link.setAttribute('href',mw.util.getUrl(checkbox.value));link.setAttribute('target','_blank');checkbox.nextElementSibling.append(link);};/** * Used in deprod and unlink listings to link the page title */Twinkle.generateBatchPageLinks=function(checkbox){const$checkbox=$(checkbox);constlink=Morebits.htmlNode('a',$checkbox.val());link.setAttribute('class','tw-batchpage-link');link.setAttribute('href',mw.util.getUrl($checkbox.val()));link.setAttribute('target','_blank');$checkbox.next().prepend([link,' ']);};/** * remove "move to Commons" tag - deletion-tagged files cannot be moved to Commons */Twinkle.removeMoveToCommonsTagsFromWikicode=(wikicode)=>wikicode.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)(?!( in))[^}]*\}\}/gi,'');}());// </nowiki>
    Retrieved from "https://en.wikipedia.org/w/index.php?title=MediaWiki:Gadget-Twinkle.js&oldid=1337244545"

    [8]ページ先頭

    ©2009-2026 Movatter.jp