User:優枰/造字
外觀
本頁面包括本人所寫、未完善的造字模組。參討論區§關於自造文字。
模組[編輯]
以下內容用於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.css和MediaWiki: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。是一種穩定的元素(因為有無限個質子,所以需要無限長的時間才能衰變)。