모듈:Dictionary: 두 판 사이의 차이
편집 요약 없음 |
편집 요약 없음 태그: 되돌려진 기여 |
||
| 1번째 줄: | 1번째 줄: | ||
-------------------------------------------------- | -------------------------------------------------- | ||
-- | -- Module:Dictionary – v3 (조합형 한글 인식 지원) | ||
-------------------------------------------------- | -------------------------------------------------- | ||
local p | |||
local p = {} | |||
local encode = mw.text.encode | local encode = mw.text.encode | ||
-- 기본 데이터 테이블 | -- 기본 데이터 테이블 | ||
local defaultData = mw.loadData('Module:Dictionary/data') | local defaultData = mw.loadData('Module:Dictionary/data') | ||
-- Unicode 정규화 (조합형 → 완성형) | |||
local function normalizeKey(str) | |||
if type(str) ~= "string" then | |||
return str | |||
end | |||
return mw.ustring.toNFC(str) | |||
end | |||
-- 테이블 전체를 정규화 (키 기준) | |||
local function normalizeTableKeys(tbl) | |||
local new = {} | |||
for key, value in pairs(tbl) do | |||
local nkey = normalizeKey(key) | |||
-- 충돌 방지: 같은 의미의 키가 여러 개일 때 마지막 것을 유지 | |||
new[nkey] = value | |||
end | |||
return new | |||
end | |||
-- 주어진 이름의 하위 데이터 페이지를 안전하게 불러옵니다. | -- 주어진 이름의 하위 데이터 페이지를 안전하게 불러옵니다. | ||
local function loadDataset(name) | local function loadDataset(name) | ||
if not name or name == '' then | if not name or name == '' then | ||
return defaultData | return normalizeTableKeys(defaultData) | ||
end | end | ||
local ok, dataset = pcall(mw.loadData, 'Module:Dictionary/data/' .. name) | local ok, dataset = pcall(mw.loadData, 'Module:Dictionary/data/' .. name) | ||
if ok and type(dataset) == 'table' then | if ok and type(dataset) == 'table' then | ||
return dataset | return normalizeTableKeys(dataset) | ||
end | end | ||
return defaultData | return normalizeTableKeys(defaultData) | ||
end | end | ||
--- Renders the dictionary search container. | --- Renders the dictionary search container. | ||
function p.render(frame) | function p.render(frame) | ||
-- dataset 명은 ① 첫 번째 무명 인수, ② named 인수 dataset 에서 찾습니다. | -- dataset 명은 ① 첫 번째 무명 인수, ② named 인수 dataset 에서 찾습니다. | ||
| 31번째 줄: | 49번째 줄: | ||
local data = loadDataset(datasetName) | local data = loadDataset(datasetName) | ||
-- | -- 검색 UI 컨테이너 + 숨겨진 JSON | ||
local out = { | local out = { | ||
'<div class="dictionary-container dict-card"></div>', | '<div class="dictionary-container dict-card"></div>', | ||
'<div id="dictionary-json" style="display:none">', | '<div id="dictionary-json" style="display:none">', | ||
encode(mw.text.jsonEncode(data)), | encode(mw.text.jsonEncode(data)), -- XSS-safe | ||
'</div>' | '</div>' | ||
} | } | ||
return table.concat(out, '\n') | return table.concat(out, '\n') | ||
end | end | ||
return p | return p | ||
2025년 12월 6일 (토) 20:59 판
이 모듈에 대한 설명문서는 모듈:Dictionary/설명문서에서 만들 수 있습니다
--------------------------------------------------
-- Module:Dictionary – v3 (조합형 한글 인식 지원)
--------------------------------------------------
local p = {}
local encode = mw.text.encode
-- 기본 데이터 테이블
local defaultData = mw.loadData('Module:Dictionary/data')
-- Unicode 정규화 (조합형 → 완성형)
local function normalizeKey(str)
if type(str) ~= "string" then
return str
end
return mw.ustring.toNFC(str)
end
-- 테이블 전체를 정규화 (키 기준)
local function normalizeTableKeys(tbl)
local new = {}
for key, value in pairs(tbl) do
local nkey = normalizeKey(key)
-- 충돌 방지: 같은 의미의 키가 여러 개일 때 마지막 것을 유지
new[nkey] = value
end
return new
end
-- 주어진 이름의 하위 데이터 페이지를 안전하게 불러옵니다.
local function loadDataset(name)
if not name or name == '' then
return normalizeTableKeys(defaultData)
end
local ok, dataset = pcall(mw.loadData, 'Module:Dictionary/data/' .. name)
if ok and type(dataset) == 'table' then
return normalizeTableKeys(dataset)
end
return normalizeTableKeys(defaultData)
end
--- Renders the dictionary search container.
function p.render(frame)
-- dataset 명은 ① 첫 번째 무명 인수, ② named 인수 dataset 에서 찾습니다.
local datasetName = frame.args[1] or frame.args.dataset
local data = loadDataset(datasetName)
-- 검색 UI 컨테이너 + 숨겨진 JSON
local out = {
'<div class="dictionary-container dict-card"></div>',
'<div id="dictionary-json" style="display:none">',
encode(mw.text.jsonEncode(data)), -- XSS-safe
'</div>'
}
return table.concat(out, '\n')
end
return p