بەکارھێنەر:Calak/vector.js

لە ئینسایکڵۆپیدیای ئازادی ویکیپیدیاوە
تێبینی: دوای پاشەکەوتکردن، پێویستە کاشی وێبگەڕەکەت پاک بکەیتەوە تا گۆڕانکارییەکان ببینیت. بۆ گووگڵ کڕۆم، فایەرفۆکس، مایکرۆسۆفت ئێج و سافاری: پەنجە لەسەر دوگمەی ⇧ Shift ڕاگرە و کرتە لەسەر Reload بکە. بۆ وردەکاری و ڕێنمایییەکان لەسەر وێبگەڕەکانی تر، بڕوانە ئێرە.
/*jslint browser: true, regexp: true, unparam: true, indent: 2*/
/*global jQuery: false, mw: false*/
/*
 + Default option
 + Size Query
 + Last User Query
 + Last edit time Query
**********************************************************************************
Options: put this variable to your /common.js. each item sets to 0 doesn't show! *
                                                                                 *
var pageInfoConf = {                                                             *
  'disambigQuery': true,                                                         *
  'firstUserQuery': true,                                                        *
  'lastUserQuery': true,                                                         *
  'firstTimeQuery': true,                                                        *
  'lastTimeQuery': true,                                                         *
  'redirectQuery': true,                                                         *
  'sizeQuery': true,                                                             *
  'redQuery': true,                                                              *
  'wikidataLink': true,                                                          *
  'wikidataWikiCount': true,                                                     *
  'wikidataP31': true                                                            *
};                                                                               *
                                                                                 *
**********************************************************************************
*/

(function ($) {
  'use strict';
  function addInfoToNode(node, info, color) {
    $(node).after('<span class="infoAddedcontent">[<span style="color: ' + color + ';">' + info + '</span>]</span>');
  }

  var conf = {
    'disambigQuery': true,
    'firstUserQuery': true,
    'lastUserQuery': true,
    'firstTimeQuery': true,
    'lastTimeQuery': true,
    'redirectQuery': true,
    'sizeQuery': true,
    'redQuery': true,
    'wikidataLink': true,
    'wikidataWikiCount': true,
    'wikidataP31': true
  };
  $.extend(conf, window.pageInfoConf);

  function getSelectedTextLinks() {
    // borrowed from: http://stackoverflow.com/questions/4220478 :)
    var selection,
      selectionAncestor,
      range,
      allWithinRangeParent,
      allSelected,
      i,
      el;

    // if `window.getSelection` is not defined (on IE) return nothing.
    if (window.getSelection === undefined) {
      return [];
    }
    selection = window.getSelection();

    // if nothing is selected, return empty array
    if (selection.isCollapsed) {
      return [];
    }

    range = selection.getRangeAt(0);
    selectionAncestor = range.commonAncestorContainer;

    if (selectionAncestor.getElementsByTagName === undefined) { // if it is not a formal HTML selection
      return [];
    }

    allWithinRangeParent = selectionAncestor.getElementsByTagName('a');

    allSelected = [];

    for (i = 0; allWithinRangeParent[i] !== undefined; i += 1) {
      el = allWithinRangeParent[i];
      // The second parameter says to include the element 
      // even if it's not fully selected
      if (selection.containsNode(el, true)) {
        allSelected.push(el);
      }
    }

    return allSelected;
  }

  function getArticleLinks() {
    var allSelected = getSelectedTextLinks();

    if (allSelected.length === 0) {
      return $('#bodyContent a');
    }

    return allSelected;
  }

  function parseUrl(url) {
    if (url === undefined) {
      return undefined;
    }

    var match = url.match(/\/wiki\/([^#]*)/);

    if (match === null) {
      match = url.match(/\/w\/index\.php\?title=([^&#]*).*redlink=1/);
    }

    if (match !== null) {
      return decodeURI(match[1]); // returns () matched text
    }

    return undefined;
  }

  function getLinkTitle(link) {
    return parseUrl(link.href);
  }

  function firstUserAndTime(data) {
    var res;
    $.each(data.query.pages, function (key, value) { // for retrieving first object index
      if (value.revisions !== undefined) {
        res = [value.revisions[0].user, value.revisions[0].timestamp];
      }
    });
    return res;
  }

  function lastUserAndTime(data) {
    var res;
    $.each(data.query.pages, function (key, value) { // for retrieving first object index
      if (value.revisions !== undefined) {
        res = [value.revisions[0].user, value.revisions[0].timestamp];
      }
    });
    return res;
  }
  function pageSize(data) {
    var res;
    $.each(data.query.pages, function (key, value) { // for retrieving first object index
      if (value !== undefined) {
        res = value.length;
      }
    });
    return res;
  }
  function detectHasTemplate(data) {
    var hasTemplate = false;

    $.each(data.query.pages, function (key, value) { // for retrieving first object index
      hasTemplate = value.templates === undefined ? false : true;
    });

    return hasTemplate;
  }

  function infoAdder(infoType) {
    var enableDisambigDetection = $('#enableDisambigDetection').is(':checked'),
      enableFirstUserName = $('#enableFirstUserName').is(':checked'),
      enableFirstUserTime = $('#enableFirstUserTime').is(':checked'),
      enableLastUserName = $('#enableLastUserName').is(':checked'),
      enableLastUserTime = $('#enableLastUserTime').is(':checked'),
      enablePageSize = $('#enablePageSize').is(':checked'),
      enableRedirectDetection = $('#enableRedirectDetection').is(':checked'),
      enableRedLinkDetection = $('#enableRedLinkDetection').is(':checked'),
      enableWikidataLink = $('#enableWikidataLink').is(':checked'),
      enableWikidataWikiCount = $('#enableWikidataWikiCount').is(':checked'),
      enableWikidataP31 = $('#enableWikidataP31').is(':checked'),
      api = new mw.Api(),
      links = getArticleLinks();

    if (enableRedLinkDetection) {
      $(links).filter('a.new').each(function (key, value) {
        // value.innerHTML = value.innerHTML + ' @';
        addInfoToNode(value, 'ناموجود', 'red');
      });
    }

    $(links).each(function (key, value) {
      var jValue = $(value),
        href = jValue.attr('href'),
        name;

      if (href === undefined) {
        return;
      }

      name = getLinkTitle(value);

      if (name === undefined) {
        return;
      }

      if (enableRedirectDetection && jValue.is('a.mw-redirect')) {
        addInfoToNode(value, 'تغییر مسیر', 'green');
      }

      if (enableDisambigDetection) {
        api.get({
          action: 'query',
          prop: 'templates',
          titles: name,
          tltemplates: 'الگو:ابهام\u200cزدایی'
        }).done(function (data) {
          if (detectHasTemplate(data)) {
            addInfoToNode(value, 'ابهام\u200cزدایی', 'aqua');
          }
        });
      }

      if (enableFirstUserName || enableFirstUserTime) {
        api.get({
          action: 'query',
          prop: 'revisions',
          titles: name,
          rvlimit: '1',
          rvprop: 'user|timestamp',
          rvdir: 'newer'
        }).done(function (data) {
          var fut = firstUserAndTime(data);
          if (fut !== undefined) {
            if (enableFirstUserName) {
              addInfoToNode(value, 'کاربر:' + fut[0], 'gray');
            }
            if (enableFirstUserTime) {
              addInfoToNode(value, 'در ' + new Date(fut[1]).toDateString(), 'orange');
            }
          }
        });
      }

      if (enablePageSize) {
        api.get({
          action: 'query',
          prop: 'info',
          titles: name
        }).done(function (data) {
          var size = pageSize(data),
            num;
          if (size !== undefined) {
            num = size / 1000;
            if (num < 4) {
              addInfoToNode(value, 'کیلوبایت ~ ' + num, '#D715C1');
            } else if (10 > num && num > 4) {
              addInfoToNode(value, 'کیلوبایت ~ ' + num, '#039839');
            } else if (30 > num && num > 10) {
              addInfoToNode(value, 'کیلوبایت ~ ' + num, 'red');
            } else if (num > 30) {
              addInfoToNode(value, 'کیلوبایت ~ ' + num, '#FF6B00');
            }
          }
        });
      }

      if (enableLastUserName || enableLastUserTime) {
        api.get({
          action: 'query',
          prop: 'revisions',
          titles: name,
          rvlimit: '1',
          rvprop: 'user|timestamp',
          rvdir: 'older'
        }).done(function (data) {
          var Lut = lastUserAndTime(data);
          if (Lut !== undefined) {
            if (enableLastUserName) {
              addInfoToNode(value, 'کاربر:' + Lut[0], 'gray');
            }
            if (enableLastUserTime) {
              addInfoToNode(value, 'در ' + new Date(Lut[1]).toDateString(), 'orange');
            }
          }
        });
      }
      if (enableWikidataLink || enableWikidataWikiCount || enableWikidataP31) {
        $.ajax({
        url: '//www.wikidata.org/w/api.php',
        data: {
          action: 'wbgetentities',
          sites: value.href.replace(/^.*\/\/([^\.]*)\.(wiki)pedia\.org.*$/, "$1$2"),
          prop: 'revisions',
          titles: name,
          format: 'json'
        },
        success: function (data) {
          var itemId = Object.keys(data.entities)[0];
          if (itemId === '-1') { return; }
          if (enableWikidataLink) {
          addInfoToNode(value, 'ویکی‌داده: <a href="//www.wikidata.org/wiki/' + itemId + '">' + itemId + '</a>', 'black');
          }
          if (enableWikidataWikiCount) {
          addInfoToNode(value, 'تعداد میان‌ویکی: ' + Object.keys(data.entities[itemId].sitelinks).length, 'yellowgreen');
          }
          if (enableWikidataP31 &&
            data.entities[itemId].claims !== undefined &&
            data.entities[itemId].claims.P31 !== undefined) {
          $.ajax({
            url: '//www.wikidata.org/w/api.php',
            dataType: 'jsonp',
            data: {
            action: 'wbgetentities',
            ids: data.entities[itemId].claims.P31.map(function (x) {
              return 'Q' + x.mainsnak.datavalue.value['numeric-id'];
            }).join('|'),
            format: 'json'
            }, success: function (data) {
            if (Object.keys(data.entities) === undefined) { return; }
            addInfoToNode(value, 'یک ...: ' +
              Object.keys(data.entities).map(function (x) {
              var labels = data.entities[x].labels;
              if (labels.fa === undefined) { return labels.en.value; }
              return labels.fa.value;
              }).join(', '),
              'green'
            );
            }
          });
          }
        },
        dataType: 'jsonp'
        });
      }
    });
  }

  $(function () {
    $('#articlesLinksInfo').remove();
    // HTML Builder
    var hb = [];
    hb.push('<span style="font-size: 40%; margin: 0 2em; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;" id="articlesLinksInfo" class="noprint">');
    hb.push('<a id="allInfo-button" href="#">اطلاعات پیوندها</a>');
    if (conf.disambigQuery) {
      hb.push(' <input type="checkbox" name="enableDisambigDetection" id="enableDisambigDetection"><label for="enableDisambigDetection">ابهام\u200cزدایی؟</label>');
    }
    if (conf.firstUserQuery) {
      hb.push(' <input type="checkbox" name="enableFirstUserName" id="enableFirstUserName"><label for="enableFirstUserName">اولین ویرایشگر؟</label>');
    }
    if (conf.lastUserQuery) {
      hb.push(' <input type="checkbox" name="enableLastUserName" id="enableLastUserName"><label for="enableLastUserName">آخرین ویرایشگر؟</label>');
    }
    if (conf.firstTimeQuery) {
      hb.push(' <input type="checkbox" name="enableFirstUserTime" id="enableFirstUserTime"><label for="enableFirstUserTime">تاریخ ایجاد؟</label>');
    }
    if (conf.lastTimeQuery) {
      hb.push(' <input type="checkbox" name="enableLastUserTime" id="enableLastUserTime"><label for="enableLastUserTime">تاریخ آخرین ویرایش؟</label>');
    }
    if (conf.redirectQuery) {
      hb.push(' <input type="checkbox" name="enableRedirectDetection" id="enableRedirectDetection"><label for="enableRedirectDetection">تغییر مسیر؟</label>');
    }
    if (conf.sizeQuery) {
      hb.push(' <input type="checkbox" name="enablePageSize" id="enablePageSize"><label for="enablePageSize">حجم؟</label>');
    }
    if (conf.redQuery) {
      hb.push(' <input type="checkbox" name="enableRedLinkDetection" id="enableRedLinkDetection"><label for="enableRedLinkDetection">ناموجود؟</label>');
    }
    if (conf.wikidataLink) {
      hb.push(' <input type="checkbox" name="enableWikidataLink" id="enableWikidataLink"><label for="enableWikidataLink">ویکی‌داده؟</label>');
    }
    if (conf.wikidataWikiCount) {
      hb.push(' <input type="checkbox" name="enableWikidataWikiCount" id="enableWikidataWikiCount"><label for="enableWikidataWikiCount">تعداد میان‌ویکی؟</label>');
    }
    if (conf.wikidataP31) {
      hb.push(' <input type="checkbox" name="enableWikidataP31" id="enableWikidataP31"><label for="enableWikidataP31">ویکی‌داده یک ...؟</label>');
    }
    hb.push('</span>');

    $('h1:first').append(hb.join(''));

    $('#allInfo-button').click(function (event) {
      event.preventDefault();
      infoAdder('all');
    });
  });
}(jQuery));