跳转到内容

Module:SunShow

此后如竟没有炬火,我便是唯一的光。

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

local p = {}

local getArgs = require('Module:Arguments').getArgs

local json49 = mw.text.jsonDecode(mw.title.new('Module:49.json'):getContent())
local json7 = mw.text.jsonDecode(mw.title.new('Module:7.json'):getContent())

local rainbow = {}        -- 色值表
local ele = {}            -- 元素名
local cname = {}          -- 颜色名
local en_cname = {}       -- 英文颜色名

-- 读取 7.json 数据
for _, entry in ipairs(json7) do
    local order = tonumber(entry.su6H[1]) -- 获取序数
    local index = (order + 6) % 7 + 1     -- 转换索引
    rainbow[index] = entry.sue:lower()
    ele[index] = entry.fEE
    cname[index] = entry.suemi8H['zh-CN']
    en_cname[index] = entry.suemi8H['en-US']
end
rainbow[8] = "#aa10aa"    -- 补充?

local seq_map = {}        -- 整序映射自然序
local gua = {}            -- 中文卦名
local old_gua = {}        -- 古文卦名
local en_gua = {}    -- 英文卦名
local speech = {}         -- 现代言语
local old_speech = {}     -- 古文言语
local notes = {}          -- 注释

-- 读取 49.json 数据
for _, entry in ipairs(json49) do
    local seq = (entry.az8sA5 + 48) % 49 + 1-- 计算整序
    seq_map[seq] = entry.t1ru2sA5    -- 存储自然序
    
    gua[seq] = entry.mi8H
    old_gua[seq] = entry.gAmi8H
    en_gua[seq] = entry.English
    speech[seq] = entry.HuVL
    old_speech[seq] = entry.gAHuVL
    notes[seq] = entry.Eka
end

--[[
整序转自然序
将指定的整序转换为自然序。
输入:
  num: 整序数字,范围应在 1 到 49 之间
输出:
  返回对应的自然序数字,如果输入无效则返回 0
]]
function p.seq2nat(num)
    if num < 1 or num > 49 then
        return 0
    end
    return seq_map[num]
end

--[[
自然序转整序
将指定的自然序转换为整序。
输入:
  val: 自然序数字,范围应在 1 到 49 之间
输出:
  返回对应的整序数字,如果输入无效则返回 0
]]
function p.nat2seq(val)
    for i, v in ipairs(seq_map) do
        if v == val then
            return i
        end
    end
    return 0
end

--[[
双色太阳易色块生成器(补码模式)
为方便起见,这里事实上是用补码,即数值 6 5 4 3 2 1 0 指代火木光土风水空。
输入:
  inp: 0-48的整数
  tzbiou: 是否启用特殊时期样式(可选,默认0)
输出:带双色背景的HTML块儿
]]
function p.sunColor(inp, tzbiou)
	tzbiou = tzbiou or 0
	
    local l = inp % 7 -- 下卦
    local u = math.floor(inp/7) % 7 -- 上卦
    
    if (l == 4 and u == 1 and tzbiou == 1) then
        return ' ' -- 特殊时期返回空格
    else
        return string.format(
            '<span style="background:-webkit-linear-gradient(90deg, %s 0%%, %s 50%%, %s 50%%, %s 100%%)"> </span>',
            rainbow[7-l], rainbow[7-l], rainbow[7-u], rainbow[7-u]
        )
    end
end

--[[
双色太阳易色块生成器(原码模式)
输入:
  inp: 1-49的整数
  tzbiou: 是否启用特殊时期样式(可选,默认0)
输出:带双色背景的HTML块儿
]]
function p.sunColor2(inp, tzbiou)
	tzbiou = tzbiou or 0
	
    local l = (inp - 1) % 7 + 1
    local u = math.floor((inp - 1) / 7) % 7 + 1
    
    if (l == 3 and u == 6 and tzbiou==1) then
        return ' ' -- 特殊时期返回空格
    else
        return string.format(
            '<span style="background:-webkit-linear-gradient(90deg, %s 0%%, %s 50%%, %s 50%%, %s 100%%)"> </span>',
            rainbow[l], rainbow[l], rainbow[u], rainbow[u]
        )
    end
end

--[[
单色契色块生成器
输入:1-8的整数(对应八契原码)
输出:带纯色背景的HTML块儿
]]
function p.cheiColor(inp)
    return string.format('<span style="background:%s">  </span>', rainbow[inp])
end

--[[
获取卦名(补码模式)
输入:0-48的整数
输出:对应的49日卦名
]]
function p.sun49(inp)
    return gua[49 - (inp % 49)]
end

--[[
通用卦属性查询函数
输入:
  num: 原码整序,范围应在 1 到 49 之间
  property: 字符串 'old_gua', 'gua', 'en_gua', 'speech' 等,用于指定要获取的属性
输出:
  返回对应的卦的属性值,如果输入无效则返回 nil
]]
function p.sunPar(num, property)
    if num < 1 or num > 49 then
        return nil
    end
    
    local valid_properties = {
        old_gua = old_gua,
        gua = gua,
        en_gua = en_gua,
        speech = speech,
        old_speech = old_speech,
        notes = notes
    }
    
    if valid_properties[property] then
        return valid_properties[property][num]
    else
        return nil
    end
end

--[[
元素属性查询函数
输入:
  num: 原码整序,范围应在 1 到 7 之间
  property: 字符串 'rainbow', 'ele', 'cname', '' 等,用于指定要获取的属性
输出:
  返回对应的元素的属性值,如果输入无效则返回 nil
]]
function p.elePar(num, property)
    if num < 1 or num > 7 then
        return nil
    end
    
    local valid_properties = {
        rainbow = rainbow,
        color = rainbow,
        ele = ele,
        cname = cname,
        en_cname = en_cname
    }
    
    if valid_properties[property] then
        return valid_properties[property][num]
    else
        return nil
    end
end

---- 模板定义 ----

--[[
模板调用:整序转自然序
用法:{{#invoke:SunShow|seqToNatT|输入值}}
]]
function p.seqToNatT(frame)
    local args = getArgs(frame)
    local num = tonumber(args[1]) or 0 -- 默认值为0
    return p.seq2nat(num)
end

--[[
模板调用:自然序转整序
用法:{{#invoke:SunShow|natToSeqT|输入值}}
]]
function p.natToSeqT(frame)
    local args = getArgs(frame)
    local val = tonumber(args[1]) or 0 -- 默认值为01
    return p.nat2seq(val)
end

--[[
模板调用:双色太阳易色块生成器(补码模式)
用法:{{#invoke:SunShow|sunColorT|输入值}}
]]
function p.sunColorT(frame)
    local args = getArgs(frame)
    local inp = tonumber(args[1]) or 0 -- 默认值为0
    return p.sunColor(inp)
end

--[[
模板调用:双色太阳易色块生成器(原码模式)
用法:{{#invoke:SunShow|sunColor2T|输入值}}
]]
function p.sunColor2T(frame)
    local args = getArgs(frame)
    local inp = tonumber(args[1]) or 1 -- 默认值为1
    return p.sunColor2(inp)
end

--[[
模板调用:单色契色块生成器
用法:{{#invoke:SunShow|cheiColorT|输入值}}
]]
function p.cheiColorT(frame)
    local args = getArgs(frame)
    local inp = tonumber(args[1]) or 1 -- 默认值为1
    return p.cheiColor(inp)
end

--[[
模板调用:获取卦属性
用法:{{#invoke:SunShow|sunParT|整序|属性名}}
]]
function p.sunParT(frame)
    local args = getArgs(frame)
    local num = tonumber(args[1]) or 1 -- 默认值为1
    local property = args[2] or 'gua'     -- 默认值为'gua'
    return p.sunPar(num, property)      -- 调用 sunPar 函数
end

--[[
模板调用:获取元素属性
用法:{{#invoke:SunShow|eleParT|整序|属性名}}
]]
function p.eleParT(frame)
    local args = getArgs(frame)
    local num = tonumber(args[1]) or 1 -- 默认值为1
    local property = args[2] or 'ele'     -- 默认值为'ele'
    return p.elePar(num, property)      -- 调用 elePar 函数
end

return p