跳至內容

User:優枰/造字

出自锑星百科
於 2023年5月27日 (六) 06:46 由 imported>優枰 所做的修訂 (造字模組)
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)

本頁面包括本人所寫、未完善的造字模組。參討論區§關於自造文字

模組[編輯]

以下內容用於Module:造字

local ziCreate = {}

local ts = { _data = mw.loadData('Module:造字/参数') }

-- 尋找訊息
function ts:msg(opts, ...)
    if not self or not opts then
        error('ts:msg缺少參數')
    end

    -- 初始化
    local key, subkey, args, preprocess
    if type(opts) == 'table' then
        key = opts.key or table.remove(opts, 1) or error('ts:msg缺少參數')
        subkey = opts.sub or opts.subkey or table.remove(opts, 1) or 1
        preprocess = opts.pre or opts.preprocess
        args = opts.args or opts or { ... }
    else
        key = opts
        subkey = 1
        args = { ... }
    end

    -- 尋找對應訊息
    local msg = self._data[key]
    if type(msg) == 'table' then
        msg = msg[subkey]
    end
    if msg then
        for i, a in ipairs(args) do
            msg = (string.gsub(msg, '%$' .. tostring(i), tostring(a)))
        end
        return preprocess and mw.getCurrentFrame():preprocess(msg) or msg
    end
end

-- 在所有別名中尋找參數
function ts:parameter(key, args)
    if not self or not key or not args then
        error('ts:parameter缺少參數')
    end

    local arg = args[key]
    if arg then
        return arg
    end
    local aliases = self._data[key]
    arg = aliases and args[aliases]
    if arg then -- 找到訊息
        return arg
    end
    if type(aliases) == 'table' then -- 訊息在表中
        for _, alias in ipairs(aliases) do
            arg = alias and args[alias]
            if arg then
                return arg
            end
        end
    end
    return nil
end

function ts:styleParameter(key, suffix, args)
    if not self or not key or not suffix or not args then
        error('ts:styleParameter缺少參數')
    end

    for _, v in ipairs(ts:msg { 'suffixes', suffix }) do
        local arg = args[string.format('%s%s', key, v)]
        if arg then
            return arg
        end
    end
    return nil
end

function ziCreate.main(frame)
    local args = require('Dev:Arguments').getArgs(frame, { wrappers = { 'Template:造字' } })
    return ziCreate._main(args)
end

function ziCreate._main(args)
    local wrapper = mw.html.create('span'):addClass('zi')
    local idcWrapper = wrapper:tag('span'):addClass('zi--idc')
    local main = ts:parameter('主', args)
    return ziCreate[ts:msg(main) or main](args, wrapper, idcWrapper)
end

-- 左右結構
function ziCreate.left(args, wrapper, idcWrapper)
    wrapper:addClass('zi--lr')
    local parts = 0

    _, parts = ziCreate.vertical('左上', '左', '左下', wrapper, args, parts)
    _, parts = ziCreate.vertical('上', '中', '下', wrapper, args, parts)
    _, parts = ziCreate.vertical('右上', '右', '右下', wrapper, args, parts)

    local idc = parts == 2 and '⿰' or parts == 3 and '⿲' or ''
    idcWrapper:wikitext(idc)
    wrapper:addClass(string.format('zi-%d', parts))
    return wrapper
end

-- 上下結構
function ziCreate.top(args, wrapper, idcWrapper)
    wrapper:addClass('zi--tb')
    local parts = 0

    _, parts = ziCreate.vertical('左上', '上', '右上', wrapper, args, parts)
    _, parts = ziCreate.vertical('左', '中', '右', wrapper, args, parts)
    _, parts = ziCreate.vertical('左下', '下', '右下', wrapper, args, parts)

    local idc = parts == 2 and '⿱' or parts == 3 and '⿳' or ''
    idcWrapper:wikitext(idc)
    wrapper:addClass(string.format('zi-%d', parts))
    return wrapper
end

-- 气
function ziCreate.topright(args, wrapper, idcWrapper)
    wrapper:addClass('zi--tr')
    idcWrapper:wikitext('⿹')

    local outside = ts:parameter('外', args)
    local attr = {
        class = 'zi-part zi-outside',
        style = ts:styleParameter('外', 'style', args)
    }
    wrapper:wikitext(mw.text.tag('span', attr, outside))

    idcWrapper = wrapper:tag('span'):addClass('zi--idc')
    local sub = ts:parameter('次', args) or '左'
    return ziCreate[ts:msg(sub) or sub](args, wrapper, idcWrapper)
end

ziCreate['top-right'] = ziCreate.topright

-- 豎直部件
function ziCreate.vertical(topName, middleName, bottomName, wrapper, args, parts)
    local top = ts:parameter(topName, args)
    local middle = ts:parameter(middleName, args)
    local bottom = ts:parameter(bottomName, args)
    local partParts = #{ top } + #{ middle } + #{ bottom }
    if partParts == 0 then
        return nil, parts
    end

    parts = parts + 1
    local partClass = ts:msg(middleName)
    local partWrapper = wrapper:tag('span'):addClass(string.format('zi-vh zi--%s zi-%d', partClass, partParts)):cssText(
        ts:styleParameter(middleName, 'sidestyle', args))
    local idc = partParts == 2 and '⿱' or partParts == 3 and '⿳' or ''
    partWrapper:tag('span'):addClass('zi--idc'):wikitext(idc)
    if top then
        local attr = {
            class = string.format('zi-part zi-%s--top', partClass),
            style = ts:styleParameter(topName, 'style', args)
        }
        partWrapper:wikitext(mw.text.tag('span', attr, top))
    end
    if middle then
        local attr = {
            class = string.format('zi-part zi-%s--middle', partClass),
            style = ts:styleParameter(middleName, 'style', args)
        }
        partWrapper:wikitext(mw.text.tag('span', attr, middle))
    end
    if bottom then
        local attr = {
            class = string.format('zi-part zi-%s--bottom', partClass),
            style = ts:styleParameter(bottomName, 'style', args)
        }
        partWrapper:wikitext(mw.text.tag('span', attr, bottom))
    end
    return partWrapper, parts
end

-- 水平部件
function ziCreate.horizontal(leftName, middleName, rightName, wrapper, args, parts)
    local left = ts:parameter(leftName, args)
    local middle = ts:parameter(middleName, args)
    local right = ts:parameter(rightName, args)
    local partParts = #{ left } + #{ middle } + #{ right }
    if partParts == 0 then
        return nil, parts
    end

    parts = parts + 1
    local partClass = ts:msg(middleName)
    local partWrapper = wrapper:tag('span'):addClass(string.format('zi-vh zi--%s zi-%d', partClass, partParts)):cssText(
        ts:styleParameter(middleName, 'sidestyle', args))
    local idc = partParts == 2 and '⿰' or partParts == 3 and '⿲' or ''
    partWrapper:tag('span'):addClass('zi--idc'):wikitext(idc)
    if left then
        local attr = {
            class = string.format('zi-part zi-%s--left', partClass),
            style = ts:styleParameter(leftName, 'style', args)
        }
        partWrapper:wikitext(mw.text.tag('span', attr, left))
    end
    if middle then
        local attr = {
            class = string.format('zi-part zi-%s--middle', partClass),
            style = ts:styleParameter(middleName, 'style', args)
        }
        partWrapper:wikitext(mw.text.tag('span', attr, middle))
    end
    if right then
        local attr = {
            class = string.format('zi-part zi-%s--right', partClass),
            style = ts:styleParameter(rightName, 'style', args)
        }
        partWrapper:wikitext(mw.text.tag('span', attr, right))
    end
    return partWrapper, parts
end

return ziCreate

參數[編輯]

以下內容用於Module:造字/參數

return {
    ['主'] = 'main',
    ['次'] = 'sub',
    ['左上'] = { 'top-left', '上左' },
    ['上左'] = 'top-left',
    ['左'] = 'left',
    ['左下'] = { 'bottom-left', '下左' },
    ['下左'] = 'bottom-left',
    ['上'] = 'top',
    ['中'] = 'middle',
    ['下'] = 'bottom',
    ['右上'] = { 'top-right', '上右' },
    ['上右'] = 'top-right',
    ['右'] = 'right',
    ['右下'] = { 'bottomright', '上右' },
    ['下右'] = 'bottomright',
    ['外'] = { 'outside', 'outer' },
    suffixes = {
        style = { '样式', '樣式' },
        sidestyle = { '侧样式', '側樣式', '部样式', '部樣式' }
    }
}

樣式[編輯]

以下內容用於全站樣式,即MediaWiki:Common.cssMediaWiki:Fandommobile.css

.zi {
    display: inline-flex;
    justify-content: space-around;
    align-items: center;
    width: 1em;
    height: 1em;
    line-height: 1;
    overflow: visible;
}

.zi,
.zi-vh,
.zi-part {
    position: relative;
}

.zi--tb {
    flex-direction: column;
}

.zi>.zi-vh {
    display: flex;
    justify-content: space-around;
    align-items: center;
    width: 1em;
    height: 1em;
}

.zi--lr>.zi-vh {
    flex-direction: column;
    flex-grow: 1;
    height: 100%;
}

.zi--tb>.zi-vh {
    flex-grow: 1;
    width: 100%;
}

.zi-2.zi--lr>.zi-vh {
    transform: scale(.5, 1);
    width: 50%;
}

.zi-3.zi--lr>.zi-vh {
    transform: scale(.33, 1);
    width: 33.33%;
}

.zi-2.zi--tb>.zi-vh {
    transform: scale(1, .5);
    height: 50%;
}

.zi-3.zi--tb>.zi-vh {
    transform: scale(1, .33);
    height: 33.33%;
}

.zi>.zi-vh>.zi-part {
    display: flex;
    justify-content: space-around;
    align-items: center;
    flex-grow: 1;
}

.zi--lr>.zi-vh>.zi-part {
    width: 100%;
}

.zi--tb>.zi-vh>.zi-part {
    height: 100%;
}

.zi--lr>.zi-2>.zi-part {
    transform: scale(1, .5);
    height: 50%;
}

.zi--lr>.zi-3>.zi-part {
    transform: scale(1, .33);
    height: 33.33%;
}

.zi--tb>.zi-2>.zi-part {
    transform: scale(.5, 1);
    width: 50%;
}

.zi--tb>.zi-3>.zi-part {
    transform: scale(.33, 1);
    width: 33.33%;
}

.zi--idc {
    opacity: 0;
}

.zi--lr>.zi--idc,
.zi--tb>.zi-vh>.zi--idc {
	width: 0;
}

.zi--tb>.zi--idc,
.zi--lr>.zi-vh>.zi--idc {
	height: 0;
}

效果[編輯]

你可以將上述樣式複製到瀏覽器檢查面板的樣式源代碼中來看看以下段落的效果:

是一種超理元素,原子序數為ℵ0(但是如果用「是第ℵ0號元素」這種表述就不可以了,因為ℵ0是基數而不是序數,所以用對應的序數ω)[1],是第ω號元素,因此稱,符號Inf。是一種穩定的元素(因為有無限個質子,所以需要無限長的時間才能衰變)。