// ==UserScript==
// @name Sanskrit Tools - Toolbar
// @namespace stgeorge
// @description Sanskrit Language Tools
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @grant GM_setValue
// @grant GM_getValue
// @version 2.3.2
// ==/UserScript==
(function() {
const IGNORES = [
'yahoo.com',
// 'spokensanskrit.de',
// 'sanskrit.inria.fr',
// 'sambhashanasandesha.in',
// 'youtube.com/user/sanskritanews'
];
const ACTIONS = {
verb: 'sanskrit.inria.fr/cgi-bin/SKT/sktconjug?lex=SH&q=%Q%&t=%E%&c=%C%&font=deva',
noun: 'sanskrit.inria.fr/cgi-bin/SKT/sktdeclin?lex=SH&q=%Q%&t=%E%&g=%G%&font=deva',
dict: 'spokensanskrit.de/index.php?trans=Translate&tinput=%Q%',
join: 'sanskrit.inria.fr/cgi-bin/SKT/sktsandhier?lex=SH&l=%Q%&r=%R%&t=%E%&k=external'
};
const LINKS = {
mag: 'www.sambhashanasandesha.in/',
books: 'www.sanskrit.nic.in/ebook.htm',
news: 'www.youtube.com/user/sanskritanews/videos',
wiki: 'sa.wikipedia.org',
alpha: 'en.wikipedia.org/wiki/Siva_Sutra#Text',
};
const WIN_NAME = "SanskritTools";
var numClicks = 0;
function toolbar() {
// Create widgets.
var tbHTML = $(
'<form id="toolbar" style="overflow:hidden; float:left">' +
'<div style="float:left; display:inline-block">' +
'<input id="mag" type="button" title="सम्भाषण सन्देशम् (Sambhashana Sandesha Magazine)" class="st_button st_link bold spaced" value="पत्रिका"/>' +
'<input id="books" type="button" title="पुस्तकानि (Books)" class="st_button st_link bold spaced" value="पुस्तकानि"/>' +
'<input id="news" type="button" title="भारतीय दूरदर्शन वार्ता: (Sanskrit Doordarshan News Channel on YouTube)" class="st_button st_link bold spaced" value="वार्ता:"/>' +
'<input id="wiki" type="button" title="विकिपीडिया (Sanskrit Wikipedia)" class="st_button st_link bold spaced" value="विकिपीडिया"/>' +
'<input id="alpha" type="button" title="माहेश्वरसूत्रम् (Panini\'s Maheshwara Sutram)" class="st_button st_link bold spaced" value="माहेश्वरसूत्रम्"/>' +
'</div>' +
'<div style="float:left; display:inline-block">' +
'<span class="spaced"></span>' +
'<span class="spaced"></span>' +
'<span class="spaced"></span>' +
'<span title="Select a tool from the menu, then provide appropriate input(s)" class="bold act noun verb dict join spaced">Tools:</span>' +
'<select class="st_select spaced" id="tbMenu">' +
'<option value="dict" class="bold" selected="selected">शब्तकोश:</option>' +
'<option class="bold" value="noun">सुबन्तरूपम्</option>' +
'<option class="bold" value="verb">तिङन्तरूपम्</option>' +
'<option class="bold" value="join">संधिः</option>' +
'</select>'+
'<span class="spaced act noun verb dict">पदम्</span>' +
'<span class="spaced act join">पदे</span>' +
'<input class="st_input spaced act noun verb dict join" id="st_word" size="20"' +
'placeHolder="Type word (in KH)"/>' +
'<span class="spaced act noun">लिङ्गम् </span>' +
'<select class="st_select act noun" id="st_linga">' +
'<option value=""></option>' +
'<option value="Fem">स्त्रीलिङगम्</option>' +
'<option value="Mas">पुम्लिङगम्</option>' +
'<option value="Neu">नपुम्सकलिङगम्</option>' +
'<option value="Any">अन्य</option>' +
'</select>' +
'<span class="act verb spaced">गण: </span>' +
'<select class="st_select act verb" id="st_gana">' +
'<option value=""></option>' +
'<option value="1">1</option>' +
'<option value="2">2</option>' +
'<option value="3">3</option>' +
'<option value="4">4</option>' +
'<option value="5">5</option>' +
'<option value="6">6</option>' +
'<option value="7">7</option>' +
'<option value="8">8</option>' +
'<option value="9">9</option>' +
'<option value="10">10</option>' +
'</select>' +
'<input class="st_input spaced act join" id="st_word2" size="20"' +
'placeHolder="Type word 2 (in KH)"/>' +
'<input id="st_action" type="submit" class="st_button bold spaced" value="सूचयतु"/>' +
'</div>' +
'<div style="float:right">' +
'<span class="spaced">Open in new window </span>' +
'<input type="checkbox" style="margin-right: 10px" class="st_input" id="tbNewWindow" value="false"/>' +
'</div>' +
'</form>' +
'<a href="" style="display:none" id="tbLink"></a>'
);
var tbToggleHTML = '<div id="tbToggle" title="Click to show/hide Sanskrit Toolbar">\u0938</div>';
// Place them on the screen.
place('toolbar', tbHTML, {
position: 'fixed',
'top': 0,
margin: 0,
height: '40px',
width: '100%',
zIndex: 2999999999,
paddingTop: '5px',
backgroundColor: '#eeeeee',
borderBottom: '1px solid orange',
display:'none'
});
place('tbToggle', tbToggleHTML, {
cursor:'pointer',
'float':'right',
fontSize:'large',
padding: '0px 15px 18px',
fontWeight:'bold',
backgroundColor: 'white',
color:'green',
position:'fixed',
right:0,
bottom: 0,
height:'10px',
width:'10px',
zIndex:9999
});
$('.spaced').css({
marginLeft:'10px',
verticalAlign:'middle',
fontSize:'16px',
});
$('.st_button').css({
paddingRight:'10px !important',
padding:'0px',
fontSize:'16px',
verticalAlign:'middle',
height:'35px',
cursor: 'pointer',
});
$('.st_select').css({
verticalAlign:'middle',
fontSize:'16px',
height:'30px',
padding:'3px 0'
});
$('.st_input').css({
verticalAlign:'middle',
padding:'0px',
height:'30px',
fontSize:'16px',
verticalAlign:'middle'
});
$('.bold').css('fontWeight', 'bold');
$('option').css({
paddingRight: '3px',
paddingLeft: '3px',
});
// Set initial state.
$('#st_word').val(GM_getValue('word', ''));
$('#st_word2').val(GM_getValue('word2', ''));
$('#st_linga').val(GM_getValue('linga', ''));
$('#st_gana').val(GM_getValue('gana', ''));
var opt = GM_getValue('opt', 'dict');
$('#tbMenu').val(opt);
hilite(opt);
if (GM_getValue('status', 0)) showTb();
else hideTb();
// Set event handlers.
$('#tbToggle').on('click', toggleTb);
$('#tbMenu').on('change', function(e) {
hilite($('#tbMenu option:selected').val());
});
$('.st_link').on('click', function(e) {
var x = $(this).attr('id');
show(x, LINKS[x]);
});
$('#st_action').on('click', action);
$('#toolbar').on('submit', action);
}
function action(e) {
e.preventDefault();
var action = $('#tbMenu :selected').val()
GM_setValue('opt', action);
var word = $('#st_word').val();
var word2 = $('#st_word2').val();
var linga = $('#st_linga').val();
var gana = $('#st_gana').val();
GM_setValue('word', word);
GM_setValue('word2', word2);
GM_setValue('linga', linga);
GM_setValue('gana', gana);
// TODO: Devanagari input doesn't work
// for inria.fr, since their backend doesn't
// understand DN natively (the infria.fr client
// converts from DN to Velthius when sending to their
// backend. Until then, force KH.
// var c = word.charCodeAt(0);
// var enc = (c >= 0x0900 && c <= 0x097f) ? 'DN' : 'KH';
var enc = 'KH';
show(action, ACTIONS[action].
replace('%Q%', word).
replace('%R%', word2).
replace('%G%', linga).
replace('%C%', gana).
replace('%E%', enc)
);
}
function toggleTb() {
if (GM_getValue('status', 0) == 0) {
showTb();
} else {
hideTb();
}
}
function showTb() {
$('#toolbar').css({
'display':'block',
});
$('#tbToggle').css('color', 'green');
$('body').css('marginTop', '50px');
GM_setValue('status', 1);
}
function hideTb() {
$('#toolbar').css({
'display':'none',
});
$('#tbToggle').css('color', 'red');
$('body').css('marginTop', 0);
GM_setValue('status', 0);
}
function place(id, html, css) {
$('body').prepend(html);
$('#'+id).css(css);
}
function hilite(x) {
$('#toolbar .act').hide();
$('#toolbar .'+x).show();
return $('#toolbar :visible').size();
}
function handleClick(e) {
var node = (e.target || e.srcElement);
if (e.button != 0)
return;
if (node.nodeName == 'A')
return;
var n = node;
while (n) {
if (n.getAttribute) {
var ce = n.getAttribute('contenteditable');
if (ce)
return;
}
n = n.parentNode;
}
if (++numClicks == 1) {
window.setTimeout(function() {
var selectedText = getSelectedText(true);
if (selectedText != null) {
var i = selectedText.indexOf(' ');
if (i >= 0) {
selectedText = selectedText.slice(0,i);
}
if (selectedText.length > 0) {
$('#st_word').val(selectedText);
GM_setValue('word', selectedText);
}
}
numClicks = 0;
}, 300);
}
}
function getSelectedText(trim) {
var text =
(window.getSelection) ? window.getSelection().toString() :
(document.getSelection) ? document.getSelection().toString() :
(document.selection) ? document.selection.createRange().text : null;
if (trim && text != null)
text = text.trim();
return text;
}
function show(action, url) {
var u = 'http://' + url;
var a = $('#tbLink');
a.on('click', function(e) {
a.attr('href', u);
if ($('#tbNewWindow').prop('checked'))
a.attr('target', '_'+action);
else
a.removeAttr('target');
});
a.get(0).click();
}
if (window.top == window.self) {
var ok = true;
for (var i in IGNORES) {
if (document.URL.indexOf(IGNORES[i]) != -1) {
ok = false;
break;
}
}
if (ok) {
toolbar();
document.addEventListener('mouseup', handleClick, false);
}
}
})();