본문으로 이동

모듈:Wikidata reference format

위키낱말사전, 말과 글의 누리

이 모듈에 대한 설명문서는 모듈:Wikidata reference format/설명문서에서 만들 수 있습니다

local p = {}

-- 기본 설정
base_lang_code_labels = 'ko'
target_wikisource = 'kowikisource'
label_of_Q31464082 = '출처' -- Q31464082의 한국어 라벨

-- 메시지 형식
archive_live = '$2에 $1에서 보존된 문서' -- 원본이 살아있을 때
archive_dead = '$2에 원본$1에서 보존된 문서' -- 원본이 깨졌을 때

-- 저자/편집자/번역자 표시 형식
indicator_format_strings = {
    ['P50'] = '$1',  -- P50(저자)
    ['P98'] = '$1 (편집.)', -- P98(편집자)
    ['P655'] = '$1 (번역)', -- P655(번역자)
}

-- 쪽/줄/문단 번호 표시 형식
specifier_format_strings = {
    ['P7421'] = "$1행",     -- P7421(행)
    ['P958'] = "$1 문단",    -- P958(문단)
    ['P792'] = "$1장",      -- P792(장)
    ['P304'] = "$1쪽",      -- P304(쪽)
}

-- 수록 정보 표시 형식
published_in_format_string = "《$1》에 수록"

function p.format ( reference )
    local stated_ins = reference.snaks['P248'] -- 이 출처에 명시됨
    local urls = reference.snaks['P854'] -- 출처 URL
    if urls == nil then
        urls = reference.snaks['P4656'] -- 위키미디어 가져오기 URL
    end
    local commons_scanned_files = reference.snaks['P996'] -- 위키미디어 공용에 스캔된 파일
    local internet_archive_ids = reference.snaks['P724'] -- 인터넷 아카이브 ID

    local inside_text_parts = {}

    local example_from_id = nil
    local example_from_text = ''
    if stated_ins ~= nil then
        example_from_id = stated_ins[1].datavalue.value.id
        example_from_text = mw.wikibase.getLabel( example_from_id )
    elseif commons_scanned_files ~= nil then
        table.insert(inside_text_parts, '[[:File:' .. commons_scanned_files[1].datavalue.value .. '|' .. commons_scanned_files[1].datavalue.value .. ']]')
    elseif urls ~= nil or internet_archive_ids ~= nil then
        local link_title = label_of_Q31464082
        local titles = reference.snaks['P1476'] -- 제목
        if titles ~= nil then
            link_title = '"' .. titles[1].datavalue.value.text .. '"'
        end

        local main_url = ''
        if urls ~= nil then
            main_url = urls[1].datavalue.value
        else
            main_url = 'https://archive.org/details/' .. internet_archive_ids[1].datavalue.value
        end
        local original_link = '[' .. main_url .. ' ' .. link_title .. ']'
        table.insert(inside_text_parts, original_link)

        local broader_titles = reference.snaks['P6333'] -- 상위 저작물 제목
        if broader_titles ~= nil then
            table.insert(inside_text_parts, "''" .. broader_titles[1].datavalue.value.text .. "''")
        end
        
        local publication_dates = reference.snaks['P577'] -- 출판일
        if publication_dates ~= nil then
            table.insert(inside_text_parts, mw.wikibase.formatValue(publication_dates[1]))
        end

        local archive_urls = reference.snaks['P1065'] -- 보존 URL
        if archive_urls ~= nil then
            local archive_url = archive_urls[1].datavalue.value
            local archival_date_text = nil
            local archival_dates = reference.snaks['P2960'] -- 보존 날짜
            if archival_dates ~= nil then
                archival_date_text = mw.wikibase.formatValue(archival_dates[1])
            end

            -- 'url-status' 속성으로 보존 메시지 결정 (기본값은 원본이 깨진 것으로 간주)
            local archive_message_format = archive_dead
            local url_status = reference.snaks['P1095'] -- URL 상태
            if url_status and url_status[1] and url_status[1].datavalue.value.id == 'Q56455490' then -- Q56455490은 'live' 상태
                 archive_message_format = archive_live
            end
            
            -- 최종 보존 메시지 생성 (예: "2024년 1월 1일에 원본에서 보존된 문서")
            local archive_link = '[' .. archive_url .. ' 원본]'
            local final_archive_message = mw.ustring.gsub(archive_message_format, '$1', archive_link)
            final_archive_message = mw.ustring.gsub(final_archive_message, '$2', archival_date_text or '')
            table.insert(inside_text_parts, final_archive_message)
        end
        
        local retrieval_dates = reference.snaks['P813'] -- 확인 날짜
        if retrieval_dates ~= nil then
            table.insert(inside_text_parts, mw.wikibase.formatValue(retrieval_dates[1]) .. ' 확인')
        end
    end

    if example_from_id ~= nil then
        for property, format_string in pairs(indicator_format_strings) do
            for i, statement in pairs(mw.wikibase.getEntity(example_from_id):getBestStatements(property)) do
                local author_id = statement.mainsnak.datavalue.value.id
                local author_text = mw.wikibase.getLabel( author_id ) or author_id
                local author_wikisource_link = mw.wikibase.getSitelink( author_id, target_wikisource )
                
                local from_author_line
                if author_wikisource_link ~= nil then
                    from_author_line = "—[[:s:" .. author_wikisource_link .. '|' .. author_text .. "]]"
                else
                    from_author_line = "—" .. author_text
                end
                from_author_line = mw.ustring.gsub(format_string, '$1', from_author_line)
                table.insert(inside_text_parts, from_author_line)
            end
        end
        
        local example_from_link = mw.wikibase.getSitelink( example_from_id, target_wikisource )
        if example_from_link ~= nil then
            table.insert(inside_text_parts, '[[File:Wikisource-logo.svg|16px|link=s:]] [[:s:' .. example_from_link .. '|' .. example_from_text .. ']]')
        elseif example_from_text ~= '' then
            table.insert(inside_text_parts, "''《" .. example_from_text .. "》''") -- 책 제목은 겹낫표와 이탤릭체로
        end
    end

    local published_in_statements = reference.snaks['P1433']
    if published_in_statements == nil and example_from_id ~= nil then
        published_in_statements = mw.wikibase.getEntity(example_from_id):getBestStatements('P1433')
    end
    
    if published_in_statements and published_in_statements[1] then
        local publishedin_id = published_in_statements[1].mainsnak.datavalue.value.id
        local publishedin_text = mw.wikibase.getLabelByLang( publishedin_id, base_lang_code_labels )
        if publishedin_text == nil then
            for i, fallback_lang in ipairs(mw.language.getFallbacksFor( base_lang_code_labels )) do
                publishedin_text = mw.wikibase.getLabelByLang( publishedin_id, fallback_lang )
                if publishedin_text ~= nil then break end
            end
        end
        
        local publishedin_link = mw.wikibase.getSitelink( publishedin_id, target_wikisource ) or ''
        local publishedin_out
        if publishedin_link == '' then
            publishedin_out = " (" .. mw.ustring.gsub(published_in_format_string, "$1", "''《" .. (publishedin_text or publishedin_id) .. "》''") .. ")"
        else
            publishedin_out = " (" .. mw.ustring.gsub(published_in_format_string, "$1", "[[:s:" .. publishedin_link .. '|' .. publishedin_text .. ']]') .. ')'
        end
        table.insert(inside_text_parts, publishedin_out)
    end

    for property, format_string in pairs(specifier_format_strings) do
        if reference.snaks[property] and reference.snaks[property][1] then
            local specifier_value = reference.snaks[property][1].datavalue.value
            local formatted_specifier = mw.ustring.gsub(format_string, '$1', specifier_value)
            table.insert(inside_text_parts, formatted_specifier)
        end
    end

    return table.concat(inside_text_parts, '. ') -- 각 항목을 점과 공백으로 구분
end

return p