about summary refs log tree commit diff stats
path: root/src/assets/javascripts/wikipedia.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/assets/javascripts/wikipedia.js')
-rw-r--r--src/assets/javascripts/wikipedia.js220
1 files changed, 220 insertions, 0 deletions
diff --git a/src/assets/javascripts/wikipedia.js b/src/assets/javascripts/wikipedia.js
new file mode 100644
index 00000000..868bb01c
--- /dev/null
+++ b/src/assets/javascripts/wikipedia.js
@@ -0,0 +1,220 @@
+window.browser = window.browser || window.chrome;
+
+import utils from './utils.js'
+
+const targets = /^https?:\/{2}(([a-z]{1,}\.){0,})wikipedia\.org/
+
+let redirects = {
+  "wikiless": {
+    "normal": [],
+    "tor": [],
+    "i2p": []
+  }
+};
+function setRedirects(val) {
+  browser.storage.local.get('cloudflareList', r => {
+    redirects.wikiless = val;
+    wikilessNormalRedirectsChecks = [...redirects.wikiless.normal];
+    for (const instance of r.cloudflareList) {
+      const a = wikilessNormalRedirectsChecks.indexOf(instance);
+      if (a > -1) wikilessNormalRedirectsChecks.splice(a, 1);
+    }
+    browser.storage.local.set({
+      wikipediaRedirects: redirects,
+      wikilessNormalRedirectsChecks
+    })
+  })
+}
+
+let
+  disableWikipedia,
+  wikipediaRedirects,
+  wikipediaProtocol,
+  wikilessNormalRedirectsChecks,
+  wikilessTorRedirectsChecks,
+  wikilessI2pRedirectsChecks,
+  wikilessNormalCustomRedirects,
+  wikilessTorCustomRedirects,
+  wikilessI2pCustomRedirects;
+
+function init() {
+  return new Promise(async resolve => {
+    browser.storage.local.get(
+      [
+        "disableWikipedia",
+        "wikipediaRedirects",
+        "wikipediaProtocol",
+
+        "wikilessNormalRedirectsChecks",
+        "wikilessTorRedirectsChecks",
+        "wikilessI2pRedirectsChecks",
+        "wikilessNormalCustomRedirects",
+        "wikilessTorCustomRedirects",
+        "wikilessI2pCustomRedirects",
+      ],
+      r => {
+        disableWikipedia = r.disableWikipedia;
+        wikipediaRedirects = r.wikipediaRedirects;
+        wikipediaProtocol = r.wikipediaProtocol;
+        wikilessNormalRedirectsChecks = r.wikilessNormalRedirectsChecks;
+        wikilessTorRedirectsChecks = r.wikilessTorRedirectsChecks;
+        wikilessI2pRedirectsChecks = r.wikilessI2pRedirectsChecks;
+        wikilessNormalCustomRedirects = r.wikilessNormalCustomRedirects;
+        wikilessTorCustomRedirects = r.wikilessTorCustomRedirects;
+        wikilessI2pCustomRedirects = r.wikilessI2pCustomRedirects;
+        resolve();
+      }
+    )
+  })
+}
+
+init();
+browser.storage.onChanged.addListener(init)
+
+function initWikilessCookies(test, from) {
+  return new Promise(async resolve => {
+    await init();
+    const protocolHost = utils.protocolHost(from);
+    const all = [
+      ...wikilessNormalRedirectsChecks,
+      ...wikilessNormalCustomRedirects,
+      ...wikilessTorRedirectsChecks,
+      ...wikilessTorCustomRedirects,
+      ...wikilessI2pRedirectsChecks,
+      ...wikilessI2pCustomRedirects,
+    ];
+    if (!all.includes(protocolHost)) { resolve(); return; }
+
+    if (!test) {
+      let checkedInstances;
+      if (wikipediaProtocol == 'normal') checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
+      else if (wikipediaProtocol == 'tor') checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
+      else if (wikipediaProtocol == 'i2p') checkedInstances = [...wikilessI2pRedirectsChecks, ...wikilessI2pCustomRedirects]
+
+      for (const to of checkedInstances) {
+        utils.copyCookie('wikiless', from, to, 'theme');
+        utils.copyCookie('wikiless', from, to, 'default_lang');
+      }
+    }
+    resolve(true);
+  })
+}
+
+function setWikilessCookies() {
+  return new Promise(async resolve => {
+    await init();
+    if (disableWikipedia || wikipediaProtocol === undefined) { resolve(); return; }
+    let checkedInstances;
+    if (wikipediaProtocol == 'normal') checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
+    else if (wikipediaProtocol == 'tor') checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
+    for (const to of checkedInstances) {
+      utils.getCookiesFromStorage('wikiless', to, 'theme');
+      utils.getCookiesFromStorage('wikiless', to, 'default_lang');
+    }
+    resolve();
+  })
+}
+
+function redirect(url) {
+  if (disableWikipedia) return;
+  if (!targets.test(url.href)) return;
+
+  let GETArguments = [];
+  if (url.search.length > 0) {
+    let search = url.search.substring(1); //get rid of '?'
+    let argstrings = search.split("&");
+    for (let i = 0; i < argstrings.length; i++) {
+      let args = argstrings[i].split("=");
+      GETArguments.push([args[0], args[1]]);
+    }
+  }
+  let instancesList;
+  if (wikipediaProtocol == 'normal') instancesList = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects];
+  else if (wikipediaProtocol == 'tor') instancesList = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects];
+  else if (wikipediaProtocol == 'i2p') instancesList = [...wikilessI2pRedirectsChecks, ...wikilessI2pCustomRedirects];
+  if (instancesList.length === 0) return;
+  const randomInstance = utils.getRandomInstance(instancesList)
+
+  let link = `${randomInstance}${url.pathname}`;
+  let urlSplit = url.host.split(".");
+  if (urlSplit[0] != "wikipedia" && urlSplit[0] != "www") {
+    if (urlSplit[0] == "m")
+      GETArguments.push(["mobileaction", "toggle_view_mobile"]);
+    else
+      GETArguments.push(["lang", urlSplit[0]]);
+    if (urlSplit[1] == "m")
+      GETArguments.push(["mobileaction", "toggle_view_mobile"]);
+    // wikiless doesn't have mobile view support yet
+  }
+  for (let i = 0; i < GETArguments.length; i++)
+    link += (i == 0 ? "?" : "&") + GETArguments[i][0] + "=" + GETArguments[i][1];
+  return link;
+}
+
+function switchInstance(url) {
+  return new Promise(async resolve => {
+    await init();
+    const protocolHost = utils.protocolHost(url);
+    const wikipediaList = [
+      ...wikipediaRedirects.wikiless.normal,
+      ...wikipediaRedirects.wikiless.tor,
+      ...wikipediaRedirects.wikiless.i2p,
+
+      ...wikilessNormalCustomRedirects,
+      ...wikilessTorCustomRedirects,
+      ...wikilessI2pCustomRedirects
+    ];
+    if (!wikipediaList.includes(protocolHost)) { resolve(); return; }
+
+    let instancesList;
+    if (wikipediaProtocol == 'normal') instancesList = [...wikilessNormalCustomRedirects, ...wikilessNormalRedirectsChecks];
+    else if (wikipediaProtocol == 'tor') instancesList = [...wikilessTorCustomRedirects, ...wikilessTorRedirectsChecks];
+    else if (wikipediaProtocol == 'i2p') instancesList = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks];
+
+    let index = instancesList.indexOf(protocolHost);
+    if (index > -1) instancesList.splice(index, 1);
+    if (instancesList.length === 0) { resolve(); return; }
+
+    const randomInstance = utils.getRandomInstance(instancesList);
+    resolve(`${randomInstance}${url.pathname}${url.search}`);
+  })
+}
+
+function initDefaults() {
+  return new Promise(resolve => {
+    fetch('/instances/data.json').then(response => response.text()).then(async data => {
+      let dataJson = JSON.parse(data);
+      redirects.wikiless = dataJson.wikiless;
+      browser.storage.local.get('cloudflareList', async r => {
+        wikilessNormalRedirectsChecks = [...redirects.wikiless.normal];
+        for (const instance of r.cloudflareList) {
+          let i = wikilessNormalRedirectsChecks.indexOf(instance);
+          if (i > -1) wikilessNormalRedirectsChecks.splice(i, 1);
+        }
+        await browser.storage.local.set({
+          disableWikipedia: true,
+          wikipediaRedirects: redirects,
+          wikipediaProtocol: "normal",
+          wikilessNormalRedirectsChecks: wikilessNormalRedirectsChecks,
+          wikilessTorRedirectsChecks: [...redirects.wikiless.tor],
+          wikilessI2pRedirectsChecks: [...redirects.wikiless.i2p],
+          wikilessNormalCustomRedirects: [],
+          wikilessTorCustomRedirects: [],
+          wikilessI2pCustomRedirects: [],
+        })
+        resolve();
+      })
+    })
+  })
+}
+
+export default {
+  setRedirects,
+
+  initWikilessCookies,
+  setWikilessCookies,
+
+  redirect,
+  initDefaults,
+  switchInstance,
+};