diff --git a/aegisub/auto4_lua.cpp b/aegisub/auto4_lua.cpp index 5e422401e..68c04d11a 100644 --- a/aegisub/auto4_lua.cpp +++ b/aegisub/auto4_lua.cpp @@ -55,7 +55,8 @@ namespace Automation4 { // LuaStackcheck -#ifdef _DEBUG +//#ifdef _DEBUG +#if 0 struct LuaStackcheck { lua_State *L; int startstack; @@ -241,7 +242,7 @@ namespace Automation4 { // load user script LuaScriptReader script_reader(GetFilename()); - if (lua_load(L, script_reader.reader_func, &script_reader, GetFilename().mb_str(wxConvUTF8))) { + if (lua_load(L, script_reader.reader_func, &script_reader, GetPrettyFilename().mb_str(wxConvUTF8))) { wxString *err = new wxString(lua_tostring(L, -1), wxConvUTF8); err->Prepend(_T("Error loading Lua script \"") + GetPrettyFilename() + _T("\":\n\n")); throw err->c_str(); @@ -412,7 +413,7 @@ namespace Automation4 { } LuaScriptReader script_reader(fname.GetFullPath()); - if (lua_load(L, script_reader.reader_func, &script_reader, s->GetFilename().mb_str(wxConvUTF8))) { + if (lua_load(L, script_reader.reader_func, &script_reader, fname.GetFullName().mb_str(wxConvUTF8))) { lua_pushfstring(L, "Error loading Lua include \"%s\":\n\n%s", fname.GetFullPath().mb_str(wxConvUTF8).data(), lua_tostring(L, -1)); lua_error(L); return 0; @@ -475,6 +476,15 @@ namespace Automation4 { lua_getfield(L, LUA_REGISTRYINDEX, "progress_sink"); if (lua_isuserdata(L, -1)) { LuaProgressSink *ps = LuaProgressSink::GetObjPointer(L, -1); + + if (result) { + // if the call failed, log the error here + wxString errmsg(lua_tostring(L, -2), wxConvUTF8); + ps->AddDebugOutput(_T("\n\nLua reported a runtime error:\n")); + ps->AddDebugOutput(errmsg); + lua_pop(L, 1); + } + // don't bother protecting this with a mutex, it should be safe enough like this ps->script_finished = true; // tell wx to run its idle-events now, just to make the progress window notice earlier that we're done @@ -628,7 +638,7 @@ namespace Automation4 { ps->ShowModal(); wxThread::ExitCode code = call.Wait(); - if (code) ThrowError(); + //if (code) ThrowError(); delete ps; } @@ -676,6 +686,7 @@ namespace Automation4 { void LuaFeatureFilter::ProcessSubs(AssFile *subs, wxWindow *export_dialog) { GetFeatureFunction(1); // 1 = processing function + assert(lua_isfunction(L, -1)); // prepare function call // subtitles (undo doesn't make sense in exported subs, in fact it'll totally break the undo system) @@ -685,6 +696,9 @@ namespace Automation4 { if (has_config && config_dialog) { assert(config_dialog->LuaReadBack(L) == 1); // TODO, write back stored options here + } else { + // no config so put an empty table instead + lua_newtable(L); } LuaProgressSink *ps = new LuaProgressSink(L, export_dialog, false); @@ -695,7 +709,7 @@ namespace Automation4 { ps->ShowModal(); wxThread::ExitCode code = call.Wait(); - if (code) ThrowError(); + //if (code) ThrowError(); delete ps; } @@ -722,12 +736,16 @@ namespace Automation4 { ps->ShowModal(); wxThread::ExitCode code = call.Wait(); - if (code) ThrowError(); + //if (code) ThrowError(); delete ps; // The config dialog table should now be on stack - return config_dialog = new LuaConfigDialog(L, false); + if (!code) { + return config_dialog = new LuaConfigDialog(L, false); + } else { + return config_dialog = 0; + } } diff --git a/aegisub/base_grid.cpp b/aegisub/base_grid.cpp index b4dea94f4..9aac317a2 100644 --- a/aegisub/base_grid.cpp +++ b/aegisub/base_grid.cpp @@ -865,7 +865,9 @@ void BaseGrid::SetColumnWidths() { // Gets dialogue from map AssDialogue *BaseGrid::GetDialogue(int n) { try { - return AssEntry::GetAsDialogue(*(diagMap.at(n))); + AssEntry *e = *diagMap.at(n); + if (e->GetType() != ENTRY_DIALOGUE) return NULL; + return AssEntry::GetAsDialogue(e); } catch (...) { return NULL; diff --git a/aegisub/frame_main_events.cpp b/aegisub/frame_main_events.cpp index 5ce99903e..37842d31a 100644 --- a/aegisub/frame_main_events.cpp +++ b/aegisub/frame_main_events.cpp @@ -998,11 +998,13 @@ void FrameMain::OnOpenAutomation (wxCommandEvent &event) { /////////////////////////////////////////////////////////// // General handler for all Automation-generated menu items void FrameMain::OnAutomationMacro (wxCommandEvent &event) { + // Clear all maps from the subs grid before running the macro + // The stuff done by the macro might invalidate some of the iterators held by the grid, which will cause great crashing + SubsBox->Clear(); + // Run the macro... activeMacroItems[event.GetId()-Menu_Automation_Macro]->Process(SubsBox->ass, SubsBox->GetAbsoluteSelection(), SubsBox->GetFirstSelRow(), this); - // check if modifications were made and put on undo stack - AssFile::Popping = true; // HACK to avoid getting an additional undo point on stack - SubsBox->LoadFromAss(AssFile::top, true, true); - AssFile::Popping = false; + // Have the grid update its maps, this properly refreshes it to reflect the changed subs + SubsBox->UpdateMaps(); } diff --git a/automation/include/karaskel.lua b/automation/include/karaskel.lua index e7412d14c..55f3267b6 100644 --- a/automation/include/karaskel.lua +++ b/automation/include/karaskel.lua @@ -52,7 +52,7 @@ function karaskel.collect_head(subs) local l = subs[i] if l.class == "style" then styles.n = styles.n + 1 - styles[n] = l + styles[styles.n] = l styles[l.name] = l elseif l.class == "info" then local k = l.key:lower() @@ -91,23 +91,23 @@ end -- Modifies the line parameter function karaskel.preproc_line(subs, meta, styles, line) -- Assume line is class=dialogue - local kara = aegisub.parse_karaoke_data(line.text) + local kara = aegisub.parse_karaoke_data(line) line.kara = { n = 0 } line.furi = { n = 0 } if styles[line.style] then - line.style = styles[line.style] + line.styleref = styles[line.style] else - aegisub.debug.out("WARNING: Style not found: " .. line.style .. "\n") - line.style = styles[1] + aegisub.debug.out(2, "WARNING: Style not found: " .. line.style .. "\n") + line.styleref = styles[1] end line.text_stripped = "" local curx = 0 local worksyl = { } - for i = 0, #line.kara do - local syl = line.kara[i] + for i = 0, #kara do + local syl = kara[i] -- Spaces at the start and end of the syllable are best ignored local prespace, syltext, postspace = syl.text_stripped:match("^([ \t]*)(.-)([ \t]*)$") @@ -155,7 +155,7 @@ function karaskel.preproc_line(subs, meta, styles, line) -- If this is the start of a highlight group, do regular processing if prefix ~= "#" and prefix ~= "#" then -- Update stripped line-text - line.text_stripped = line.text_stripped + syl.text_stripped + line.text_stripped = line.text_stripped .. syl.text_stripped -- Copy data from syl to worksyl worksyl.text = syl.text @@ -165,16 +165,16 @@ function karaskel.preproc_line(subs, meta, styles, line) worksyl.end_time = syl.end_time worksyl.tag = syl.tag worksyl.line = line - worksyl.style = line.style + worksyl.style = line.styleref -- And add new data to worksyl worksyl.text_stripped = syltext - worksyl.width = aegisub.text_extents(line.style, syltext) - curx = curx + aegisub.text_extents(line.style, prespace) + worksyl.width = aegisub.text_extents(line.styleref, syltext) + curx = curx + aegisub.text_extents(line.styleref, prespace) worksyl.left = curx worksyl.center = curx + worksyl.width/2 worksyl.right = curx + worksyl.width - curx = curx + worksyl.width + aegisub.text_extents(line.style, postspace) + curx = curx + worksyl.width + aegisub.text_extents(line.styleref, postspace) -- TODO: inlinefx here end @@ -192,10 +192,12 @@ function karaskel.preproc_line(subs, meta, styles, line) line.kara[line.kara.n] = worksyl -- Full line sizes - line.width, line.height, line.descent, line.extlead = aegisub.text_extents(line.style, line.text_stripped) + line.width, line.height, line.descent, line.extlead = aegisub.text_extents(line.styleref, line.text_stripped) + -- And positioning (FIXME: assume centering for now) + line.left = (meta.res_x - line.styleref.margin_l - line.styleref.margin_r - line.width) / 2 + line.styleref.margin_l -- Generate furigana style - local furistyle = table.copy(line.style) + local furistyle = table.copy(line.styleref) furistyle.fontsize = furistyle.fontsize / 2 furistyle.outline = furistyle.outline / 2 diff --git a/automation/include/unicode.lua b/automation/include/unicode.lua index e278214f1..2f9ce952d 100644 --- a/automation/include/unicode.lua +++ b/automation/include/unicode.lua @@ -35,7 +35,12 @@ module("unicode") -- Return the number of bytes occupied by the character starting at the i'th byte in s function charwidth(s, i) local b = s:byte(i) - if b < 128 then + if not b then + --aegisub.debug.out(3, "unicode.charwidth of '%s' @ %d, nil byte\n", s, i) + -- FIXME, something in karaskel results in this case, shouldn't happen + -- What would "proper" behaviour be? Zero? Or just explode? + return 1 + elseif b < 128 then return 1 elseif b < 224 then return 2 diff --git a/automation/include/utils.lua b/automation/include/utils.lua index 0656ee731..fc798c223 100644 --- a/automation/include/utils.lua +++ b/automation/include/utils.lua @@ -143,3 +143,14 @@ function string.headtail(s) return s, "" end end + +-- Clamp a number value to a range +function clamp(val, min, max) + if val < min then + return min + elseif val > max then + return max + else + return val + end +end