User:Percyboy/zheditionsdemo.js
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
function ZhEditionsFunc() {
this.data = '';
this.editions = [];
this.editionNames = {};
this.containsOriginalEdition = false;
this.relations = {};
this.defaults = {};
this.maps = [];
this.spans = [];
this.convertionName = 'zh';
this.trim = function(s) {
return s.replace(/(^\s*)|(\s*$)/g, "");
};
this.init = function() {
var div = document.getElementById('ZhEditionsData');
if (!div) return;
div.style.display = 'none';
var switchDiv = document.getElementById('ZhEditionsSwitch');
var tableDiv = document.getElementById('ZhEditionsTable');
this.data = div.innerHTML;
var lines = this.data.split('^');
for (var i=0; i<lines.length; i++) {
var line = lines[i];
if (line.length > 0 && line.indexOf('=') > -1) {
var para = this.trim(line.substr(0, line.indexOf('='))).toUpperCase();
var content = line.substr(line.indexOf('=') + 1);
var parts = content.split(';');
var list = [];
var ht = {};
for (var j = 0; j < parts.length; j++) {
var part = this.trim(parts[j]);
if (part.length > 0 && part.indexOf(':') > -1) {
var name = this.trim(part.substr(0, part.indexOf(':'))).toUpperCase();
var valu = this.trim(part.substr(part.indexOf(':') + 1));
list[j] = name;
ht[name] = valu;
}
}
if (para == 'EDITIONS') {
this.editions = list;
this.editionNames = ht;
for (var j = 0; j < list.length; j++) {
if (list[j] == '0') { this.containsOriginalEdition = true; break; }
}
} else if (para == 'RELATIONS') {
this.relations = ht;
} else if (para == 'DEFAULTS') {
this.defaults = ht;
} else if (para == 'L') {
this.maps[this.maps.length] = ht;
} else if (para == 'LANGUAGE') {
this.convertionName = content.toUpperCase();
}
}
}
var contentEle = document.getElementById('bodyContent');
this.prepare(contentEle);
for (var i = 0; i < this.spans.length; i++) {
var span = this.spans[i];
var txt = span.innerHTML;
var found = null;
for (var j = 0; j < this.maps.length; j++) {
for (var k = 0; k < this.editions.length; k++) {
if (txt == this.maps[j][this.editions[k]]) found = this.maps[j];
}
if (found != null) break;
}
if (found != null) {span.map = found; }
}
var html = '<SELECT onchange=\'javascript:ZhEditions.switchTo(this.options[this.selectedIndex].value);\' id=\'ZhEditionsSwitchSelect\'>';
for(var i=0; i<this.editions.length; i++) {
html += '<OPTION value=\'' + this.editions[i] + '\'>'
+ this.editionNames[this.editions[i]] + '</OPTION>';
}
html += '</SELECT>';
switchDiv.innerHTML = html;
html = '<TABLE class=\'wikitable\'><TR>';
for(var i=0; i<this.editions.length; i++) {
html += '<TH>' + this.editionNames[this.editions[i]]
+ '</TH>';
}
html += '</TR>';
for (var i=0; i < this.maps.length; i++) {
html += '<TR>';
for(var j=0; j<this.editions.length; j++) {
var found = '?';
var map = this.maps[i];
var edition = this.editions[j];
if (map[edition] != undefined) {
found = map[edition];
} else if (this.relations[edition] != undefined) {
var childEdition = edition;
while (true) {
var parentEdition = this.relations[childEdition];
if (parentEdition == undefined) {
break;
} else if (map[parentEdition] != undefined) {
found = map[parentEdition];
break;
} else {
childEdition = parentEdition;
}
}
} else if (this.containsOriginalEdition && map['0'] != undefined) {
found = map['0'];
}
html += '<TD>' + found + '</TD>';
}
html += '</TR>';
}
html += '</TABLE>';
tableDiv.innerHTML = html;
var defaultEdition = '';
if (this.defaults[this.convertionName] != undefined) defaultEdition = this.defaults[this.convertionName];
else {
if (this.convertionName == 'ZH-HANS') {
if (this.defaults['ZH-CN'] != undefined) defaultEdition = this.defaults['ZH-CN'];
else if (this.defaults['ZH-SG'] != undefined) defaultEdition = this.defaults['ZH-SG'];
} else if (this.convertionName == 'ZH-HANT') {
if (this.defaults['ZH-TW'] != undefined) defaultEdition = this.defaults['ZH-TW'];
else if (this.defaults['ZH-HK'] != undefined) defaultEdition = this.defaults['ZH-HK'];
} else if (this.convertionName == 'ZH-CN') {
if (this.defaults['ZH-HANS'] != undefined) defaultEdition = this.defaults['ZH-HANS'];
else if (this.defaults['ZH-SG'] != undefined) defaultEdition = this.defaults['ZH-SG'];
} else if (this.convertionName == 'ZH-TW') {
if (this.defaults['ZH-HANT'] != undefined) defaultEdition = this.defaults['ZH-HANT'];
else if (this.defaults['ZH-HK'] != undefined) defaultEdition = this.defaults['ZH-HK'];
} else if (this.convertionName == 'ZH-HK') {
if (this.defaults['ZH-HANT'] != undefined) defaultEdition = this.defaults['ZH-HANT'];
else if (this.defaults['ZH-TW'] != undefined) defaultEdition = this.defaults['ZH-TW'];
} else if (this.convertionName == 'ZH-SG') {
if (this.defaults['ZH-HANS'] != undefined) defaultEdition = this.defaults['ZH-HANS'];
else if (this.defaults['ZH-CN'] != undefined) defaultEdition = this.defaults['ZH-CN'];
}
}
var sel = document.getElementById('ZhEditionsSwitchSelect');
if (defaultEdition != '') {
for (var i=0; i< sel.options.length; i++) {
if (sel.options[i].value == defaultEdition) { sel.selectedIndex = i; break; }
}
this.switchTo(defaultEdition);
} else {
var op = document.createElement('OPTION');
op.value = '';
op.innerHTML = '(未选择)';
try {
if (sel.options.length > 0) {
sel.add(op, sel.options[0]); // standards compliant; doesn't work in IE
} else {
sel.add(op, null);
}
}
catch(ex) {
sel.add(op, 0); // IE only
}
sel.selectedIndex = 0;
}
};
this.prepare = function(parentEle) {
for (var i = 0; i < parentEle.childNodes.length; i++) {
var child = parentEle.childNodes[i];
if (child.nodeType == 1) { //ELEMENT_NODE
if (child.hasChildNodes()) this.prepare(child);
} else if (child.nodeType == 3) { //TEXT_NODE
if (child.id != 'ZhEditionsData') {
var html = child.nodeValue;
var p1 = html.indexOf('<<');
var p2 = html.indexOf('>>');
var s = '';
var lastLength = -1;
while (p1 > -1 && p2 > -1 && p2 > p1) {
s = html.substr(0, p1) + '<span class=\'ZhEditionsTerm\'>'
+ html.substr(p1+2, p2-p1-2) + '</span>';
lastLength = s.length;
s += html.substr(p2+2);
html = s;
p1 = html.indexOf('<<', lastLength)
p2 = html.indexOf('>>', lastLength)
}
if (lastLength > -1) {
var y = document.createElement('SPAN');
y.innerHTML = html;
var z = child.parentNode;
z.insertBefore(y, child);
z.removeChild(child);
for (var j = 0; j < y.childNodes.length; j++) {
var c = y.childNodes[j];
if (c.nodeType == 1 //ELEMENT_NODE
&& c.nodeName == 'SPAN' && c.className == 'ZhEditionsTerm') {
this.spans[this.spans.length] = c;
}
}
}
}
}
}
};
this.switchTo = function(edition) {
if (edition == '') return;
for (var i=0; i<this.spans.length; i++) {
var span = this.spans[i];
var map = span.map;
if (map != null) {
var found = null;
if (map[edition] != undefined && map[edition] != '?') {
found = map[edition];
} else if (this.relations[edition] != undefined) {
var childEdition = edition;
while (true) {
var parentEdition = this.relations[childEdition];
if (parentEdition == undefined) {
break;
} else if (map[parentEdition] != undefined && map[parentEdition] != '?') {
found = map[parentEdition];
break;
} else {
childEdition = parentEdition;
}
}
} else if (this.containsOriginalEdition && map['0'] != undefined && map['0'] != '?') {
found = map['0'];
}
if (found != null) span.innerHTML = found;
}
}
};
}
var ZhEditions;
function ZhEditionsSetup() {
if (!document.getElementById('ZhEditionsData')) return;
ZhEditions = new ZhEditionsFunc();
ZhEditions.init();
}
hookEvent('load', ZhEditionsSetup);