モジュール:文字列
現時点で二つの関数が存在します。
関数名 | 引数1 | 出力 | 使用例 |
---|---|---|---|
bytenum | あらゆる文字列 | バイト数(半角文字のみを入力した場合、文字数に等しい) | *{{#invoke:文字列|bytenum|WikiWiki is the best.}} : 21
|
emcharnum | 全角文字列 | 文字数 | *{{#invoke:文字列|emcharnum|隠るとも思ほえなくに所置く時しなければ薬あたふる}} : 24
|
each_utf8 | |||
reverse | あらゆる文字列 | 文字列をあべこべにした文字列 | *{{#invoke:文字列|reverse|今日もいい天気ですね。}} : 。ねすで気天いいも日今
|
timestamp | 14桁の数字 | 単位(年月日時分秒)付き日時表示 | *{{#invoke:文字列|timestamp|{{CURRENTTIMESTAMP}}}} : 2024年11月24日00時13分36秒
|
deletedefaultsort | 「{{defaultsort:--}}」を含む文字列 | 「{{defaultsort:--}}」を除いた文字列 | *{{#invoke:文字列|deletedefaultsort|迷羊、迷羊。{{defaultsort:さんしろう}}}} : 迷羊、迷羊。
|
index |
local p = {}
function p.bytenum(frame)
return string.len(frame.args[1])
end
function p.emcharnum(frame)
return string.len(frame.args[1]) / 3
end
function each_utf8(text)
local i=1
return function()
if i>#text then
-- 終了
return
end
local b=string.byte(text, i)
if b==0 then
-- eof
return
elseif b<128 then
-- ascii
local m=string.sub(text, i, i)
i=i+1
return m
elseif b<192 then
assert(false, 'invalid byte')
return
elseif b<224 then
-- 2bytes
local m=string.sub(text, i, i+1)
i=i+2
return m
elseif b<240 then
-- 3bytes(japanese multibyte)
local m=string.sub(text, i, i+2)
i=i+3
return m
elseif b<248 then
-- 4bytes
local m=string.sub(text, i, i+3)
i=i+4
return m
elseif b<252 then
-- 5bytes
local m=string.sub(text, i, i+4)
i=i+5
return m
elseif b<254 then
-- 6bytes
local m=string.sub(text, i, i+5)
i=i+6
return m
else
assert(false, 'unknown')
return
end
end
end
function p.reverse(frame)
es = ""
for v in each_utf8(frame.args[1]) do
es = v..es
end
return es
end
function p.timestamp(frame)
str = string.char(string.byte(frame.args[1],1,4)).."年"..string.char(string.byte(frame.args[1],5,6)).."月"..string.char(string.byte(frame.args[1],7,8)).."日"..string.char(string.byte(frame.args[1],9,10)).."時"..string.char(string.byte(frame.args[1],11,12)).."分"..string.char(string.byte(frame.args[1],13,14)).."秒"
return str
end
function p.deletedefaultsort(cont)
a,b = string.find(cont.args[1],"{{defaultsort:")
str = ""
if a then
c,d = string.find(cont.args[1],"}}",b+1)
str = string.char(cont.args[1],string.byte(cont.args[1],1,a-1))..string.char(cont.args[1],string.byte(cont.args[1],d+1,string.len(cont.args[1])))
else
str = cont.args[1]
end
return str
end
function p.index(frame)
s = ""
if frame.args[3] then
for i=0, frame.args[3] - frame.args[2] do
s = s..each_utf8(frame.args[1])[frame.args[2]+i]
end
elseif frame.args[2] then
for i=1, frame.args[2] do
s = s..each_utf8(frame.args[1])[i]
end
elseif frame.args[1] then
s = each_utf8(frame.args[1])[1]
else
assert(false,"引数を一つ以上入力してください。")
end
return s
end
function p.split(sep,trgt)
if trgt == nil then return {} end
local t = {}
i = 1
for str in string.gmatch(trgt, "[^"..sep.."]+") do
t[i] = str
i = i + 1
end
return t
end
return p