local letters = {} -- 分割した文字を入れるテーブル -- 2バイト文字専用分割 for i=1, text:len()-1, 2 do letters[#letters+1] = text:gsub(i, i+1) end
半角文字も混じるようなら、文字コード調べるところからになるなあ。
function letter_length(letter) -- 文字を与えたら、その文字の長さを0か1で返す関数。半角なら0、全角なら1を返す。 local num = letter:byte() -- 先頭の文字の文字コードを取得。 if num < 127 then return 0 end if num < 161 then return 1 end if num < 224 then return 0 end return 1 end -- この関数はShift-JIS専用
local letters = {} local cursor = 1 while cursor < text:len()+1 do letters[#letters+1] = text:gsub(cursor, cursor+letter_length(text:gsub(cursor, cursor)) cursor = cursor + letters[#letters]:len() end
-- 3.の分離禁則を実現するルーチン -- チェック1:頭から舐めていって、分離禁則文字が見つかったら、チェック2を開始する。 -- チェック2:次の文字からチェックしていく。分離禁則文字が連続する限り、それをチェック1の文字の末尾につけていく。 local cursor = 1 -- さっきも作ったから、localは要らないかも。 local letter1 local letter2
function is_no_purge(letter) -- 文字を与えると、それが分離禁則文字かどうかを返す関数 if letter:len()>1 then return false end -- 半角文字でなければ分離禁則文字ではない。 if letter == " " then return false end -- 半角スペースは分離禁則文字ではない。 return true end
while cursor < #letters do letter1 = letters[cursor] -- チェック1 if is_no_purge(letter1) then -- 分離禁則文字であればチェック2開始 while true do letter2 = letters[cursor+1] if type(letter2)=="nil" then break end -- 終了条件 if is_no_purge(letter2) then letter1 = letter1 .. letter2 -- 結合 table.remove(letters, cursor+1) -- 結合した文字を削除 else break -- 終了 end end end lettes[cursor] = letter1 -- 再登録。 cursor = cursor + 1 end
local width_max = 40 -- テキストウィンドウの幅(単位:文字数)ただし、半角で。 function next_line(letters) -- 次の一行を返す。引数にはlettersを与える。 if #letters<1 then return nil end -- 表示する内容がない場合はnilを返す。 local text = "" if letters[1]==" " then table.remove(letters, 1) -- 先頭が半角スペースなら表示しない。 else if width_max < text:len()+letters[1]:len() then -- 現在の内容と次に来る文字の長さの合計が、最大幅を超える場合、終了。 return text else text = text .. table.remove(letters, 1) end end end
local all_text = "" -- 現在のテキストウィンドウの内容 while true do local line = next_line() -- 次の一行を取得。 if line then if all_text:len()>0 then -- 既に何か表示していれば NSExec("_br") -- 改行 all_text = all_text.."\\" end NSExec("_puttext \""..line.."/\"") all_text = all_text..line else -- 表示内容がないなら、終了 break end end