User:Diegodlh/Web2Cit/script.js

(function { // https://gitlab.wikimedia.org/diegodlh/w2c-gadget/-/blob/845f604f3368684a231b0d6d0fc8c43cd0b218b0/script.js // Copyright (C) 2022 Diego de la Hera and contributors. // This work is released under the terms of GPL-3.0 or any later version. class Web2Cit {  static disabledItem = 'web2cit.disabled';

constructor { this.unpatched = {}; this.initialized = false; // this.mode = undefined; this.server = "https://web2cit.toolforge.org/"; if (window.web2citServer) { try { this.server = new URL(window.web2citServer).href; } catch { console.log("Ignoring invalid web2citServer setting"); }   }  }

get disabled { return localStorage.getItem(this.disabledItem) === "true"; // if (this.mode === "visual") { //  return localStorage.getItem(this.disabledItem) === "true"; // } else { //  return false; // }     }

set disabled(disabled) { localStorage.setItem(this.disabledItem, disabled === "true"); // if (this.mode === "visual") { //  localStorage.setItem(this.disabledItem, disabled === "true"); // } else { //  throw Error(`Cannot disable in ${this.mode} mode`); // } }

init { if (this.initialized) return; console.log('Web2Cit: Initializing...'); this.patchInitialize; if(!this.disabled) this.enable; this.initialized = true; // const surface = ve.init.target.getSurface; // this.mode = surface.getMode; // if (this.mode === "visual") { //  this.patchInitialize; // }   // if (!this.disabled || this.mode === "source") { //  this.enable; // } }

enable { console.log("Web2Cit: Enabling..."); this.patchAjax; this.patchBuildTemplateResults; // if (this.mode === "visual") { //  this.patchBuildTemplateResults; // }; }

disable { console.log("Web2Cit: Disabling..."); this.unpatchAjax; this.unpatchBuildTemplateResults; // if (this.mode === "visual") { //  this.unpatchBuildTemplateResults; // } }

patchInitialize { // console.log("Web2Cit: Patching CitoidInspector's \"initalize\"...") const initialize = ve.ui.CitoidInspector.prototype.initialize; // const toggle = new OO.ui.ToggleSwitchWidget({   //   value: !this.disabled    // }); const toggle = new OO.ui.CheckboxInputWidget({     selected: !this.disabled,    }); const field = new OO.ui.FieldLayout( toggle, {     align: 'inline',      label: 'Web2Cit'    } ); toggle.on("change", (value) => {     if (value) {        this.disabled = false;        this.enable;      } else {        this.disabled = true;        this.disable;      }    }); ve.ui.CitoidInspector.prototype.initialize = function { initialize.bind(this); const parentElement = this.autoProcessPanels.lookup.$element; field.$element.insertAfter(parentElement.children.first); } }

patchAjax { if (this.unpatched.ajax) return; // console.log("Web2Cit: Patching ajax...") const ajax = $.ajax; this.unpatched.ajax = ajax; const server = this.server; $.ajax = function(url, options) { // If url is an object, simulate pre-1.5 signature if ( typeof url === "object" ) { options = url; url = undefined; }     // Force options to be an object options = options || {}; url = url || options.url; const match = url.match(       /^\/api\/rest_v1\/data\/citation\/mediawiki\/(? .+)/     );      if (match !== null) { let { search } = match.groups; search = decodeURIComponent(search); // mimick citoid's CitoidService.js       search = search.trim//.toLowerCase; // if the query does not begin with either http:// or https:// // only assume that the user meant a url if it follows the pattern // www.something.somethingelse // otherwise, we may miss DOIs, QIDs, PMCIDs, ISBNs or PMIDs // which are handled by Citoid differently // instruct the user to always add http:// or https:// at the beginning // to explicitly mean a url if (search.match(/^www\..+\..+/i)) { search = "http://" + search; };       if (          search.match(/^https?:\/\/.+/i) &&          // to prevent an endless loop, continue using web2cit through citoid          // if user explicitly asks to translate a web2cit url          !search.match( new RegExp(`^https?://${server.replace(/^https?:\/\//i, "")}.+`, "i") )       ) {          console.log('Web2Cit: Search will be resolved using Web2Cit + Citoid...') url = server + "translate"; options.data = { "citoid": "true", "format": "mediawiki", "url": search };       }      }      return ajax.bind(this)(url, options); }   }

patchBuildTemplateResults { if (this.unpatched.buildTemplateResults) return; // console.log("Web2Cit: Patching CitoidInspector's \"buildTemplateResults\"..."); const buildTemplateResults = ve.ui.CitoidInspector.prototype.buildTemplateResults; this.unpatched.buildTemplateResults = buildTemplateResults const server = this.server; ve.ui.CitoidInspector.prototype.buildTemplateResults = function( searchResults ) { let url; let web2citLocal = false; for (const citation of searchResults) { let { source } = citation; if (source !== undefined) { if (!Array.isArray(source)) source = [ source ]; if (source.includes('Web2Cit')) { url = citation.url; web2citLocal = true; break; }       }      }      const credit = this.credit; const onLabelChange = function { credit.off("labelChange", onLabelChange); console.log('Web2Cit: Adding "Web2Cit" to credit label...'); credit.setLabel($( ` ${credit.label} & Web2Cit (🖉) ` ));     }      if (web2citLocal) { credit.on("labelChange", onLabelChange); }     return buildTemplateResults.bind(this)(searchResults); } }

unpatchAjax { if (!this.unpatched.ajax) return; // console.log("Web2Cit: Unpatching ajax..."); $.ajax = this.unpatched.ajax; delete this.unpatched.ajax; }

unpatchBuildTemplateResults { if (!this.unpatched.buildTemplateResults) return; // console.log("Web2Cit: Unpatching CitoidInspector's \"buildTemplateResults\"..."); ve.ui.CitoidInspector.prototype.buildTemplateResults = this.unpatched.buildTemplateResults; delete this.unpatched.buildTemplateResults; } }

// a "gadget loader" - a small gadget that tells VE to load the real gadget // once VE is activated by the user // https://www.mediawiki.org/wiki/VisualEditor/Gadgets#Deployment mw.loader.using( 'ext.visualEditor.desktopArticleTarget.init', function {  // console.log("Web2Cit script will load...");  // return mw.loader.getScript('/w/index.php?title=User:Diegodlh/Web2Cit/script.js&action=raw&ctype=text/javascript');   window.web2cit = new Web2Cit;  mw.hook( 've.activationComplete' ).add( function  { // console.log('Web2Cit: Running "ve.activationComplete" hook...') window.web2cit.init; }); // mw.hook( 've.wikitextInteractive' ).add( function  { //  console.log('Web2Cit: Running "ve.wikitextInteractive" hook...') //  window.web2cit.init; // } ); }); })