User:Percyboy/zheditionsdemo.js

维基百科,自由的百科全书

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ 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);