Jump to content

User:DaxServer/CiteWikiLinker.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
//<nowiki>

/**
 * –––––
 *       YOU ARE FULLY RESPONSIBLE FOR PUBLISHING EDITS USING THIS SCRIPT
 * –––––
 *
 * This script is not ready for use, unless of course, if you know what you are doing.
 * You must verify if the conversion is successful and modify if not.
 */

$.when(
  $.ready
).then(function () {
  const regexes = [
    ['www\.bollywoodhungama\.com', 'Bollywood Hungama'],
    ['www\.dailymirror\.lk', 'Daily Mirror', 'Daily Mirror (Sri Lanka)|Daily Mirror'],
    ['www\.dnaindia\.com', 'Daily News & Analysis'],
    ['www\.deccanchronicle\.com', 'Deccan Chronicle'],
    ['www\.deccanherald\.com', 'Deccan Herald'],
    ['www\.deccanherald\.com', 'deccanherald\.com', 'Deccan Herald'],
    ['www\.firstpost\.com', 'Firstpost'],
    ['www\.hindustantimes\.com', 'Hindustan Times'],
    ['www\.indiatoday\.in', 'India Today'],
    ['www\.ibtimes\.co\.in', 'International Business Times'],
    ['www\.livemint\.com', 'LiveMint'],
    ['www\.mumbaimirror\.com', 'Mumbai Mirror'],
    ['www\.ndtv\.com', 'NDTV\.com', 'NDTV'],
    ['www\.ndtv\.com', 'NDTV'],
    ['www\.news18\.com', 'News18'],
    ['entertainment\.oneindia\.in', 'oneindia\.in', 'OneIndia'],
    ['entertainment\.oneindia\.in', 'OneIndia'],
    ['www\.rediff\.com', 'Rediff'],
    ['in\.reuters\.com', 'Reuters'],
    ['economictimes\.indiatimes\.com', 'The Economic Times'],
    ['economictimes\.indiatimes\.com', 'Economic Times', 'The Economic Times'],
    ['www\.thehindu\.com', 'The Hindu'],
    ['www\.thehindu\.com', 'thehindu', 'The Hindu'],
    ['(?:www\.)?indianexpress\.com', 'The Indian Express'],
    ['(?:www\.)?newindianexpress\.com', 'The New Indian Express'],
    ['www\.thenewsminute.\com', 'The News Minute'],
    ['www\.thequint\.com', 'The Quint'],
    ['www\.siasat\.com', 'The Siasat Daily'],
    ['thestar\.com\.my', 'The Star', 'The Star (Malaysia)|The Star'],
    ['www\.telegraphindia\.com', 'The Telegraph', 'The Telegraph (India)|The Telegraph'],
    ['www\.telegraphindia\.com', 'www\.telegraphindia\.com', 'The Telegraph (India)|The Telegraph'],
    ['timesofindia\.indiatimes\.com', 'The Times of India'],
    ['timesofindia\.indiatimes\.com', 'Timesofindia\. ?indiatimes\.com', 'The Times of India'],
    ['www\.tribuneindia\.com', 'The Tribune', 'The Tribune (Chandigarh)|The Tribune'],
    ['www\.uiowa\.edu', 'University of Iowa'],
    ['www\.washingtonpost\.com', 'Washington Post'],
    ['movies\.yahoo\.com', 'Yahoo! Movies'],
    ['zeenews\.india\.com', 'Zee News'],
    ...(window.ds_citewikilinker_regexes || [])
  ];

  const refPartStart = '(<ref(?: name=":?[\\w\\.\\s]+")?>{{cite (?:news|web)'
  const refPartEnd = '}}<\\/ref>)'
  const citePart = '[|\\w\\s=?-–-&’\'#.:;+,%!₹\\/[\\]()]*'
  const urlPart = 'url ?= ?https?:\/\/'
  const params = '(?:website|work|newspaper|publisher) ?= ?'

  // Activate portlet when VE source editor is enabled
  mw.hook( 've.activationComplete' ).add(function () {
    // Remove portlet when VE visual editor is enabled
    if (0 === $('.ve-ui-surface-source').length) {
      $('#ds-cite-wikilinker').remove()

      return
    }

    $.when(
      mw.loader.using( [ 'mediawiki.util' ] )
    ).then( function () {
      main()
    })
  })

  // Remove portlet when VE is deactivated
  mw.hook( 've.deactivationComplete' ).add(function () {
    $('#ds-cite-wikilinker').remove()
  })

  function main() {
    const node = mw.util.addPortletLink('p-tb', '#', 'Cite Wikilinker', 'ds-cite-wikilinker', 'Wikilink publishers in citations')

    $( node ).click(function (e) {
      let textBox = $('#wpTextbox1')
      let content = textBox.textSelection('getContents')
      let re1, re2, changes = false;

      for (const i of regexes) {
        re1 = new RegExp(`${refPartStart}${citePart}${urlPart}${i[0]}${citePart}${params})${i[1]}(${citePart}${refPartEnd}`, 'gim')
        re2 = new RegExp(`${refPartStart}${citePart}${params})${i[1]}(${citePart}${urlPart}${i[0]}${citePart}${refPartEnd}`, 'gim')

        if (re1.test(content)) {
          changes = true
          content = content.replaceAll(re1, `$1[[${i[2] ?? i[1]}]]$2`)
        }

        if (re2.test(content)) {
          changes = true
          content = content.replaceAll(re2, `$1[[${i[2] ?? i[1]}]]$2`)
        }
      }

      if (!changes) {
        mw.notify('No changes made', {
          title: 'Cite Wikilinker',
        })

        return
      }

      textBox.textSelection('setContents', content)

      mw.notify('Citations wiki-linked', {
        title: 'Cite Wikilinker',
        type: 'success',
      })

      // Hook to add edit summary
      mw.hook( 've.saveDialog.stateChanged' ).add(prefillEditSummary)

      e.preventDefault()
    })
  }

  function prefillEditSummary() {
    if (ve.init.target.saveDialog) {
      ve.init.target.saveDialog.editSummaryInput.$input.val('Wikilink citation publisher ([[User:DaxServer/CiteWikiLinker|CiteWikiLinker.js]])')
    }

    // Remove hook upon prefilling
    mw.hook( 've.saveDialog.stateChanged' ).remove(prefillEditSummary)
  }
});

//</nowiki>