최근 바뀜
도구
업로드
도움말
문서 작성
위키 문법
길라잡이
특수 문서
문의·신고
디스코드
IP 사용자
216.73.216.42
로그인
미디어위키:Gadget-dictionary.js 문서 원본 보기
←
미디어위키:Gadget-dictionary.js
편집
토론
역사
새로고침
주시
역링크
정보
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게 제한됩니다:
사용자
.
이 문서는 이 위키의 소프트웨어 인터페이스에 쓰이는 문서로, 부정 행위를 막기 위해 보호되어 있습니다. 모든 위키에 대한 번역을 추가하거나 바꾸려면 미디어위키 지역화 프로젝트인
translatewiki.net
에 참여하시기 바랍니다.
모든 방문자에게 영향을 미칠 수 있기 때문에 이 자바스크립트 문서의 편집 권한이 없습니다.
문서의 원본을 보거나 복사할 수 있습니다.
mw.loader.using( ['oojs-ui-core', 'oojs-ui.styles.icons-interactions', 'mediawiki.api'], function () { var jsonNode = document.getElementById('dictionary-json'); if (!jsonNode) return; var dictRaw = JSON.parse(jsonNode.textContent); var dict = {}; Object.keys(dictRaw).forEach(function (k) { const normKey = k.normalize('NFC').toLowerCase(); dict[normKey] = { raw: k, def: dictRaw[k], rawNorm: k.normalize('NFC').toLowerCase(), defNorm: dictRaw[k].normalize('NFC').toLowerCase() }; }); if (!document.getElementById('dict-card-style')) { mw.util.addCSS(` .dictionary-container .oo-ui-inputWidget-input, .dictionary-container .oo-ui-buttonElement-button { background: var(--bg) !important; color: var(--text) !important; border: 1px solid var(--border) !important; height: 36px !important; font-family: 'Source', 'Noto Sans KR', 'Noto Sans', 'Noto Sans CJK KR'; } .oo-ui-inputWidget-input { border-radius: 0.5rem 0 0 0.5rem !important; padding-left: 11px !important; } .oo-ui-buttonElement-button { border-radius: 0 0.5rem 0.5rem 0 !important; padding-top: 6px; padding-bottom: 6px; width: 75px; } .dict-card { padding: 20px 20px 8px !important; border:1px solid light-dark(#ccc, #555); border-radius:0.8rem; margin: 1em 0 0.5em !important; background:var(--altbg); padding-top: font-family: 'Source', 'Noto Sans KR', 'Noto Sans', 'Noto Sans CJK KR'; } .dict-card .term p, .dict-card .def p { margin-top: 0 !important; margin-bottom: 0 !important; } .dict-card .term { font-weight: 600; font-size: 1.5em; margin-right: .4em; padding: 8px; padding-bottom: 6px; padding-top: 9px; } .dict-card .def { padding-left: 8px; padding-right: 8px; margin-bottom: 10px; } .dict-none { padding: 8px; color: light-dark(#d33, HSL(0, 71%, 75%)); } `).id = 'dict-card-style'; } var api = new mw.Api(); function debounce(fn, delay) { let timer; return function () { clearTimeout(timer); timer = setTimeout(fn, delay); }; } function parseWikitext(wikitext) { return api.get({ action: 'parse', format: 'json', contentmodel: 'wikitext', prop: 'text', text: wikitext, disablelimitreport: 1, disableeditsection: 1, pst: 0, wrapshtml: 1 }).then(function (data) { return (data.parse && data.parse.text) ? data.parse.text['*'] : mw.html.escape(wikitext); }); } function matchLevel(entry, q) { if (entry.rawNorm === q) return 1; if (entry.rawNorm.startsWith(q)) return 2; if (entry.rawNorm.includes(q)) return 3; if (entry.defNorm.includes(q)) return 4; return 0; } async function renderResults($result, results) { if (!results.length) { $result.html('<div class="dict-none">해당 단어가 없습니다.</div>'); return; } const chunks = await Promise.all( results.map(async r => { const termHtml = await parseWikitext(r.entry.raw); const defHtml = await parseWikitext(r.entry.def); return `<div class="term">${termHtml}</div><div class="def">${defHtml}</div>`; }) ); $result.html(chunks.join('')); } mw.hook('wikipage.content').add(function ($content) { $content.find('.dictionary-container').each(function () { var $box = $(this); if ($box.children().length) return; var input = new OO.ui.TextInputWidget({ placeholder: '검색어 입력…', icons: ['search'] }); var button = new OO.ui.ButtonWidget({ label: '검색', flags: ['progressive'] }); var field = new OO.ui.ActionFieldLayout(input, button, {align:'top'}) .$element.css('margin-bottom','10px'); var $result = $('<div class="dict-result"></div>'); $box.append(field, $result); function run() { const qRaw = input.getValue(); const q = qRaw.trim().normalize('NFC').toLowerCase(); if (!q) { $result.empty(); return; } const hits = []; Object.values(dict).forEach(entry => { const level = matchLevel(entry, q); if (level) { hits.push({ entry, level }); } }); hits.sort((a, b) => { if (a.level !== b.level) return a.level - b.level; return a.entry.rawNorm.localeCompare(b.entry.rawNorm); }); renderResults($result, hits.slice(0, 11)); } button.on('click', run); input.on('enter', run); const runDebounced = debounce(run, 200); input.on('change', runDebounced); }); }); } );
미디어위키:Gadget-dictionary.js
문서로 돌아갑니다.