모듈:Dictionary: 두 판 사이의 차이

삼쩌모 (토론)의 21376 판 편집을 되돌림
태그: 편집 취소 되돌려진 기여
편집 요약 없음
태그: 수동 되돌리기 되돌려진 기여
1번째 줄: 1번째 줄:
-- Module:Dictionary – v2 (데이터를 인수로 선택 가능)
--------------------------------------------------
--------------------------------------------------
-- 이 모듈은 {{#invoke:Dictionary|render|dataset=xxx}} 형태로 호출할 때
-- Module:Dictionary – v3 (조합형 한글 인식 지원)
-- |dataset= 인수(또는 첫 번째 무명 인수)에 지정된 하위 데이터 페이지를
-- 읽어 사전을 교체합니다. 지정이 없거나, 하위 페이지가 없으면 기본
-- Module:Dictionary/data 를 그대로 사용합니다.
--------------------------------------------------
--------------------------------------------------
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.
-- @param frame mw.frame
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가 들어갈 빈 컨테이너
     -- 검색 UI 컨테이너 + 숨겨진 JSON
     local out = {
     local out = {
         '<div class="dictionary-container dict-card"></div>',
         '<div class="dictionary-container dict-card"></div>',
        -- ② 숨겨 둔 JSON (XSS 방지 HTML‑escape)
         '<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일 (토) 21:01 판

이 모듈에 대한 설명문서는 모듈: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