「モジュール:文字列」の版間の差分
ナビゲーションに移動
検索に移動
編集の要約なし |
編集の要約なし |
||
(2人の利用者による、間の34版が非表示) | |||
7行目: | 7行目: | ||
function p.emcharnum(frame) | function p.emcharnum(frame) | ||
return string.len(frame.args[1]) / 3 | 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 | end | ||
function p.reverse(frame) | 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 | end | ||
return | 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 | end | ||
return p | return p |
4年5月16日 (ヰ) 18:30時点における最新版
現時点で二つの関数が存在します。
関数名 | 引数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月22日02時19分44秒
|
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