Last active
December 11, 2017 14:12
-
-
Save hurss/bc187db152ad8a6d8e8031796bf263d4 to your computer and use it in GitHub Desktop.
연합뉴스용 깨진 한자 변환기
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Javascript for GreaseMonkey(Firefox) TamperMonkey(Chrome) | |
// cited from foriequal0/yaminjeongeum.user.js | |
// ==UserScript== | |
// @name textreplacer | |
// @namespace textreplacer.kr | |
// @description 연합뉴스용 한자 변환기 | |
// @include * | |
// @exclude file://* | |
// @version 1 | |
// @grant none | |
// @run-at document-end | |
// ==/UserScript== | |
(function () { | |
var txtrepl = (function () { | |
var rules = []; | |
(function () { | |
function getRandomInt(min, max) { | |
return Math.floor(Math.random() * (max - min)) + min; | |
} | |
var constant = function (v) { | |
return function () { | |
return v; | |
}; | |
}; | |
var add = function (type) { | |
return function (pattern) { | |
var pattern_args = arguments; | |
if (type === "char") { | |
var regex = new RegExp(pattern); | |
var match = function (x) { | |
return x.match(regex); | |
}; | |
} else { | |
var match = function (x) { | |
if (x.startsWith(pattern)) return pattern; | |
else null; | |
}; | |
} | |
if (pattern_args.length == 2) { | |
rules.push({ | |
type: type, | |
match: match, | |
process: arguments[1] | |
}); | |
} else { | |
rules.push({ | |
type: type, | |
match: match, | |
process: function (x) { | |
var i = getRandomInt(1, pattern_args.length); | |
var select = pattern_args[i]; | |
return select(x); | |
} | |
}); | |
} | |
}; | |
}; | |
var word = add("word"); | |
var char = add("char"); | |
var rword = function () { | |
var candidates = arguments; | |
for (var i = 0; i < candidates.length; i++) { | |
var pivot = candidates[i]; | |
var args = [pivot]; | |
for (var j = 0; j < candidates.length; j++) { | |
if (i == j) continue; | |
args.push(constant(candidates[j])); | |
} | |
word.apply(this, args); | |
} | |
}; | |
// 연합뉴스 EUC-KR 외 한자들을 바꿉니다. | |
// replace here | |
/* | |
rword("<封+手>", "㨍"); | |
rword("<손수변에 處>", "㨿"); | |
rword("<炎+火>", "㷋"); | |
rword("<초두밑에 赤>", "䓇"); | |
rword("<人변에 分>", "份"); | |
rword("<人+占>", "佔"); | |
rword("<人+冬>", "佟"); | |
rword("니<人+爾>", "你"); | |
rword("<人+同>", "侗"); | |
rword("오<갈래지을 오, 人변+口+天, 天이 口아래에 있음>", "俣"); | |
rword("<人+泰>", "傣"); | |
rword("<초두머리 없는 苒>", "冉"); | |
rword("<口+巴>", "吧"); | |
rword("<口+內>", "呐"); | |
rword("<口+幼>", "呦"); | |
rword("<口+那>", "哪"); | |
rword("<口+卒>", "啐"); | |
rword("<摘에서 手대신口>", "嘀"); | |
rword("<口+麻>", "嘛"); | |
rword("<口+華>", "嘩"); | |
rword("<土+川>", "圳"); | |
rword("<土+甫>", "埔"); | |
rword("<土+盧>", "壚"); | |
rword("<土+覇>", "壩"); | |
rword("<女+馬>", "媽"); | |
rword("<女+馬>", "媽"); | |
rword("<山아래卯>", "峁"); | |
rword("<被, 옷의 변 대신 수건건 변>", "帔"); | |
rword("<慢에서 물수변 대신 수건건변>", "幔"); | |
rword("<杉에서 木 대신 丹>", "彤"); | |
rword("<心변에 甚>", "愖"); | |
rword("<손수변에 爪>", "抓"); | |
rword("<손수변에 斥>", "拆"); | |
rword("<손수변에 幷>", "拼"); | |
rword("<손수변에旱>", "捍"); | |
rword("<손수변에 辱>", "搙"); | |
rword("<손수변에高>", "搞"); | |
rword("<손수변에 專>", "摶"); | |
rword("<又대신 万이 들어간 板>", "栃"); | |
rword("<木+危>", "桅"); | |
rword("<木+隸>", "棣"); | |
rword("<木+亞>", "椏"); | |
rword("<木+兪>", "榆"); | |
rword("<木+神>", "榊"); | |
rword("<矩 아래 木>", "榘"); | |
rword("<木+犀>", "樨"); | |
rword("<木+當>", "檔"); | |
rword("<水+戶>", "沪"); | |
rword("<좌부변 대신 삼수변 들어간 陀>", "沱"); | |
rword("<삼수변+失>", "泆"); | |
rword("<삼수변에出> ", "泏"); | |
rword("<삼수변에 耳>", "洱"); | |
rword("<우부방 대신 물수변 있는 部>", "涪"); | |
rword("<삼수변에金>", "淦"); | |
rword("<삼수변에 來>", "淶"); | |
rword("<삼수변에 兪>", "渝"); | |
rword("<삼수변+省>", "渻"); | |
rword("<물수변에建>", "湕"); | |
rword("<삼수변에 栗>", "溧"); | |
rword("<풀 초변 없는 藤>", "滕"); | |
rword("<삼수변+扈>", "滬"); | |
rword("<삼수변에 僕>", "濮"); | |
rword("<삼수변에 維>", "濰"); | |
rword("<삼수변+襄>", "瀼"); | |
rword("<火+考>", "烤"); | |
rword("<火+昆>", "焜"); | |
rword("<火+韋>", "煒"); | |
rword("<火+會>", "燴"); | |
rword("<王+路>", "璐"); | |
rword("<白밑에田>", "畠"); | |
rword("<石자 2개>", "砳"); | |
rword("<木대신 石이 들어간 椎>", "碓"); | |
rword("<사람인변 대신 石 붙은 倍>", "碚"); | |
rword("<石+義>", "礒"); | |
rword("<龍아래石>", "礱"); | |
rword("<示+示>", "祘"); | |
rword("<人 없은 偶>", "禺"); | |
rword("<竹 밑에 旦>", "笪"); | |
rword("<竹아래快>", "筷"); | |
rword("<대죽+更>", "筻"); | |
rword("<兼대신虎들어간簾>", "篪"); | |
rword("<米+刃>", "籾"); | |
rword("<손수변 없는 攝>", "聶"); | |
rword("<月+半>", "胖"); | |
rword("<月+盧>", "臚"); | |
rword("<고울염>", "艳"); | |
rword("<초두밑에 令>", "苓"); | |
rword("<초두머리 아래 助>", "莇"); | |
rword("<초두아래 保>", "葆"); | |
rword("<초두밑에 紅>", "葒"); | |
rword("<초두머리 아래 段>", "葭"); | |
rword("<초두 밑에 倍>", "蓓"); | |
rword("<초두머리 아래 寇>", "蔻"); | |
rword("<초두머리 아래 雷>", "蕾"); | |
rword("<초두머리 아래 頻>", "蘋"); | |
rword("<벌레 충+馬>", "螞"); | |
rword("<衣+叉>", "衩"); | |
rword("구<求 밑에 衣>", "裘"); | |
rword("<옷의 변에 者>", "褚"); | |
rword("<衣+庫>", "褲"); | |
rword("<告+우부방>", "郜"); | |
rword("<우부방+赤>", "郝"); | |
rword("<金+惠>", "鏸"); | |
rword("<金밑에 金金>", "鑫"); | |
rword("<金+羅>", "鑼"); | |
rword("<흘비올 매>", "霾"); | |
rword("<臣+頁>", "頤"); | |
rword("<拔에서 손수변 대신 魚>", "鮁"); | |
rword("<魚+皇>", "鱑"); | |
rword("<儒에서 사람인변 대신 魚>", "鱬"); | |
rword("공<龍 밑에 共>", "龔"); | |
rword("求 밑에 衣", "裘"); | |
rword("求밑에衣", "裘"); | |
rword("탁<又대신尺들어간度>", "庹"); | |
rword("호<삼수변+扈>", "滬"); | |
rword("堀起", "崛起"); | |
rword("中國", "中国"); | |
rword("新聞網", "新闻网"); | |
//rword("網", "网"); | |
rword("習近平", "习近平"); | |
rword("溫家寶", "温家宝"); | |
*/ | |
rword("김일성", ""); | |
rword("김정일", ""); | |
rword("김정은", ""); | |
/* | |
// 빻음방지 | |
rword("女", " "); | |
rword("女", " "); | |
rword("男", "남성"); | |
*/ | |
/* | |
rword("", ""); | |
rword("", ""); | |
rword("", ""); | |
*/ | |
/* | |
rword("檢 ", "검찰 "); | |
rword("與 ", "여당 "); | |
rword("野 ", "야당 "); | |
rword("號", "호"); | |
rword("美", "미국"); | |
rword("日", "일본"); | |
rword("獨", "독일"); | |
rword("佛", "프랑스"); | |
rword("弗", "달러"); | |
rword("前", "전"); | |
rword("軍", "군"); | |
rword("對", "대"); | |
rword("ㆍ", "·"); | |
*/ | |
//rword("", ""); | |
})(); | |
var findMatch = function (arr, func) { | |
for (var i = 0; i < arr.length; i++) { | |
if (func(arr[i])) { | |
return arr[i]; | |
} | |
} | |
return undefined; | |
}; | |
return { | |
convert: function (text) { | |
var res = ""; | |
while (text.length > 0) { | |
var rule = findMatch(rules, function (r) { | |
if (r.type == 'word') { | |
return r.match(text); | |
} else { | |
var char = text[0]; | |
return r.match(char); | |
} | |
}); | |
if (rule) { | |
if (rule.type == 'word') { | |
var match = rule.match(text); | |
var processed = rule.process(match); | |
res = res + processed; | |
text = text.substring(match.length); | |
continue; | |
} else if (rule.type == 'char') { | |
var char = text[0]; | |
res = res + char; | |
text = text.substring(1); | |
} | |
} else { | |
var char = text[0]; | |
res = res + char; | |
text = text.substring(1); | |
} | |
} | |
return res; | |
} | |
}; | |
})(); | |
var converted = new Set(); | |
function replacer(root) { | |
for (var child of root.childNodes || []) { | |
replacer(child); | |
} | |
if (root.nodeName == "#text" && !converted.has(root)) { | |
root.nodeValue = txtrepl.convert(root.nodeValue); | |
converted.add(root); | |
} | |
} | |
replacer(document.body); | |
var observer = new MutationObserver(function (changes) { | |
for (var change of changes) { | |
replacer(change.target); | |
} | |
}); | |
observer.observe(document.body, { | |
childList: true, | |
subtree: true | |
}); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment