mirror of https://github.com/odrling/Aegisub
Template parsing seems to be done
Originally committed to SVN as r945.
This commit is contained in:
parent
6055eea81f
commit
ef403060f8
|
@ -43,22 +43,29 @@ include("karaskel.lua")
|
||||||
-- Find and parse/prepare all karaoke template lines
|
-- Find and parse/prepare all karaoke template lines
|
||||||
function parse_templates(meta, styles, subs)
|
function parse_templates(meta, styles, subs)
|
||||||
local templates = { once = {}, line = {}, syl = {}, char = {}, furi = {} }
|
local templates = { once = {}, line = {}, syl = {}, char = {}, furi = {} }
|
||||||
for l = 1, #subs do
|
for i = 1, #subs do
|
||||||
|
aegisub.progress.set((i-1) / #subs * 100)
|
||||||
local l = subs[i]
|
local l = subs[i]
|
||||||
if l.class == "dialogue" and l.comment then
|
if l.class == "dialogue" and l.comment then
|
||||||
local fx, fxtail = string.headtail(l.effect)
|
local fx, mods = string.headtail(l.effect)
|
||||||
fx = fx:lower()
|
fx = fx:lower()
|
||||||
if fx == "code" then
|
if fx == "code" then
|
||||||
parse_code(meta, styles, l, templates, fxtail)
|
parse_code(meta, styles, l, templates, mods)
|
||||||
elseif fx == "template" then
|
elseif fx == "template" then
|
||||||
parse_template(meta, styles, l, templates, fxtail)
|
parse_template(meta, styles, l, templates, mods)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
aegisub.progress.set(100)
|
||||||
|
return templates
|
||||||
end
|
end
|
||||||
|
|
||||||
function parse_code(meta, styles, line, templates, mods)
|
function parse_code(meta, styles, line, templates, mods)
|
||||||
local template = { code = line.text, loops = 1, all = false }
|
local template = {
|
||||||
|
code = line.text,
|
||||||
|
loops = 1,
|
||||||
|
style = line.style
|
||||||
|
}
|
||||||
local inserted = false
|
local inserted = false
|
||||||
|
|
||||||
local rest = mods
|
local rest = mods
|
||||||
|
@ -82,8 +89,8 @@ function parse_code(meta, styles, line, templates, mods)
|
||||||
table.insert(templates.furi, template)
|
table.insert(templates.furi, template)
|
||||||
inserted = true
|
inserted = true
|
||||||
elseif m == "all" then
|
elseif m == "all" then
|
||||||
template.all = true
|
template.style = nil
|
||||||
elseif m == "repeat" then
|
elseif m == "repeat" or m == "loop" then
|
||||||
local times, t = string.headtail(rest)
|
local times, t = string.headtail(rest)
|
||||||
template.loops = tonumber(times)
|
template.loops = tonumber(times)
|
||||||
if not template.loops then
|
if not template.loops then
|
||||||
|
@ -92,6 +99,8 @@ function parse_code(meta, styles, line, templates, mods)
|
||||||
else
|
else
|
||||||
rest = t
|
rest = t
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
aegisub.out(3, "Unknown modifier in code template: %s\nIn template code line: %s\nEffect field: %s\n\n", m, line.text, line.effect)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -100,7 +109,109 @@ function parse_code(meta, styles, line, templates, mods)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
template_modifiers = {
|
||||||
|
"pre-line", "line", "syl", "char", "furi",
|
||||||
|
"all", "repeat", "loop", "notext", "keeptags", "multi", "fx"
|
||||||
|
}
|
||||||
|
|
||||||
function parse_template(meta, styles, line, templates, mods)
|
function parse_template(meta, styles, line, templates, mods)
|
||||||
|
local template = {
|
||||||
|
t = "",
|
||||||
|
pre = "",
|
||||||
|
style = line.style,
|
||||||
|
loops = 1,
|
||||||
|
addtext = true,
|
||||||
|
keeptags = false,
|
||||||
|
inline_fx = nil,
|
||||||
|
multi = false,
|
||||||
|
isline = false
|
||||||
|
}
|
||||||
|
local inserted = false
|
||||||
|
|
||||||
|
local rest = mods
|
||||||
|
while rest ~= "" do
|
||||||
|
local m, t = string.headtail(rest)
|
||||||
|
rest = t
|
||||||
|
m = m:lower()
|
||||||
|
if (m == "pre-line" or m == "line") and not inserted then
|
||||||
|
-- should really fail if already inserted
|
||||||
|
local id, t = string.headtail(rest)
|
||||||
|
id = id:lower()
|
||||||
|
-- check that it really is an identifier and not a keyword
|
||||||
|
for _, kw in pairs(template_modifiers) do
|
||||||
|
if id == kw then
|
||||||
|
id = nil
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if id then
|
||||||
|
rest = t
|
||||||
|
end
|
||||||
|
-- get old template if there is one
|
||||||
|
if id and templates.line[id] then
|
||||||
|
template = templates.line[id]
|
||||||
|
elseif id then
|
||||||
|
template.id = id
|
||||||
|
templates.line[id] = template
|
||||||
|
else
|
||||||
|
table.insert(templates.line, template)
|
||||||
|
end
|
||||||
|
inserted = true
|
||||||
|
template.isline = true
|
||||||
|
-- apply text to correct string
|
||||||
|
if m == "line" then
|
||||||
|
template.t = template.t .. line.text
|
||||||
|
else -- must be pre-line
|
||||||
|
template.pre = template.pre .. line.text
|
||||||
|
end
|
||||||
|
elseif m == "syl" and not template.isline then
|
||||||
|
table.insert(templates.syl, template)
|
||||||
|
inserted = true
|
||||||
|
elseif m == "char" and not template.isline then
|
||||||
|
table.insert(templates.char, template)
|
||||||
|
inserted = true
|
||||||
|
elseif m == "furi" and not template.isline then
|
||||||
|
aegisub.debug.out(3, "Warning, furi template class used but furigana support isn't implemented yet\n\n")
|
||||||
|
table.insert(templates.furi, template)
|
||||||
|
inserted = true
|
||||||
|
elseif (m == "pre-line" or m == "line") and inserted then
|
||||||
|
aegisub.out(2, "Unable to combine %s class templates with other template classes\n\n", m)
|
||||||
|
elseif (m == "syl" or m == "char" or m == "furi") and template.isline then
|
||||||
|
aegisub.out(2, "Unable to combine %s class template lines with line or pre-line classes\n\n", m)
|
||||||
|
elseif m == "all" then
|
||||||
|
template.style = nil
|
||||||
|
elseif m == "repeat" or m == "loop" then
|
||||||
|
local times, t = string.headtail(rest)
|
||||||
|
template.loops = tonumber(times)
|
||||||
|
if not template.loops then
|
||||||
|
aegisub.out(3, "Failed reading this repeat-count to a number: %s\nIn template line: %s\nEffect field: %s\n\n", times, line.text, line.effect)
|
||||||
|
template.loops = 1
|
||||||
|
else
|
||||||
|
rest = t
|
||||||
|
end
|
||||||
|
elseif m == "notext" then
|
||||||
|
template.addtext = false
|
||||||
|
elseif m == "keeptags" then
|
||||||
|
template.keeptags = true
|
||||||
|
elseif m == "multi" then
|
||||||
|
template.multi = true
|
||||||
|
elseif m == "fx" then
|
||||||
|
local fx, t = string.headtail(rest)
|
||||||
|
if fx ~= "" then
|
||||||
|
template.fx = fx
|
||||||
|
rest = t
|
||||||
|
else
|
||||||
|
aegisub.out(3, "No fx name following fx modifier\nIn template line: %s\nEffect field: %s\n\n", line.text, line.effect)
|
||||||
|
template.fx = nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
aegisub.out(3, "Unknown modifier in template: %s\nIn template line: %s\nEffect field: %s\n\n", m, line.text, line.effect)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not inserted then
|
||||||
|
table.insert(templates.syl, template)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -114,7 +225,7 @@ function apply_templates(meta, styles, subs, templates)
|
||||||
}
|
}
|
||||||
|
|
||||||
-- run all run-once code snippets
|
-- run all run-once code snippets
|
||||||
for k, t in pairs(templates.code) do
|
for k, t in pairs(templates.once) do
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -37,7 +37,7 @@ Comment: 0,0:00:50.00,0:00:55.00,Default,,0000,0000,0000,template syl repeat 10,
|
||||||
Comment: 0,0:00:55.00,0:01:00.00,Default,,0000,0000,0000,template syl all,{this template is used for any style, not just the one specified}
|
Comment: 0,0:00:55.00,0:01:00.00,Default,,0000,0000,0000,template syl all,{this template is used for any style, not just the one specified}
|
||||||
Comment: 0,0:00:55.00,0:01:00.00,Default,,0000,0000,0000,template syl multi,{every highlight of a syllable generates a line from this, timing is changed to match current highlight}
|
Comment: 0,0:00:55.00,0:01:00.00,Default,,0000,0000,0000,template syl multi,{every highlight of a syllable generates a line from this, timing is changed to match current highlight}
|
||||||
Comment: 0,0:00:55.00,0:01:00.00,Default,,0000,0000,0000,template syl fx foo,{only applied for syllables with inline-fx "foo"}
|
Comment: 0,0:00:55.00,0:01:00.00,Default,,0000,0000,0000,template syl fx foo,{only applied for syllables with inline-fx "foo"}
|
||||||
Comment: 0,0:00:55.00,0:01:00.00,Default,,0000,0000,0000,template syl notext repeat 10,{modifiers can be combined}
|
Comment: 0,0:00:55.00,0:01:00.00,Default,,0000,0000,0000,template syl notext loop 10,{modifiers can be combined, loop is another name for repeat}
|
||||||
Comment: 0,0:01:00.00,0:01:05.00,Default,,0000,0000,0000,template char,{each character generates a line like this, with the character appended. positioning variables matches the character and timing matches syllable}
|
Comment: 0,0:01:00.00,0:01:05.00,Default,,0000,0000,0000,template char,{each character generates a line like this, with the character appended. positioning variables matches the character and timing matches syllable}
|
||||||
Comment: 0,0:01:05.00,0:01:10.00,Default,,0000,0000,0000,template char multi,{multi highlight also supported for char, as well as repeat and notext}
|
Comment: 0,0:01:05.00,0:01:10.00,Default,,0000,0000,0000,template char multi,{multi highlight also supported for char, as well as repeat and notext}
|
||||||
Comment: 0,0:01:10.00,0:01:15.00,Default,,0000,0000,0000,template furi,{each furigana part generates a line like this, a new style with changed font size is automatically generated and applied}
|
Comment: 0,0:01:10.00,0:01:15.00,Default,,0000,0000,0000,template furi,{each furigana part generates a line like this, a new style with changed font size is automatically generated and applied}
|
||||||
|
@ -52,6 +52,12 @@ Dialogue: 0,0:01:50.00,0:01:55.00,Default,,0000,0000,0000,,ie. first all pre-lin
|
||||||
Dialogue: 0,0:01:55.00,0:02:00.00,Default,,0000,0000,0000,,code and template lines within same class are executed intermixed as they appear
|
Dialogue: 0,0:01:55.00,0:02:00.00,Default,,0000,0000,0000,,code and template lines within same class are executed intermixed as they appear
|
||||||
Dialogue: 0,0:02:00.00,0:02:05.00,Default,,0000,0000,0000,,(code lines are like template lines, they just don't generate any output)
|
Dialogue: 0,0:02:00.00,0:02:05.00,Default,,0000,0000,0000,,(code lines are like template lines, they just don't generate any output)
|
||||||
Dialogue: 0,0:02:05.00,0:02:05.00,Default,,0000,0000,0000,,the 'all' modifier should be used carefully, it will catch *any* line, even those without karaoke tags in them
|
Dialogue: 0,0:02:05.00,0:02:05.00,Default,,0000,0000,0000,,the 'all' modifier should be used carefully, it will catch *any* line, even those without karaoke tags in them
|
||||||
Dialogue: 0,0:02:05.00,0:02:05.00,Default,,0000,0000,0000,,
|
Dialogue: 0,0:02:05.00,0:02:05.00,Default,,0000,0000,0000,,if 'keeptags' is used, tags in syllable zero are prepended to the line and tags in the current syllable are inserted between the template text and syllable text (this is not compatible with 'notext')
|
||||||
|
Dialogue: 0,0:02:05.00,0:02:05.00,Default,,0000,0000,0000,,the optional identifier for 'pre-line'/'line' can be any string, but numbers are recommended as they won't clash with other modifiers (you can also insert some other special character at the start of the identifier though) - ascii identifiers are case insensitive
|
||||||
|
Dialogue: 0,0:02:05.00,0:02:05.00,Default,,0000,0000,0000,,'line' templates with identifiers can be used to split long effect lines into several, however they are simply concatenated when parsed, not processed separately
|
||||||
|
Dialogue: 0,0:02:05.00,0:02:05.00,Default,,0000,0000,0000,,also, there is no guarantee of execution order of non-anonymous 'line' templates
|
||||||
|
Dialogue: 0,0:02:05.00,0:02:05.00,Default,,0000,0000,0000,,anonymous 'line' templates can't have 'pre-line' templates
|
||||||
|
Dialogue: 0,0:02:05.00,0:02:05.00,Default,,0000,0000,0000,,while 'syl', 'char' and 'furi' can freely be combined in one line, 'line' and 'pre-line' can't live with any other class, not even each other (ie. you can't have 'line pre-line', 'line syl', 'syl pre-line' etc.)
|
||||||
|
Dialogue: 0,0:02:05.00,0:02:05.00,Default,,0000,0000,0000,,'syl' is the default for templates with no other class specified, like 'once' is the default for code
|
||||||
Comment: 0,0:02:05.00,0:02:10.00,Default,template,0000,0000,0000,,auto3 multi-template style is not supported, it'll need a different script (supporting it all in one will be more work than it's worth, probably, particularily because of differences in variables)
|
Comment: 0,0:02:05.00,0:02:10.00,Default,template,0000,0000,0000,,auto3 multi-template style is not supported, it'll need a different script (supporting it all in one will be more work than it's worth, probably, particularily because of differences in variables)
|
||||||
Dialogue: 0,0:02:10.00,0:02:15.00,Default,,0000,0000,0000,,
|
Dialogue: 0,0:02:10.00,0:02:15.00,Default,,0000,0000,0000,,
|
||||||
|
|
Loading…
Reference in New Issue