사용자:Ykhwong/Banmal.js
참고: 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다. 구글 크롬, 파이어폭스, 마이크로소프트 엣지, 사파리: ⇧ Shift 키를 누른 채 "새로 고침" 버튼을 클릭하십시오. 더 자세한 정보를 보려면 위키백과:캐시 무시하기 항목을 참고하십시오.
/*
* Banmal.js
* @author ykhwong
*/
/*jshint esversion: 6 */
$(function () {
var isMobile = false;
var textBoxId = '';
const matchHangul = [
/* ㅏ,ㅓ,ㅕ,ㅗ,ㅛ,ㅜ,ㅡ,ㅣ,ㅐ,ㅚ,ㅟ */
// ㅏ
{ key: '[각-갛]', val: '간' },
{ key: '[낙-낳]', val: '난' },
{ key: '[닥-닿]', val: '단' },
{ key: '[락-랗]', val: '란' },
{ key: '[막-맣]', val: '만' },
{ key: '[박-밯]', val: '반' },
{ key: '[삭-샇]', val: '산' },
{ key: '[악-앟]', val: '안' },
{ key: '[작-잫]', val: '잔' },
{ key: '[착-챃]', val: '찬' },
{ key: '[칵-캏]', val: '칸' },
{ key: '[탁-탛]', val: '탄' },
{ key: '[팍-팧]', val: '판' },
{ key: '[학-핳]', val: '한' },
{ key: '[깍-깧]', val: '깐' },
{ key: '[딱-땋]', val: '딴' },
{ key: '[빡-빻]', val: '빤' },
{ key: '[싹-쌓]', val: '싼' },
{ key: '[짝-짷]', val: '짠' },
// ㅓ
{ key: '[건-겋]', val: '건' },
{ key: '[넉-넣]', val: '넌' },
{ key: '[덕-덯]', val: '던' },
{ key: '[럭-렇]', val: '런' },
{ key: '[먹-멓]', val: '먼' },
{ key: '[벅-벟]', val: '번' },
{ key: '[석-섷]', val: '선' },
{ key: '[억-엏]', val: '언' },
{ key: '[적-젛]', val: '전' },
{ key: '[척-첳]', val: '천' },
{ key: '[컥-컿]', val: '컨' },
{ key: '[턱-텋]', val: '턴' },
{ key: '[퍽-펗]', val: '펀' },
{ key: '[헉-헣]', val: '헌' },
{ key: '[꺽-껗]', val: '껀' },
{ key: '[떡-떻]', val: '떤' },
{ key: '[뻑-뻫]', val: '뻔' },
{ key: '[썩-쎃]', val: '썬' },
{ key: '[쩍-쩧]', val: '쩐' },
// ㅕ
{ key: '[견-곃]', val: '견' },
{ key: '[녁-녛]', val: '년' },
{ key: '[뎍-뎧]', val: '뎐' },
{ key: '[력-렿]', val: '련' },
{ key: '[멱-몋]', val: '면' },
{ key: '[벽-볗]', val: '변' },
{ key: '[셕-셯]', val: '션' },
{ key: '[역-옇]', val: '연' },
{ key: '[젹-졓]', val: '젼' },
{ key: '[쳑-쳫]', val: '쳔' },
{ key: '[켝-켷]', val: '켠' },
{ key: '[텩-톃]', val: '텬' },
{ key: '[펵-폏]', val: '편' },
{ key: '[혁-혛]', val: '현' },
{ key: '[껵-꼏]', val: '껸' },
{ key: '[뗙-뗳]', val: '뗜' },
{ key: '[뼉-뼣]', val: '뼌' },
{ key: '[쎡-쎻]', val: '쎤' },
{ key: '[쪅-쪟]', val: '쪈' },
// ㅗ
{ key: '[곡-곻]', val: '곤' },
{ key: '[녹-놓]', val: '논' },
{ key: '[독-돟]', val: '돈' },
{ key: '[록-롷]', val: '론' },
{ key: '[목-뫃]', val: '몬' },
{ key: '[복-봏]', val: '본' },
{ key: '[속-솧]', val: '손' },
{ key: '[옥-옿]', val: '온' },
{ key: '[족-좋]', val: '존' },
{ key: '[촉-촣]', val: '촌' },
{ key: '[콕-콯]', val: '콘' },
{ key: '[톡-톻]', val: '톤' },
{ key: '[폭-퐇]', val: '폰' },
{ key: '[혹-홓]', val: '혼' },
{ key: '[꼭-꽇]', val: '꼰' },
{ key: '[똑-똫]', val: '똔' },
{ key: '[뽁-뽛]', val: '뽄' },
{ key: '[쏙-쏳]', val: '쏜' },
{ key: '[쪽-쫗]', val: '쫀' },
// ㅛ
{ key: '[굑-굫]', val: '굔' },
{ key: '[뇩-눃]', val: '뇬' },
{ key: '[됵-둏]', val: '됸' },
{ key: '[룍-룧]', val: '룐' },
{ key: '[묙-묳]', val: '묜' },
{ key: '[뵥-뵿]', val: '뵨' },
{ key: '[쇽-숗]', val: '숀' },
{ key: '[욕-욯]', val: '욘' },
{ key: '[죡-죻]', val: '죤' },
{ key: '[쵹-춓]', val: '쵼' },
{ key: '[쿅-쿟]', val: '쿈' },
{ key: '[툑-툫]', val: '툔' },
{ key: '[푝-푷]', val: '푠' },
{ key: '[횩-훃]', val: '횬' },
{ key: '[꾝-꾷]', val: '꾠' },
{ key: '[뚁-뚛]', val: '뚄' },
{ key: '[뾱-뿋]', val: '뾴' },
{ key: '[쑉-쑣]', val: '쑌' },
{ key: '[쬭-쭇]', val: '쬰' },
// ㅜ
{ key: '[국-궇]', val: '군' },
{ key: '[눅-눟]', val: '눈' },
{ key: '[둑-둫]', val: '둔' },
{ key: '[룩-뤃]', val: '룬' },
{ key: '[묵-뭏]', val: '문' },
{ key: '[북-붛]', val: '분' },
{ key: '[숙-숳]', val: '순' },
{ key: '[욱-웋]', val: '운' },
{ key: '[죽-줗]', val: '준' },
{ key: '[축-춯]', val: '춘' },
{ key: '[쿡-쿻]', val: '쿤' },
{ key: '[툭-퉇]', val: '툰' },
{ key: '[푹-풓]', val: '푼' },
{ key: '[훅-훟]', val: '훈' },
{ key: '[꾹-꿓]', val: '꾼' },
{ key: '[뚝-뚷]', val: '뚠' },
{ key: '[뿍-뿧]', val: '뿐' },
{ key: '[쑥-쑿]', val: '쑨' },
{ key: '[쭉-쭣]', val: '쭌' },
// ㅡ
{ key: '[극-긓]', val: '근' },
{ key: '[늑-늫]', val: '는' },
{ key: '[득-듷]', val: '든' },
{ key: '[륵-릏]', val: '른' },
{ key: '[믁-믛]', val: '믄' },
{ key: '[븍-븧]', val: '븐' },
{ key: '[슥-슿]', val: '슨' },
{ key: '[윽-읗]', val: '은' },
{ key: '[즉-즣]', val: '즌' },
{ key: '[측-츻]', val: '츤' },
{ key: '[큭-킇]', val: '큰' },
{ key: '[특-틓]', val: '튼' },
{ key: '[픅-픟]', val: '픈' },
{ key: '[흑-흫]', val: '흔' },
{ key: '[끅-끟]', val: '끈' },
{ key: '[뜩-띃]', val: '뜬' },
{ key: '[쁙-쁳]', val: '쁜' },
{ key: '[쓱-씋]', val: '쓴' },
{ key: '[쯕-쯯]', val: '쯘' },
// ㅣ
{ key: '[긱-깋]', val: '긴' },
{ key: '[닉-닣]', val: '닌' },
{ key: '[딕-딯]', val: '딘' },
{ key: '[릭-맇]', val: '린' },
{ key: '[믹-밓]', val: '민' },
{ key: '[빅-빟]', val: '빈' },
{ key: '[식-싷]', val: '신' },
{ key: '[익-잏]', val: '인' },
{ key: '[직-짛]', val: '진' },
{ key: '[칙-칳]', val: '친' },
{ key: '[킥-킿]', val: '킨' },
{ key: '[틱-팋]', val: '틴' },
{ key: '[픽-핗]', val: '핀' },
{ key: '[힉-힣]', val: '힌' },
{ key: '[끽-낗]', val: '낀' },
{ key: '[띡-띻]', val: '띤' },
{ key: '[삑-삫]', val: '삔' },
{ key: '[씩-앃]', val: '씬' },
{ key: '[찍-찧]', val: '찐' },
// ㅐ
{ key: '[객-갷]', val: '갠' },
{ key: '[낵-냏]', val: '낸' },
{ key: '[댁-댛]', val: '댄' },
{ key: '[랙-랳]', val: '랜' },
{ key: '[맥-맿]', val: '맨' },
{ key: '[백-뱋]', val: '밴' },
{ key: '[색-샣]', val: '샌' },
{ key: '[액-앻]', val: '앤' },
{ key: '[잭-쟇]', val: '잰' },
{ key: '[책-챟]', val: '챈' },
{ key: '[캑-캫]', val: '캔' },
{ key: '[택-탷]', val: '탠' },
{ key: '[팩-퍃]', val: '팬' },
{ key: '[핵-햏]', val: '핸' },
{ key: '[깩-꺃]', val: '깬' },
{ key: '[땍-땧]', val: '땐' },
{ key: '[빽-뺗]', val: '뺀' },
{ key: '[쌕-쌯]', val: '쌘' },
{ key: '[짹-쨓]', val: '짼' },
// ㅚ
{ key: '[괵-굏]', val: '괸' },
{ key: '[뇍-뇧]', val: '뇐' },
{ key: '[됙-됳]', val: '된' },
{ key: '[뢱-룋]', val: '뢴' },
{ key: '[뫽-묗]', val: '묀' },
{ key: '[뵉-뵣]', val: '뵌' },
{ key: '[쇡-쇻]', val: '쇤' },
{ key: '[왹-욓]', val: '왼' },
{ key: '[죅-죟]', val: '죈' },
{ key: '[쵝-쵷]', val: '쵠' },
{ key: '[쾩-쿃]', val: '쾬' },
{ key: '[퇵-툏]', val: '퇸' },
{ key: '[푁-푛]', val: '푄' },
{ key: '[획-횧]', val: '횐' },
{ key: '[꾁-꾛]', val: '꾄' },
{ key: '[뙥-뙿]', val: '뙨' },
{ key: '[뾕-뾯]', val: '뾘' },
{ key: '[쐭-쑇]', val: '쐰' },
{ key: '[쬑-쬫]', val: '쬔' },
// ㅟ
{ key: '[귁-귛]', val: '귄' },
{ key: '[뉙-뉳]', val: '뉜' },
{ key: '[뒥-뒿]', val: '뒨' },
{ key: '[뤽-륗]', val: '륀' },
{ key: '[뮉-뮣]', val: '뮌' },
{ key: '[뷕-뷯]', val: '뷘' },
{ key: '[쉭-슇]', val: '쉰' },
{ key: '[윅-윟]', val: '윈' },
{ key: '[쥑-쥫]', val: '쥔' },
{ key: '[췩-츃]', val: '췬' },
{ key: '[퀵-큏]', val: '퀸' },
{ key: '[튁-튛]', val: '튄' },
{ key: '[퓍-퓧]', val: '퓐' },
{ key: '[휙-휳]', val: '휜' },
{ key: '[뀍-뀧]', val: '뀐' },
{ key: '[뛱-뜋]', val: '뛴' },
{ key: '[쀡-쀻]', val: '쀤' },
{ key: '[쒹-쓓]', val: '쒼' },
{ key: '[쮝-쮷]', val: '쮠' },
];
function replaceStr(txt) {
var result = "";
txt = txt
.replace(/졌습니다(\.|<|\()/g, '졌다$1')
.replace(/([있없갔었였했았렸렀짧꼈겠켰됐났쳤겼같높낮녔많깝왔썼잤랐렵냈뒀혔롭럽좋싫췄섰웠맵])습니다(\.|<|\()/g, '$1다$2')
.replace(/ (우세|유능|무능|무능력|촉촉|익숙|순|편안|편리|간편|중요|확실|불확실|필요|불편|편|동일|암울|우울|귀중|소중|모호|애매|애매모호|유명|저명|다양|잔인|강인|상이|편협|협소|광대|광활|불과|간결|가능|불가|불가능|흔|가득|독특|특별|적합|부적합|적절|부적절|유사|유연|뻣뻣|행복|비슷|분명|곤란|불안)합니다(\.|<|\()/g, ' $1하다$2')
//.replace(/이기도 합니다(\.|<|\()/g,'이기도 하다$1') // TO-DO: Fix 학생이기도 합니다(학생이기도 하다) and 쓰이기도 합니다(쓰이기도 한다)
.replace(/ 아닙니다(\.|<|\()/g,' 아니다$1')
.replace(/ 보입니다(\.|<|\()/g,' 보인다$1')
.replace(/ 줄입니다(\.|<|\()/g,' 줄인다$1')
.replace(/ 높입니다(\.|<|\()/g,' 높인다$1')
//.replace(/ 절입니다(\.|<|\()/g,' 절인다$1') // TO-DO: Fix noun(절) and verb(절)
.replace(/들입니다(\.|<|\()/g,'들인다$1') // e.g, 들인다, 곁들인다
.replace(/입니다(\.|<|\()/g,'이다$1')
.replace(/쁩니다(\.|<|\()/g,'쁘다$1') // e.g, 기쁩니다, 예쁩니다
.replace(/쉽니다(\.|<|\()/g,'쉰다$1') // e.g, 내쉽니다
.replace(/쉽습니다(\.|<|\()/g,'쉽다$1') // e.g, 쉽습니다, 아쉽습니다
.replace(/ 부릅니다(\.|<|\()/g,' 부른다$1')
.replace(/ 바릅니다(\.|<|\()/g,' 바른다$1')
.replace(/릅니다(\.|<|\()/g,'르다$1') // e.g, 푸르릅니다, 다릅니다
.replace(/ 깁니다(\.|<|\()/g, ' 길다$1'); // but note: 굶깁니다 → 굶긴다
for ( var i=0; i < txt.split(/\n/).length; i++ ) {
var line = txt.split(/\n/)[i];
if ( ! /니다(\.|<|\()/.test(line) ) {
result += line + "\n";
continue;
}
// e.g, 엮습니다 → 엮는다
if (/습니다(\.|<|\()/.test(line)) {
line = line.replace(/습니다(\.|<|\()/g, '는다$1');
}
if (/[가-힣]니다(\.|<|\()/.test(line)) {
for ( var i2=0; i2 < matchHangul.length; i2++ ) {
var key = matchHangul[i2].key;
var val = matchHangul[i2].val;
line = line.replace(new RegExp(key + "니다(\\.|<|\\()", "g"), val + "다$1");
}
}
result += line + "\n";
}
return result.trim() + "\n";
}
function removeRoughTmpl(txt) {
var result = "";
for ( var i=0; i < txt.split(/\n/).length; i++ ) {
var line = txt.split(/\n/)[i];
if (/^\s*\{\{기계(\s|_)*번역/.test(line)) {
continue;
}
result += line + "\n";
}
return result.trim() + "\n";
}
function registerEvent() {
$('#convert_to_banmal').click(function(){
var newTxt = "";
const txtOrig = $(textBoxId).val();
if ( !/[^아]니다(\.|<|\()/.test(txtOrig) ) {
OO.ui.alert( "'니다'로 끝나는 치환할 존댓말이 없습니다." ).done( function () {} );
return;
}
newTxt = replaceStr(txtOrig);
$(textBoxId).val(newTxt);
if (/[^아]니다(\.|<|\()/.test(newTxt)) {
if (txtOrig.trim() === newTxt.trim()) {
OO.ui.alert( "존댓말 수정을 실패했습니다. '니다'로 끝나는 문장이 아직 존재합니다. 확인해 주세요." ).done( function () {} );
} else {
OO.ui.alert( "존댓말을 부분 수정했습니다. '니다'로 끝나는 문장이 아직 존재합니다. 확인해 주세요." ).done( function () {} );
}
} else {
if (isMobile) {
OO.ui.alert( '존댓말을 수정했습니다.' );
} else {
OO.ui.confirm( '존댓말을 수정했습니다.\n차이를 보시겠습니까?')
.done( function ( confirmed ) {
if ( ! confirmed ) {
return;
}
if ($('#remove_rough_tmpl').length > 0 && $('#remove_rough_tmpl').is(':checked')) {
newTxt = removeRoughTmpl(newTxt);
$(textBoxId).val(newTxt);
}
$("#wpDiff").click();
});
setTimeout(function() {
if (/\{\{기계(\s|_)*번역/.test(newTxt)) {
$('.oo-ui-messageDialog-text .oo-ui-labelElement').append(' <span style="font-size: small; float: right;"><input type="checkbox" id="remove_rough_tmpl" checked> 기계 번역 틀 제거 후 차이 보기</span>');
}
}, 250);
}
}
});
}
function init() {
if (!(
$('#wikiEditor-section-advanced').length > 0 ||
$('#wikitext-editor').length > 0 ||
$('#ca-edit').length > 0
)) {
return;
}
if ( mw.config.get('skin') === 'minerva' ) {
isMobile = true;
}
if ( isMobile ) {
textBoxId = '#wikitext-editor';
$('#ca-edit').click(function() {
function onElementInserted(containerSelector, elementSelector, callback) {
var onMutationsObserved = function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.addedNodes.length) {
var elements = $(mutation.addedNodes).find(elementSelector);
for (var i = 0, len = elements.length; i < len; i++) {
callback(elements[i]);
}
}
});
};
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var observer = new MutationObserver(onMutationsObserved);
observer.observe( $(containerSelector)[0], { childList: true, subtree: true } );
}
onElementInserted('body', '.switcher-container', function(element) {
$('.switcher-container').append('<span class="label" id="convert_to_banmal" style="position: absolute; background-color: black; color: white; text-align: center; padding-left: 0.5em; padding-right: 0.5em; font-size: small; cursor: pointer;">존댓말→반말</span>');
registerEvent();
});
});
} else {
textBoxId = '#wpTextbox1';
$("#wikiEditor-section-advanced").append('<div class="group group-format" rel="banmal" id="convert_to_banmal"><span class="label">존댓말→반말</span></div>');
registerEvent();
$('#convert_to_banmal .label').css({
"cursor": "pointer"
});
}
}
init();
});