User:Mike Dillon/Scripts/edittools.js
/*
*/*/ // XXX: This should be in a regular CSS file
(function () {
var head = document.getElementsByTagName("head")[0];
if (head) {
var style = document.createElement("style");
style.setAttribute("type", "text/css")
style.appendChild(document.createTextNode(
"div#edittools_main {" +
" font-size: inherit;" +
" border-bottom: 1px solid #aaa;" +
"}" +
"div.edittools-group {" +
" font-size: smaller;" +
"}"
));
head.appendChild(style);
}
})();
function EdittoolsGroup(name, label) {
this.label = label || name;
this.elements = [];
function addElement(group, type, e) {
group.elements[group.elements.length] = [ type, e ];
return group;
}
this.addLabel = function (label) {
var b = document.createElement("b");
b.appendChild(document.createTextNode(label));
return addElement(this, "label", b);
};
this.addInsert = function (open, close, sample) {
if (!open) open = '';
if (!close) close = '';
if (!sample) sample = '';
var display = open + close;
if (display.match(/^[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/)) {
display = "\u034F" + display;
}
var a = document.createElement("a");
a.setAttribute("href", "#");
a.setAttribute("title", "Insert text: " + display);
a.appendChild(document.createTextNode(display));
a.onclick = function () {
insertTags(open, close, sample);
return false;
};
return addElement(this, "insert", a);
};
this.addInsertList = function (chars) {
if (!chars) return;
var list = chars.split(/\s+/);
for (var n in list) {
if (list[n] != '') this.addInsert(list[n]);
}
return this;
};
this.addGap = function () {
return addElement(this, "gap", document.createTextNode("\xA0"));
};
this.addBullet = function () {
return addElement(this, "bullet", document.createTextNode("\xA0•\xA0"));
};
this.addWikiLink = function (page, label) {
var parts = page.split(/#/, 2);
var url = wgArticlePath.replace(/\$1/, encodeURIComponent(parts[0]));
if (parts[1]) {
url += "#" + encodeURIComponent(parts[1]).replace(/%/g, ".");
}
var a = document.createElement("a");
a.setAttribute("href", url);
a.setAttribute("title", page.replace(/_/g, " "));
a.appendChild(document.createTextNode(label || page));
var span = document.createElement("span");
span.appendChild(document.createTextNode("("));
span.appendChild(a);
span.appendChild(document.createTextNode(")"));
return addElement(this, "link", span);
};
}
var Edittools = new function () {
this.style = "full";
this.clear = true;
this.groups = {};
this.createGroup = function (name, label) {
if (!this.groups[name]) {
this.groups[name] = new EdittoolsGroup(name, label);
}
return this.groups[name];
};
this.getGroup = function (name) {
return this.groups[name];
};
this.removeGroup = function (name) {
delete this.groups[name];
};
this.removeAllGroups = function () {
this.groups = {};
};
this.install = function (container) {
if (container && container.nodeType == null) {
container = document.getElementById(container);
}
if (!container) return;
if (this.clear) {
while (container.firstChild) container.removeChild(container.firstChild);
}
var groupEls = {};
if (this.style == 'compact') {
var select = document.createElement("select");
select.onchange = function () {
var sel = this.options[this.selectedIndex].value;
for (var name in groupEls) {
groupEls[name].style.display = (name == sel) ? "inline" : "none";
}
};
container.appendChild(select);
container.appendChild(document.createTextNode(" "));
}
var first = true;
var elType = (this.style == 'compact') ? "span" : "div";
for (var name in this.groups) {
var group = this.groups[name];
if (this.style == 'compact') {
var opt = document.createElement("option");
opt.setAttribute("value", name);
opt.appendChild(document.createTextNode(group.label));
select.appendChild(opt);
}
var groupEl = document.createElement(elType);
groupEl.setAttribute("id", "edittools_" + name);
groupEl.setAttribute("class", "edittools-group");
if (!first && this.style == 'compact') {
groupEl.setAttribute("style", "display: none");
}
for (var n in group.elements) {
var element = group.elements[n];
if (element[0] == 'label' && this.style == 'compact') continue;
if (groupEl.childNodes.length) {
groupEl.appendChild(document.createTextNode(" "));
}
groupEl.appendChild(element[1]);
}
container.appendChild(groupEl);
groupEls[name] = groupEl;
first = false;
}
};
};
with (Edittools) {
// Main group
var main = createGroup("main", "Standard");
with (main) {
addLabel("Insert:");
addInsertList("– — … ° ≈ ≠ ≤ ≥ ± − × ÷ ← → · §").addGap();
addLabel("Sign your username:");
addInsert("~~" + "~~");
}
// Wiki markup
var wikimarkup = createGroup("wikimarkup", "Wiki markup");
with (wikimarkup) {
addLabel("Wiki markup:");
addInsert("{{", "}}").addGap();
addInsert("|").addGap();
addInsert("[", "]").addGap();
addInsert("", "").addGap();
addInsert("Category:", "").addGap();
addInsert("#REDIRECT", "").addGap();
addInsert("
", "").addGap();addInsert("", "").addGap();
addInsert("", "").addGap();
addInsert("
", "
").addGap();addInsert("
", "").addGap();addInsert("", "").addGap();
addInsert("{{Reflist}}").addGap();
addInsert("
").addGap(); addInsert("
", " ").addGap();addInsert("
", " ").addGap();addInsert("{{DEFAULTSORT:", "}}").addGap();
addInsert("
", " ").addGap();addInsert("").addGap();
addInsert("", "");
addBullet();
addWikiLink("Wikipedia:Template messages", "templates");
}
// Symbols
var symbols = createGroup("symbols", "Symbols");
with (symbols) {
addLabel("Symbols:");
addInsertList("~ | ¡ ¿ † ‡ ↔ ↑ ↓ • ¶").addGap();
addInsertList("# ¹ ² ³ ½ ⅓ ⅔ ¼ ¾ ⅛ ⅜ ⅝ ⅞ ∞").addGap();
addInsertList("‘ “ ’ ”").addGap();
addInsertList("¤ ₳ ฿ ₵ ¢ ₡ ₢ $ ₫ ₯ € ₠ ₣ ƒ ₴ ₭ ₤ ℳ ₥ ₦ ₧ ₰");
addInsertList("£ ៛ ₨ ₪ ৳ ₮ ₩ ¥").addGap();
addInsertList("♠ ♣ ♥ ♦");
}
// Characters
var characters = createGroup("characters", "Characters");
with (characters) {
addLabel("Characters:");
addInsertList("Á á Ć ć É é Í í Ĺ ĺ Ń ń Ó ó Ŕ ŕ Ś ś Ú ú Ý ý Ź ź").addGap();
addInsertList("À à È è Ì ì Ò ò Ù ù").addGap();
addInsertList("Â â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ").addGap();
addInsertList("Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ").addGap();
addInsertList("ß").addGap();
addInsertList("Ã ã Ẽ ẽ Ĩ ĩ Ñ ñ Õ õ Ũ ũ Ỹ ỹ").addGap();
addInsertList("Ç ç Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ").addGap();
addInsertList("Đ đ").addGap();
addInsertList("Ů ů").addGap();
addInsertList("Ǎ ǎ Č č Ď ď Ě ě Ǐ ǐ Ľ ľ Ň ň Ǒ ǒ Ř ř Š š Ť ť Ǔ ǔ Ž ž").addGap();
addInsertList("Ā ā Ē ē Ī ī Ō ō Ū ū Ȳ ȳ Ǣ ǣ").addGap();
addInsertList("ǖ ǘ ǚ ǜ").addGap();
addInsertList("Ă ă Ĕ ĕ Ğ ğ Ĭ ĭ Ŏ ŏ Ŭ ŭ").addGap();
addInsertList("Ċ ċ Ė ė Ġ ġ İ ı Ż ż").addGap();
addInsertList("Ą ą Ę ę Į į Ǫ ǫ Ų ų").addGap();
addInsertList("Ḍ ḍ Ḥ ḥ Ḷ ḷ Ḹ ḹ Ṃ ṃ Ṇ ṇ Ṛ ṛ Ṝ ṝ Ṣ ṣ Ṭ ṭ").addGap();
addInsertList("Ł ł").addGap();
addInsertList("Ő ő Ű ű").addGap();
addInsertList("Ŀ ŀ").addGap();
addInsertList("Ħ ħ").addGap();
addInsertList("Ð ð Þ þ").addGap();
addInsertList("Œ œ").addGap();
addInsertList("Æ æ Ø ø Å å").addGap();
addInsertList("Ə ə");
addBullet();
addInsert("{{Unicode|", "}}");
}
// Greek
var greek = createGroup("greek", "Greek");
with (greek) {
addLabel("Greek:");
addInsertList("Ά ά Έ έ Ή ή Ί ί Ό ό Ύ ύ Ώ ώ").addGap();
addInsertList("Α α Β β Γ γ Δ δ").addGap();
addInsertList("Ε ε Ζ ζ Η η Θ θ").addGap();
addInsertList("Ι ι Κ κ Λ λ Μ μ").addGap();
addInsertList("Ν ν Ξ ξ Ο ο Π π").addGap();
addInsertList("Ρ ρ Σ σ ς Τ τ Υ υ").addGap();
addInsertList("Φ φ Χ χ Ψ ψ Ω ω").addGap();
addInsertList("");
addBullet();
addInsert("{{Polytonic|", "}}");
addBullet();
addWikiLink("Polytonic_orthography#Examples_of_polytonic_characters", "polytonic");
}
// Cyrillic
var cyrillic = createGroup("cyrillic", "Cyrillic");
with (cyrillic) {
addLabel("Cyrillic:");
addInsertList("А а Б б В в Г г").addGap();
addInsertList("Ґ ґ Ѓ ѓ Д д Ђ ђ").addGap();
addInsertList("Е е Ё ё Є є Ж ж").addGap();
addInsertList("З з Ѕ ѕ И и І і").addGap();
addInsertList("Ї ї Й й Ј ј К к").addGap();
addInsertList("Ќ ќ Л л Љ љ М м").addGap();
addInsertList("Н н Њ њ О о П п").addGap();
addInsertList("Р р С с Т т Ћ ћ").addGap();
addInsertList("У у Ў ў Ф ф Х х").addGap();
addInsertList("Ц ц Ч ч Џ џ Ш ш").addGap();
addInsertList("Щ щ Ъ ъ Ы ы Ь ь").addGap();
addInsertList("Э э Ю ю Я я");
}
// IPA
var ipa = createGroup("ipa", "IPA");
with (ipa) {
addLabel("IPA:");
addInsertList("t̪ d̪ ʈ ɖ ɟ ɡ ɢ ʡ ʔ").addGap();
addInsertList("ɸ ʃ ʒ ɕ ʑ ʂ ʐ ʝ ɣ ʁ ʕ ʜ ʢ ɦ").addGap();
addInsertList("ɱ ɳ ɲ ŋ ɴ").addGap();
addInsertList("ʋ ɹ ɻ ɰ").addGap();
addInsertList("ʙ ʀ ɾ ɽ").addGap();
addInsertList("ɫ ɬ ɮ ɺ ɭ ʎ ʟ").addGap();
addInsertList("ɥ ʍ ɧ").addGap();
addInsertList("ɓ ɗ ʄ ɠ ʛ").addGap();
addInsertList("ʘ ǀ ǃ ǂ ǁ").addGap();
addInsertList("ɨ ʉ ɯ").addGap();
addInsertList("ɪ ʏ ʊ").addGap();
addInsertList("ɘ ɵ ɤ").addGap();
addInsertList("ə ɚ").addGap();
addInsertList("ɛ ɜ ɝ ɞ ʌ ɔ").addGap();
addInsertList("ɐ ɶ ɑ ɒ").addGap();
addInsertList("ʰ ʷ ʲ ˠ ˤ ⁿ ˡ").addGap();
addInsertList("ˈ ˌ ː ˑ ̪");
addBullet();
addInsert("{{IPA|", "}}");
}
}
addOnloadHook(function () {
Edittools.install("editpage-specialchars");
});
/*