Runtime errors in auto3 scripts no longer kill the program but are reported properly instead.

Apparently Lua 5.1 has changed the semantics of table.insert so it's incompatible with the way used in all Auto3 demo scripts etc. Now it's overridden in utils.auto3 and all instances of it in sample scripts etc. replaced with code having the expected behaviour.

Originally committed to SVN as r926.
This commit is contained in:
Niels Martin Hansen 2007-02-06 12:30:17 +00:00
parent caea5872b4
commit 6dcb5ff4a8
8 changed files with 50 additions and 19 deletions

View file

@ -962,7 +962,14 @@ continue_invalid_option:
sink->SetTask(_T("Running script for processing")); sink->SetTask(_T("Running script for processing"));
sink->SetProgress(100.0f/3); sink->SetProgress(100.0f/3);
lua_call(L, 4, 1); int ret = lua_pcall(L, 4, 1, 0);
if (ret) {
wxString emsg(lua_tostring(L, -1), wxConvUTF8);
emsg.Prepend(_T("The Automation 3 script produced an error:\n"));
emsg.Append(_T("\nThe subtitles have not been altered."));
lua_pushstring(L, emsg.mb_str(wxConvUTF8));
throw ret;
}
sink->SetProgress(200.0f/3); sink->SetProgress(200.0f/3);
sink->SetTask(_T("Reading back data from script")); sink->SetTask(_T("Reading back data from script"));

View file

@ -22,7 +22,8 @@ function do_syllable(meta, styles, config, line, syl)
-- The result from this function can just be modified, and the line in the result table changes along (since it's just a reference) -- The result from this function can just be modified, and the line in the result table changes along (since it's just a reference)
function result.add() function result.add()
local l = copy_line(line) local l = copy_line(line)
table.insert(result, l) result.n = result.n + 1
result[result.n] = l
return l return l
end end
-- Place the main text -- Place the main text

View file

@ -16,7 +16,8 @@ function process_lines(meta, styles, lines, config)
aegisub.report_progress(i/lines.n*100) aegisub.report_progress(i/lines.n*100)
-- Only process dialogue lines -- Only process dialogue lines
if lines[i].kind ~= "dialogue" then if lines[i].kind ~= "dialogue" then
table.insert(output, lines[i]) output.n = output.n + 1
output[output.n] = lines[i]
else else
-- This is just for making the code a bit easier to read -- This is just for making the code a bit easier to read
local line = lines[i] local line = lines[i]
@ -40,7 +41,8 @@ function process_lines(meta, styles, lines, config)
-- Replace the text of the copy of the line with this syllable, moving around -- Replace the text of the copy of the line with this syllable, moving around
syllin.text = string.format("{\\an4\\move(%d,%d,%d,%d,%d,%d)\\kf%d\\kf%d}%s", curx, cury, curx, cury-exty, tstart, tend, tstart/10, syl.duration, syl.text) syllin.text = string.format("{\\an4\\move(%d,%d,%d,%d,%d,%d)\\kf%d\\kf%d}%s", curx, cury, curx, cury-exty, tstart, tend, tstart/10, syl.duration, syl.text)
-- Add the line to the output -- Add the line to the output
table.insert(output, syllin) output.n = output.n + 1
output[output.n] = syllin
-- And prepare for next iteration -- And prepare for next iteration
curx = curx + extx curx = curx + extx
tstart = tend tstart = tend

View file

@ -24,7 +24,8 @@ function process_lines(meta, styles, lines, config)
aegisub.report_progress(i/lines.n*100) aegisub.report_progress(i/lines.n*100)
-- First check if the line is even a dialogue line. If it's not, no need to process it. -- First check if the line is even a dialogue line. If it's not, no need to process it.
if lines[i].kind ~= "dialogue" then if lines[i].kind ~= "dialogue" then
table.insert(output, lines[i]) output.n = output.n + 1
output[output.n] = lines[i]
else else
-- This is a dialogue line, so process is -- This is a dialogue line, so process is
-- Make a nicer name for the line we're processing -- Make a nicer name for the line we're processing
@ -55,7 +56,8 @@ function process_lines(meta, styles, lines, config)
-- The entire line has been calculated -- The entire line has been calculated
-- Add it to the output -- Add it to the output
table.insert(output, newline) output.n = output.n + 1
output[output.n] = newline
end end
end end

View file

@ -33,7 +33,8 @@ function process_lines(meta, styles, lines, config)
dokanji(lin, output, styles["op kanji"]) dokanji(lin, output, styles["op kanji"])
else else
-- Unknown lines are copied verbatim -- Unknown lines are copied verbatim
table.insert(output, lin) output.n = output.n + 1
output[output.n] = lin
end end
end end
return output return output
@ -110,7 +111,8 @@ function doromaji(lin, output, sty, linetop)
enterlin.start_time = lin.start_time - 40 enterlin.start_time = lin.start_time - 40
enterlin.end_time = lin.start_time enterlin.end_time = lin.start_time
enterlin.text = string.format("{\\move(%d,%d,%d,%d)\\fr%d\\t(\\fr0)\\an7}%s", startx, starty, shakex, shakey, -math.deg(enterangle), syl.text) enterlin.text = string.format("{\\move(%d,%d,%d,%d)\\fr%d\\t(\\fr0)\\an7}%s", startx, starty, shakex, shakey, -math.deg(enterangle), syl.text)
table.insert(output, enterlin) output.n = output.n + 1
output[output.n] = enterlin
-- main highlight effect -- main highlight effect
local newlin = copy_line(lin) local newlin = copy_line(lin)
local hilistart, hilimid, hiliend = syl.start_time*10, (syl.start_time+syl.duration/2)*10, (syl.start_time+syl.duration)*10 local hilistart, hilimid, hiliend = syl.start_time*10, (syl.start_time+syl.duration/2)*10, (syl.start_time+syl.duration)*10
@ -127,8 +129,9 @@ function doromaji(lin, output, sty, linetop)
bord.layer = 0 bord.layer = 0
bord.text = "{" .. bord.text bord.text = "{" .. bord.text
newlin.text = "{\\bord0" .. newlin.text newlin.text = "{\\bord0" .. newlin.text
table.insert(output, bord) output.n = output.n + 2
table.insert(output, newlin) output[output.n-1] = bord
output[output.n] = newlin
-- leave effect -- leave effect
-- cut the line over in two, lower half "drops down", upper just fades away -- cut the line over in two, lower half "drops down", upper just fades away
local tophalf = copy_line(lin) local tophalf = copy_line(lin)
@ -138,8 +141,9 @@ function doromaji(lin, output, sty, linetop)
local bottomhalf = copy_line(tophalf) local bottomhalf = copy_line(tophalf)
tophalf.text = string.format("{\\t(0,200,\\1c&H000080&)\\clip(0,0,640,%d)%s", linetop+syl.height/2, tophalf.text) tophalf.text = string.format("{\\t(0,200,\\1c&H000080&)\\clip(0,0,640,%d)%s", linetop+syl.height/2, tophalf.text)
bottomhalf.text = string.format("{\\org(%d,%d)\\clip(0,%d,640,480)\\t(0,200,\\1c&H000080&)\\t(200,1000,1.2,\\frx90\\clip(0,%d,640,480)%s", 320, linetop+syl.height, linetop+syl.height/2, linetop+syl.height, bottomhalf.text) bottomhalf.text = string.format("{\\org(%d,%d)\\clip(0,%d,640,480)\\t(0,200,\\1c&H000080&)\\t(200,1000,1.2,\\frx90\\clip(0,%d,640,480)%s", 320, linetop+syl.height, linetop+syl.height/2, linetop+syl.height, bottomhalf.text)
table.insert(output, tophalf) output.n = output.n + 2
table.insert(output, bottomhalf) output[output.n-1] = tophalf
output[output.n] = bottomhalf
end end
end end
end end
@ -190,7 +194,8 @@ function dokanji(lin, output, sty)
end end
newlin.text = string.format("{\\fn%s\\an7\\fr-90\\move(%d,%d,%d,%d)\\1a&H%2x&\\3a&H%2x&\\t(\\1a&H%2x&\\3a&H%2x&)}%s", fontname, 620, top, 620, top-syl.height, startalpha, startalpha, targetalpha, targetalpha, syls[i+j].text) newlin.text = string.format("{\\fn%s\\an7\\fr-90\\move(%d,%d,%d,%d)\\1a&H%2x&\\3a&H%2x&\\t(\\1a&H%2x&\\3a&H%2x&)}%s", fontname, 620, top, 620, top-syl.height, startalpha, startalpha, targetalpha, targetalpha, syls[i+j].text)
top = top + syls[i+j].height top = top + syls[i+j].height
table.insert(output, newlin) output.n = output.n + 1
output[output.n] = newlin
end end
end end
end end

View file

@ -44,7 +44,7 @@ karaskel.engage_positioning = true
-- The arguments here mean the same as in karaskel.lua, and all tables have the same members -- The arguments here mean the same as in karaskel.lua, and all tables have the same members
-- The return value is different now, though. -- The return value is different now, though.
-- It is required to be in the same format as the do_line function: -- It is required to be in the same format as the do_line function:
-- A table with an "n" key, and keys 0..n-1 with line structures. -- A table with an "n" key, and keys 1..n with line structures.
function karaskel.do_syllable(meta, styles, config, line, syl) function karaskel.do_syllable(meta, styles, config, line, syl)
karaskel.trace("default_do_syllable") karaskel.trace("default_do_syllable")
return {n=0} return {n=0}
@ -60,11 +60,15 @@ function karaskel.do_line(meta, styles, config, line)
for i = 0, line.karaoke.n-1 do for i = 0, line.karaoke.n-1 do
karaskel.trace("adv_do_line:2:"..i) karaskel.trace("adv_do_line:2:"..i)
local out = do_syllable(meta, styles, config, line, line.karaoke[i]) local out = do_syllable(meta, styles, config, line, line.karaoke[i])
karaskel.trace("adv_do_line:produced " .. out.n)
for j = 1, out.n do for j = 1, out.n do
table.insert(result, out[j]) karaskel.trace("adv_do_line:produced:" .. out[j].kind)
result.n = result.n + 1
result[result.n] = out[j]
end end
karaskel.trace("adv_do_line:3:"..result.n)
end end
karaskel.trace("adv_do_line:3") karaskel.trace("adv_do_line:4")
return result return result
end end
do_line = karaskel.do_line do_line = karaskel.do_line

View file

@ -51,7 +51,7 @@ karaskel = {
-- Set this to the name of the style used for out-of-line effect specifications, if any (read manual on this!) -- Set this to the name of the style used for out-of-line effect specifications, if any (read manual on this!)
ool_fx_style = false, ool_fx_style = false,
-- Show tracing messages? -- Show tracing messages?
engage_trace = false engage_trace = true
} }
function karaskel.warning(s) function karaskel.warning(s)
@ -300,10 +300,11 @@ function karaskel.process_lines(meta, styles, lines, config)
-- Get replacement lines -- Get replacement lines
lines[i].ool_fx = ool_fx lines[i].ool_fx = ool_fx
repl = do_line(meta, styles, config, lines[i]) repl = do_line(meta, styles, config, lines[i])
karaskel.trace("skel_process_lines:4:"..i) karaskel.trace("skel_process_lines:4:"..i..":"..repl.n)
-- Append to result table -- Append to result table
for j = 1, repl.n do for j = 1, repl.n do
table.insert(result, repl[j]) result.n = result.n + 1
result[result.n] = repl[j]
end end
end end
end end

View file

@ -177,3 +177,12 @@ function xor(a, b)
return false return false
end end
end end
-- Lua 5.1 breaks the table.insert function, here's a "fix"
table.org_insert = table.insert
function table.insert(tab, val)
aegisub.output_debug("Warning: this script uses the table.insert function which has changed behaviour in Lua 5.1. This might cause problems. Please update the script so it does not use this function, and instead replace it with code equivalent to the intended behaviour.")
tab.n = tab.n + 1
tab[tab.n] = val
end