// ==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, '×tamp=', 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);
}
})()