User:Capmo/Edittools
This is a javascript implementation of the Edittools that doesn't require the installation of Extension:CharInsert. Another advantage of using JavaScript is that .js pages are cached locally by the browser (as far as I'm concerned), differently from the content inside MediaWiki:Edittools, which is downloaded everytime a page is edited. This solution was based on the suggestion given by Neoshinji.
Check also a similar solution at User:Tim Laqua/CharInsert Dropdown (requires CharInsert extension).
MediaWiki:Common.js
edit//*** import Edittools.js if (document.URL.indexOf("action=edit") > 0 || document.URL.indexOf("action=submit") > 0 || wgCanonicalSpecialPageName == "Upload") { document.write('<script type="text/javascript" src="' + wgScript + '?title=MediaWiki:Edittools.js' + '&action=raw&ctype=text/javascript&dontcountme=s"></script>'); }
MediaWiki:Edittools
edit<div id="mw-editTools"></div><!-- ************************************************************ * The dynamic Edittools is at [[MediaWiki:Edittools.js]] * ************************************************************ -->
MediaWiki:Edittools.js
editvar charinsert = { "Standard":[ [ "’", ["‚","‘"], ["“","”"], ["‘","’"], ["«","»"], ["‹","›"], ["–","","","Hyphen"] ], [ "+", ["−","","","Minus"], "#", "*", "§", "$", "¿", "¡", "‣", "•", ["〈","〉"], "…" ], [ [" ","","","Non-breakable space"], ["[[","]]","","Wikilink"], "|", ["{{","}}"], ["~~~~","","","Signature"] ], [ ["<poem>","<\/poem>"], ["<tt>","<\/tt>"], ["<nowiki>","<\/nowiki>"], ["<pre>","<\/pre>"], ["<code>","<\/code>"], ["<noinclude>","<\/noinclude>"], ["<includeonly>","<\/includeonly>"], ["[[Category:","]]"], ["[[File:","]]"], ["{{filepath:","}}"], ["{{DEFAULTSORT:","}}"], "{{NameSorter}}", ["#REDIRECT [[","]]"] ] ], "Latin":[ ["A", "a", "Á", "á", "À", "à", "Â", "â", "Ä", "ä", "Ǎ", "ǎ", "Ă", "ă", "Ā", "ā", "Ã", "ã", "Å", "å", "Ą", "ą", "Æ", "æ", "Ǣ", "ǣ", "B", "b", "C", "c", "Ć", "ć", "Ċ", "ċ", "Ĉ", "ĉ", "Č", "č", "Ç", "ç", "D", "d", "Ď", "ď", "Đ", "đ", "Ḍ", "ḍ", "Ð", "ð", "E", "e", "É", "é", "È", "è", "Ė", "ė", "Ê", "ê", "Ë", "ë", "Ě", "ě", "Ĕ", "ĕ", "Ē", "ē", "Ẽ", "ẽ", "Ę", "ę", "Ə", "ə", "F", "f", "G", "g", "Ġ", "ġ", "Ĝ", "ĝ", "Ğ", "ğ", "Ģ", "ģ", "H", "h", "Ĥ", "ĥ", "Ħ", "ħ", "Ḥ", "ḥ", "I", "i", "İ", "ı", "Í", "í", "Ì", "ì", "Î", "î", "Ï", "ï", "Ǐ", "ǐ", "Ĭ", "ĭ", "Ī", "ī", "Ĩ", "ĩ", "Į", "į", "J", "j", "Ĵ", "ĵ", "K", "k", "Ķ", "ķ", "L", "l", "Ĺ", "ĺ", "Ŀ", "ŀ", "Ľ", "ľ", "Ļ", "ļ", "Ł", "ł", "Ḷ", "ḷ", "Ḹ", "ḹ", "M", "m", "Ṃ", "ṃ", "N", "n", "Ń", "ń", "Ň", "ň", "Ñ", "ñ", "Ņ", "ņ", "Ṇ", "ṇ", "O", "o", "Ó", "ó", "Ò", "ò", "Ô", "ô", "Ö", "ö", "Ǒ", "ǒ", "Ŏ", "ŏ", "Ō", "ō", "Õ", "õ", "Ǫ", "ǫ", "Ő", "ő", "Ø", "ø", "Œ", "œ", "P", "p", "Q", "q", "R", "r", "Ŕ", "ŕ", "Ř", "ř", "Ŗ", "ŗ", "Ṛ", "ṛ", "Ṝ", "ṝ", "S", "s", "Ś", "ś", "Ŝ", "ŝ", "Š", "š", "Ş", "ş", "Ṣ", "ṣ", "ß", "T", "t", "Ť", "ť", "Ţ", "ţ", "Ṭ", "ṭ", "Þ", "þ", "U", "u", "Ú", "ú", "Ù", "ù", "Û", "û", "Ü", "ü", "Ǔ", "ǔ", "Ŭ", "ŭ", "Ū", "ū", "Ũ", "ũ", "Ů", "ů", "Ų", "ų", "Ű", "ű", "Ǘ", "ǘ", "Ǜ", "ǜ", "Ǚ", "ǚ", "Ǖ", "ǖ", "V", "v", "W", "w", "Ŵ", "ŵ", "X", "x", "Y", "y", "Ý", "ý", "Ŷ", "ŷ", "Ÿ", "ÿ", "Ỹ", "ỹ", "Ȳ", "ȳ", "Z", "z", "Ź", "ź", "Ż", "ż", "Ž", "ž", "ß", "Ð", "ð", "Þ", "þ", "Ə", "ə"] ], "Classical Greek":[ { "lang":"grc", "font-family":"'Arial Unicode MS','Lucida Sans Unicode','MS Mincho',Arial,sans-serif;" }, ["Α", "α", "Ά", "ά", "Β", "β", "Γ", "γ", "Δ", "δ", "Ε", "ε", "Έ", "έ", "Ζ", "ζ", "Η", "η", "Ή", "ή", "Θ", "θ", "Ι", "ι", "Ί", "ί", "Ϊ", "ϊ", "ΐ", "Κ", "κ", "Λ", "λ", "Μ", "μ", "Ν", "ν", "Ξ", "ξ", "Ο", "ο", "", "Ό", "ό", "Π", "π", "Ρ", "ρ", "Σ", "σ", "ς", "Τ", "τ", "Υ", "υ", "Ϋ", "ϋ", "Ύ", "ύ", "ΰ", "Φ", "φ", "Χ", "χ", "Ψ", "ψ", "Ω", "ω", "Ώ", "ώ", ";", "·", "ἀ", "ἁ", "ὰ", "ᾶ", "ἂ", "ἃ", "ἄ", "ἅ", "ἆ", "ἇ", "ᾳ", "ᾀ", "ᾁ", "ᾴ", "ᾲ", "ᾷ", "ᾄ", "ᾅ", "ᾂ", "ᾃ", "ᾆ", "ᾇ", "ἐ", "ἑ", "ὲ", "ἔ", "ἕ", "ἒ", "ἓ", "ἠ", "ἡ", "ὴ", "ῆ", "ἤ", "ἢ", "ἣ", "ἥ", "ἦ", "ἧ", "ῃ", "ῄ", "ῂ", "ῇ", "ᾐ", "ᾑ", "ᾔ", "ᾒ", "ᾕ", "ᾓ", "ᾖ", "ᾗ", "ἰ", "ἱ", "ὶ", "ῖ", "ἴ", "ἲ", "ἵ", "ἳ", "ἶ", "ἷ", "ὸ", "ὀ", "ὁ", "ὄ", "ὅ", "ὂ", "ὃ", "ῤ", "ῥ", "ὐ", "ὑ", "ὺ", "ῦ", "ὔ", "ὕ", "ὒ", "ὓ", "ὖ", "ὗ", "ὠ", "ὡ", "ὼ", "ῶ", "ὤ", "ὢ", "ὥ", "ὣ", "ὦ", "ὧ", "ῳ", "ῴ", "ῲ", "ῷ", "ᾠ", "ᾡ", "ᾤ", "ᾢ", "ᾥ", "ᾣ", "ᾦ", "ᾧ", "`", "᾿", "῾", "῍", "῎", "῏", "῟", "῞", "῝", "῍", "῎", "Ϝ", "ϝ", "Ϙ", "ϙ", "Ϡ", "ϡ"] ], "Cyrillic":[ ["А", "а", "Б", "б", "В", "в", "Г", "г", "Ґ", "ґ", "Ѓ", "ѓ", "Д", "д", "Ђ", "ђ", "Е", "е", "Ё", "ё", "Є", "є", "Ж", "ж", "З", "з", "Ѕ", "ѕ", "И", "и", "І", "і", "Ї", "ї", "Й", "й", "Ј", "ј", "К", "к", "Ќ", "ќ", "Л", "л", "Љ", "љ", "М", "м", "Н", "н", "Њ", "њ", "О", "о", "П", "п", "Р", "р", "С", "с", "Т", "т", "Ћ", "ћ", "У", "у", "Ў", "ў", "Ф", "ф", "Х", "х", "Ц", "ц", "Ч", "ч", "Џ", "џ", "Ш", "ш", "Щ", "щ", "Ъ", "ъ", "Ы", "ы", "Ь", "ь", "Э", "э", "Ю", "ю", "Я", "я", "Ә", "ә", "Ө", "ө", "Ғ", "ғ", "Җ", "җ", "Қ", "қ", "Ҝ", "ҝ", "Ң", "ң", "Ү", "ү", "Ұ", "ұ", "Ҳ", "ҳ", "Ҹ", "ҹ", "Һ", "һ", "Ҕ", "ҕ", "Ӣ", "ӣ", "Ӯ", "ӯ", "Ҙ", "ҙ", "Ҡ", "ҡ", "Ҥ", "ҥ", "Ҫ", "ҫ", "Ӑ", "ӑ", "Ӓ", "ӓ", "Ӕ", "ӕ", "Ӗ", "ӗ", "Ӱ", "ӱ", "Ӳ", "ӳ", "Ӹ", "ӹ", "Ӏ", "Ҟ", "ҟ", "Ҧ", "ҧ", "Ҩ", "ҩ", "Ҭ", "ҭ", "Ҵ", "ҵ", "Ҷ", "ҷ", "Ҽ", "ҽ", "Ҿ", "ҿ", "Ӂ", "ӂ", "Ӄ", "ӄ", "Ӈ", "ӈ", "Ӌ", "ӌ", "Ӛ", "ӛ", "Ӝ", "ӝ", "Ӟ", "ӟ", "Ӡӡ", "Ӥ", "ӥ", "Ӧ", "ӧ", "Ӫ", "ӫ", "Ӵ", "ӵ"] ], "Vietnamese":[ { "lang":"vi" }, ["À", "à", "Ả", "ả", "Á", "á", "Ạ", "ạ", "Ã", "ã", "Ă", "ă", "Ằ", "ằ", "Ẳ", "ẳ", "Ẵ", "ẵ", "Ắ", "ắ", "Ặ", "ặ", "Â", "â", "Ầ", "ầ", "Ẩ", "ẩ", "Ẫ", "ẫ", "Ấ", "ấ", "Ậ", "ậ", "Đ", "đ", "È", "è", "Ẻ", "ẻ", "Ẽ", "ẽ", "É", "é", "Ẹ", "ẹ", "Ê", "ê", "Ề", "ề", "Ể", "ể", "Ễ", "ễ", "Ế", "ế", "Ệ", "ệ", "Ỉ", "ỉ", "Ĩ", "ĩ", "Í", "í", "Ị", "ị", "Ì", "ì", "Ỏ", "ỏ", "Ó", "ó", "Ọ", "ọ", "Ò", "ò", "Õ", "õ", "Ô", "ô", "Ồ", "ồ", "Ổ", "ổ", "Ỗ", "ỗ", "Ố", "ố", "Ộ", "ộ", "Ơ", "ơ", "Ờ", "ờ", "Ở", "ở", "Ỡ", "ỡ", "Ớ", "ớ", "Ợ", "ợ", "Ù", "ù", "Ủ", "ủ", "Ũ", "ũ", "Ú", "ú", "Ụ", "ụ", "Ư", "ư", "Ừ", "ừ", "Ử", "ử", "Ữ", "ữ", "Ứ", "ứ", "Ự", "ự", "Ỳ", "ỳ", "Ỷ", "ỷ", "Ỹ", "ỹ", "Ỵ", "ỵ", "Ý", "ý"] ] }; addOnloadHook(function() { addOnloadHook(function() { var box; function loadCommonsTools() { function selectSubset() { var pp = box.getElementsByTagName("p"); for (var i=0; i<pp.length; ++i) { pp[i].style["display"] = "none"; } // show/create current subset var id = sel.options[sel.selectedIndex].value; var p = document.getElementById(id); if(!p) { p = document.createElement('p'); p.setAttribute("id", id); p.setAttribute("class", "mwEdittoolsLanguage"); createTokens(p, charinsert[id.substr("mwEdittools--".length)]); box.appendChild(p); } p.style["display"] = "inline"; } function createTokens(paragraph, outerArr) { var buttons; function insertInner(elem) { var a = false, ins; switch(typeof(elem)) { case("string"): { ins = function() { insertTags(elem, "", ""); return false; }; a = document.createElement("a"); a.setAttribute("title", elem); a.appendChild(document.createTextNode(elem)); } break; case("array"): case("object"): { ins = function() { insertTags(elem[0], elem[1] || "", elem[2] || ""); return false; }; a = document.createElement("a"); a.setAttribute("title", elem[3] || (elem[0] + (elem[2] || "…") + (elem[1] || ""))); a.appendChild(document.createTextNode(elem[0] + (elem[1] || ""))); }; break; } if(a !== false) { a.onclick = ins; a.setAttribute("href", "#"); a.setAttribute("class", "mwEdittoolsButton"); buttons.appendChild(document.createTextNode(" ")); buttons.appendChild(a); } } function insertOuter(innerArr) { switch(typeof(innerArr)) { case("object"): case("array"): var obj = false; if(typeof(innerArr["class"]) === "string") { obj = true; paragraph.setAttribute("class", innerArr["class"]); } if(typeof(innerArr["lang"]) === "string") { obj = true; paragraph.setAttribute("lang", innerArr["lang"]); } if(typeof(innerArr["direction"]) === "string") { obj = true; paragraph.style.direction = innerArr["direction"]; } if(typeof(innerArr["font-family"]) === "string") { obj = true; paragraph.style.fontFamily = innerArr["font-family"]; } if(typeof(innerArr["font-size"]) === "string") { obj = true; paragraph.style.fontSize = innerArr["font-size"]; } if(obj) { return false; } buttons = document.createElement("span"); buttons.setAttribute("class", "mwEdittoolsButtons"); for(var i = 0; i<innerArr.length; ++i) { insertInner(innerArr[i]); } paragraph.appendChild(buttons); return true; default: return false; } } if(outerArr.length == 0) { return; } for(var i=0; i<outerArr.length-1; ++i) { if(insertOuter(outerArr[i])) { var s = document.createElement("span"); s.appendChild(document.createTextNode("\xA0\xA0•\xA0 ")); s.style["font-weight"] = "bold"; paragraph.appendChild(s); } } insertOuter(outerArr[outerArr.length-1]); } //create drop-down select var sel = document.createElement("select"); for(var id in charinsert) { var op = document.createElement("option"); op.setAttribute("value", "mwEdittools--" + id); op.appendChild(document.createTextNode(id)); sel.appendChild(op); } sel.setAttribute("title", "Zeichensatz auswählen"); sel.onchange = sel.onkeyup = selectSubset; box.appendChild(sel); box.appendChild(document.createTextNode(" ")); selectSubset(); return false; } //get div#mw-editTools box = document.getElementById('mw-editTools'); if(!box) { return; } box = box.appendChild(document.createElement("div")); box.setAttribute("id", "specialchars"); box.style.cssText = 'margin-top:5px; border:1px solid #aaaaaa; padding:2px;'; loadCommonsTools(); }) });