【書きかけスクリプト】文字種別フォント
タイトルの通り。文字種別にフォントを選びたいという時のために作ったもの。一応anmファイルを想定していますがあくまで自分用
配布元どこだか忘れましたが、「ランダムフォント」で使われているスクリプトを流用しています。
code:lua
@文字種別フォント
--check0:縦書き,0
--dialog:コピー用,co="<?mes(EF_tex('ここにテキスト'))?>";基本font,bfont="MS UI Gothic";半角数字font,hnfont="Bradley Hand ITC";半角記号font,hfont="Bradley Hand ITC";半角カナfont,hkfont="MingLiU";全角記号font,afont="HGゴシックE";全角ひらfont,ahfont="HG明朝B";全角カナfont,akfont="メイリオ";全角漢字font,acfont="KaiTi";各fontsize,local fs={nil,nil,nil,nil,nil,nil,nil}
--attention;このスクリプトは「ランダムフォント」から必要な部分だけ抜粋&追加したものです。
if hfont == nil then
hfont = bfont
end
if hkfont == nil then
hkfont = bfont
end
if hnfont == nil then
hnfont = bfont
end
if afont == nil then
afont = bfont
end
if ahfont == nil then
ahfont = bfont
end
if akfont == nil then
akfont = bfont
end
if acont == nil then
acfont = bfont
end
if obj.check0 then
bfont="@"..bfont
hnfont="@"..hnfont
hfont="@"..hfont
hkfont="@"..hkfont
afont="@"..afont
ahfont="@"..ahfont
akfont="@"..akfont
acfont="@"..acfont
end
function EF_tex(text)
local fb={}
local TE={}
local ri=0
local se=0
local SF={}
if 0<#text then
while(0) do
ri=ri+1
if((0<=string.byte(text,1) and string.byte(text,1)<=127) or (161<=string.byte(text,1) and string.byte(text,1)<=223)) then --半角記号文字and半角カナの処理?
--if nil then
fbri=1
TEri=string.sub(text,1,1) --半角文字列を収納
if((0<=string.byte(text,1) and string.byte(text,1)<=32) or string.byte(text,1)==127) then --制御文字
--if nil then
se=se+1
SFse=ri --制御文字はtextの文字数に含まれないからTEriとは別で保存?
end
else
fbri=2
TEri=string.sub(text,1,2) --全角文字列を収納
end
text=string.sub(text,1+fbri,#text) --fbriで格納した分だけ全体からtextを削る。textが残り0文字になったらbreak。
if(#text==0) then
break --この時点で繰り返された分だけriの値が保持される
end
end
end
local c=""
-- local font=""
-----------------------------------------------------
for k=1,ri do
local s,clr,clr2
if(fbk==1) then --半角系統の文字処理
if(48<=string.byte(TEk,1) and string.byte(TEk,1)<=57) then --半角数字文字
font=hnfont --半角数字文字
s=fs3
elseif(0<=string.byte(TEk,1) and string.byte(TEk,1)<=127) then --半角記号文字
font=hfont --半角記号文字
s=fs1
elseif(161<=string.byte(TEk,1) and string.byte(TEk,1)<=223) then --半角カナ
font=hkfont --半角カナ
s=fs2
end
else --全角系統(2バイト文字)の処理
if(0x88<=string.byte(TEk,1) or (string.byte(TEk,1)==0x81 and (string.byte(TEk,2)==0x57 or string.byte(TEk,2)==0x58 or string.byte(TEk,2)==0x59))) then --全角漢字
font=acfont --全角漢字
s=fs7
else
if(string.byte(TEk,1)==0x83 and (0x40<=string.byte(TEk,2) and string.byte(TEk,2)<=0x96)) then --全角カナ
font=akfont --全角カナ
s=fs6
elseif((string.byte(TEk,1)==0x82 and (0x9f<=string.byte(TEk,2) and string.byte(TEk,2)<=0xf1)) or (string.byte(TEk,1)==0x81 and ((0x40<=string.byte(TEk,2) and string.byte(TEk,2)<=0x56) or string.byte(TEk,2)==0x5b or string.byte(TEk,2)==0x60))) then --全角ひら
font=ahfont --全角ひら
s=fs5
else --全角記号全般の処理
font=afont --全角記号
s=fs4
end
end
end
local b="<s,"..font..">"
local bb="<s>"
if(s~=nil) then --文字の大きさ指定されてる時の処理
b="<s"..s..","..font..">"
end
c=c..b..TEk..bb --ここで文字を繋げる
s=nil --文字サイズを破棄
end
return c
end
文字カーニングとかサイズ変更もしたいよね
code:lua
---@param text string @ 表示文字列
---@param x number @ 表示位置x
---@param y number @ 表示位置y
---@param ch number @ 0=横書き/1=縦書き
---@param type number @ 文字装飾(0~4)
---@param col any @ 文字色
---@param size number @ 基準フォントサイズ
---@param fs table @ 各サイズ比{1,1,1,1,1,1,1,1}
---@param line number @ 行
---@param bfont string @ 基本フォント{"フォント名",字間,行間,字間(異なるフォント同士)}
---@param hnfont string @ 半角数字フォント{上に同じ。以下全部同様。}
---@param hfont string @ 半角記号フォント
---@param hkfont string @ 半角カナフォント
---@param afont string @ 全角記号フォント
---@param ahfont string @ 全角ひらフォント
---@param akfont string @ 全角カナフォント
---@param acfont string @ 全角漢字フォント
function EFob(text,x,y,ch,type,col,size,fs,line,bfont,hnfont,hfont,hkfont,afont,ahfont,akfont,acfont)
local function add(a,k)
local b = 0
for i = 1,k do
if ai ~= nil then b = b + ai end
end
return b
end
if bfont1 == "" or nil then bfont1="MS UI Gothic" end
if hnfont1 == "" or nil then hnfont1 = bfont1 end
if hfont1 == "" or nil then hfont1 = bfont1 end
if hkfont1 == "" or nil then hkfont1 = bfont1 end
if afont1 == "" or nil then afont1 = bfont1 end
if ahfont1 == "" or nil then ahfont1 = bfont1 end
if akfont1 == "" or nil then akfont1 = bfont1 end
if acfont1 == "" or nil then acfont1 = bfont1 end
for i = 2,5 do
if bfonti == nil then bfonti = 0 end
if hnfonti == nil then hnfonti = bfonti end
if hfonti == nil then hfonti = bfonti end
if hkfonti == nil then hkfonti = bfonti end
if afonti == nil then afonti = bfonti end
if ahfonti == nil then ahfonti = bfonti end
if akfonti == nil then akfonti = bfonti end
if acfonti == nil then acfonti = bfonti end
end
if fs1 == nil then fs1 = 1 end
for i = 2,8 do
if fsi == nil then fsi = fs1 end
end
if ch==1 then
bfont1="@"..bfont1
hnfont1="@"..hnfont1
hfont1="@"..hfont1
hkfont1="@"..hkfont1
afont1="@"..afont1
ahfont1="@"..ahfont1
akfont1="@"..akfont1
acfont1="@"..acfont1
end
local fb={} --半角全角識別情報(1=半角/2=全角)
local TE={} --文字列を格納
local ri=0 --文字列の文字数
local se=0 --制御文字の文字数
local SF={} --制御文字格納
if 0<#text then
while(0) do
ri=ri+1
if((0<=string.byte(text,1) and string.byte(text,1)<=127) or (161<=string.byte(text,1) and string.byte(text,1)<=223)) then --半角記号文字and半角カナの処理?
--if nil then
fbri=1
TEri=string.sub(text,1,1) --半角文字列を収納
if((0<=string.byte(text,1) and string.byte(text,1)<=32) or string.byte(text,1)==127) then --制御文字
--if nil then
se=se+1
SFse=ri --制御文字はtextの文字数に含まれないからTEriとは別で保存?
end
else
fbri=2
TEri=string.sub(text,1,2) --全角文字列を収納
end
text=string.sub(text,1+fbri,#text) --fbriで格納した分だけ全体からtextを削る。textが残り0文字になったらbreak。
if(#text==0) then
break --この時点で繰り返された分だけriの値が保持される
end
end
end
local c=""
local font = ""
local f_x,f_y,c_x,yMax = 0,0,{},0
-----------------------------------------------------
for k=1,ri do
local s
if(fbk==1) then --半角系統の文字処理
if(string.byte(TEk,1)==46 or (48<=string.byte(TEk,1) and string.byte(TEk,1)<=58)) then --半角数字文字
font=hnfont1 --半角数字文字
s=fs2
f_x,f_y = hnfont2,hnfont3
c_xk = hnfont4
elseif(0<=string.byte(TEk,1) and string.byte(TEk,1)<=127) then --半角記号文字
font=hfont1 --半角記号文字
s=fs3
f_x,f_y = hfont2,hfont3
c_xk = hfont4
elseif(161<=string.byte(TEk,1) and string.byte(TEk,1)<=223) then --半角カナ
font=hkfont1 --半角カナ
s=fs4
f_x,f_y = hkfont2,hkfont3
c_xk = hkfont4
end
else --全角系統(2バイト文字)の処理
if(0x88<=string.byte(TEk,1) or (string.byte(TEk,1)==0x81 and (string.byte(TEk,2)==0x57 or string.byte(TEk,2)==0x58 or string.byte(TEk,2)==0x59))) then --全角漢字
font=acfont1 --全角漢字
s=fs8
f_x,f_y = acfont2,acfont3
c_xk = acfont4
else
if(string.byte(TEk,1)==0x83 and (0x40<=string.byte(TEk,2) and string.byte(TEk,2)<=0x96)) then --全角カナ
font=akfont1 --全角カナ
s=fs7
f_x,f_y = akfont2,akfont3
c_xk = akfont4
elseif((string.byte(TEk,1)==0x82 and (0x9f<=string.byte(TEk,2) and string.byte(TEk,2)<=0xf1)) or (string.byte(TEk,1)==0x81 and ((0x40<=string.byte(TEk,2) and string.byte(TEk,2)<=0x56) or string.byte(TEk,2)==0x5b or string.byte(TEk,2)==0x60))) then --全角ひら
font=ahfont1 --全角ひら
s=fs6
f_x,f_y = ahfont2,ahfont3
c_xk = ahfont4
else --全角記号全般の処理
font=afont1 --全角記号
s=fs5
f_x,f_y = afont2,afont3
c_xk = afont4
end
end
end
yMax = math.max(unpack(fs))
obj.setfont(font,size*s,type,col)
obj.load("text",TEk)
obj.draw(x+add(c_x,k)+add(fb,k)*0.5*size*s+f_x , y+line*size*yMax+f_y)
s,font=nil,"" --文字サイズを破棄
f_x,f_y = 0,0
end
end
相変わらずスクリプトとしてごちゃごちゃしてるし使い勝手が悪いね
しかも前半はanmファイル想定なのに後半のはobjファイルから引っ張り出してきているというちぐはぐさ...
気が向いたらちゃんと作り直そうかな(←絶対作り直さない)
#Aviutl
#備忘録
#スクリプト
#書きかけスクリプト