Jump to content
Wikimedia Meta-Wiki

User:SunAfterRain/js/Difflink.js

From Meta, a Wikimedia project coordination wiki

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
 /*!
  * Difflink.js
  * https://meta.wikimedia.org/wiki/User:SunAfterRain/js/Difflink.js
  * Cover from https://zh.wikipedia.org/w/index.php?title=MediaWiki:Gadget-Difflink.js&oldid=63763124
  *
  * Released under GPL v3 license
  */

 $.when(
 $.ready,
 mw.loader.using(['mediawiki.util','mediawiki.widgets','oojs-ui']),
 (()=>{
 for(constrlNameof['ext.gadget.HanAssist','userscript.SunAfterRain.HanAssist']){
 if(mw.loader.getState(rlName)){
 returnmw.loader.using(rlName).then(require=>require(rlName));
 }
 }
 returnnewPromise((resolve)=>{
 mw.hook('userscript.SunAfterRain.HanAssist.ready').add(functionhandler(HanAssist){
 mw.hook('userscript.SunAfterRain.HanAssist.ready').remove(handler);
 resolve(HanAssist);
 });
 });
 })()
 ).then((_$,_require,HanAssist)=>{
 constisFlowMode=(
 (
 mw.config.get('wgAction')==='view-header'||
 mw.config.get('wgAction')==='compare-header-revisions'
 )&&mw.config.get('wgFlowData')
 );
 if(
 !(
 (mw.config.get('wgAction')==='view'&&mw.config.get('wgArticleId')&&mw.config.get('wgRevisionId'))||
 (mw.config.get('wgDiffNewId')&&mw.config.get('wgDiffOldId'))||
 isFlowMode
 )
 ){
 return;
 }

 constmodeOldid=Symbol('oldid');
 constmodeDiff=Symbol('diff');
 constmessages={
 [modeOldid]:HanAssist.batchConv({
 displayText:'固定版本',
 portletText:{hans:'当前修订链接',hant:'當前修訂連結'},
 portletDesc:{hans:'复制链接到当前修订版本的维基语法',hant:'複製連結到當前修訂版本的維基語法'}
 }),
 [modeDiff]:HanAssist.batchConv({
 displayText:{hans:'版本差异',hant:'版本差異'},
 portletText:{hans:'当前差异链接',hant:'當前差異連結'},
 portletDesc:{hans:'复制链接到当前差异版本的维基语法',hant:'複製連結到當前差異版本的維基語法'}
 })
 };

 letmode;
 if(mw.config.get('wgDiffNewId')||mw.config.get('wgAction')==='compare-header-revisions'){
 mode=modeDiff;
 }else{
 mode=modeOldid;
 }

 letdiff,oldid,ln;
 constreloadlink={
 normal(){
 diff=mw.config.get('wgDiffNewId');
 oldid=mw.config.get('wgDiffOldId')||mw.config.get('wgRevisionId');

 if(diff){
 ln='Special:Diff/'+oldid+'/'+diff;
 if(
 mw.config.get('wgCanonicalSpecialPageName')!=='ComparePages'&&/** For [[Special:ComparePages]] **/
 !$('td').is('.diff-multi')
 ){
 newmw.Api().get({
 action:'compare',
 fromrev:diff,
 torelative:'prev',
 prop:'ids'
 }).done(function(data){
 if(diff===mw.config.get('wgDiffNewId')&&data.compare&&data.compare.fromrevid===oldid){
 ln='Special:Diff/'+diff;
 }
 });
 }
 }else{
 ln='Special:PermanentLink/'+oldid;
 }
 },
 flow(){
 constflowData=mw.config.get('wgFlowData');
 if(mode===modeOldid){
 oldid=flowData.blocks.header.revision.revisionId;

 ln=mw.util.getUrl(mw.config.get('wgPageName'),{
 action:'view-header',
 header_newRevision:oldid
 });
 }else{
 diff=flowData.blocks.header.revision.new.revisionId;
 oldid=flowData.blocks.header.revision.old.revisionId;

 if(flowData.blocks.header.revision.new.previousRevisionId===oldid){
 ln=mw.util.getUrl(mw.config.get('wgPageName'),{
 action:'compare-header-revisions',
 header_newRevision:diff
 });
 }else{
 ln=mw.util.getUrl(mw.config.get('wgPageName'),{
 action:'compare-header-revisions',
 header_newRevision:diff,
 header_oldRevision:oldid
 });
 }
 }
 }
 };

 if(isFlowMode){
 reloadlink.exec=reloadlink.flow;
 }else{
 reloadlink.exec=reloadlink.normal;
 }

 $(mw.util.addPortletLink(
 mw.config.get('skin')==='minerva'?'p-tb':'p-cactions',
 '',
 messages[mode].portletText,
 't-difflink',
 messages[mode].portletDesc
 )).on('click',function(e){
 e.preventDefault();
 const$dom=$('<div>').attr({
 id:'difflink'
 });

 for(constlinkof(isFlowMode
 ?[
 '['+ln+']',
 '['+ln+' '+messages[mode].displayText+']',
 window.location.origin+ln
 ]
 :[
 ln,
 '[['+ln+']]',
 '[['+ln+'|'+messages[mode].displayText+']]',
 window.location.origin+mw.util.getUrl(ln)
 ]
 )){
 const$layout=newmw.widgets.CopyTextLayout({copyText:link}).$element;
 $layout.removeClass('oo-ui-fieldLayout-align-left');
 $dom.append($layout);
 }

 if(/(Android|iPhone|Mobile)/i.test(navigator.userAgent)){
 OO.ui.alert($dom);
 }else{
 OO.ui.alert($dom,{size:'medium'});
 }
 });

 mw.hook('wikipage.content').add(reloadlink.exec);
 });

AltStyle によって変換されたページ (->オリジナル) /