跳转到内容
打开/关闭菜单
  • 451 条目
  • 798 文件
  • 22 用户
  • 8955 编辑
Blockland Wiki
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

模块:CharacterJsonLD:修订间差异

来自Blockland Wiki
无编辑摘要
无编辑摘要
 
(未显示同一用户的3个中间版本)
第1行: 第1行:


local p = {}
local p = {}
-- ==========================================
-- Blockland Wiki - Character JSON-LD
-- Universal character structured data module
-- ==========================================


local function clean(value)
local function clean(value)
     if not value then
     if type(value) ~= 'string' then
         return nil
         return nil
     end
     end
第16行: 第21行:
end
end


-- Build a direct MediaWiki file URL
local function fileUrl(filename)
local function fileUrl(filename)
     filename = clean(filename)
     filename = clean(filename)
第23行: 第29行:
     end
     end


     filename = filename:gsub(
     filename = filename:gsub('^文件:', '')
        '^[Ff]ile:', ''
     filename = filename:gsub('^[Ff]ile:', '')
     ):gsub('^文件:', '')
 
     filename = mw.text.trim(filename)
     filename = mw.text.trim(filename)


第33行: 第37行:
end
end


local function addImage(images, filename, label)
-- Get DynamicJsonLD Lua library
     local url = fileUrl(filename)
local function getJsonLD()
    if mw.ext and mw.ext.JsonLD then
        return mw.ext.JsonLD
    end
 
     local ok, lib = pcall(
        require,
        'mw.ext.JsonLD'
    )


     if url then
     if ok and type(lib) == 'table' then
        table.insert(images, {
         return lib
            ["@type"] = "ImageObject",
            ["url"] = url,
            ["name"] = label
         })
     end
     end
    return nil
end
end


function p.main(frame)
function p.main(frame)
    local JsonLD = mw.ext.JsonLD


     if not JsonLD then
     -- Parameters from template or #invoke
        return ''
     local args = frame.args
     end


     local parent = frame:getParent()
     local parent = frame:getParent()
     local args = parent and parent.args or frame.args
 
     if not clean(args['名称']) and parent then
        args = parent.args
    end


     local title = mw.title.getCurrentTitle()
     local title = mw.title.getCurrentTitle()


     -- Do not publish entity data on template pages
     -- Only main namespace articles
     if title.namespace ~= 0 then
     if title.namespace ~= 0 then
         return ''
         return ''
第63行: 第74行:


     local name = clean(args['名称']) or title.text
     local name = clean(args['名称']) or title.text
    local pageUrl = tostring(title:fullUrl())


     local pageUrl = title:fullUrl(''):gsub('%?$', '')
     -- ==========================================
    -- Main character entity
    -- ==========================================


     local entity = {
     local entity = {
第73行: 第87行:
     }
     }


    -- Description
     local description = clean(args['简介'])
     local description = clean(args['简介'])


第78行: 第93行:
         entity.description = description
         entity.description = description
     end
     end
    -- ==========================================
    -- Alternate names
    -- Avoid Lua arrays for DynamicJsonLD
    -- ==========================================


     local aliases = {}
     local aliases = {}
    local seen = {}


     for _, key in ipairs({
     for _, key in ipairs({
第89行: 第110行:
         local value = clean(args[key])
         local value = clean(args[key])


         if value and value ~= name then
         if value and value ~= name and not seen[value] then
             table.insert(aliases, value)
             table.insert(aliases, value)
            seen[value] = true
         end
         end
     end
     end


     if #aliases > 0 then
     if #aliases > 0 then
         entity.alternateName = aliases
         entity.alternateName = table.concat(
            aliases,
            '、'
        )
     end
     end


     local images = {}
     -- ==========================================
    -- Primary avatar
    -- ==========================================


     addImage(
     local avatar = fileUrl(args['头像'])
        images,
 
        args['头像'],
    if avatar then
        name .. '的头像'
        entity.image = {
     )
            ["@type"] = "ImageObject",
            ["name"] = name .. '的头像',
            ["url"] = avatar,
            ["contentUrl"] = avatar
        }
    end
 
    -- ==========================================
    -- Full-body illustration
    -- ==========================================
 
     local artwork = fileUrl(args['立绘'])


     addImage(
     if artwork then
         images,
         local illustration = {
        args['立绘'],
            ["@type"] = "ImageObject",
        name .. '的角色立绘'
            ["name"] = name .. '的角色立绘',
    )
            ["url"] = artwork,
            ["contentUrl"] = artwork,
            ["about"] = {
                ["@id"] = pageUrl .. '#character'
            }
        }


    if #images > 0 then
        -- Keep main image as avatar
         entity.image = images
        -- Associate illustration with character
        if avatar then
            entity.subjectOf = illustration
         else
            entity.image = illustration
        end
     end
     end
    -- ==========================================
    -- Optional music group
    -- ==========================================


     local group = clean(args['所属组合'])
     local group = clean(args['所属组合'])


     if group then
     if group then
         entity.memberOf = {
         local musicGroup = {
             ["@type"] = "MusicGroup",
             ["@type"] = "MusicGroup",
             ["name"] = group
             ["name"] = group
第127行: 第179行:


         if groupUrl then
         if groupUrl then
             entity.memberOf.url = groupUrl
             musicGroup.url = groupUrl
         end
         end
        entity.memberOf = musicGroup
    end
    -- ==========================================
    -- DynamicJsonLD integration
    -- ==========================================
    local JsonLD = getJsonLD()
    if not JsonLD then
        return '<strong class="error">' ..
            'CharacterJsonLD: DynamicJsonLD Lua API unavailable' ..
            '</strong>'
     end
     end


     JsonLD.setMainEntity(entity)
     if type(JsonLD.setMainEntity) ~= 'function' then
        return '<strong class="error">' ..
            'CharacterJsonLD: setMainEntity unavailable' ..
            '</strong>'
    end
 
    local ok, err = pcall(function()
        JsonLD.setMainEntity(entity)
    end)
 
    if not ok then
        return '<strong class="error">' ..
            'CharacterJsonLD: ' ..
            mw.text.encode(tostring(err)) ..
            '</strong>'
    end
 
    -- Optional debugging
    if clean(args['调试']) == '1' then
        return 'JSONLD_SUCCESS: ' .. name
    end


     return 'JSONLD_DEBUG_SUCCESS: ' .. name
     return ''
end
end


return p
return p

2026年10月19日 (一) 17:02的最新版本

此模块的文档可以在模块:CharacterJsonLD/doc创建


local p = {}

-- ==========================================
-- Blockland Wiki - Character JSON-LD
-- Universal character structured data module
-- ==========================================

local function clean(value)
    if type(value) ~= 'string' then
        return nil
    end

    value = mw.text.trim(value)

    if value == '' then
        return nil
    end

    return value
end

-- Build a direct MediaWiki file URL
local function fileUrl(filename)
    filename = clean(filename)

    if not filename then
        return nil
    end

    filename = filename:gsub('^文件:', '')
    filename = filename:gsub('^[Ff]ile:', '')
    filename = mw.text.trim(filename)

    return 'https://blockland.wiki/wiki/Special:FilePath/'
        .. mw.uri.encode(filename, 'PATH')
end

-- Get DynamicJsonLD Lua library
local function getJsonLD()
    if mw.ext and mw.ext.JsonLD then
        return mw.ext.JsonLD
    end

    local ok, lib = pcall(
        require,
        'mw.ext.JsonLD'
    )

    if ok and type(lib) == 'table' then
        return lib
    end

    return nil
end

function p.main(frame)

    -- Parameters from template or #invoke
    local args = frame.args

    local parent = frame:getParent()

    if not clean(args['名称']) and parent then
        args = parent.args
    end

    local title = mw.title.getCurrentTitle()

    -- Only main namespace articles
    if title.namespace ~= 0 then
        return ''
    end

    local name = clean(args['名称']) or title.text
    local pageUrl = tostring(title:fullUrl())

    -- ==========================================
    -- Main character entity
    -- ==========================================

    local entity = {
        ["@type"] = "Person",
        ["@id"] = pageUrl .. '#character',
        ["name"] = name,
        ["url"] = pageUrl
    }

    -- Description
    local description = clean(args['简介'])

    if description then
        entity.description = description
    end

    -- ==========================================
    -- Alternate names
    -- Avoid Lua arrays for DynamicJsonLD
    -- ==========================================

    local aliases = {}
    local seen = {}

    for _, key in ipairs({
        '本名',
        '英文名',
        '别名',
        '其他名称'
    }) do
        local value = clean(args[key])

        if value and value ~= name and not seen[value] then
            table.insert(aliases, value)
            seen[value] = true
        end
    end

    if #aliases > 0 then
        entity.alternateName = table.concat(
            aliases,
            '、'
        )
    end

    -- ==========================================
    -- Primary avatar
    -- ==========================================

    local avatar = fileUrl(args['头像'])

    if avatar then
        entity.image = {
            ["@type"] = "ImageObject",
            ["name"] = name .. '的头像',
            ["url"] = avatar,
            ["contentUrl"] = avatar
        }
    end

    -- ==========================================
    -- Full-body illustration
    -- ==========================================

    local artwork = fileUrl(args['立绘'])

    if artwork then
        local illustration = {
            ["@type"] = "ImageObject",
            ["name"] = name .. '的角色立绘',
            ["url"] = artwork,
            ["contentUrl"] = artwork,
            ["about"] = {
                ["@id"] = pageUrl .. '#character'
            }
        }

        -- Keep main image as avatar
        -- Associate illustration with character
        if avatar then
            entity.subjectOf = illustration
        else
            entity.image = illustration
        end
    end

    -- ==========================================
    -- Optional music group
    -- ==========================================

    local group = clean(args['所属组合'])

    if group then
        local musicGroup = {
            ["@type"] = "MusicGroup",
            ["name"] = group
        }

        local groupUrl = clean(args['组合链接'])

        if groupUrl then
            musicGroup.url = groupUrl
        end

        entity.memberOf = musicGroup
    end

    -- ==========================================
    -- DynamicJsonLD integration
    -- ==========================================

    local JsonLD = getJsonLD()

    if not JsonLD then
        return '<strong class="error">' ..
            'CharacterJsonLD: DynamicJsonLD Lua API unavailable' ..
            '</strong>'
    end

    if type(JsonLD.setMainEntity) ~= 'function' then
        return '<strong class="error">' ..
            'CharacterJsonLD: setMainEntity unavailable' ..
            '</strong>'
    end

    local ok, err = pcall(function()
        JsonLD.setMainEntity(entity)
    end)

    if not ok then
        return '<strong class="error">' ..
            'CharacterJsonLD: ' ..
            mw.text.encode(tostring(err)) ..
            '</strong>'
    end

    -- Optional debugging
    if clean(args['调试']) == '1' then
        return 'JSONLD_SUCCESS: ' .. name
    end

    return ''
end

return p