User:ZeScript/space.js
来自滚动的天空Wiki
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-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]);
}
})();