vvCiteWeb

Заполняет вики-шаблон Cite web для текущей страницы.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==UserScript==
// @description Заполняет вики-шаблон Cite web для текущей страницы.
// @exclude https://ru.wikipedia.org/*
// @exclude https://commons.wikimedia.org/*
// @exclude http://books.google.com/*
// @exclude http://books.google.ru/*
// @grant GM_xmlhttpRequest
// @icon http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/32/Actions-insert-link-icon.png
// @match http://*/*
// @match https://*/*
// @name vvCiteWeb
// @namespace https://ru.wikipedia.org/wiki/User:Neolexx
// @run-at document-end
// @version 2.0
// ==/UserScript==
/*
 * "THE BEER-WARE LICENSE" (Revision 42):
 * Neolexx wrote this file. As long as you retain this notice you can do
 * whatever you want with this stuff. If we meet some day, and you think
 * this stuff is worth it, you can buy me a beer in return.
 *
 * Icon by Oxygen Team, GNU LGPL https://www.gnu.org/licenses/lgpl.html
 */
 
 
 
'use strict';
void(function(){
if ( (typeof window != 'object') || (window.top != window.self) ) {return;}
if ( /wikipedia.org/.test(document.location.hostname) ) {return;}
 
 
 
var fontStyle = 'margin:4px;white-space:nowrap;font:normal normal normal 14px Arial,sans-serif;';
 
var voidValue = 'добавить';
 
var languageList = {
  'ru' : 'русский',
  'en' : 'английский',
  'be' : 'белорусский',
  'de' : 'немецкий',
  'uk' : 'украинский',
  'fr' : 'французский',
  'jp' : 'японский'
}
 
var publisherList = {
  'lenta.ru'        : 'Лента.Ру',
  'ria.ru'          : 'РИА Новости',
  'regnum.ru'       : 'ИА REGNUM',
  'rosbalt.ru'      : 'Росбалт',
  'km.ru'           : 'KM.RU',
  'cnn.com'         : 'CNN',
  'foxnews.com'     : 'FOX News',
  'bbc.com'         : 'BBC',
  'theguardian.com' : 'Guardian',
  'nytimes.com'     : 'New York Times',
  'wsj.com'         : 'Wall Street Journal'
}
 
var jsonData = null;
 
var isoDate, isoTimestamp, pageUrl = '';
 
var nodeText = ( 'innerText' in document.body )? 'innerText' : 'textContent';
 
var Container = document.createElement('DIV');
 
Container.style.position = 'fixed';
Container.style.zIndex   = '1001';
Container.style.left = '0';
Container.style.top  = '0';
Container.style.width  = '34px';
Container.style.height = '34px';
Container.style.margin = '0';
Container.style.padding  = '1px';
Container.style.overflow = 'hidden';
Container.style.backgroundColor  = '#FFFFFF';
Container.style.backgroundImage  =
  'url(http://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/32/Actions-insert-link-icon.png)';
Container.style.backgroundRepeat = 'no-repeat';
Container.style.cursor = 'pointer';
 
document.body.appendChild(Container).addEventListener('click', vvCiteWeb, true, false);
 
 
 
function vvCiteWeb(evt) {
  evt.stopPropagation();
  evt.preventDefault();
  Container.removeEventListener('click', vvCiteWeb, true);
 
  Container.style.width  = '300px';
  Container.style.height = 'auto';
  Container.style.border  = '1px solid silver';
  Container.style.margin  = '2px';
  Container.style.padding = '5px 10px';
  Container.style.overflowX = 'auto';
  Container.style.overflowY = 'visible';
  Container.style.backgroundImage  = 'none';
  Container.style.backgroundRepeat = 'initial';
  Container.style.cursor = 'auto';
 
  window.setTimeout(fillData, 1);
}
 
 
 
function fillData() {
  getDatePoint();
 
  pageUrl = getTemplateSafeString(document.location.href);
 
  Container.innerHTML = ''.concat(
    '<table border="0" cellspacing="0" cellpadding="0"><tbody>',
      getSelectableDataRow('vvLanguage', 'Язык', languageList, getSourceLanguage()),
      getStaticDataRow('vvArchive', 'Архивная копия', 'проверяется...'),
      getStaticDataRow('vvArchiveDate', 'Дата архивации:', 'проверяется...'),
      getEditableDataRow('vvPublisher', 'Издание / сайт', getSourcePublisher()),
      getEditableDataRow('vvTitle', 'Заглавие', getSourceTitle()),
      getEditableDataRow('vvAuthor', 'Автор(ы)', voidValue, 'Фамилия И. О. через запятую'),
      getEditableDataRow('vvDate', 'Дата публикации', voidValue, 'В формате ГГГГ-ММ-ДД'),
      getEditableDataRow('vvQuote', 'Цитата', voidValue, 'Краткая цитата без кавычек'),
    '</tbody></table>',
    '<p style="margin-top:5px;">',
    '<button style="width:90%;" type="button" id="vvGet1">Шаблон одной строкой</button></p>',
    '<p style="margin-top:5px;">',
    '<button style="width:90%;" type="button" id="vvGet2">Шаблон c pretty-print</button></p>'
  );
 
  window.setTimeout(checkArchiveCopy, 1);
}
 
 
 
function getDatePoint() {
  var now = new Date();
  var yyyy = now.getUTCFullYear();
  var m = now.getUTCMonth() + 1;
  var mm = m < 10 ? '0'+m : m;
  var d = now.getUTCDate();
  var dd = d < 10 ? '0'+d : d;
  var h = now.getUTCHours();
  var hh = h < 10 ? '0'+h : h;
  var n = now.getUTCMinutes();
  var mn = n < 10 ? '0'+n : n;
  var s = now.getUTCSeconds();
  var ss = s < 10 ? '0'+s : s;
  isoDate = ''.concat(yyyy, '-', mm, '-', dd);
  isoTimestamp = ''.concat(yyyy,mm,dd,hh,mn,ss);
}
 
 
 
function getSourceTitle() {
  var title;
  var header = _('H1');
  if ( header != null ) {
    title = getTemplateSafeString(header[nodeText].trim()) || '?';
  }
  else if ( !!document.title ) {
    title = document.title.trim() || '?';
  }
  else {
    title = '?';
  }
  return title;
}
 
 
 
function getSourceLanguage() {
  var l = _('HTML').getAttribute('lang') || _('HTML').getAttribute('xml:lang') || '';
  var lng;
  if ( !!l.length ) {
    lng = l.substr(0,2).toLowerCase();
  }
  else if ( !/[\u0400-\u04FF]/.test(getSourceTitle()) ) {
    lng = 'en'; // an educated guess...
  }
  else {
    lng = 'ru';
  }
  return lng;
}
 
 
 
function getSourcePublisher() {
  var domain = document.location.hostname.match(/\w+\.\w+$/);
  return (domain in publisherList)? publisherList[domain] : voidValue;
}
 
 
 
function getStaticDataRow(id, label, defaultValue) {
  return '<tr><td>'.concat(getLabel(label),
    '</td><td>', getKeyValueDivider(), '</td><td>',
    getStaticField(id, defaultValue),
    '</td></tr>'
  );
}
 
 
 
function getEditableDataRow(id, label, defaultValue, promptMessage) {
  return '<tr><td>'.concat(getLabel(label),
    '</td><td>', getKeyValueDivider(), '</td><td>',
    getEditableField(id, defaultValue, promptMessage||label),
    '</td></tr>'
  );
}
 
 
 
function getSelectableDataRow(id, label, values, def) {
  return '<tr><td>'.concat(getLabel(label),
    '</td><td>', getKeyValueDivider(), '</td><td>',
    getSelectableField(id, values, def),
    '</td></tr>'
  );
}
 
 
 
function getKeyValueDivider() {
  return '<var'.concat(' style="', fontStyle,
    'color:black;cursor:default;">=</var>'
  );
}
 
 
 
function getLabel(label) {
  return '<dfn'.concat(' style="', fontStyle,
    'color:black;cursor:default;">',
    label, '</dfn>'
  );
}
 
 
 
function getStaticField(id, defaultValue) {
  return '<var id="'.concat(id, '" style="', fontStyle,
    'color:black;cursor:default;">',
    defaultValue, '</var>'
  );
}
 
 
 
function getEditableField(id, defaultValue, promptMessage) {
  return '<var id="'.concat(id, '" style="',
    fontStyle, 'color:#0645AD;cursor:pointer;" ',
    'onmouseover="this.style.textDecoration=\'underline\';" ',
    'onmouseout="this.style.textDecoration=\'none\';" ',
    'onclick="',
    'var t = ( \'innerText\' in document.body )? \'innerText\' : \'textContent\';',
    'var txt = window.prompt(\'', extend_prompt(), '\',',
    'this[t]==\'', voidValue, '\'?\'\'\:this[t]);',
    'if ( !!txt && !!txt.trim() ) {this[t] = txt.trim();}">',
    defaultValue, '</var>'
  );
 
  function extend_prompt() {
    var w = 150;
    var len = promptMessage.length;
    if ( len >= w-2) {
      return promptMessage;
    }
    else {
      var ext = Math.round((w-len)/2);
      return (new Array(ext).join('\u00A0')).concat(
        promptMessage, (new Array(ext).join('\u00A0'))
      )
    }
  }
}
 
 
 
function getSelectableField(id, values, def) {
  var sel = '<select id="'.concat(id, '" style="', fontStyle, '">');
  for (var k in values) {
    sel+= '<option value="'.concat(
      k, '"', k==def?' selected>':'>', values[k], '</option>'
    );
  }
  return sel + '</select>';
}
 
 
 
function checkArchiveCopy() {
  if ( typeof GM_xmlhttpRequest == 'undefined' ) {
    alert('Вызовы между доменами запрещены.');
    return;
  }
 
  GM_xmlhttpRequest({
    method: 'GET',
    url   : 'https://archive.org/wayback/available?url='.concat(
      pageUrl, '&timestamp=', isoTimestamp
    ),
    onload: function(que) {
      jsonData = JSON.parse(que.responseText);
      if ( !!jsonData.archived_snapshots.closest ) {
        $('vvArchive').innerHTML = '<a href="'.concat(
          jsonData.archived_snapshots.closest.url,
          '" target="_blank" title="проверить" style="',
          fontStyle, 'color:#0645AD;text-decoration:underline;">',
          jsonData.archived_snapshots.closest.url, '</a>'
        );
        var s = jsonData.archived_snapshots.closest.timestamp;
        $('vvArchiveDate')[nodeText] = ''+s.substr(0,4)+'-'+s.substr(4,2)+'-'+s.substr(6,2);
      }
      else {
        $('vvArchive').innerHTML = '<var '.concat(
          'style="', fontStyle, 'color:black;cursor:default;">нет</var>\u00A0',
          '<a href="https://web.archive.org/save/', pageUrl,
          '" target="_blank" style="',
          fontStyle, 'color:#0645AD;text-decoration:underline;">',
          'создать вручную</a>'
        );
        $('vvArchiveDate')[nodeText] = 'нет';
      }
    }
  });
 
  $('vvGet1').onclick = getSingleLineSource;
 
  $('vvGet2').onclick = getPrettyPrintSource;
}
 
 
 
function getSingleLineSource() {
  var out = '{{cite web';
  out+=     '|url='+pageUrl+'\n';
  out+=     '|title='+$('vvTitle')[nodeText];
  if ( $('vvAuthor')[nodeText] != voidValue ) {
    out+=   '|author='+$('vvAuthor')[nodeText];
  }
  if ( $('vvQuote')[nodeText] != voidValue ) {
    out+=   '|quote'+$('vvQuote')[nodeText];
  }
  if ( $('vvDate')[nodeText] != voidValue ) {
    out+=   '|date='+$('vvDate')[nodeText];
  }
  if ( $('vvPublisher')[nodeText] != voidValue ) {
    out+=   '|publisher'+$('vvPublisher')[nodeText];
  }
  out+=     '|accessdate='+isoDate;
  if ( $('vvLanguage').options[$('vvLanguage').selectedIndex].value != 'ru' ) {
    out+=   '|language='+$('vvLanguage').options[$('vvLanguage').selectedIndex].value;
  }
  out+=     '|deadlink=';
  if ( $('vvArchiveDate')[nodeText] != 'нет' ) {
    out+=   '|archiveurl='+$('vvArchive')[nodeText];
    out+=   '|archivedate='+$('vvArchiveDate')[nodeText]+'\n';
  }
  out+= '}}';
  Container.innerHTML = '<form action="" onsubmit="return false">'.concat(
    '<textarea cols="32" rows="12" onclick="this.select();">',
    out, '</textarea></form>'
  );
}
 
 
 
function getPrettyPrintSource() {
  var out = '{{cite web\n';
  out+=     ' |url         = '+pageUrl+'\n';
  out+=     ' |title       = '+$('vvTitle')[nodeText]+'\n';
  if ( $('vvAuthor')[nodeText] != voidValue ) {
    out+=   ' |author      = '+$('vvAuthor')[nodeText]+'\n';
  }
  if ( $('vvQuote')[nodeText] != voidValue ) {
    out+=   ' |quote       = '+$('vvQuote')[nodeText]+'\n';
  }
  if ( $('vvDate')[nodeText] != voidValue ) {
    out+=   ' |date        = '+$('vvDate')[nodeText]+'\n';
  }
  if ( $('vvPublisher')[nodeText] != voidValue ) {
    out+=   ' |publisher   = '+$('vvPublisher')[nodeText]+'\n';
  }
  out+=     ' |accessdate  = '+isoDate+'\n';
  if ( $('vvLanguage').options[$('vvLanguage').selectedIndex].value != 'ru' ) {
    out+=   ' |language    = '+$('vvLanguage').options[$('vvLanguage').selectedIndex].value+'\n';
  }
  out+=     ' |deadlink    = \n';
  if ( $('vvArchiveDate')[nodeText] != 'нет' ) {
    out+=   ' |archiveurl  = '+$('vvArchive')[nodeText]+'\n';
    out+=   ' |archivedate = '+$('vvArchiveDate')[nodeText]+'\n';
  }
  out+= '}}';
  Container.innerHTML = '<form action="" onsubmit="return false">'.concat(
    '<textarea cols="32" rows="12" onclick="this.select();">',
    out, '</textarea></form>'
  );
}
 
 
 
function getTemplateSafeString(str) {
  return str.
  replace(/\n/g, ' ');
  replace(/\|/g, '%7C').
  replace(/\{/g, '%7B').
  replace(/\[/g, '%5B');
}
 
 
 
function _(tag) {
  try {
    return document.getElementsByTagName(tag)[0];
  }
  catch(e) {
    return null;
  }
}
 
 
 
function $(id) {
  return document.getElementById(id);
}
 
 
 
})()