Skip to content

Instantly share code, notes, and snippets.

@hurss
Last active December 11, 2017 14:12
Show Gist options
  • Save hurss/bc187db152ad8a6d8e8031796bf263d4 to your computer and use it in GitHub Desktop.
Save hurss/bc187db152ad8a6d8e8031796bf263d4 to your computer and use it in GitHub Desktop.
연합뉴스용 깨진 한자 변환기
// 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