Skip to content

Instantly share code, notes, and snippets.

@hogelog
Created November 10, 2010 11:35
Show Gist options
  • Save hogelog/670734 to your computer and use it in GitHub Desktop.
Save hogelog/670734 to your computer and use it in GitHub Desktop.
greasemonkey-fixtext
// ==UserScript==
// @name fixtext_sssite
// @namespace fixtext_sssite
// ==/UserScript==
function $x(exp, doc, callback) {
var result = doc.evaluate(exp, doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
if(result.resultType == XPathResult.ORDERED_NODE_SNAPSHOT_TYPE) {
for(var i=0;i<result.snapshotLength;++i) {
callback(result.snapshotItem(i));
}
}
}
function $p() {
return "("+Array.prototype.slice.call(arguments, 0).join("|")+")";
}
var re_lparen = $p("\\(","\\[","{","(","[","{","「","『","【","〔","「", "<", "“");
var re_rparen = $p("\\)","\\]","}",")","]","}","」","』","】","〕","」", ">", "”");
var re_touten = $p("。", "。", "、", "、");
var re_maru = $p("。", "。");
var re_ten = $p("\\.", "・", "\u30fb", "・", "‥", ".");
var re_space = $p("\\s", " ");
var re_dash = $p("-", "―", "─");
var re_jo = $p("は", "と", "が", "ない", "なく");
var re_mark = $p("×", "-", "○", "●", "―");
var table = [
["ガ", "ガ"], ["ギ", "ギ"], ["グ", "グ"], ["ゲ", "ゲ"], ["ゴ", "ゴ"],
["ザ", "ザ"], ["ジ", "ジ"], ["ズ", "ズ"], ["ゼ", "ゼ"], ["ゾ", "ゾ"],
["ダ", "ダ"], ["ヂ", "ヂ"], ["ヅ", "ヅ"], ["デ", "デ"], ["ド", "ド"],
["バ", "バ"], ["ビ", "ビ"], ["ブ", "ブ"], ["ベ", "ベ"], ["ボ", "ボ"],
["パ", "パ"], ["ピ", "ピ"], ["プ", "プ"], ["ペ", "ペ"], ["ポ", "ポ"],
["ヴ", "ヴ"],
["ア", "ア"], ["イ", "イ"], ["ウ", "ウ"], ["エ", "エ"], ["オ", "オ"],
["ァ", "ァ"], ["ィ", "ィ"], ["ゥ", "ゥ"], ["ェ", "ェ"], ["ォ", "ォ"],
["カ", "カ"], ["キ", "キ"], ["ク", "ク"], ["ケ", "ケ"], ["コ", "コ"],
["サ", "サ"], ["シ", "シ"], ["ス", "ス"], ["セ", "セ"], ["ソ", "ソ"],
["タ", "タ"], ["チ", "チ"], ["ツ", "ツ"], ["テ", "テ"], ["ト", "ト"],
["ナ", "ナ"], ["ニ", "ニ"], ["ヌ", "ヌ"], ["ネ", "ネ"], ["ノ", "ノ"],
["ハ", "ハ"], ["ヒ", "ヒ"], ["フ", "フ"], ["ヘ", "ヘ"], ["ホ", "ホ"],
["マ", "マ"], ["ミ", "ミ"], ["ム", "ム"], ["メ", "メ"], ["モ", "モ"],
["ラ", "ラ"], ["リ", "リ"], ["ル", "ル"], ["レ", "レ"], ["ロ", "ロ"],
["ヤ", "ヤ"], ["ユ", "ユ"], ["ヨ", "ヨ"], ["ャ", "ャ"], ["ュ", "ュ"], ["ョ", "ョ"],
["ワ", "ワ"], ["ヲ", "ヲ"], ["ン", "ン"], ["ッ", "ッ"],
["、", "、"], ["。", "。"], ["ー", "ー"], ["「", "「"], ["」", "」"],
["㌻", "ページ"],
["-", "―"],
[re_dash+"{3,}", "――"],
["…。", "…"],
["、…", "…"],
[re_ten+"{2,}", "……"],
["-―", "――"],
["‥", "……"],
["どうり", "どおり"],
//["…"+re_touten, "……"],
["\u2026{3,}", "……"],
["([^…]|^)…([^…]|$)", function(){return RegExp.$1+"……"+RegExp.$2}],
//["([^…])……"+re_touten, function(){return RegExp.$1+"……"],
["\\!", "!"],
["\\?", "?"],
["!、", "!"],
["!。", "!"],
["?。", "?"],
["?、", "?"],
["?!", "!?"],
["!!", "!"],
[" {2,}", " "],
[re_touten+re_space+"+", function(){return RegExp.$1}],
["…… +", "……"],
["((?:汗|黒笑|怒|泣))", ""],
["///+", ""],
[re_maru+re_rparen, function(){return RegExp.$2;}],
[re_space+re_rparen, function(){return RegExp.$2;}],
[$p("そう","どう")+"ゆう", function(){return RegExp.$1+"いう"}],
["そうゆう", "そういう"],
["どうゆう", "どういう"],
["信じれる", "信じられる"],
["間違え"+re_jo, function(){return "間違い"+RegExp.$1;}],
[re_mark+"{4,}", function(){return RegExp.$1+RegExp.$1+RegExp.$1;}],
["米神", "こめかみ"],
[re_lparen+re_space, function(){return RegExp.$1}],
[re_space+re_rparen, function(){return RegExp.$2}],
];
var targets = RegExp(table.map(function(x) {return x[0];}).join("|"), "g");
var targets_re = table.map(function(x) {return RegExp(x[0],"g");});
function replacer(x) {
for(var i=0;i<targets_re.length;++i) {
if(x.match(targets_re[i])) {
result = table[i][1];
if(result instanceof Function) return result(x);
else if(typeof result == "function") return result(x);
return result;
}
}
return x;
}
function fixtext(doc) {
$x("//text()", doc, function (node) {
if(node.parentNode.tagName.match(/^(NOSCRIPT|SCRIPT|STYLE)/)) return;
var data = node.data;
if(data.match(targets)) {
do {
data = data.replace(targets, replacer);
} while(data.match(targets));
var div = doc.createElement("div");
div.innerHTML = data;
var range = document.createRange();
range.selectNodeContents(div);
var content = range.extractContents();
range.setStartBefore(node);
range.insertNode(content);
range.selectNode(node);
range.deleteContents();
}
});
}
fixtext(document);
setTimeout(function() {
if (window.AutoPagerize && window.AutoPagerize.addDocumentFilter) {
window.AutoPagerize.addDocumentFilter(fixtext);
}
}, 0);
// vim: set sw=4 ts=4 et:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment