// ==UserScript== // @name Sanskrit Tools - Toolbar // @namespace stgeorge // @description Sanskrit Language Tools - Quick access to Sanskrit dictionary, thesarus, news and other tools, on Firefox and Chrome browsers. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js // @match *://*/* // @version 3.4.2 // @downloadURL none // ==/UserScript== (function() { var $j = jQuery.noConflict(); // ==================================================================== // Options. Modify as needed. // TODO: Expose these options via GM. Some day ... var OPTION_DEBUG = false; // When on spokensanskrit.org site, Set to true to change word completion list // to show up below the input field instead of on the side. var OPTION_IN_PLACE_MATCH = true; // End options. Don't change anything below this. // ==================================================================== // Grammar stuff. var SANSKRIT_SITE = 'spokensanskrit.org'; var verbMatch = /(verb)\s*(.*)/; var verbRootMatch = /{\s*(.*)\s*}/; var verbClassMatch = /\s*([0-9]+)\s*/g; var nounMatch = /\b([fmn](?=\.))/g; var nounRootMatch = /^\s*(.*)\s*$/; var vurl = 'http://sanskrit.inria.fr/cgi-bin/SKT/sktconjug?lex=SH&q=%Q%&t=KH&c=%C%&font=deva'; var nurl = 'http://sanskrit.inria.fr/cgi-bin/SKT/sktdeclin?lex=SH&q=%Q%&t=KH&g=%G%&font=deva'; var surl = 'http://sanskrit.uohyd.ernet.in/cgi-bin/scl/SHMT/generate.cgi?dic=amara&word=%Q%'; var genders = { f: 'Fem', n: 'Neu', m: 'Mas' }; var gender_names = { f: 'feminine', n: 'neuter', m: 'masculine' }; var initDone = false; function isGrammarSupported() { if (document.URL.indexOf(SANSKRIT_SITE) == -1) return false; if (!initDone) { _debug('vurl=' + vurl); _debug('nurl=' + nurl); _debug('-----'); initDone = true; } return true; } function buildGrammarUI() { fixSuggestBox(); addGrammarLinks(); } function fixSuggestBox() { if (OPTION_IN_PLACE_MATCH) { var ans = $j('#answer2'); var target = $j('input[name="tran_input"]').closest('form'); ans.detach(); ans.attr('align', 'center'); ans.removeClass('absolute'); target.after(ans); } } function addGrammarLinks() { var line = 1; $j('tr.bgcolor2,tr.bgcolor0,tr.highlight').each(function() { var row = $j(this); // Each row is of the form: // sans_text grammar_info translit_text meaning var col = row.children().first(); var sansText = col.text().trim(); col = col.next(); var grammarInfo = col.text().trim(); col = col.next(); var transText = col.text().trim(); _debug("line " + (line++) + "='" + sansText + "' '" + grammarInfo + "' '" + transText + "'"); var links = []; if (matchVerb(sansText, grammarInfo, transText, links) || matchNoun(sansText, grammarInfo, transText, links)) { makeURLs(row, links); } _debug('-----'); }); } function matchVerb(sansText, grammarInfo, transText, links) { // Grammar is of the form: verb N var a = grammarInfo.match(verbMatch); if (a && a[1] == 'verb') { // transText is of the form xlit_word (xlit_root). // We want the root. var b = transText.match(verbRootMatch); if (!b || !b[1]) return false; b[1] = b[1].trim().replace(/[\s-]/g, "") _debug('verb: matching ' + transText + ' with verbroot'); if (b[1].match(/[^A-Za-z]/)) return false; var n; // For verbs, see if grammar_info has the gaNA info. if (a[2]) n = a[2].trim().match(verbClassMatch); if (!(n && n[0])) { return false; } // At this point, b[1] is the transliterated verb root, // sansText is the devangari verb root, and n the gaNa. _debug('verb=' + b[1]); _debug('ganas=' + n); for (var i = 0; i < n.length; ++i) { links.push({ tooltip: 'Inflections for ' + a[1] + '(' + n[i].trim() + ') ' + sansText, url: vurl.replace('%Q%', b[1]).replace('%C%', n[i].trim()), sym: '▸', target: 'l_grammar', }); } return true; } return false; } function matchNoun(sansText, grammarInfo, transText, links) { // grammar, in turn, is of the forms: m./f./n./adj. etc (for nouns) _debug('noun: matching ' + grammarInfo + ' with noun'); var a = grammarInfo.match(nounMatch); if (!(a && a[0])) return false; _debug('noun: matching ' + transText + ' with nounroot'); var b = transText.match(nounRootMatch); if (!b || !b[1]) return false; b[1] = b[1].trim(); if (b[1].match(/[^A-Za-z]/)) return false; // At this point, b[1] is the xlit noun, sansText is the // devanagari noun, and a is one or more lingas. _debug('noun=' + b[1]); _debug('lingams=' + a); if (a.length > 0) { for (var i = 0; i < a.length; ++i) { links.push({ url: nurl.replace('%Q%', b[1]).replace('%G%', genders[a[i]]), tooltip: 'Inflections for ' + gender_names[a[i]] + ' noun ' + sansText, sym: '▸', target: 'l_grammar', }); } return true; } return false; } function makeURLs(row, links) { var ltd = row.children().first(); var html; html = ''; for (var i in links) { l = links[i]; ltd.attr('valign','top'); html += ''+l.sym+''; } _debug("link: " + l.url + " --> " + l.tooltip); ltd.html(html + ' ' + ltd.html()); ltd.attr('align', 'left'); return true; } // =============================================================== // Toolbar stuff. // =============================================================== var IGNORES = [ 'mail.yahoo.com', 'groups.yahoo.com', SANSKRIT_SITE ]; var ALLOW_ANCHORS = [ 'sanskrit.uohyd.ernet.in/cgi-bin/scl/SHMT/generate.cgi', ]; var TOOLBAR_LINKS = [ [ "vArtAvaLiH", "https://www.youtube.com/playlist?list=PLxx0m3vtiqMZGmsUEVeTAuWIXqc9fTMHy", "l_news", "वार्तावलिः" ], [ "samprati vArtAH", "http://samprativartah.in/", "l_mag2", "सम्प्रतिवार्ताः" ], [ "sudharmA", "http://epaper.sudharmasanskritdaily.in/", "l_mag3", "सुधर्मा" ], [ "sambhASaNa sandezaH", "http://www.sambhashanasandesha.in/", "l_mag1", "सम्भाषण सन्देशः" ], [ "mAhezvarasUtrANi", "http://en.wikipedia.org/wiki/Siva_Sutra#Text", "l_msutra", "माहेश्वरसूत्राणि" ], [ "sandhiH", "http://sanskrit.jnu.ac.in/sandhi/viccheda.jsp", "l_sandhi", "सन्धिः" ], [ "Noun/Verb", "http://sanskrit.inria.fr/DICO/grammar.fr.html", "l_inria", "शब्द-/धातु-रूपावली" ], [ "Books", "http://www.sanskrit.nic.in/ebooks.php", "l_books", "पुस्तकानि" ], [ "Wikipedia", "http://sa.wikipedia.org", "l_wiki", "विकिपीडिया" ], ]; var TOOLBAR_HTML = '\
| \
\
\
\
\
| \