「モジュール:文字列」の版間の差分
ナビゲーションに移動
検索に移動
タグ: 取り消し |
(エラー修正) |
||
9行目: | 9行目: | ||
end | end | ||
function | 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 | ||
2年1月27日 (W) 18:22時点における版
現時点で二つの関数が存在します。
関数名 | 引数1 | 出力 | 使用例 |
---|---|---|---|
bytenum | あらゆる文字列 | バイト数(半角文字のみを入力した場合、文字数に等しい) | *{{#invoke:文字列|bytenum|WikiWiki is the best.}} : 21
|
emcharnum | 全角文字列 | 文字数 | *{{#invoke:文字列|emcharnum|隠るとも思ほえなくに所置く時しなければ薬あたふる}} : 24
|
each_utf8 | |||
reverse | あらゆる文字列 | 文字列をあべこべにした文字列 | *{{#invoke:文字列|reverse|今日もいい天気ですね。}} : 。ねすで気天いいも日今
|
timestamp | 14桁の数字 | 単位(年月日時分秒)付き日時表示 | *{{#invoke:文字列|timestamp|{{CURRENTTIMESTAMP}}}} : スクリプトエラー: 関数「timestamp」は存在しません。
|
deletedefaultsort | 「{{defaultsort:--}}」を含む文字列 | 「{{defaultsort:--}}」を除いた文字列 | *{{#invoke:文字列|deletedefaultsort|迷羊、迷羊。{{defaultsort:さんしろう}}}} : スクリプトエラー: 関数「deletedefaultsort」は存在しません。
|
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
return p