「モジュール:文字列」の版間の差分

提供:WikiWiki
ナビゲーションに移動 検索に移動
編集の要約なし
編集の要約なし
 
(2人の利用者による、間の28版が非表示)
9行目: 9行目:
end
end


function each_utf8(frame)
function each_utf8(text)
local i = 1
  local i=1
str = frame.args[1]
  return function()
if i > #str then
    if i>#text then
return
      -- 終了
      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
end
local b = string.byte(frame.args[1],i)
return es
if b == 0 then
end
return
 
elseif b < 128 then
function p.timestamp(frame)
local m = string.sub(frame.args[1],i,i)
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)).."秒"
i = i + 1
return str
return m
end
elseif b < 192 then
 
assert(false,"invalid byte")
function p.deletedefaultsort(cont)
return
a,b = string.find(cont.args[1],"{{defaultsort:")
elseif b < 224 then
str = ""
local m = string.sub(frame.args[1],i,i+1)
    if a then
i = i + 2
    c,d = string.find(cont.args[1],"}}",b+1)
return m
    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])))
elseif b < 240 then
    else
local m = string.sub(frame.args[1],i,i+2)
    str = cont.args[1]
i = i + 3
    end
return m
    return str
elseif b < 248 then
end
local m = string.sub(frame.args[1],i,i+3)
 
i = i + 4
function p.index(frame)
return m
s = ""
elseif b < 252 then
if frame.args[3] then
local m = string.sub(frame.args[1],i,i+4)
for i=0, frame.args[3] - frame.args[2] do
i = i + 5
s = s..each_utf8(frame.args[1])[frame.args[2]+i]
return m
end
elseif b < 254 then
elseif frame.args[2] then
local m = string.sub(frame.args[1],i,i+5)
for i=1, frame.args[2] do
i = i + 6
s = s..each_utf8(frame.args[1])[i]
return m
end
elseif frame.args[1] then
s = each_utf8(frame.args[1])[1]
else
else
assert(false,"unknown")
assert(false,"引数を一つ以上入力してください。")
return
end
end
return s
end
end


function p.reverse(frame)
function p.split(sep,trgt)
es = ""
  if trgt == nil then return {} end
for v in each_utf8(frame) do
  local t = {}
        es = str..es
  i = 1
     end
  for str in string.gmatch(trgt, "[^"..sep.."]+") do
    return es
    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|今日もいい天気ですね。}}: 。ねすで気天いいも日今
  • {{#invoke:文字列|reverse|命題「AならばB」の対偶は、「BでないならばAでない」}}: 」いなでAばらないなでB「、は偶対の」BばらなA「題命
timestamp 14桁の数字 単位(年月日時分秒)付き日時表示 *{{#invoke:文字列|timestamp|{{CURRENTTIMESTAMP}}}}: 2024年09月19日22時31分16秒
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