vvCiteWeb

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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);
}
 
 
 
})()