mirror of https://github.com/odrling/Aegisub
758 lines
28 KiB
Lua
758 lines
28 KiB
Lua
|
-- Disclaimer: RTFM! - http://unanimated.hostfree.pw/ts/scripts-manuals.htm#cleanup
|
||
|
|
||
|
script_name="Script Cleanup"
|
||
|
script_description="Garbage disposal and elimination of incriminating evidence"
|
||
|
script_author="unanimated"
|
||
|
script_version="5.0"
|
||
|
script_namespace="ua.ScriptCleanup"
|
||
|
|
||
|
local haveDepCtrl,DependencyControl,depRec=pcall(require,"l0.DependencyControl")
|
||
|
if haveDepCtrl then
|
||
|
script_version="5.0.0"
|
||
|
depRec=DependencyControl{feed="https://raw.githubusercontent.com/unanimated/luaegisub/master/DependencyControl.json"}
|
||
|
end
|
||
|
|
||
|
dont_delete_empty_tags=false -- option to not delete {}
|
||
|
|
||
|
re=require'aegisub.re'
|
||
|
|
||
|
function cleanlines(subs,sel)
|
||
|
if res.all then
|
||
|
for k,v in ipairs(GUI) do
|
||
|
if v.x==0 then res[v.name]=true end
|
||
|
end
|
||
|
end
|
||
|
for z,i in ipairs(sel) do
|
||
|
progress("Processing line: "..z.."/"..#sel)
|
||
|
prog=math.floor(z/#sel*100)
|
||
|
aegisub.progress.set(prog)
|
||
|
line=subs[i]
|
||
|
text=line.text
|
||
|
stl=line.style
|
||
|
|
||
|
if res.nots and not res.nocom then text=text:gsub("{TS[^}]*} *","") end
|
||
|
|
||
|
if res.nocom then
|
||
|
text=text:gsub("{[^\\}]-}","")
|
||
|
:gsub("{[^\\}]-\\N[^\\}]-}","")
|
||
|
:gsub("^({[^}]-}) *","%1")
|
||
|
:gsub(" *$","")
|
||
|
end
|
||
|
|
||
|
if res.clear_a then line.actor="" end
|
||
|
if res.clear_e then line.effect="" end
|
||
|
|
||
|
if res.layers and line.layer<5 then
|
||
|
if stl:match("Defa") or stl:match("Alt") or stl:match("Main") then line.layer=line.layer+5 end
|
||
|
end
|
||
|
|
||
|
if res.cleantag and text:match("{[*>]?\\") then
|
||
|
txt2=text
|
||
|
text=text:gsub("{\\\\k0}",""):gsub(">\\","\\"):gsub("{(\\[^}]-)} *\\N *{(\\[^}]-)}","\\N{%1%2}")
|
||
|
repeat text,r=text:gsub("{(\\[^}]-)}{(\\[^}]-)}","{%1%2}") until r==0
|
||
|
text=text:gsub("({\\[^}]-){(\\[^}]-})","%1%2"):gsub("{.-\\r","{\\r"):gsub("^{\\r([\\}])","{%1")
|
||
|
:gsub("\\fad%(0,0%)",""):gsub(ATAG.."$",""):gsub("^({\\[^}]-)\\frx0\\fry0","%1"):gsub("\\%a+%(%)","")
|
||
|
text=text:gsub(ATAG,function(tgs)
|
||
|
tgs2=tgs
|
||
|
:gsub("\\+([\\}])","%1")
|
||
|
:gsub("(\\[^\\})]+)",function(a) if not a:match'clip' and not a:match'\\fn' and not a:match'\\r' then a=a:gsub(' ','') end return a end)
|
||
|
:gsub("(\\%a+)([%d%-]+%.%d+)",function(a,b) if not a:match("\\fn") then b=rnd2dec(b) end return a..b end)
|
||
|
:gsub("(\\%a+)%(([%d%.%-]+),([%d%.%-]+)%)",function(a,b,c) b=rnd2dec(b) c=rnd2dec(c) return a.."("..b..","..c..")" end)
|
||
|
:gsub("(\\%a+)%(([%d%.%-]+),([%d%.%-]+),([%d%.%-]+),([%d%.%-]+)",function(a,b,c,d,e)
|
||
|
return a.."("..rnd2dec(b)..","..rnd2dec(c)..","..rnd2dec(d)..","..rnd2dec(e) end)
|
||
|
tgs2=duplikill(tgs2)
|
||
|
tgs2=extrakill(tgs2)
|
||
|
return tgs2
|
||
|
end)
|
||
|
if txt2~=text then kleen=kleen+1 end
|
||
|
end
|
||
|
|
||
|
if res.overlap then
|
||
|
if line.comment==false and stl:match("Defa") then
|
||
|
start=line.start_time
|
||
|
endt=line.end_time
|
||
|
if i<#subs then nextline=subs[i+1] nextart=nextline.start_time end
|
||
|
prevline=subs[i-1]
|
||
|
prevstart=prevline.start_time
|
||
|
prevend=prevline.end_time
|
||
|
dur=line.end_time-line.start_time
|
||
|
ms2fr=aegisub.frame_from_ms
|
||
|
fr2ms=aegisub.ms_from_frame
|
||
|
keyframes=aegisub.keyframes()
|
||
|
startf=ms2fr(start)
|
||
|
endf=ms2fr(endt)
|
||
|
prevendf=ms2fr(prevend)
|
||
|
nextartf=ms2fr(nextart)
|
||
|
|
||
|
-- start gaps/overlaps
|
||
|
if prevline.class=="dialogue" and prevline.style:match("Defa") and dur>50 then
|
||
|
-- get keyframes
|
||
|
kfst=0 kfprev=0
|
||
|
for k,kf in ipairs(keyframes) do
|
||
|
if kf==startf then kfst=1 end
|
||
|
if kf==prevendf then kfprev=1 end
|
||
|
end
|
||
|
-- start overlap
|
||
|
if start<prevend and prevend-start<=50 then
|
||
|
if kfst==0 or kfprev==1 then nstart=prevend end
|
||
|
end
|
||
|
-- start gap
|
||
|
if start>prevend and start-prevend<=50 then
|
||
|
if kfst==0 and kfprev==1 then nstart=prevend end
|
||
|
end
|
||
|
end
|
||
|
-- end gaps/overlaps
|
||
|
if i<#subs and nextline.style:match("Defa") and dur>50 then
|
||
|
--get keyframes
|
||
|
kfend=0 kfnext=0
|
||
|
for k,kf in ipairs(keyframes) do
|
||
|
if kf==endf then kfend=1 end
|
||
|
if kf==nextartf then kfnext=1 end
|
||
|
end
|
||
|
-- end overlap
|
||
|
if endt>nextart and endt-nextart<=50 then
|
||
|
if kfnext==1 and kfend==0 then nendt=nextart end
|
||
|
end
|
||
|
-- end gap
|
||
|
if endt<nextart and nextart-endt<=50 then
|
||
|
if kfend==0 or kfnext==1 then nendt=nextart end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if nstart then line.start_time=nstart end
|
||
|
if nendt then line.end_time=nendt end
|
||
|
nstart=nil nendt=nil
|
||
|
end
|
||
|
|
||
|
if res.spaces then text=text:gsub(" +"," ") :gsub(" *$","") :gsub("^({\\[^}]-}) *","%1") end
|
||
|
|
||
|
if res.nobreak2 then text=text:gsub("\\[Nn]","")
|
||
|
elseif res.nobreak then
|
||
|
text=text
|
||
|
:gsub(" *{\\i0}\\N{\\i1} *"," ")
|
||
|
:gsub("%*","_ast_")
|
||
|
:gsub("\\[Nn]","*")
|
||
|
:gsub(" *%*+ *"," ")
|
||
|
:gsub("_ast_","*")
|
||
|
end
|
||
|
|
||
|
if res.hspace then text=text:gsub("\\h","") end
|
||
|
if res.notag then text=text:gsub(ATAG,"") end
|
||
|
if res.allcol then text=text:gsub("\\[1234]?c[^\\})]*","") end
|
||
|
if res.alpha14 then text=text:gsub("\\[1234]a[^\\})]*","")
|
||
|
elseif res.allphas then text=text:gsub("\\[1234]a[^\\})]*","") :gsub("\\alpha[^\\})]*","") end
|
||
|
if res.xyshad then text=text:gsub("\\[xy]shad[^\\})]*","")
|
||
|
elseif res.allshad then text=text:gsub("\\[xy]?shad[^\\})]*","") end
|
||
|
if res.xyrot then text=text:gsub("\\fr[xy][^\\})]*","")
|
||
|
elseif res.allrot then text=text:gsub("\\fr[^\\})]*","") end
|
||
|
if res.allpers then text=text:gsub("\\f[ar][xyz][^\\})]*","") :gsub("\\org%b()","") end
|
||
|
if res.scales then text=text:gsub("\\fsc[xy][^\\})]*","")
|
||
|
elseif res.allsize then text=text:gsub("\\fs[%d.]+","") :gsub("\\fs([\\}%)])","%1") :gsub("\\fsc[xy][^\\})]*","") end
|
||
|
if res.parent2 then text=text:gsub("(\\%a%a+)(%b())",function(a,b) if a=='\\pos' then return a..b else return "" end end)
|
||
|
elseif res.parent then text=text:gsub("\\%a%a+%b()","") end
|
||
|
if res.ctrans then text=text:gsub(ATAG,function(tg) return cleantr(tg) end) end
|
||
|
if res.inline2 then repeat text,r=text:gsub("(.)"..ATAG.."(.-{%*?\\)","%1%2") until r==0
|
||
|
elseif res.inline then text=text:gsub("(.)"..ATAG,"%1") end
|
||
|
|
||
|
if res.alphacol then
|
||
|
text=text
|
||
|
:gsub("alpha&(%x%x)&","alpha&H%1&")
|
||
|
:gsub("alpha&?H?(%x%x)&?([\\}])","alpha&H%1&%2")
|
||
|
:gsub("alpha&H0&","alpha&H00&")
|
||
|
:gsub("alpha&H(%x%x)%x*&","alpha&H%1&")
|
||
|
:gsub("(\\[1234]a)&(%x%x)&","%1&H%2&")
|
||
|
:gsub("(\\[1234]a)(%x%x)([\\}])","%1&H%2&%3")
|
||
|
:gsub("(\\[1234]?c&)(%x%x%x%x%x%x)&","%1H%2&")
|
||
|
:gsub("(\\[1234]?c&H%x%x%x%x%x%x)([^&])","%1&%2")
|
||
|
:gsub("(\\i?clip%([^%)]-) ?([\\}])","%1)%2")
|
||
|
:gsub("(\\t%([^%)]-\\i?clip%([^%)]-%))([\\}])","%1)%2")
|
||
|
:gsub("(fad%([%d,]+)([\\}])","%1)%2")
|
||
|
:gsub("([1234]?[ac])H&(%x+)","%1&H%2")
|
||
|
:gsub("([1234]?c&H)00(%x%x%x%x%x%x)","%1%2")
|
||
|
end
|
||
|
|
||
|
text=text:gsub("^ *","") :gsub("\\t%([^\\%)]-%)","") :gsub("{%*}","")
|
||
|
if not dont_delete_empty_tags then text=text:gsub("{}","") end
|
||
|
if line.text~=text then chng=chng+1 end
|
||
|
line.text=text
|
||
|
subs[i]=line
|
||
|
end
|
||
|
if res.info then
|
||
|
infotxt="Lines with modified Text field: "..chng
|
||
|
if res.cleantag then infotxt=infotxt.."\nChanges from Clean Tags: "..kleen end
|
||
|
P,rez=ADD({{class="label",label=infotxt}},{"OK"},{close='OK'})
|
||
|
end
|
||
|
return sel
|
||
|
end
|
||
|
|
||
|
-- delete commented lines from selected lines
|
||
|
function nocom_line(subs,sel)
|
||
|
progress("Deleting commented lines")
|
||
|
ncl_sel={}
|
||
|
for s=#sel,1,-1 do
|
||
|
line=subs[sel[s]]
|
||
|
if line.comment then
|
||
|
for z,i in ipairs(ncl_sel) do ncl_sel[z]=i-1 end
|
||
|
subs.delete(sel[s])
|
||
|
else
|
||
|
table.insert(ncl_sel,sel[s])
|
||
|
end
|
||
|
end
|
||
|
return ncl_sel
|
||
|
end
|
||
|
|
||
|
-- delete empty lines
|
||
|
function noempty(subs,sel)
|
||
|
progress("Deleting empty lines")
|
||
|
noe_sel={}
|
||
|
for s=#sel,1,-1 do
|
||
|
line=subs[sel[s]]
|
||
|
if line.text=="" then
|
||
|
for z,i in ipairs(noe_sel) do noe_sel[z]=i-1 end
|
||
|
subs.delete(sel[s])
|
||
|
else
|
||
|
table.insert(noe_sel,sel[s])
|
||
|
end
|
||
|
end
|
||
|
return noe_sel
|
||
|
end
|
||
|
|
||
|
-- delete commented or empty lines
|
||
|
function noemptycom(subs,sel)
|
||
|
progress("Deleting commented/empty lines")
|
||
|
noecom_sel={}
|
||
|
for s=#sel,1,-1 do
|
||
|
line=subs[sel[s]]
|
||
|
if line.comment or line.text=="" then
|
||
|
for z,i in ipairs(noecom_sel) do noecom_sel[z]=i-1 end
|
||
|
subs.delete(sel[s])
|
||
|
else
|
||
|
table.insert(noecom_sel,sel[s])
|
||
|
end
|
||
|
end
|
||
|
return noecom_sel
|
||
|
end
|
||
|
|
||
|
-- delete unused styles
|
||
|
function nostyle(subs,sel)
|
||
|
stylist=",,"
|
||
|
for i=#subs,1,-1 do
|
||
|
if subs[i].class=="dialogue" then
|
||
|
line=subs[i]
|
||
|
text=line.text
|
||
|
st2=text:match("\\r([^\\}]*)")
|
||
|
st=line.style
|
||
|
if not stylist:match(","..esc(st)..",") then stylist=stylist..st..",," end
|
||
|
if st2 and st2~="" and not stylist:match(","..esc(st2)..",") then stylist=stylist..st2..",," end
|
||
|
end
|
||
|
if subs[i].class=="style" then
|
||
|
style=subs[i]
|
||
|
if res.nostyle2 and style.name:match("Defa") or res.nostyle2 and style.name:match("Alt") then nodel=1 else nodel=0 end
|
||
|
if not stylist:match(","..esc(style.name)..",") and nodel==0 then
|
||
|
subs.delete(i)
|
||
|
logg("\n Deleted style: "..style.name)
|
||
|
for s=1,#sel do sel[s]=sel[s]-1 end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
return sel
|
||
|
end
|
||
|
|
||
|
|
||
|
-- kill everything
|
||
|
function killemall(subs,sel)
|
||
|
if res.inverse then
|
||
|
for k,v in ipairs(GUI) do
|
||
|
if v.x>4 and v.y>0 and v.name~="onlyt" then res[v.name]=not res[v.name] end
|
||
|
end
|
||
|
end
|
||
|
for z,i in ipairs(sel) do
|
||
|
progress("Processing line: "..z.."/"..#sel)
|
||
|
line=subs[i]
|
||
|
text=line.text
|
||
|
if res.onlyt then res.trans=false
|
||
|
text=text:gsub(ATAG,function(t) return t:gsub("\\","|") end)
|
||
|
:gsub("|t(%b())",function(t) return "\\t"..t:gsub("|","\\") end)
|
||
|
end
|
||
|
tags=text:match(STAG) or ""
|
||
|
inline=text:gsub(STAG,"")
|
||
|
if res.skill and res.ikill then trgt=text tg=3
|
||
|
elseif res.ikill then trgt=inline tg=2
|
||
|
else trgt=tags tg=1 end
|
||
|
if res.border then trgt=killtag("[xy]?bord",trgt) end
|
||
|
if res.shadow then trgt=killtag("shad",trgt) end
|
||
|
if res.blur then trgt=killtag("blur",trgt) end
|
||
|
if res.bee then trgt=killtag("be",trgt) end
|
||
|
if res.fsize then trgt=killtag("fs",trgt) end
|
||
|
if res.fspace then trgt=killtag("fsp",trgt) end
|
||
|
if res.scalex then trgt=killtag("fscx",trgt) end
|
||
|
if res.scaley then trgt=killtag("fscy",trgt) end
|
||
|
if res.fade then trgt=trgt:gsub("\\fade?%b()","") end
|
||
|
if res.posi then trgt=trgt:gsub("\\pos%b()","") end
|
||
|
if res.move then trgt=trgt:gsub("\\move%b()","") end
|
||
|
if res.org then trgt=trgt:gsub("\\org%b()","") end
|
||
|
if res.color1 then trgt=killctag("1?c",trgt) end
|
||
|
if res.color2 then trgt=killctag("2c",trgt) end
|
||
|
if res.color3 then trgt=killctag("3c",trgt) end
|
||
|
if res.color4 then trgt=killctag("4c",trgt) end
|
||
|
if res.alfa1 then trgt=killctag("1a",trgt) end
|
||
|
if res.alfa2 then trgt=killctag("2a",trgt) end
|
||
|
if res.alfa3 then trgt=killctag("3a",trgt) end
|
||
|
if res.alfa4 then trgt=killctag("4a",trgt) end
|
||
|
if res.alpha then trgt=killctag("alpha",trgt) end
|
||
|
if res.clip then trgt=trgt:gsub("\\i?clip%b()","") end
|
||
|
if res.fname then trgt=trgt:gsub("\\fn[^\\}]+","") end
|
||
|
if res.frz then trgt=killtag("frz",trgt) end
|
||
|
if res.frx then trgt=killtag("frx",trgt) end
|
||
|
if res.fry then trgt=killtag("fry",trgt) end
|
||
|
if res.fax then trgt=killtag("fax",trgt) end
|
||
|
if res.fay then trgt=killtag("fay",trgt) end
|
||
|
if res.anna then trgt=killtag("an",trgt) end
|
||
|
if res.align then trgt=killtag("a",trgt) end
|
||
|
if res.wrap then trgt=killtag("q",trgt) end
|
||
|
if res["return"] then trgt=trgt:gsub("\\r.+([\\}])","%1") end
|
||
|
if res.kara then trgt=trgt:gsub("\\[Kk][fo]?[%d%.]+([\\}])","%1") end
|
||
|
if res.ital then repeat trgt,r=trgt:gsub("\\i[01]?([\\}])","%1") until r==0 end
|
||
|
if res.bold then repeat trgt,r=trgt:gsub("\\b[01]?([\\}])","%1") until r==0 end
|
||
|
if res.under then repeat trgt,r=trgt:gsub("\\u[01]?([\\}])","%1") until r==0 end
|
||
|
if res.stri then repeat trgt,r=trgt:gsub("\\s[01]?([\\}])","%1") until r==0 end
|
||
|
if res.trans then trgt=trgt:gsub("\\t%b()","") end
|
||
|
trgt=trgt:gsub("\\t%([%d%.,]*%)","") :gsub("{%**}","")
|
||
|
if tg==1 then tags=trgt elseif tg==2 then inline=trgt elseif tg==3 then text=trgt end
|
||
|
if trgt~=text then text=tags..inline end
|
||
|
if res.onlyt then text=text:gsub("{%*?|[^}]-}",function(t) return t:gsub("|","\\") end) end
|
||
|
line.text=text
|
||
|
subs[i]=line
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function killtag(tag,t) repeat t,r=t:gsub("\\"..tag.."[%d%.%-]-([\\}])","%1") until r==0 return t end
|
||
|
function killctag(tag,t) t=t:gsub("\\"..tag.."&H%x+&","") repeat t,r=t:gsub("\\"..tag.."([\\}])","%1") until r==0 return t end
|
||
|
|
||
|
|
||
|
-- hide tags
|
||
|
function hide_tags(subs,sel)
|
||
|
hide=true
|
||
|
if res.inverse then hide=nil end
|
||
|
local numbers="\\i\\b\\u\\s\\q\\a\\be\\blur\\bord\\fs\\fscx\\fscy\\shad\\an\\frz\\fry\\frx\\fsp\\fax\\fay\\"
|
||
|
local alphacol="\\1a\\2a\\3a\\4a\\1c\\2c\\3c\\4c\\alpha\\"
|
||
|
local parent="\\fad\\pos\\move\\org\\clip\\"
|
||
|
local fontret="\\r\\fn\\"
|
||
|
if hide then
|
||
|
hidem={}
|
||
|
for k,v in ipairs(GUI) do
|
||
|
if v.x>4 and v.y>0 and v.name~='onlyt' and v.name~='kara' then
|
||
|
nom=v.label:gsub("c, 1c","1c"):gsub("%(i%)","")
|
||
|
if res[v.name] then table.insert(hidem,nom) end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
for x,i in ipairs(sel) do
|
||
|
line=subs[i]
|
||
|
text=line.text:gsub("\\c&","\\1c&")
|
||
|
startg=text:match("^{\\[^}]-}") or ""
|
||
|
startg=trem(startg)
|
||
|
t2=text:gsub("^{\\[^}]-}","")
|
||
|
|
||
|
if hide then
|
||
|
for t=1,#hidem do
|
||
|
local tag='\\'..hidem[t]
|
||
|
local htag='//'..hidem[t]
|
||
|
local chk=tag..'\\'
|
||
|
tg=nil
|
||
|
if numbers:match(chk) then
|
||
|
tg=startg:match(tag.."([%d.-]+)")
|
||
|
if tg then t2=t2.."{"..htag..tg.."}" end
|
||
|
startg=startg:gsub(tag.."[%d.-]+","")
|
||
|
if not tg and tag=="\\shad" then
|
||
|
tg1=startg:match("\\xshad([%d.-]+)")
|
||
|
tg2=startg:match("\\yshad([%d.-]+)")
|
||
|
if tg1 then t2=t2.."{//xshad"..tg1.."}" end
|
||
|
if tg2 then t2=t2.."{//yshad"..tg2.."}" end
|
||
|
startg=startg:gsub("\\[xy]shad[%d.-]+","")
|
||
|
end
|
||
|
elseif alphacol:match(chk) then
|
||
|
tg=startg:match(tag.."(&H%x+&)")
|
||
|
if tg then t2=t2.."{"..htag..tg.."}" end
|
||
|
startg=startg:gsub(tag.."&H%x+&","")
|
||
|
elseif parent:match(chk) then
|
||
|
tg=startg:match(tag.."(%b())")
|
||
|
if not tg and tag=="\\clip" then tg=startg:match("\\iclip(%b())") tag='\\iclip' htag='//iclip' end
|
||
|
if not tg and tag=="\\fad" then tg=startg:match("\\fade(%b())") tag='\\fade' htag='//fade' end
|
||
|
if tg then t2=t2.."{"..htag..tg.."}" end
|
||
|
startg=startg:gsub(tag.."%b()","")
|
||
|
elseif fontret:match(chk) then
|
||
|
tg=startg:match(tag.."([^\\}]*)")
|
||
|
if tg then t2=t2.."{"..htag..tg.."}" end
|
||
|
startg=startg:gsub(tag.."[^\\}]*","")
|
||
|
elseif tag=='\\t' then
|
||
|
t2=t2.."{"..trnsfrm:gsub("\\t","//t").."}"
|
||
|
end
|
||
|
end
|
||
|
if res.hidline then
|
||
|
-- hide inline
|
||
|
inT=inline_pos(t2)
|
||
|
t2=t2:gsub(ATAG,"")
|
||
|
for k,v in ipairs(inT) do
|
||
|
t2=t2..v.t:gsub("{%*?\\","{"..v.n.."//")
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
local vis1,vis2=t2:gsub("%b{}","")
|
||
|
local c=0
|
||
|
repeat
|
||
|
-- Unhide regular
|
||
|
if res.skill then
|
||
|
for hidden in t2:gmatch("{(//.-)}") do
|
||
|
t2=t2:gsub("{"..esc(hidden).."}","")
|
||
|
hidden=hidden:gsub("//","\\")
|
||
|
startg=startg.."{"..hidden.."}"
|
||
|
end
|
||
|
end
|
||
|
-- unhide inline
|
||
|
if t2:match("{%d+//[^}]+}") and res.ikill then
|
||
|
inT={}
|
||
|
stT=''
|
||
|
for num,tag in t2:gmatch("{(%d+)//([^}]+)}") do
|
||
|
table.insert(inT,{n=num,t=tag})
|
||
|
end
|
||
|
for tag in t2:gmatch("{//[^}]+}") do stT=stT..tag end
|
||
|
table.sort(inT,function(a,b) return tonumber(a.n)<tonumber(b.n) end)
|
||
|
t2=t2:gsub("{%d+//[^}]+}","")
|
||
|
if t2:match"{" then orig=t2 t2=t2:gsub("%b{}","") end
|
||
|
t2=inline_ret2(t2,inT)
|
||
|
if orig then t2=textmod(orig,t2) orig=nil end
|
||
|
t2=t2..stT
|
||
|
end
|
||
|
vis2=t2:gsub("%b{}","")
|
||
|
c=c+1
|
||
|
until vis1==vis2 or c==666
|
||
|
if vis1~=vis2 then logg('Error:\n '..vis1..'\n> '..vis2) end
|
||
|
end
|
||
|
|
||
|
if not hide or hide and not res.trans then startg=startg.."{"..trnsfrm.."}" end
|
||
|
text=duplikill(startg:gsub("}{",""):gsub("\\1c","\\c"))..t2
|
||
|
text=text:gsub("{}",""):gsub("\\1c","\\c")
|
||
|
if line.text~=text then line.text=text subs[i]=line end
|
||
|
end
|
||
|
return sel
|
||
|
end
|
||
|
|
||
|
-- save inline tags
|
||
|
function inline_pos(t)
|
||
|
inTags={}
|
||
|
tl=t:len()
|
||
|
if tl==0 then return {} end
|
||
|
p=0
|
||
|
t1=''
|
||
|
repeat
|
||
|
seg=t:match("^(%b{})") -- try to match tags/comments
|
||
|
if seg then
|
||
|
if seg:match("{%*?\\") then table.insert(inTags,{n=p,t=seg}) end
|
||
|
else
|
||
|
seg=t:match("^([^{]+)") -- or match text
|
||
|
if not seg then t_error("Error: There appears to be a problem with the brackets here...\n"..t1..t,1) end
|
||
|
SL=re.find(seg,".")
|
||
|
p=p+#SL -- position of next '{' [or end]
|
||
|
end
|
||
|
t1=t1..seg
|
||
|
t=t:gsub("^"..esc(seg),"")
|
||
|
tl=t:len()
|
||
|
until tl==0
|
||
|
return inTags
|
||
|
end
|
||
|
|
||
|
-- rebuild inline tags
|
||
|
function inline_ret2(t,tab)
|
||
|
tl=t:len()
|
||
|
nt=''
|
||
|
kill='_Z#W_' -- this is supposed to never match
|
||
|
for k,v in ipairs(tab) do
|
||
|
N=tonumber(v.n)
|
||
|
if N==0 then nt=nt..v.t
|
||
|
else
|
||
|
m='.'
|
||
|
-- match how many chars at the start
|
||
|
m=m:rep(N)
|
||
|
RS=re.find(t,m)
|
||
|
seg=RS[1].str
|
||
|
seg=re.sub(seg,'^'..kill,'')
|
||
|
nt=nt..seg..'{\\'..v.t..'}'
|
||
|
kill=m -- how many matched in the last round
|
||
|
end
|
||
|
end
|
||
|
-- the rest
|
||
|
seg=re.sub(t,'^'..kill,'')
|
||
|
nt=nt..seg
|
||
|
return nt
|
||
|
end
|
||
|
|
||
|
-- reanimatools -------
|
||
|
function esc(str) str=str:gsub("[%%%(%)%[%]%.%-%+%*%?%^%$]","%%%1") return str end
|
||
|
function rnd2dec(num) num=math.floor((num*100)+0.5)/100 return num end
|
||
|
function logg(m) m=m or "nil" aegisub.log("\n "..m) end
|
||
|
function wrap(str) return "{"..str.."}" end
|
||
|
function nobra(t) return t:gsub("%b{}","") end
|
||
|
function nobrea(t) return t:gsub("%b{}",""):gsub("\\[Nh]","") end
|
||
|
function nobrea1(t) return t:gsub("%b{}",""):gsub(" *\\[Nh] *"," ") end
|
||
|
function tagmerge(t) repeat t,r=t:gsub("({\\[^}]-)}{(\\[^}]-})","%1%2") until r==0 return t end
|
||
|
function progress(msg) if aegisub.progress.is_cancelled() then ak() end aegisub.progress.title(msg) end
|
||
|
function t_error(message,cancel) ADD({{class="label",label=message}},{"OK"},{close='OK'}) if cancel then ak() end end
|
||
|
|
||
|
function duplikill(tagz)
|
||
|
local tags1={"blur","be","bord","shad","xbord","xshad","ybord","yshad","fs","fsp","fscx","fscy","frz","frx","fry","fax","fay"}
|
||
|
local tags2={"c","2c","3c","4c","1a","2a","3a","4a","alpha"}
|
||
|
tagz=tagz:gsub("\\t%b()",function(t) return t:gsub("\\","|") end)
|
||
|
for i=1,#tags1 do
|
||
|
tag=tags1[i]
|
||
|
repeat tagz,c=tagz:gsub("|"..tag.."[%d%.%-]+([^}]-)(\\"..tag.."[%d%.%-]+)","%1%2") until c==0
|
||
|
repeat tagz,c=tagz:gsub("\\"..tag.."[%d%.%-]+([^}]-)(\\"..tag.."[%d%.%-]+)","%2%1") until c==0
|
||
|
end
|
||
|
tagz=tagz:gsub("\\1c&","\\c&")
|
||
|
for i=1,#tags2 do
|
||
|
tag=tags2[i]
|
||
|
repeat tagz,c=tagz:gsub("|"..tag.."&H%x+&([^}]-)(\\"..tag.."&H%x+&)","%1%2") until c==0
|
||
|
repeat tagz,c=tagz:gsub("\\"..tag.."&H%x+&([^}]-)(\\"..tag.."&H%x+&)","%2%1") until c==0
|
||
|
end
|
||
|
repeat tagz,c=tagz:gsub("\\fn[^\\}]+([^}]-)(\\fn[^\\}]+)","%2%1") until c==0
|
||
|
repeat tagz,c=tagz:gsub("(\\[ibusq])%d(.-)(%1%d)","%2%3") until c==0
|
||
|
repeat tagz,c=tagz:gsub("(\\an)%d(.-)(%1%d)","%3%2") until c==0
|
||
|
tagz=tagz:gsub("(|i?clip%(%A-%))(.-)(\\i?clip%(%A-%))","%2%3")
|
||
|
:gsub("(\\i?clip%b())(.-)(\\i?clip%b())",function(a,b,c)
|
||
|
if a:match("m") and c:match("m") or not a:match("m") and not c:match("m") then return b..c else return a..b..c end end)
|
||
|
tagz=tagz:gsub("|","\\"):gsub("\\t%([^\\%)]-%)","")
|
||
|
return tagz
|
||
|
end
|
||
|
|
||
|
function extrakill(text,o)
|
||
|
local tags3={"pos","move","org","fad"}
|
||
|
for i=1,#tags3 do
|
||
|
tag=tags3[i]
|
||
|
if o==2 then
|
||
|
repeat text,c=text:gsub("(\\"..tag.."[^\\}]+)([^}]-)(\\"..tag.."[^\\}]+)","%3%2") until c==0
|
||
|
else
|
||
|
repeat text,c=text:gsub("(\\"..tag.."[^\\}]+)([^}]-)(\\"..tag.."[^\\}]+)","%1%2") until c==0
|
||
|
end
|
||
|
end
|
||
|
repeat text,c=text:gsub("(\\pos[^\\}]+)([^}]-)(\\move[^\\}]+)","%1%2") until c==0
|
||
|
repeat text,c=text:gsub("(\\move[^\\}]+)([^}]-)(\\pos[^\\}]+)","%1%2") until c==0
|
||
|
return text
|
||
|
end
|
||
|
|
||
|
function trem(tags)
|
||
|
trnsfrm=""
|
||
|
for t in tags:gmatch("\\t%b()") do trnsfrm=trnsfrm..t end
|
||
|
tags=tags:gsub("\\t%b()","")
|
||
|
return tags
|
||
|
end
|
||
|
|
||
|
function cleantr(tags)
|
||
|
trnsfrm=""
|
||
|
zerotf=""
|
||
|
for t in tags:gmatch("\\t%b()") do
|
||
|
if t:match("\\t%(\\") then
|
||
|
zerotf=zerotf..t:match("\\t%((.*)%)$")
|
||
|
else
|
||
|
trnsfrm=trnsfrm..t
|
||
|
end
|
||
|
end
|
||
|
zerotf="\\t("..zerotf..")"
|
||
|
tags=tags:gsub("\\t%b()",""):gsub("^({[^}]*)}","%1"..zerotf..trnsfrm.."}"):gsub("\\t%(%)","")
|
||
|
return tags
|
||
|
end
|
||
|
|
||
|
function retextmod(orig,text)
|
||
|
local v1,v2,c,t2
|
||
|
v1=nobrea(orig)
|
||
|
c=0
|
||
|
repeat
|
||
|
t2=textmod(orig,text)
|
||
|
v2=nobrea(text)
|
||
|
c=c+1
|
||
|
until v1==v2 or c==666
|
||
|
if v1~=v2 then logg("Something went wrong with the text...") logg(v1) logg(v2) end
|
||
|
return t2
|
||
|
end
|
||
|
|
||
|
function textmod(orig,text)
|
||
|
if text=="" then return orig end
|
||
|
tk={}
|
||
|
tg={}
|
||
|
text=text:gsub("{\\\\k0}","")
|
||
|
text=tagmerge(text)
|
||
|
vis=nobra(text)
|
||
|
ltrmatches=re.find(vis,".")
|
||
|
if not ltrmatches then logg("text: "..text..'\nvisible: '..vis)
|
||
|
logg("If you're seeing this, something really weird is happening with the re module.\nTry this again or rescan Autoload.")
|
||
|
end
|
||
|
for l=1,#ltrmatches do
|
||
|
table.insert(tk,ltrmatches[l].str)
|
||
|
end
|
||
|
stags=text:match(STAG) or ""
|
||
|
text=text:gsub(STAG,"") :gsub("{[^\\}]-}","")
|
||
|
orig=orig:gsub("{([^\\}]+)}",function(c) return wrap("\\\\"..c.."|||") end)
|
||
|
count=0
|
||
|
for seq in orig:gmatch("[^{]-{%*?\\[^}]-}") do
|
||
|
chars,as,tak=seq:match("([^{]-){(%*?)(\\[^}]-)}")
|
||
|
pos=re.find(chars,".")
|
||
|
if pos==nil then ps=0+count else ps=#pos+count end
|
||
|
tgl={p=ps,t=tak,a=as}
|
||
|
table.insert(tg,tgl)
|
||
|
count=ps
|
||
|
end
|
||
|
count=0
|
||
|
for seq in text:gmatch("[^{]-{%*?\\[^}]-}") do
|
||
|
chars,as,tak=seq:match("([^{]-){(%*?)(\\[^}]-)}")
|
||
|
pos=re.find(chars,".")
|
||
|
if pos==nil then ps=0+count else ps=#pos+count end
|
||
|
tgl={p=ps,t=tak,a=as}
|
||
|
table.insert(tg,tgl)
|
||
|
count=ps
|
||
|
end
|
||
|
newline=""
|
||
|
for i=1,#tk do
|
||
|
newline=newline..tk[i]
|
||
|
newt=""
|
||
|
for n,t in ipairs(tg) do
|
||
|
if t.p==i then newt=newt..t.a..t.t end
|
||
|
end
|
||
|
if newt~="" then newline=newline.."{"..as..newt.."}" end
|
||
|
end
|
||
|
newtext=stags..newline:gsub("(|||)(\\\\)","%1}{%2"):gsub("({[^}]-)\\\\([^\\}]-)|||","{%2}%1")
|
||
|
text=newtext:gsub("{}","")
|
||
|
return text
|
||
|
end
|
||
|
|
||
|
|
||
|
function cleanup(subs,sel,act)
|
||
|
ADD=aegisub.dialog.display
|
||
|
ak=aegisub.cancel
|
||
|
if #sel==0 then t_error("No selection",1) end
|
||
|
ATAG="{[*>]?\\[^}]-}"
|
||
|
STAG="^{>?\\[^}]-}"
|
||
|
if act==0 then act=sel[1] end
|
||
|
chng=0 kleen=0
|
||
|
GUI={
|
||
|
{x=0,y=0,class="checkbox",name="nots",label="Remove TS timecodes",hint="Removes timecodes like {TS 12:36}"},
|
||
|
{x=0,y=1,class="checkbox",name="clear_a",label="Clear Actor field"},
|
||
|
{x=0,y=2,class="checkbox",name="clear_e",label="Clear Effect field"},
|
||
|
{x=0,y=3,class="checkbox",name="layers",label="Raise dialogue layer by 5"},
|
||
|
{x=0,y=4,class="checkbox",name="cleantag",label="Clean up tags",hint="Fixes duplicates, \\\\, \\}, }{, and other garbage"},
|
||
|
{x=0,y=5,class="checkbox",name="ctrans",label="Clean up transforms"},
|
||
|
{x=0,y=6,class="checkbox",name="overlap",label="Fix 1-frame gaps/overlaps"},
|
||
|
{x=0,y=7,class="checkbox",name="nocomline",label="Delete commented lines"},
|
||
|
{x=0,y=8,class="checkbox",name="noempty",label="Delete empty lines"},
|
||
|
{x=0,y=9,class="checkbox",name="alphacol",label="Try to fix alpha / colour tags"},
|
||
|
{x=0,y=10,class="checkbox",name="spaces",label="Fix start/end/double spaces"},
|
||
|
{x=0,y=12,class="checkbox",name="info",label="Print info"},
|
||
|
{x=0,y=13,class="checkbox",name="all",label="ALL OF THE ABOVE"},
|
||
|
|
||
|
{x=1,y=0,class="label",label=" "},
|
||
|
|
||
|
{x=2,y=0,width=2,class="checkbox",name="allcol",label="Remove all colour tags"},
|
||
|
{x=2,y=1,class="checkbox",name="allphas",label="Remove all alphas"},
|
||
|
{x=3,y=1,class="checkbox",name="alpha14",label="Only 1a-4a"},
|
||
|
{x=2,y=2,class="checkbox",name="allrot",label="Remove all rotations",hint="frx, fry, frz"},
|
||
|
{x=3,y=2,class="checkbox",name="xyrot",label="Only x, y",hint="remove frx, fry"},
|
||
|
{x=2,y=3,class="checkbox",name="allsize",label="Remove size/scaling",hint="fs, fscx, fscy"},
|
||
|
{x=3,y=3,class="checkbox",name="scales",label="Only scaling",hint="remove fscx, fscy"},
|
||
|
{x=2,y=4,class="checkbox",name="allshad",label="Remove all shadows",hint="shad, xshad, yshad"},
|
||
|
{x=3,y=4,class="checkbox",name="xyshad",label="Only x, y",hint="remove xshad, yshad"},
|
||
|
{x=2,y=5,class="checkbox",name="parent",label="Remove parentheses",hint="fad(e), (i)clip, pos, move, org\n(but not t)"},
|
||
|
{x=3,y=5,class="checkbox",name="parent2",label="Except \\pos",hint="fad(e), (i)clip, move, org\n(but not t or pos)"},
|
||
|
{x=2,y=6,width=2,class="checkbox",name="allpers",label="Remove all perspective",hint="frx, fry, frz, fax, fay, org"},
|
||
|
|
||
|
{x=2,y=7,width=2,class="label",label=" ~ Script Cleanup v"..script_version.." ~"},
|
||
|
|
||
|
{x=2,y=8,width=2,class="checkbox",name="hspace",label="Remove hard spaces - \\h"},
|
||
|
{x=2,y=9,class="checkbox",name="nobreak",label="Remove line breaks"},
|
||
|
{x=3,y=9,class="checkbox",name="nobreak2",label="...no space",hint="Remove line breaks, leave no spaces"},
|
||
|
{x=2,y=10,class="checkbox",name="nostyle",label="Delete unused styles"},
|
||
|
{x=3,y=10,class="checkbox",name="nostyle2",label="Except Def.",hint="Delete unused styles except Default"},
|
||
|
{x=2,y=11,class="checkbox",name="inline",label="Remove inline tags"},
|
||
|
{x=3,y=11,class="checkbox",name="inline2",label="Except last",hint="Remove inline tags except the last one"},
|
||
|
{x=2,y=12,width=2,class="checkbox",name="nocom",label="Remove comments from lines",hint="Removes {comments} (not tags)"},
|
||
|
{x=2,y=13,width=2,class="checkbox",name="notag",label="Remove all {\\tags} from selected lines"},
|
||
|
|
||
|
{x=4,y=0,height=14,class="label",label="| \n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|\n|"},
|
||
|
|
||
|
{x=5,y=0,class="checkbox",name="skill",label="[start]",value=true},
|
||
|
{x=6,y=0,class="checkbox",name="ikill",label="[inline]",value=true,hint="only kill, not hide"},
|
||
|
{x=7,y=0,width=2,class="checkbox",name="inverse",label="[inverse/unhide]",hint="kill all except checked ones\n\n'Unhide' for 'Hide Tags'"},
|
||
|
{x=7,y=1,width=2,class="checkbox",name="onlyt",label="[from \\t]",hint="remove only from transforms\n\n n/a for 'Hide Tags'"},
|
||
|
|
||
|
{x=5,y=1,class="checkbox",name="blur",label="blur"},
|
||
|
{x=5,y=2,class="checkbox",name="border",label="bord",hint="includes xbord and ybord [not for Hide]"},
|
||
|
{x=5,y=3,class="checkbox",name="shadow",label="shad",hint="includes xshad and yshad for Hide"},
|
||
|
{x=5,y=4,class="checkbox",name="fsize",label="fs"},
|
||
|
{x=5,y=5,class="checkbox",name="fspace",label="fsp"},
|
||
|
{x=5,y=6,class="checkbox",name="scalex",label="fscx"},
|
||
|
{x=5,y=7,class="checkbox",name="scaley",label="fscy"},
|
||
|
{x=5,y=8,class="checkbox",name="fname",label="fn"},
|
||
|
{x=5,y=9,class="checkbox",name="ital",label="i"},
|
||
|
{x=5,y=10,class="checkbox",name="bold",label="b"},
|
||
|
{x=5,y=11,class="checkbox",name="under",label="u"},
|
||
|
{x=5,y=12,class="checkbox",name="stri",label="s"},
|
||
|
{x=5,y=13,class="checkbox",name="wrap",label="q"},
|
||
|
|
||
|
{x=6,y=1,class="checkbox",name="bee",label="be"},
|
||
|
{x=6,y=2,class="checkbox",name="color1",label="c, 1c"},
|
||
|
{x=6,y=3,class="checkbox",name="color2",label="2c"},
|
||
|
{x=6,y=4,class="checkbox",name="color3",label="3c"},
|
||
|
{x=6,y=5,class="checkbox",name="color4",label="4c"},
|
||
|
{x=6,y=6,class="checkbox",name="alpha",label="alpha"},
|
||
|
{x=6,y=7,class="checkbox",name="alfa1",label="1a"},
|
||
|
{x=6,y=8,class="checkbox",name="alfa2",label="2a"},
|
||
|
{x=6,y=9,class="checkbox",name="alfa3",label="3a"},
|
||
|
{x=6,y=10,class="checkbox",name="alfa4",label="4a"},
|
||
|
{x=6,y=11,class="checkbox",name="align",label="a"},
|
||
|
{x=6,y=12,class="checkbox",name="anna",label="an"},
|
||
|
{x=6,y=13,class="checkbox",name="clip",label="(i)clip"},
|
||
|
|
||
|
{x=7,y=2,class="checkbox",name="fade",label="fad"},
|
||
|
{x=7,y=3,class="checkbox",name="posi",label="pos"},
|
||
|
{x=7,y=4,class="checkbox",name="move",label="move"},
|
||
|
{x=7,y=5,class="checkbox",name="org",label="org"},
|
||
|
{x=7,y=6,class="checkbox",name="frz",label="frz"},
|
||
|
{x=7,y=7,class="checkbox",name="frx",label="frx"},
|
||
|
{x=7,y=8,class="checkbox",name="fry",label="fry"},
|
||
|
{x=7,y=9,class="checkbox",name="fax",label="fax"},
|
||
|
{x=7,y=10,class="checkbox",name="fay",label="fay"},
|
||
|
{x=7,y=11,width=2,class="checkbox",name="kara",label="k/kf/ko"},
|
||
|
{x=7,y=12,class="checkbox",name="return",label="r"},
|
||
|
{x=7,y=13,class="checkbox",name="trans",label="t"},
|
||
|
|
||
|
{x=8,y=12,height=2,class="checkbox",name="hidline",label="hide\ninline",hint='Hide ALL inline tags'},
|
||
|
}
|
||
|
P,res=ADD(GUI,
|
||
|
{"Run selected","Comments","Tags","Dial 5","Clean Tags","^ Kill Tags","Hide Tags","Cancer"},{ok='Run selected',cancel='Cancer'})
|
||
|
if P=="Cancer" then ak() end
|
||
|
if P=="^ Kill Tags" then killemall(subs,sel) end
|
||
|
if P=="Hide Tags" then hide_tags(subs,sel) end
|
||
|
if P=="Comments" then res.nocom=true cleanlines(subs,sel) end
|
||
|
if P=="Tags" then res.notag=true cleanlines(subs,sel) end
|
||
|
if P=="Dial 5" then res.layers=true cleanlines(subs,sel) end
|
||
|
if P=="Clean Tags" then res.cleantag=true cleanlines(subs,sel) end
|
||
|
if P=="Run selected" then
|
||
|
C=0 for key,v in ipairs(GUI) do if v.x<=3 and res[v.name] then C=1 end end
|
||
|
if C==0 then t_error("Run Selected: Error - nothing selected",1) end
|
||
|
if res.all then
|
||
|
for key,v in ipairs(GUI) do if v.x>0 and v.name then res[v.name]=false end end
|
||
|
cleanlines(subs,sel)
|
||
|
sel=noemptycom(subs,sel)
|
||
|
else cleanlines(subs,sel)
|
||
|
if res.nocomline and res.noempty then sel=noemptycom(subs,sel)
|
||
|
else
|
||
|
if res.nocomline then sel=nocom_line(subs,sel) end
|
||
|
if res.noempty then sel=noempty(subs,sel) end
|
||
|
end
|
||
|
table.sort(sel)
|
||
|
if res.nostyle or res.nostyle2 then sel=nostyle(subs,sel) end
|
||
|
end
|
||
|
end
|
||
|
if act>#subs then act=#subs end
|
||
|
return sel,act
|
||
|
end
|
||
|
|
||
|
if haveDepCtrl then depRec:registerMacro(cleanup) else aegisub.register_macro(script_name,script_description,cleanup) end
|