Fix for styles table in auto3, broken karaoke-splitter...
Originally committed to SVN as r1163.
This commit is contained in:
parent
6087314600
commit
81b8660348
5 changed files with 112 additions and 2 deletions
|
@ -105,6 +105,8 @@ namespace Automation4 {
|
|||
Auto3Filter(const wxString &_name, const wxString &_description, Auto3Interpreter *_script);
|
||||
|
||||
void ProcessSubs(AssFile *subs, wxWindow *export_dialog);
|
||||
|
||||
virtual ~Auto3Filter() { }
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -241,6 +241,8 @@ namespace Automation4 {
|
|||
public:
|
||||
static int LuaRegister(lua_State *L);
|
||||
|
||||
virtual ~LuaFeatureFilter() { }
|
||||
|
||||
void ProcessSubs(AssFile *subs, wxWindow *export_dialog);
|
||||
};
|
||||
|
||||
|
|
|
@ -674,8 +674,8 @@ static void MakeStylesTable(lua_State *L, struct Auto3Interpreter *script)
|
|||
lua_settable(L, -3);
|
||||
}
|
||||
|
||||
// Finally, make 'n' key in table
|
||||
lua_pushstring(L, "n");
|
||||
// Finally, make -1 key in table (because the name 'n' might clash with a style name)
|
||||
lua_pushnumber(L, -1);
|
||||
lua_pushnumber(L, n);
|
||||
lua_settable(L, -3);
|
||||
}
|
||||
|
|
|
@ -9,7 +9,11 @@ name = "Reading data demonstration"
|
|||
description = "This is a demonstration of how to access the various data passed to an Automation script. It loops over the data structures provided, and dumps them to the debug console."
|
||||
configuration = {}
|
||||
|
||||
include "karaskel-base.auto3"
|
||||
|
||||
function process_lines(meta, styles, lines, config)
|
||||
karaskel.parse_syllable_data(meta, styles, lines)
|
||||
|
||||
-- This makes an alias for the aegisub.output_debug function. Remember that functions are first-class values in Lua.
|
||||
-- The 'local' keyword makes the 'out' variable local to this function
|
||||
local out = aegisub.output_debug
|
||||
|
|
|
@ -67,6 +67,107 @@ function karaskel.trace(s)
|
|||
end
|
||||
end
|
||||
|
||||
-- parse_syllable_data
|
||||
-- Generates the line.karaoke table
|
||||
-- This was moved to Lua code from the C++ code for various technical reasons
|
||||
function karaskel.parse_syllable_data(meta, styles, lines)
|
||||
for i = 0, lines.n-1 do
|
||||
local l = lines[i]
|
||||
local ltext = l.text
|
||||
local indrawing = false
|
||||
|
||||
l.karaoke = { n = 0 }
|
||||
|
||||
local cursyl = {
|
||||
duration = 0,
|
||||
kind = "",
|
||||
text = "",
|
||||
text_stripped = ""
|
||||
}
|
||||
|
||||
l.text_stripped = ""
|
||||
|
||||
while ltext ~= "" do
|
||||
-- Find text part up until next tag start
|
||||
local tagstart = string.find(ltext, "{")
|
||||
|
||||
local textpart
|
||||
if not tstart then
|
||||
-- No tag start was found, rest of line is text
|
||||
textpart = ltext
|
||||
ltext = ""
|
||||
else
|
||||
-- Tag start was found, cut text part out
|
||||
textpart = string.sub(ltext, 1, tagstart)
|
||||
ltext = string.sub(ltext, tagstart+1) -- skip over opening brace
|
||||
end
|
||||
|
||||
-- Append text to relevant strings
|
||||
if not indrawing then
|
||||
l.text_stripped = l.text_stripped .. textpart
|
||||
cursyl.text_stripped = cursyl.text_stripped .. textpart
|
||||
end
|
||||
cursyl.text = cursyl.text .. textpart
|
||||
|
||||
-- If we're out of line text, we're done
|
||||
if ltext == "" then
|
||||
break
|
||||
end
|
||||
|
||||
-- Now find the tag group end
|
||||
local tagend = string.find(ltext, "}")
|
||||
|
||||
local tagpart
|
||||
if not tagend then
|
||||
tagpart = string.sub(ltext, tagstart+1)
|
||||
ltext = ""
|
||||
else
|
||||
tagpart = string.sub(ltext, 1, tagend)
|
||||
ltext = string.sub(ltext, tagend+1)
|
||||
end
|
||||
|
||||
-- Look for interesting tags (karaoke and drawing)
|
||||
while tagpart ~= "" do
|
||||
local tagstart, tagend, tag, param = string.find(tagpart, "\\([kKp]%a*)(%d+)")
|
||||
|
||||
if tag and string.find(tag, "^[kK]") then
|
||||
-- Karaoke tag, split stuff up
|
||||
|
||||
-- If the kara tag wasn't the first thing in the group, prepend previous stuff
|
||||
if tagstart > 1 then
|
||||
cursyl.text = cursyl.text .. "{" .. string.sub(tagpart, 1, tagstart) .. "}"
|
||||
end
|
||||
|
||||
-- Store last tag to table and prepare new one
|
||||
l.karaoke[l.karaoke.n] = cursyl
|
||||
l.karaoke.n = l.karaoke.n + 1
|
||||
cursyl = {
|
||||
duration = param,
|
||||
kind = tag,
|
||||
text = "",
|
||||
text_stripped = ""
|
||||
}
|
||||
|
||||
-- Remove up to and including this tag from the tagpart
|
||||
tagpart = string.sub(tagpart, tagend)
|
||||
|
||||
elseif tag and tag == "p" then
|
||||
-- Switch drawing-mode on/off
|
||||
indrawing = param > 0
|
||||
|
||||
else
|
||||
-- No more interesting tags here
|
||||
cursyl.text = cursyl.text .. "{" .. tagpart .. "}"
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
l.karaoke[l.karaoke.n] = cursyl
|
||||
l.karaoke.n = l.karaoke.n + 1
|
||||
end
|
||||
end
|
||||
|
||||
-- precalc_syllable_data
|
||||
-- Adds various extra fields to the line and syllable tables
|
||||
-- See the implementation and/or Aegisub help file for more information
|
||||
|
@ -277,6 +378,7 @@ function karaskel.process_lines(meta, styles, lines, config)
|
|||
karaskel.trace("new skeleton")
|
||||
karaskel.trace("skel_process_lines")
|
||||
-- Do a little pre-calculation for each line and syllable
|
||||
karaskel.parse_syllable_data(meta, styles, lines)
|
||||
karaskel.precalc_syllable_data(meta, styles, lines)
|
||||
karaskel.trace("skel_process_lines:2")
|
||||
-- A var for the new output
|
||||
|
|
Loading…
Reference in a new issue