User:ZeScript/space.js

来自滚动的天空Wiki

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:Ctrl-F5
"use strict";

(function () {
	
	var content = document.getElementById("mw-content-text");
	var lines = [];
    var last;
    /*
    function d(n) {
    	var date = new Date();
    	var t = date.getTime();
    	return function () { 
    		if (new Date().getTime() - t > 1000) 
    			throw Error("timeout#" + n);
    		
    	};
    }
    */
    
    function computeDisplayProperty(node) {
        return window.getComputedStyle(node).display;
    }

    function checkDisplay(node) {
        // 检查一个节点是否显示
        var current = node;
        //var t = d(1);
        for (;current !== document.body;) {
            if (computeDisplayProperty(node) === "none") return true;
            current = current.parentNode;
            //t();
        }
        return false;
    }

    function countLevel(node) {
        var i = 0;
        var cur = node;
        //var t = d(2)
        for (;cur !== document.body;i++) {
            cur = cur.parentNode;
            //t()
        }
        return i;
    }

    function checkInline(text1, text2) {
        if (text1.parentNode === text2.parentNode) {
            return true;
        }
        var lt1 = countLevel(text1), lt2 = countLevel(text2);
        var higher, lower, distance;
        if (lt1 > lt2) {
            higher = text1.parentNode;
            lower = text2.parentNode;
            distance = lt1 - lt2;
        } else {
            higher = text2.parentNode;
            lower = text1.parentNode;
            distance = lt2 - lt1;
        }
        //var t = d(3)
        for (;distance > 0;distance--) {
            if (computeDisplayProperty(higher) !== "inline") {
                return false;
            }
            higher = higher.parentNode;
            //t()
        }
        //t = d(4)
        for (;higher.parentNode !== lower.parentNode;) {
            if (computeDisplayProperty(higher) !== "inline" 
            || computeDisplayProperty(lower) !== "inline") {
                return false;
            }
            higher = higher.parentNode;
            lower = lower.parentNode;
            //t()
        }
        
        return true;
    }

	function process(node) {
		var i, n = node.childNodes, l = n.length;
        for (i = 0;i < l;i++) {
        	var ele = n[i];
            if (checkDisplay(node)) {
                return;
            }
            if (ele.nodeType === Node.TEXT_NODE) {
                if (lines.length === 0) {
                    lines.push([ele]);
                    last = ele;
                } else {
                    if(checkInline(last, ele)) {
                        lines[lines.length - 1].push(ele);
                    } else {
                        lines.push([ele]);
                    }
                    last = ele;
                }
            } else {
                process(ele);
            }
        }
    }
    function processLine(line) {
        var i,l = line.length;
        for (i = 0;i < l;i++) {
            var text = line[i];
            var content = text.textContent;
            text.textContent = content
                .replace(/([\u4E00-\u9FA5])(\w)/g,"$1 $2")
                .replace(/([\w%])([\u4E00-\u9FA5])/g,"$1 $2");
        }
        for (i = 1;i < l;i++) {
            var text1 = line[i - 1];
            var text2 = line[i];
            var content1 = text1.textContent;
            var content2 = text2.textContent;
            var last = content1.charCodeAt(content1.length - 1);
            var first = content2.charCodeAt(0);
            if (last >= 19968 && last <= 40869 && first < 123) {
                text2.textContent = " " + content2;
            } else if (first >= 19968 && first <= 40869 && last < 123) {
                text1.textContent = content1 + " ";
            }
            
        }
    }


    process(content);
    console.log(lines);
    var length = lines.length;
    for (var i = 0;i < length;i++) {
        processLine(lines[i]);
    }
    
	
	
})();