Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

User:Daniel Quinlan/Scripts/Unfiltered.js

    From Wikipedia, the free encyclopedia
    <User:Daniel Quinlan
    Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes.A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at theappropriate village pump.
    This codewill be executed when previewing this page.
    Thisuser script seems to have a documentation page atUser:Daniel Quinlan/Scripts/Unfiltered and an accompanying .json page atUser:Daniel Quinlan/Scripts/Unfiltered.json.
    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.
    'use strict';mw.loader.using(['mediawiki.api','mediawiki.language','mediawiki.storage','mediawiki.user','mediawiki.util','mediawiki.DateFormatter','mediawiki.ForeignApi']).then(async()=>{classMutex{constructor(){this.lock=Promise.resolve();}run(fn){constp=this.lock.then(fn,fn);this.lock=p.finally(()=>{});returnp;}}classRevisionData{constructor(context,api,rights){this.context=context;this.api=api;this.rights=rights;this.revElements={};this.noRevElements={};this.timestamps={};}addRevid(revid,element,timestamp){this.revElements[revid]=element;this.timestamps[revid]=timestamp;if(!this.firstRevid||revid>this.firstRevid)this.firstRevid=revid;if(!this.lastRevid||revid<this.lastRevid)this.lastRevid=revid;}extractDeletedTimestamp(element){constlink=element.querySelector('a[href*="Special:Undelete"]:where([href*="&timestamp="],[href*="?timestamp="])');if(!link)returnnull;constmatch=link.href.match(/[&?]timestamp=(\d{14})(?:&|$)/);if(!match)returnnull;returnmwToIso(match[1]);}}classDiffDataextendsRevisionData{constructor(context){super(context);for(consttdofdocument.querySelectorAll('.diff-otitle, .diff-ntitle')){constrevid=this.getRevid(td);if(!revid)continue;constlastDiv=Array.from(td.querySelectorAll(':scope > div')).filter(d=>!d.querySelector('#differences-prevlink, #differences-nextlink')).at(-1);if(!lastDiv)continue;if(context.deleted&&lastDiv.lastChild?.nodeName==='BR'){lastDiv.removeChild(lastDiv.lastChild);}this.addRevid(revid,lastDiv,this.extractTimestamp(td));}}getRevid(td){returnNumber(td.querySelector('[data-mw-revid]')?.getAttribute('data-mw-revid'));}extractTimestamp(title){if(this.context.deleted)returnthis.extractDeletedTimestamp(title);returntitle.querySelector('.mw-diff-timestamp')?.getAttribute('data-timestamp');}asyncgetTimestamp(revid){returnthis.timestamps[revid];}}classListingDataextendsRevisionData{constructor(context,api,rights){super(context,api,rights);constpager=document.querySelector('.mw-pager-navigation-bar');this.hasOlder=!!pager?.querySelector('a.mw-lastlink');this.hasNewer=!!pager?.querySelector('a.mw-firstlink');this.isoTimezone=this.getIsoTimezone();constselector=this.context.type==='page'&&this.context.deleted?'ul.mw-undelete-revlist > li':'ul.mw-contributions-list > li[data-mw-revid]';for(constliofdocument.querySelectorAll(selector)){constrevid=this.getRevid(li);if(!revid)continue;this.addRevid(revid,li,this.extractTimestamp(li));}this.fetchTimestampsPromise=this.fetchTimestamps();this.fetchRevisionsPromise=this.fetchRevisions();this.noRevids={};this.noRevidIndex=0;}getIsoTimezone(){if(mw.user.options.get('date')!=='ISO 8601')returnnull;constcorrection=mw.user.options.get('timecorrection')||'';constmatch=correction.match(/^(?:Offset|System)\|(-)?(\d+)$/);if(!match)returnnull;constsign=match[1]||'+';constoffset=Number(match[2]);constpad=n=>String(n).padStart(2,'0');return`${sign}${pad(Math.floor(offset/60))}:${pad(offset%60)}`;}getRevid(li){returnNumber(li.getAttribute('data-mw-revid')||li.querySelector('[data-mw-revid]')?.getAttribute('data-mw-revid'));}extractTimestamp(li){if(this.context.deleted)returnthis.extractDeletedTimestamp(li);if(this.isoTimezone)returnthis.extractVisibleTimestamp(li);returnnull;}extractVisibleTimestamp(li){consttext=li.querySelector('.mw-changeslist-date')?.textContentif(!text)returnnull;constmatch=text.match(/^(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d)/);if(!match)returnnull;consttextTime=match[1];if(this.isoTimezone==='+00:00')returntextTime+'Z';constdate=newDate(textTime+this.isoTimezone);if(isNaN(date))returnnull;returndate.toISOString().replace(/\.\d+Z$/,'Z');}asyncfetchTimestamps(){if(this.context.deleted)return;if(!this.context.user&&!this.context.page)return;if(!this.hasMissingTimestamps())return;constextra=n=>n+Math.ceil(Math.log10(n/10+1))+1;constlimit=this.rights.apihighlimits?5000:500;constneededCount=extra(Object.keys(this.revElements).length);letcurrentLimit=Math.min(limit,neededCount);const{baseParams,paramPrefix}=this.buildChangesParams(currentLimit);letisPrev=false;if(this.context.page){if(this.firstRevid){baseParams.rvstartid=this.firstRevid;baseParams.rvdir='older';}}else{consturlParams=newURLSearchParams(location.search);constdir=urlParams.get('dir');constoffset=urlParams.get('offset');isPrev=dir==='prev';if(this.hasNewer||this.hasOlder){baseParams[`${paramPrefix}dir`]=isPrev?'newer':'older';if(offset&&this.hasOlder){baseParams[`${paramPrefix}start`]=offset;}}}letlater=null;letreceived=0;letcontinueToken=null;do{constparams={...baseParams,...(continueToken||{}),[`${paramPrefix}limit`]:currentLimit};constdata=awaitthis.api.get(params);constrevisions=this.extractRevisions(data);if(!revisions.length)break;received+=revisions.length;for(constrevofrevisions){if(rev.revid){if(rev.revidinthis.revElements){this.timestamps[rev.revid]=rev.timestamp;}if(!isPrev&&rev.revid<this.lastRevid&&(!later||rev.revid>later.revid)){later=rev;}}}if(received>=neededCount)break;continueToken=data?.continue;currentLimit=Math.min(limit,neededCount-received);}while(continueToken);if(later){this.nextRevid=later.revid;this.timestamps[later.revid]=later.timestamp;}}hasMissingTimestamps(){returnObject.values(this.timestamps).some(ts=>ts===null);}buildChangesParams(limit){constparamPrefix=this.context.type==='page'?'rv':'uc';constbaseParams={action:'query',[`${paramPrefix}limit`]:limit,[`${paramPrefix}prop`]:'ids|timestamp',format:'json'};if(this.context.type==='page'){baseParams.prop='revisions';baseParams.titles=this.context.page;baseParams.rvslots='main';}else{baseParams.list='usercontribs';baseParams.ucuser=this.context.user;}return{baseParams,paramPrefix};}extractRevisions(data){returnthis.context.type==='page'?Object.values(data?.query?.pages||{})[0]?.revisions||[]:data?.query?.usercontribs||[];}asyncfetchRevisions(revisions){if(this.context.deleted)return;letmode;if(revisions){mode='revisions';}else{mode='missing';awaitthis.fetchTimestampsPromise;revisions=Object.keys(this.timestamps).filter(r=>this.timestamps[r]===null);}if(!revisions.length)return;revisions.unshift(revisions.pop());constlimit=this.rights.apihighlimits?500:50;for(leti=0;i<revisions.length;i+=limit){constchunk=revisions.slice(i,i+limit);constdata=awaitthis.api.get({action:'query',prop:'revisions',revids:chunk.join('|'),rvprop:'ids|timestamp',format:'json'});for(constpageofObject.values(data?.query?.pages||{})){for(constrevofpage.revisions||[]){this.timestamps[rev.revid]=rev.timestamp;}}}}asyncfetchNextRevid(caller){if(!this.lastRevid||!this.hasOlder)return;constlink=document.querySelector('a.mw-nextlink');if(!link?.href)return;consturl=newURL(link.href);if(this.context.page||this.context.user){const{baseParams,paramPrefix}=this.buildChangesParams(20);if(this.context.page){baseParams.rvstartid=this.lastRevid;}else{constoffset=url.searchParams.get('offset');if(!offset)return;baseParams[`${paramPrefix}start`]=offset;}constdata=awaitthis.api.get(baseParams);constrevisions=this.extractRevisions(data);constnext=revisions.find(rev=>Number(rev.revid)<this.lastRevid);if(next){this.nextRevid=next.revid;this.timestamps[next.revid]=next.timestamp;return;}}url.searchParams.set('limit','20');constresponse=awaitfetch(url);if(!response.ok)return;consthtml=awaitresponse.text();constfetched=newDOMParser().parseFromString(html,'text/html');constitems=fetched.querySelectorAll('ul.mw-contributions-list > li[data-mw-revid]');for(constliofitems){constrevid=Number(li.getAttribute('data-mw-revid'));if(revid&&revid<this.lastRevid){this.nextRevid=revid;this.timestamps[revid]=this.extractTimestamp(li);return;}}}asyncgetTimestamp(revid){if(this.timestamps[revid])returnthis.timestamps[revid];if(revid&&revid===this.nextRevid){this.nextRevidTimestampPromise||=this.fetchRevisions([revid]);awaitthis.nextRevidTimestampPromise;}else{awaitthis.fetchRevisionsPromise;}returnthis.timestamps[revid];}asyncgetNextRevid(caller){if(this.nextRevid)returnthis.nextRevid;awaitthis.fetchTimestampsPromise;if(this.nextRevid)returnthis.nextRevid;this.nextRevidPromise||=this.fetchNextRevid(caller);awaitthis.nextRevidPromise;returnthis.nextRevid;}createNoRevid(string){return'norev'+(this.noRevids[string]??=--this.noRevidIndex);}}classRecentDataextendsRevisionData{constructor(context){super(context);this.pages=newMap();constnow=newDate().toISOString();for(constliofdocument.querySelectorAll('li.mw-changeslist-line[data-mw-revid]:not(.unfiltered-processed)')){constrevid=li.getAttribute('data-mw-revid');if(!revid)continue;constts=mwToIso(li.getAttribute('data-mw-ts'));this.addRevid(revid,li,ts);li.classList.add('unfiltered-processed');li.setAttribute('processed',now);if(context.type==='wl'){constpageElement=li.querySelector('[data-target-page]');if(pageElement){constpage=pageElement.getAttribute('data-target-page');if(!this.pages.has(page)){this.pages.set(page,ts);}}}}}asyncgetTimestamp(revid){returnthis.timestamps[revid];}}// get contextconstcontext=getContext();if(!context)return;// constantsconstACTION_API='https://en.wikipedia.org/w/api.php';constUNFILTERED_JSON='User:Daniel Quinlan/Scripts/Unfiltered.json';constABUSELOG_BUFFER=30;constDEFAULT_OPTIONS={user:true,page:true};constDEFAULT_ALIASES={'abuselog':'AbuseLog','contributions':'Contributions','log':'Log','undelete':'Undelete',};constDEFAULT_MESSAGES={'abusefilter-hidden':'Private','cur':'cur','diff':'diff','hide':'Hide','hist':'hist','last':'prev','log-name-abusefilterblockeddomainhit':'Blocked domains hit log','log-name-spamblacklist':'Spam block list log','minoreditletter':'m','newpage':'New page','newpageletter':'N','recentchanges-label-minor':'This is a minor edit','red-link-title':'$1 (page does not exist)','show':'Show',};constINTERNAL_STRINGS={'query-addresses':'Query additional addresses','revision-deleted':'Deleted','revision-no-revision':'No revision','revision-removed':'Removed',};// main processingconstformatTimeAndDate=mw.loader.require('mediawiki.DateFormatter').formatTimeAndDate;constarticlePath=mw.config.get('wgArticlePath')?.replace(/\$1$/,'')||'/wiki/';constscriptPath=mw.config.get('wgScript')||'/w/index.php';constuserLanguage=mw.config.get('wgUserLanguage')||'en';constspecialName=mw.config.get('wgFormattedNamespaces')?.['-1']||'Special';constapi=newmw.Api();constmutex=newMutex();constrights=awaitgetRights();conststrings=awaitgetStrings();constaddedTitles=[];constcontentChanges=newSet();constincludeFields=newSet();letrevisionData;letfirstInsert=false;addFilterLogCSS();if(context.type==='page'||context.type==='user'){revisionData=newListingData(context,api,rights);if(context.page){if(!ensureContributionsList(revisionData))return;includeFields.add('user');awaitprocessTarget(context.page,'page');}elseif(context.user){if(!ensureContributionsList(revisionData))return;includeFields.add('title');awaitprocessTarget(context.user);}else{includeFields.add('title');includeFields.add('user');const{users,additional}=getMultipleUsers();constprocessUsersPromise=processUsers(users);if(additional.size){processAdditional(additional,processUsersPromise,!users.size);}}}elseif(context.type==='diff'){awaitprocessDiff();}elseif(context.type==='rc'||context.type==='wl'){awaitprocessRecent();constcontainer=document.querySelector('.mw-changeslist');if(!container)return;constrecentMutex=newMutex();newMutationObserver(()=>recentMutex.run(()=>processRecent())).observe(container,{childList:true});}functiongetContext(){constspecial=mw.config.get('wgCanonicalSpecialPageName');constdeleted=special==='DeletedContributions'||special==='Undelete';if(special==='Contributions'||special==='DeletedContributions'){return{type:'user',deleted,user:mw.config.get('wgRelevantUserName')};}constpage=mw.config.get('wgRelevantPageName')?.replace(/_/g,' ');if(!page)returnnull;if(mw.config.get('wgAction')==='history'||(special==='Undelete'&&document.querySelector('ul.mw-undelete-revlist'))){return{type:'page',deleted,page};}if((mw.config.get('wgDiffNewId')&&mw.config.get('wgDiffOldId'))||(special==='Undelete'&&document.querySelector('table.diff'))){return{type:'diff',deleted,page};}if(special==='Recentchanges'){return{type:'rc',deleted};}if(special==='Watchlist'){return{type:'wl',deleted};}returnnull;}asyncfunctiongetRights(){constsiteId=mw.config.get('wgWikiID')||'unknown';constgroups=(mw.config.get('wgUserGroups')||[]).sort().join('|');constrightsKey=`unfiltered-rights-${siteId}-${groups}`;constcached=mw.storage.getObject(rightsKey);if(cached)returncached;constuserRights=awaitmw.user.getRights();constwanted=['apihighlimits','block','deletedhistory','deletedtext'];constrights=Object.fromEntries(wanted.map(r=>[r,userRights.includes(r)]));mw.storage.setObject(rightsKey,rights,86400);returnrights;}asyncfunctiongetStrings(){constsiteId=mw.config.get('wgWikiID')||'unknown';conststringsKey=`unfiltered-strings-${siteId}-${userLanguage}`;constcached=mw.storage.getObject(stringsKey);constdefaults={...DEFAULT_ALIASES,...DEFAULT_MESSAGES,...INTERNAL_STRINGS};if(cached)return{...defaults,...cached};conststrings={};constaliasesPromise=loadAliases();constlanguageChain=mw.language.getFallbackLanguageChain();try{const[loaded]=awaitPromise.all([loadTranslations(),api.loadMessages(Object.keys(DEFAULT_MESSAGES))]);for(constkeyofObject.keys(defaults)){letreplacement;if(DEFAULT_MESSAGES[key]){constmsg=mw.message(key);if(msg.exists()){replacement=msg.plain();}}for(constlanguageoflanguageChain){constvalue=loaded[language]?.[key];if(value){replacement=value;break;}}if(replacement){strings[key]=replacement;}}}catch(error){console.warn('Unfiltered: getStrings error',error);}constaliases=awaitaliasesPromise;Object.assign(strings,aliases);mw.storage.setObject(stringsKey,strings,86400);return{...defaults,...strings};}asyncfunctionloadAliases(){constaliases={...DEFAULT_ALIASES};try{constresponse=awaitapi.get({action:'query',format:'json',formatversion:'2',meta:'siteinfo',siprop:'specialpagealiases'});constresult=response?.query?.specialpagealiases||[];for(const[key,value]ofObject.entries(DEFAULT_ALIASES)){constfound=result.find(item=>item.realname===value);aliases[key]=found?.aliases?.[0]||value;}}catch(error){console.warn('Unfiltered: loadAliases error',error);}returnaliases;}asyncfunctionloadTranslations(){constapi=newmw.ForeignApi(ACTION_API);try{constdata=awaitapi.get({action:'query',format:'json',formatversion:2,titles:UNFILTERED_JSON,prop:'revisions',rvprop:'content'});constcontent=data?.query?.pages?.[0]?.revisions?.[0]?.content;if(content){returnJSON.parse(content)||{};}}catch(error){console.warn('Unfiltered: loadTranslations error',error);}return{};}functionaddFilterLogCSS(){mw.util.addCSS(`.abusefilter-container {display: inline-block;}.abusefilter-container::before {content: "[";padding-right: 0.1em;}.abusefilter-container::after {content: "]";padding-left: 0.1em;}.abusefilter-logid {display: inline-block;}.abusefilter-logid-tag, .abusefilter-logid-tag > a {color: var(--color-content-added, #348469);}.abusefilter-logid-showcaptcha, .abusefilter-logid-showcaptcha > a {color: var(--color-content-removed, #d0450b);}.abusefilter-logid-warn, .abusefilter-logid-warn > a {color: var(--color-warning, #957013);}.abusefilter-logid-disallow, .abusefilter-logid-disallow > a {color: var(--color-error, #e90e01);}.abusefilter-logid-warned, .abusefilter-logid-warned > a {text-decoration: underline;text-decoration-color: var(--color-warning, #957013);text-decoration-thickness: 1.25px;text-underline-offset: 1.25px;}li.mw-contributions-deleted, li.mw-contributions-no-revision, li.mw-contributions-removed {background-color: color-mix(in srgb, var(--background-color-destructive, #bf3c2c) 16%, transparent);margin-bottom: 0;padding-bottom: 0.1em;}#mw-content-text.unfiltered-hide li.mw-contributions-deleted,#mw-content-text.unfiltered-hide li.mw-contributions-no-revision,#mw-content-text.unfiltered-hide li.mw-contributions-removed {display: none;}.unfiltered-toggle-button {color: var(--color-subtle, gray);}.unfiltered-toggle-button:hover, .unfiltered-toggle-button:focus-visible {color: var(--color-base--hover, gray);}.unfiltered-icon-hide { display: inline; }.unfiltered-icon-show { display: none; }#mw-content-text.unfiltered-hide .unfiltered-icon-hide { display: none; }#mw-content-text.unfiltered-hide .unfiltered-icon-show { display: inline; }`);}asyncfunctionaddToggleButton(){constcontainer=buttonContainer();if(!container)return;consthideIcon=`<svg xmlns="http://www.w3.org/2000/svg" class="unfiltered-icon-hide" width="24" height="24" viewBox="0 0 24 24"><title>${strings.hide}</title><g fill="currentColor"><circle cx="2" cy="1" r="1"/><circle cx="6" cy="1" r="1"/><circle cx="10" cy="1" r="1"/><circle cx="14" cy="1" r="1"/><circle cx="18" cy="1" r="1"/><circle cx="22" cy="1" r="1"/><circle cx="2" cy="23" r="1"/><circle cx="6" cy="23" r="1"/><circle cx="10" cy="23" r="1"/><circle cx="14" cy="23" r="1"/><circle cx="18" cy="23" r="1"/><circle cx="22" cy="23" r="1"/></g><path d="M12 3.25V10.5M12 10.5L9 6.5M12 10.5L15 6.5M12 20.75V13.5M12 13.5L9 17.5M12 13.5L15 17.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="2"/></svg>`;constshowIcon=`<svg xmlns="http://www.w3.org/2000/svg" class="unfiltered-icon-show" width="24" height="24" viewBox="0 0 24 24"><title>${strings.show}</title><g fill="currentColor"><circle cx="2" cy="12" r="1"/><circle cx="6" cy="12" r="1"/><circle cx="10" cy="12" r="1"/><circle cx="14" cy="12" r="1"/><circle cx="18" cy="12" r="1"/><circle cx="22" cy="12" r="1"/></g><path d="M12 9V1M12 1L9 5M12 1L15 5M12 15V23M12 23L9 19M12 23L15 19" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="2"/></svg>`;consttext=document.querySelector('#mw-content-text');if(!text)return;constoptions=awaitgetOptions();if(!options[context.type])text.classList.add('unfiltered-hide');constbutton=createButton('toggle',hideIcon,showIcon);container.append(button);letpress=null;constclearTimer=()=>{clearTimeout(press);press=null;};consttoggleOption=async()=>{clearTimer();options[context.type]=!options[context.type];constcontextName=context.type==='user'?'Contributions':'History';mw.notify(`${options[context.type]?strings.hide:strings.show} \u2192${options[context.type]?strings.show:strings.hide}`,{title:'Unfiltered',type:'success'});awaitsaveOptions(options);};consttoggleView=()=>{clearTimer();text.classList.toggle('unfiltered-hide');};button.addEventListener('click',e=>e.stopPropagation());button.addEventListener('pointerdown',e=>{e.stopPropagation();press=setTimeout(toggleOption,750);});button.addEventListener('pointerup',e=>{e.stopPropagation();if(press)toggleView();});button.addEventListener('pointercancel',clearTimer);button.addEventListener('pointerleave',clearTimer);button.addEventListener('keydown',asynce=>{e.stopPropagation();if(e.key==='Enter')toggleView();elseif(e.key===' ')awaittoggleOption();});}functionbuttonContainer(){if(context.deleted)returnnull;if(buttonContainer._element!==undefined)returnbuttonContainer._element;buttonContainer._element=null;constform=document.querySelector('.mw-htmlform');if(!form)returnnull;constlegend=form.querySelector('legend');if(!legend)returnnull;legend.style.display='flex';constdiv=document.createElement('div');div.className='unfiltered-button-container';div.style.marginLeft='auto';div.style.display='flex';div.style.gap='12px';legend.append(div);buttonContainer._element=div;returndiv;}functioncreateButton(name,...icons){constbutton=document.createElement('button');button.type='button';button.className=`unfiltered-${name}-button`;button.innerHTML=icons.join('');button.style.cssText=`background: none;border: none;cursor: pointer;width: 24px;height: 24px;padding: 0;margin-left: auto;vertical-align: middle;`;returnbutton;}asyncfunctiongetOptions(){try{conststored=mw.user.options.get('userjs-unfiltered')||'{}';return{...DEFAULT_OPTIONS,...JSON.parse(stored)};}catch(error){console.error('Unfiltered: getOptions error',error);awaitsaveOptions(DEFAULT_OPTIONS);returnDEFAULT_OPTIONS;}}asyncfunctionsaveOptions(options){try{constvalue=JSON.stringify(options);if(mw.user.isNamed())awaitapi.saveOption('userjs-unfiltered',value);mw.user.options.set('userjs-unfiltered',value);}catch(error){console.error('Unfiltered: saveOptions error',error);throwerror;}}functionensureContributionsList(revisionData){if(!revisionData.lastRevid){if(context.deleted)returnfalse;constpagerBody=document.querySelector('.mw-pager-body');if(pagerBody&&!pagerBody.querySelector('.mw-contributions-list')){constul=document.createElement('ul');ul.className='mw-contributions-list';pagerBody.append(ul);}else{returnfalse;}}returntrue;}functiongetMultipleUsers(){constlinks=document.querySelectorAll('ul.mw-contributions-list li a.mw-anonuserlink');constusers=newSet();constadditional=newSet();for(constlinkoflinks){users.add(link.textContent.trim());}for(constipofenumerateSmallIPv4Range(mw.config.get('wgPageName'))){if(!users.has(ip)){additional.add(ip);}}return{users,additional};}functionenumerateSmallIPv4Range(input){constm=input.match(/^[^\/]+\/((?:1?\d\d?|2[0-4]\d|25[0-5])(?:\.(?:1?\d\d?|2[0-4]\d|25[0-5])){3})\/(2[4-9]|3[0-2])\b/);if(!m)return[];constip=m[1].split('.').reduce((acc,oct)=>(acc<<8n)+BigInt(oct),0n);constmask=Number(m[2]);constcount=1n<<BigInt(32-mask);constbase=ip&~(count-1n);returnArray.from({length:Number(count)},(_,i)=>{constipValue=base+BigInt(i);return[(ipValue>>24n)&255n,(ipValue>>16n)&255n,(ipValue>>8n)&255n,ipValue&255n,].join('.');});}asyncfunctionprocessUsers(users){for(constuserofusers){awaitprocessTarget(user);}}functionprocessAdditional(ips,processUsersPromise,autoClick){constcontainer=buttonContainer();if(!container)return;constprocessTalkUsersPromise=processTalkUsers(ips,processUsersPromise);constqueryIcon=`<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><title>${strings['query-addresses']}</title><circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="2"/><circle class="query-icon-ring" cx="12" cy="12" r="10" fill="none" stroke="gray" stroke-width="2" stroke-dasharray="62.832" stroke-dashoffset="62.832" transform="rotate(-90 12 12)"/><text class="query-icon-mark" x="12" y="16" text-anchor="middle" font-size="14" fill="currentColor">?</text></svg>`;constbutton=createButton('query',queryIcon);container.prepend(button);letrunning=false;button.addEventListener('click',async(e)=>{e.stopPropagation();if(running)return;running=true;button.querySelector('.query-icon-mark').setAttribute('fill','gray');awaitprocessTalkUsersPromise;constring=button.querySelector('.query-icon-ring');letcount=0,circumference=20*Math.PI;for(constipofips){awaitprocessTarget(ip);ring.setAttribute('stroke-dashoffset',((1-++count/ips.size)*circumference));}});if(autoClick&&ensureContributionsList(revisionData)){button.click();}}asyncfunctionprocessTalkUsers(ips,processUsersPromise){awaitprocessUsersPromise;constuserTalkName=mw.config.get('wgFormattedNamespaces')?.[3]||'User talk';consttalkTitles=Array.from(ips).map(ip=>`${userTalkName}:${ip}`);constexistingTalkPages=awaitgetExistingPages(talkTitles);consttalkUsers=existingTalkPages.map(title=>title.startsWith(userTalkName+':')?title.slice(userTalkName.length+1):title);for(constipoftalkUsers){awaitprocessTarget(ip);ips.delete(ip);}}asyncfunctiongetExistingPages(titles){functionbatch(items,maxSize){constminBins=Math.ceil(items.length/maxSize);constbins=Array.from({length:minBins},()=>[]);items.forEach((item,i)=>{bins[i%minBins].push(item);});returnbins;}constresponses=awaitPromise.all(batch(titles,50).map(batchTitles=>api.get({action:'query',titles:batchTitles.join('|'),prop:'info',format:'json',formatversion:2})));returnresponses.flatMap(response=>response.query.pages.filter(page=>!page.missing).map(page=>page.title));}asyncfunctionprocessDiff(){revisionData=newDiffData(context);consttimestamps=Object.values(revisionData.timestamps);if(!timestamps.length)return;timestamps.sort();conststart=offsetIso(timestamps.at(-1),ABUSELOG_BUFFER);constend=offsetIso(timestamps.at(0),-86400);try{awaitfetchHistory(context.page,'page',start,end);}catch(error){console.error('Unfiltered: processDiff error',error);}}asyncfunctionprocessTarget(target,type='user'){conststart=awaitgetStartValue(revisionData);awaitfetchHistory(target,type,start);if(addedTitles.length){awaitupdateTitleLinks(addedTitles);addedTitles.length=0;}if(contentChanges.size){mutex.run(()=>{mw.hook('wikipage.content').fire($([...contentChanges]));contentChanges.clear();});}}asyncfunctionprocessRecent(){revisionData=newRecentData(context);if(!revisionData.firstRevid)return;try{if(context.type==='wl'){for(const[page,timestamp]ofrevisionData.pages){conststart=offsetIso(timestamp,ABUSELOG_BUFFER);constend=offsetIso(timestamp,-86400);awaitfetchHistory(page,'page',start,end);}}else{consttimestamps=Object.values(revisionData.timestamps);if(!timestamps.length)return;timestamps.sort();conststart=offsetIso(timestamps.at(-1),ABUSELOG_BUFFER);awaitfetchHistory(null,null,start);}}catch(error){console.error('Unfiltered: processRecent error',error);}}asyncfunctiongetStartValue(revisionData){if(!revisionData.hasNewer){returnnull;}consturlParams=newURLSearchParams(location.search);constdirParam=urlParams.get('dir');constoffsetParam=urlParams.get('offset');if(dirParam!=='prev'&&/^\d{14}$/.test(offsetParam)){returnoffsetIso(mwToIso(offsetParam),ABUSELOG_BUFFER);}elseif(dirParam==='prev'){constts=awaitrevisionData.getTimestamp(revisionData.firstRevid);if(ts)returnoffsetIso(ts,ABUSELOG_BUFFER);}returnnull;}asyncfunctionfetchHistory(target,type,start,end){consthits={};constrevisionMap=newMap();constwarned=newMap();constgenerators=[];if(context.type==='wl'){generators.push(cachedAbuseLogGenerator(target,type,start,end));}else{generators.push(abuseLogGenerator(target,type,start,end));}if(context.type==='page'||context.type==='user'){generators.push(logGenerator('spamblacklist',target,type,start),logGenerator('abusefilterblockeddomainhit',target,type,start));if(!context.deleted&&rights.deletedhistory){generators.push(deletedRevisionsGenerator(target,type,start));}}letlastBatchId=null;forawait(constentryofmergeGenerators(...generators)){if(entry.revtype==='deleted'){insertItem(createItem(entry));continue;}if(entry.batch_id!==lastBatchId){awaitupdateRevisions(hits);if(warned.size)updateWarned(warned);}lastBatchId=entry.batch_id;constrevid=entry.revid;constwarnedKey=`${entry.filter_id}|${entry.filter}|${entry.title}|${entry.user}`;if(revid){revisionMap.set(warnedKey,revid);}elseif(entry.result==='warn'){constwarnedRevid=revisionMap.get(warnedKey);if(warnedRevid){constfilterText=entry.filter_id??entry.filter;warned.set(warnedRevid,filterText);revisionMap.delete(warnedKey);}}entry.filter_id=entry.filter_id||'private';entry.result=entry.result||'none';if(revid){entry.revtype=revisionData.revElements[revid]?'matched':'unmatched';}elseif((context.type==='page'||context.type==='user')&&!context.deleted){consteditKey=`${entry.timestamp}>${entry.title}>${entry.user}`;entry.norevid=revisionData.createNoRevid(editKey);entry.revtype='no-revision';}constkey=entry.revid||entry.norevid;if(key){hits[key]??=[];hits[key].push(entry);}}awaitupdateRevisions(hits,true);if(warned.size)updateWarned(warned);}asyncfunction*abuseLogGenerator(target,type,start,end){constrevisionCount=Object.keys(revisionData.revElements).length;letextra=revisionCount;if(context.type==='diff'||context.type==='rc'||context.type==='wl')extra=0;constlimit=Math.min(50+extra,250);constexcessLimit=revisionCount<=50?25:50;letexcessCount=0;constparams={action:'query',list:'abuselog',afllimit:limit,aflprop:'ids|filter|user|title|action|result|timestamp|hidden|revid',format:'json'};if(start)params.aflstart=start;if(end)params.aflend=end;if(type==='user')params.afluser=target;elseif(type==='page')params.afltitle=target;letcontinueToken=null;do{constbatchId=Math.random();constdata=awaitapi.get({...params,...(continueToken||{})});if(data?.error){console.error('Unfiltered: abuseLogGenerator error',data.error);break;}for(constentryofdata?.query?.abuselog||[]){constrevid=entry.revid;if(revisionData.lastRevid){if(revid){if(Number(revid)<revisionData.lastRevid)excessCount++;}else{constlastTime=awaitrevisionData.getTimestamp(revisionData.lastRevid);if(entry.timestamp<lastTime)excessCount++;}}elseif(revisionData.hasOlder){excessCount++;}entry.batch_id=batchId;yieldentry;}if(excessCount>=excessLimit)break;continueToken=data?.continue;}while(continueToken);}asyncfunction*cachedAbuseLogGenerator(target,type,start,end){cachedAbuseLogGenerator.cache||=newMap();constcacheKey=`${target}-${type}-${start}-${end}`;constcached=cachedAbuseLogGenerator.cache.get(cacheKey);if(start&&cached){clearTimeout(cached.timer);cached.timer=setTimeout(()=>cachedAbuseLogGenerator.cache.delete(cacheKey),600000);yield*cached.entries;return;}constentries=awaitArray.fromAsync(abuseLogGenerator(target,type,start,end));yield*entries;consttimer=setTimeout(()=>cachedAbuseLogGenerator.cache.delete(cacheKey),600000);cachedAbuseLogGenerator.cache.set(cacheKey,{entries,timer});}asyncfunction*logGenerator(letype,target,type,start){constrevisionCount=Object.keys(revisionData.revElements).length;constlimit=Math.min(50+revisionCount,250);constexcessLimit=revisionCount<=50?25:50;letexcessCount=0;constparams={action:'query',list:'logevents',letype,lelimit:limit,leprop:'ids|type|user|title|action|comment|params|timestamp|details',format:'json'};if(start)params.lestart=start;if(type==='user')params.leuser=target;elseif(type==='page')params.letitle=target;letcontinueToken=null;do{constbatchId=Math.random();constdata=awaitapi.get({...params,...(continueToken||{})});if(data?.error){console.error(`Unfiltered: logGenerator error (${letype})`,data.error);break;}for(constentryofdata?.query?.logevents||[]){if(revisionData.lastRevid){if(entry.revid){if(Number(entry.revid)<revisionData.lastRevid)excessCount++;}else{constlastTime=awaitrevisionData.getTimestamp(revisionData.lastRevid);if(entry.timestamp<lastTime)excessCount++;}}elseif(revisionData.hasOlder){excessCount++;}entry.batch_id=batchId;entry.result='disallow';entry.filter_id=entry.logid;entry.filter=strings[`log-name-${letype}`]||letype;if(letype==='spamblacklist'){if(entry.params?.url){consturls=entry.params.url.split(/\s+/).filter(u=>u);try{consthostnames=[...newSet(urls.map(u=>newURL(u).hostname))];if(hostnames.length===1){entry.filter_id=hostnames[0];}}catch(error){console.warn('Unfiltered: invalid URL in log entry',error);}entry.filter+=`:${entry.params.url}`;}}elseif(letype==='abusefilterblockeddomainhit'){if(entry.params?.blocked){entry.filter_id=entry.params.blocked;entry.filter+=`:${entry.params.blocked}`;}}yieldentry;}if(excessCount>=excessLimit)break;continueToken=data?.continue;}while(continueToken);}asyncfunction*deletedRevisionsGenerator(target,type,start){constparams={action:'query',list:'alldeletedrevisions',adrlimit:50,adrprop:'flags|ids|parsedcomment|size|tags|timestamp|user',format:'json'};if(type==='user'){if(start)params.adrstart=start;params.adruser=target;}else{params.adrfrom=params.adrto=mw.config.get('wgTitle');params.adrnamespace=mw.config.get('wgNamespaceNumber');}letcontinueToken=null;do{constbatchId=Math.random();constdata=awaitapi.get({...params,...(continueToken||{})});if(data?.error){console.error('Unfiltered: deletedRevisionsGenerator error',data.error);break;}for(constpageofdata?.query?.alldeletedrevisions||[]){for(constentryofpage.revisions||[]){const{tooNew,tooOld}=awaitcheckBounds(entry,'deleted');if(tooOld)return;if(tooNew)continue;entry.title=page.title;entry.batchId=batchId;entry.revtype='deleted';yieldentry;}}continueToken=data?.continue;}while(continueToken);}asyncfunction*mergeGenerators(...generators){constpromises=newMap();for(leti=0;i<generators.length;i++){promises.set(i,generators[i].next());}while(promises.size>0){constentries=Array.from(promises.entries());constresult=awaitPromise.race(entries.map(async([id,promise])=>({id,value:awaitpromise})));if(result.value.done){promises.delete(result.id);}else{yieldresult.value.value;constgen=generators[result.id];promises.set(result.id,gen.next());}}}asyncfunctioncheckBounds(entry,type){const{hasNewer,hasOlder,firstRevid,lastRevid}=revisionData;consthasRevid=Boolean(entry.revid);constentryValue=hasRevid?Number(entry.revid):entry.timestamp;constgetDataValue=hasRevid?id=>Number(id):asyncid=>awaitrevisionData.getTimestamp(id);lettooNew=false;lettooOld=false;if(hasNewer&&firstRevid){constfirstValue=awaitgetDataValue(firstRevid);if(firstValue&&entryValue>firstValue){tooNew=true;}}if(!tooNew&&hasOlder&&lastRevid){constlastValue=awaitgetDataValue(lastRevid);if(lastValue&&entryValue<=lastValue){constnextRevid=awaitrevisionData.getNextRevid(type);if(nextRevid){constnextValue=awaitgetDataValue(nextRevid);if(nextValue&&entryValue<=nextValue){tooOld=true;}}}}return{tooNew,tooOld};}asyncfunctionupdateRevisions(hits,finalUpdate=false){constmatched=[];for(constrevidinhits){letelement=revisionData.revElements[revid]||revisionData.noRevElements[revid];if(!element&&(revid.startsWith('norev')||finalUpdate)){constfirst=hits[revid][0];const{tooNew,tooOld}=awaitcheckBounds(first,first.revtype);if(!tooNew&&!tooOld){if(first.revtype==='unmatched')first.revtype='removed';element=createItem(first);insertItem(element);}}if(!element)continue;letcontainer=element.querySelector('.abusefilter-container');if(!container){container=document.createElement('span');container.className='abusefilter-container';element.append(' ',container);}letdiff=element.querySelector('.mw-changeslist-links .unfiltered-diff-unresolved');for(constentryofhits[revid]){if(container.firstChild){container.prepend(' ');}container.prepend(createFilterElement(entry));if(diff&&entry.id&&entry.filter_id!=='private'){resolveDiff(diff,entry.id);diff=null;}}matched.push(revid);// only fire for user pages to keep IP Information gadget from duplicating iconsif(context.type==='user'){contentChanges.add(element);}}for(constrevidofmatched){deletehits[revid];}}functionupdateWarned(warned){for(const[revid,filterText]ofwarned){constelement=revisionData.revElements[revid];if(!element)return;constfilters=element.querySelectorAll('.abusefilter-logid');for(leti=filters.length-1;i>=0;i--){constfilter=filters[i];if(filter.textContent===filterText){filter.classList.add('abusefilter-logid-warned');warned.delete(revid);break;}}}}asyncfunctionupdateTitleLinks(links){consttitleToLinks={};for(constlinkoflinks){(titleToLinks[link.title]||=[]).push(link);}constexistingPages=newSet(awaitgetExistingPages(Object.keys(titleToLinks)));for(const[title,linkGroup]ofObject.entries(titleToLinks)){constisMissing=!existingPages.has(title);for(constlinkoflinkGroup){if(isMissing){consturl=newURL(link.href);if(url.pathname.startsWith(articlePath)){url.search=`?title=${url.pathname.slice(articlePath.length)}&action=edit&redlink=1`;url.pathname=scriptPath;link.href=url.toString();link.classList.add('new');link.title=strings['red-link-title'].replace('$1',link.title);}}else{link.classList.remove('new');}}}}functioninsertItem(li){returnmutex.run(()=>insertItemUnsafe(li));}asyncfunctioninsertItemUnsafe(li){if(!firstInsert){firstInsert=true;addToggleButton();}constallLis=Array.from(document.querySelectorAll('ul.mw-contributions-list > li:where([data-mw-revid],[data-revid],[data-norevid])'));constnewRevid=li.getAttribute('data-revid');for(constexistingLiofallLis){constrevid=existingLi.getAttribute('data-mw-revid')||existingLi.getAttribute('data-revid');if(newRevid&&revid&&Number(newRevid)>Number(revid)){existingLi.parentElement.insertBefore(li,existingLi);return;}constdataTimestamp=existingLi.getAttribute('data-timestamp');constts=dataTimestamp??(revid?awaitrevisionData.getTimestamp(revid):null);if(!ts)return;constnewTimestamp=li.getAttribute('data-timestamp');if(newTimestamp>ts){existingLi.parentElement.insertBefore(li,existingLi);return;}}constlastUl=document.querySelectorAll('ul.mw-contributions-list');if(lastUl.length){lastUl[lastUl.length-1]?.append(li);}}functioncreateFilterElement(entry){constelement=document.createElement('span');element.className=`abusefilter-logid abusefilter-logid-${entry.result}`;element.title=entry.filter;if(entry.filter_id!=='private'){constlink=document.createElement('a');if(entry.logid){link.href=`${articlePath}${specialName}:${strings.log}?logid=${entry.logid}`;}else{link.href=`${articlePath}${specialName}:${strings.abuselog}/${entry.id}`;}link.textContent=entry.filter_id;element.append(link);}else{element.textContent=strings['abusefilter-hidden'];}returnelement;}functionresolveDiff(diffSpan,logid){constlink=document.createElement('a');link.textContent=diffSpan.textContent;link.href=`${articlePath}${specialName}:${strings.abuselog}/${logid}`;link.className='unfiltered-diff';link.dataset.unfilteredLogId=logid;diffSpan.replaceChildren(link);diffSpan.classList.remove('unfiltered-diff-unresolved');}functioncreateItem(entry){constli=document.createElement('li');li.className=`mw-contributions-${entry.revtype}`;if(entry.revid){li.setAttribute('data-revid',entry.revid);}else{li.setAttribute('data-norevid',entry.norevid);}li.setAttribute('data-timestamp',entry.timestamp);constpageTitleEncoded=mw.util.wikiUrlencode(entry.title);if(context.type==='page'){li.append(createDiffLinks(entry,pageTitleEncoded),' ',createSeparator(),' ');}constformattedTimestamp=formatTimeAndDate(newDate(entry.timestamp));lettimestamp;if(entry.revtype==='deleted'&&rights.deletedtext){constts=newDate(entry.timestamp).toISOString().replace(/\D/g,'').slice(0,14);timestamp=document.createElement('a');timestamp.className='mw-changeslist-date';timestamp.href=`${scriptPath}?title=${specialName}:${strings.undelete}&target=${pageTitleEncoded}&timestamp=${ts}`;timestamp.title=`${specialName}:${strings.undelete}`;timestamp.textContent=formattedTimestamp;}else{timestamp=document.createElement('span');timestamp.className='mw-changeslist-date';timestamp.textContent=formattedTimestamp;}li.append(timestamp,' ');if(includeFields.has('title')&&entry.title){li.append(createDiffLinks(entry,pageTitleEncoded),' ');}lettitleSpanWrapper;if(includeFields.has('title')&&entry.title){titleSpanWrapper=document.createElement('span');titleSpanWrapper.className='mw-title';consttitleBdi=document.createElement('bdi');titleBdi.setAttribute('dir','ltr');consttitleLink=document.createElement('a');titleLink.textContent=entry.title;titleLink.href=`${articlePath}${pageTitleEncoded}`;if(entry.revtype==='deleted'){titleLink.className='mw-contributions-title new';}else{titleLink.className='mw-contributions-title';}titleLink.title=entry.title;titleBdi.append(titleLink);titleSpanWrapper.append(titleBdi);addedTitles.push(titleLink);}constlabel=document.createElement('span');label.textContent=strings['revision-'+entry.revtype]||entry.revtype;label.style.fontStyle='italic';li.append(createSeparator(),' ',label,' ',createSeparator(),' ');if(entry.revtype==='deleted'){if(entry.minor!==undefined){constminorAbbr=document.createElement('abbr');minorAbbr.className='minoredit';minorAbbr.title=strings['recentchanges-label-minor'];minorAbbr.textContent=strings.minoreditletter;li.append(' ',minorAbbr,' ');}if(entry.parentid===0){constnewAbbr=document.createElement('abbr');newAbbr.className='newpage';newAbbr.title=strings.newpage;newAbbr.textContent=strings.newpageletter;li.append(' ',newAbbr,' ');}}if(titleSpanWrapper){li.append(titleSpanWrapper,' ',createSeparator(),' ');}if(includeFields.has('user')&&entry.user){li.append(createUserNodes(entry));}if(entry.revtype==='deleted'&&entry.parsedcomment){constcommentSpan=document.createElement('span');commentSpan.className='comment';commentSpan.innerHTML=`(${entry.parsedcomment})`;li.append(' ',commentSpan);}if(entry.revid){revisionData.revElements[entry.revid]=li;}else{revisionData.noRevElements[entry.norevid]=li;}contentChanges.add(li);returnli;}functioncreateDiffLinks(entry,pageTitleEncoded){constlinksSpan=document.createElement('span');linksSpan.className='mw-changeslist-links';constdiffSpan=document.createElement('span');diffSpan.className='unfiltered-diff-unresolved';if(context.type==='user'){diffSpan.textContent=strings.diff;consthistorySpan=document.createElement('span');consthistoryLink=document.createElement('a');if(entry.revtype==='deleted'){historyLink.href=`${scriptPath}?title=${specialName}:${strings.undelete}&target=${pageTitleEncoded}`;}else{historyLink.href=`${articlePath}${pageTitleEncoded}?action=history`;}historyLink.textContent=strings.hist;historyLink.className='mw-changeslist-history';historySpan.append(historyLink);linksSpan.append(diffSpan,' ',historySpan);}else{linksSpan.classList.add('mw-history-histlinks');diffSpan.textContent=strings.last;constcurSpan=document.createElement('span');curSpan.textContent=strings.cur;linksSpan.append(curSpan,' ',diffSpan);}returnlinksSpan;}functioncreateSeparator(){constspan=document.createElement('span');span.className='mw-changeslist-separator';returnspan;}functioncreateUserNodes(entry){letnodes;if(context.type==='user'){nodes=document.createDocumentFragment();}else{nodes=document.createElement('span');nodes.className='history-user';}constisAnon=mw.util.isIPAddress(entry.user,true);constuserEncoded=mw.util.wikiUrlencode(entry.user);constuserNamespace=mw.config.get('wgFormattedNamespaces')?.[2]||'User';constuserLink=document.createElement('a');userLink.className=isAnon?'mw-userlink mw-anonuserlink':'mw-userlink';if(isAnon){userLink.href=`${articlePath}${specialName}:${strings.contributions}/${userEncoded}`;}else{userLink.href=`${articlePath}${userNamespace}:${userEncoded}`;userLink.title=`${userNamespace}:${entry.user}`;addedTitles.push(userLink);}if(entry.revid)userLink.setAttribute('data-mw-revid',entry.revid);constbdi=document.createElement('bdi');bdi.textContent=entry.user;userLink.append(bdi);if(context.type==='user'){constwrapper=document.createElement('bdi');wrapper.setAttribute('dir','ltr');wrapper.append(userLink);nodes.append(wrapper);}else{nodes.append(userLink);}consttoolsSpan=document.createElement('span');toolsSpan.className='mw-usertoollinks mw-changeslist-links';consttalkSpan=document.createElement('span');consttalkLink=document.createElement('a');constuserTalkNamespace=mw.config.get('wgFormattedNamespaces')?.[3]||'User talk';constencodedTalk=mw.util.wikiUrlencode(`${userTalkNamespace}:${entry.user}`);talkLink.href=`${articlePath}${encodedTalk}`;talkLink.className='mw-usertoollinks-talk';talkLink.title=`${userTalkNamespace}:${entry.user}`;talkLink.textContent='talk';addedTitles.push(talkLink);talkSpan.append(talkLink);toolsSpan.append(talkSpan);if(!isAnon){constcontribsSpan=document.createElement('span');constcontribsLink=document.createElement('a');contribsLink.href=`${articlePath}${specialName}:${strings.contributions}/${userEncoded}`;contribsLink.className='mw-usertoollinks-contribs';contribsLink.title=`${specialName}:${strings.contributions}/${entry.user}`;contribsLink.textContent='contribs';contribsSpan.append(contribsLink);toolsSpan.append(contribsSpan);}if(context.type==='page'&&rights.block){constblockSpan=document.createElement('span');constblockLink=document.createElement('a');blockLink.href=`${articlePath}${specialName}:Block/${userEncoded}`;blockLink.className='mw-usertoollinks-block';blockLink.title=`${specialName}:Block/${entry.user}`;blockLink.textContent='block';blockSpan.append(blockLink);toolsSpan.append(blockSpan);}nodes.append(' ',toolsSpan);returnnodes;}functionoffsetIso(iso,seconds=0){constdate=newDate(iso);date.setSeconds(date.getSeconds()+seconds);if(seconds&&date>newDate())returnnull;returndate.toISOString();}functionmwToIso(t){if(!t||t.length!==14)returnnull;return`${t.slice(0,4)}-${t.slice(4,6)}-${t.slice(6,8)}T${t.slice(8,10)}:${t.slice(10,12)}:${t.slice(12,14)}Z`;}});
    Retrieved from "https://en.wikipedia.org/w/index.php?title=User:Daniel_Quinlan/Scripts/Unfiltered.js&oldid=1318477291"

    [8]ページ先頭

    ©2009-2025 Movatter.jp