// ==UserScript==
// @name RefLinkGenerator
// @name:en-us RefLinkGenerator
// @name:zh-cn 引用链接生成器
// @namespace http://www.joshuazhang.net
// @version 1.3
// @description:en-us Generate reference link in all kinds of markup languages like html, markdown etc and copy to system clipboard.
// @description:zh-cn 提取网页标题和URL,快捷生成各类标记语言引用链接文本并复制到系统剪贴板
// @homepageURL https://coding.net/u/joshz/p/RefLinkGenerator/git
// @supportURL https://coding.net/u/joshz/p/RefLinkGenerator/topic/all
// @require https://code.jquery.com/jquery-1.11.3.min.js
// @include http://*
// @include https://*
// @author joshz
// @grant GM_addStyle
// @run-at document-end
// @noframes
// @description Generate reference link in all kinds of markup languages like html, markdown etc and copy to system clipboard.
// ==/UserScript==
/*
Tampermonkey reference -> https://tampermonkey.net/documentation.php
1. @noframes tag will prevent this script run inside iframe
2. GM_log is not very user friendly, use console.log instead
See:console.log is not working when used in a Firefox, Greasemonkey script - Stack Overflow ->
https://stackoverflow.com/questions/10135241/console-log-is-not-working-when-used-in-a-firefox-greasemonkey-script
*/
/*
Add rlg-panel styles
https://stackoverflow.com/a/707580/2709868
Just some basic style, mostly the panel style will inherit from current page.
*/
var style =
"#rlg-panel {display:inline-block;position:fixed;top:10%;left:0;\
z-index:2147483647;background:#111;color:#fff;overflow:hidden;}\
#rlg-panel input{color:#111;margin:2px 8px 2px 8px;border-width:2px;border-color:#32cd32}\
#rlg-panel a{color:#fff;font-size:14px;text-decoration:none;\
border-style:solid;border-width:1px;border-color:#32cd32}\
#rlg-panel div{white-space:nowrap;margin:2px 10px 2px 10px;}"; // CSS to be added
GM_addStyle(style);
rlg_log("rlg-panel css loaded");
/*
Retrieve page url and page title
Page title is automatically acquired following order as such:
1. <title> tag content if exists
2. first <h1> tag content if exists
3. page url
*/
var page_url = window.location.href; // Obtain absolute URL of current page
rlg_log('page_url => ' + page_url);
var page_title;
try {
var tag_content_title = document.getElementsByTagName('title')[0].innerHTML;
} catch(err) {
rlg_log("Fail to retrieve content of tag <title>: " + err.message);
}
rlg_log('tag_content_title=> ' + tag_content_title);
try {
var tag_content_first_h1 = document.getElementsByTagName('h1')[0].innerHTML;
} catch(err) {
rlg_log("Fail to retrieve content of tag <h1>: " + err.message);
}
rlg_log('tag_content_first_h1=> ' + tag_content_first_h1);
if (tag_content_title) { // tag_content_title exists and not null or undefined
page_title = tag_content_title;
} else if ( tag_content_first_h1) { // tag_content_first_h1 exists and not null or undefined
page_title = tag_content_first_h1;
} else {
page_title = page_url;
}
rlg_log('page_title=> ' + page_title);
/*
Markup language settings
Users may add their own markup language settings here
*/
var markup = [ // Specific names for different kinds of markup languages
{ // html
button_name: "HTML",
base_id: "rlg-html",
makelink: function(page_title, page_url) {
return '<a href="' + page_url + '">' + page_title + '<\/a>';
}
},
{ // markdown
button_name: "Markdown",
base_id: "rlg-markdown",
makelink: function(page_title, page_url) {
return '[' + page_title + "](" + page_url + ' "")';
}
},
{ // reStructured Text
button_name: "reST",
base_id: "rlg-rest",
makelink: function(page_title, page_url) {
return '`' + page_title + ' <' + page_url + '>`_';
}
},
{ // Org-mode
button_name: "Orgmode",
base_id: "rlg-orgmode",
makelink: function(page_title, page_url) {
return '[[' + page_url + '][' + page_title + ']]';
}
},
{ // LaTeX
button_name: "LaTeX",
base_id: "rlg-latex",
makelink: function(page_title, page_url) {
return '\\href{' + page_url + '}{' + page_title + '}';
}
},
{
// Plain Text
button_name: "Plain Text",
base_id: "rlg-text",
makelink: function(page_title, page_url) {
return page_title + ' -> ' + page_url;
}
}
];
// Auto-hide panel for generated texts and buttons
// https://stackoverflow.com/questions/4811807/hidden-sidebar-that-shows-up-on-hover
// here 20em is a magic number, I don't know how to make the width of
// the rlg panel automatically fit to the content width
$(function(){
$('#rlg-panel').hover(
function(){$(this).animate({width:'20em'},500);},
function(){$(this).animate({width:'2px'},500);}
).trigger('mouseleave');
}
);
function regenerate() { // onclick function for button "rlg-regenerate-button"
var page_title = document.getElementById("rlg-title-input").value;
rlg_log('regenerate page title :' + page_title);
var page_url = window.location.href;
rlg_log('regenerate page url :' + page_url);
var id_tmp;
for (var i=0; i<markup.length; ++i) {
id_tmp=markup[i].base_id;
rlg_log('regenerate link text of ' + id_tmp);
document.getElementById(id_tmp+'-input').value=markup[i].makelink(page_title, page_url);
rlg_log('link text of ' + id_tmp + ' has been modified');
}
}
function copy_to_system_clipboard(this_id) { // onclick function for buttons "rlg-[markup]-button"
// https://stackoverflow.com/a/30810322/2709868
// Copy textarea or input text to system clipboard with one click
// See:https://stackoverflow.com/a/30810322/2709868
// Seems IE and chrome support document.execCommand('copy')
// Firefox doesn't support it and Safari not tested yet.
rlg_log(this_id);
var text_input = document.getElementById(this_id.replace('-button', '') + '-input');
rlg_log(this_id.replace('-button', '') + '-input');
text_input.select();
var hint_div = document.getElementById('rlg-hint');
try {
var successful = document.execCommand('copy'); // TODO Is GM_setClipboard() more compatible?
var msg = successful ? 'successful' : 'unsuccessful';
hint_div.setAttribute('style', 'color:lightgreen');
var markup_tmp = this_id.replace('-button', '').replace('rlg-', '');
hint_div.innerHTML = 'Copying generated ' + markup_tmp + ' link text to system clipboard was ' + msg;
} catch (err) {
hint_div.setAttribute('style', 'color:red');
hint_div.innerHTML = "Copying to system clipboard is not supported by your browser, you can copy it manually";
}
}
function rlg_log(log_text) {
console.log('RefLinkGenerator LOG: ' + log_text);
}
/*
Append rlg-panel div element into document.body
*/
var div_rlg_panel = document.createElement("div");
div_rlg_panel.id = "rlg-panel";
rlg_log("create div rlg-panel succeed");
// rlg-regenerate
var input_regenerate_1 = document.createElement("input");
input_regenerate_1.type = "text";
input_regenerate_1.id = "rlg-title-input";
input_regenerate_1.value = page_title;
var label_regenerate_1 = document.createElement("label");
label_regenerate_1.appendChild(input_regenerate_1);
var input_regenerate_2 = document.createElement("input");
input_regenerate_2.type = "button";
input_regenerate_2.id = "rlg-regenerate-button";
input_regenerate_2.value = "Regenerate";
input_regenerate_2.addEventListener("click", regenerate);
var label_regenerate_2 = document.createElement("label");
label_regenerate_2.appendChild(input_regenerate_2);
var div_rlg_regenerate = document.createElement("div");
div_rlg_regenerate.id = "rlg-regenerate";
div_rlg_regenerate.appendChild(label_regenerate_1);
div_rlg_regenerate.appendChild(label_regenerate_2);
div_rlg_panel.appendChild(div_rlg_regenerate);
rlg_log("create div rlg-regenerate succeed");
// rlg-[markup]-button and rlg-[markup]-input
for (var j=0; j<markup.length; ++j) {
var div_markup = document.createElement("div");
var label_1 = document.createElement("label");
var label_2 = document.createElement("label");
var input_1 = document.createElement("input");
var input_2 = document.createElement("input");
input_1.type = "text";
input_1.id = markup[j].base_id + "-input";
input_1.value = markup[j].makelink(page_title, page_url);
label_1.appendChild(input_1);
input_2.type = "button";
input_2.id = markup[j].base_id + "-button";
input_2.value = markup[j].button_name;
// Important stuff about addEventListener:
// http://www.w3schools.com/js/js_htmldom_eventlistener.asp
// http://commons.oreilly.com/wiki/index.php/Greasemonkey_Hacks/Getting_Started#Avoid_Common_Pitfalls
input_2.addEventListener("click", function() {copy_to_system_clipboard(this.id);});
label_2.appendChild(input_2);
div_markup.appendChild(label_1);
div_markup.appendChild(label_2);
div_rlg_panel.appendChild(div_markup);
rlg_log(markup[j].button_name + " appended");
}
// rlg-hint
var div_rlg_hint = document.createElement("div");
div_rlg_hint.id = "rlg-hint";
div_rlg_panel.appendChild(div_rlg_hint);
document.body.appendChild(div_rlg_panel);