forked from mia/Aegisub
Fixes to make karaskel actually work again, and added some real skeleton code (fx_library)
Originally committed to SVN as r1176.
This commit is contained in:
parent
b9298b61e4
commit
5b9a374f6e
1 changed files with 60 additions and 1 deletions
|
@ -46,6 +46,7 @@ function karaskel.collect_head(subs, generate_furigana)
|
||||||
|
|
||||||
local i = 1
|
local i = 1
|
||||||
while i < #subs do
|
while i < #subs do
|
||||||
|
if aegisub.progress.is_cancelled() then error("User cancelled") end
|
||||||
local l = subs[i]
|
local l = subs[i]
|
||||||
|
|
||||||
if l.class == "style" then
|
if l.class == "style" then
|
||||||
|
@ -53,10 +54,11 @@ function karaskel.collect_head(subs, generate_furigana)
|
||||||
styles.n = styles.n + 1
|
styles.n = styles.n + 1
|
||||||
styles[styles.n] = l
|
styles[styles.n] = l
|
||||||
styles[l.name] = l
|
styles[l.name] = l
|
||||||
l.margin_v = l.margin_t
|
l.margin_v = l.margin_t -- convenience
|
||||||
|
|
||||||
-- And also generate furigana styles if wanted
|
-- And also generate furigana styles if wanted
|
||||||
if generate_furigana and not l.name:match("furigana") then
|
if generate_furigana and not l.name:match("furigana") then
|
||||||
|
aegisub.debug.out(5, "Creating furigana style for style: " .. l.name)
|
||||||
local fs = table.copy(l)
|
local fs = table.copy(l)
|
||||||
fs.fontsize = l.fontsize * karaskel.furigana_scale
|
fs.fontsize = l.fontsize * karaskel.furigana_scale
|
||||||
fs.outline = l.outline * karaskel.furigana_scale
|
fs.outline = l.outline * karaskel.furigana_scale
|
||||||
|
@ -66,6 +68,7 @@ function karaskel.collect_head(subs, generate_furigana)
|
||||||
styles.n = styles.n + 1
|
styles.n = styles.n + 1
|
||||||
styles[styles.n] = fs
|
styles[styles.n] = fs
|
||||||
styles[fs.name] = fs
|
styles[fs.name] = fs
|
||||||
|
-- TODO: also actually insert into file
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif l.class == "info" then
|
elseif l.class == "info" then
|
||||||
|
@ -77,6 +80,8 @@ function karaskel.collect_head(subs, generate_furigana)
|
||||||
meta.res_y = math.floor(l.value)
|
meta.res_y = math.floor(l.value)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
i = i + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Fix missing resolution data
|
-- Fix missing resolution data
|
||||||
|
@ -308,3 +313,57 @@ function karaskel.preproc_line(subs, meta, styles, line)
|
||||||
for i = 1, line.furi.n do
|
for i = 1, line.furi.n do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- An actual "skeleton" function
|
||||||
|
-- Parses the first word out of the Effect field of each dialogue line and runs "fx_"..effect on that line
|
||||||
|
-- Lines with empty Effect field run fx_none
|
||||||
|
-- Lines with unimplemented effects are left alone
|
||||||
|
-- If the effect function returns true, the original line is kept in output,
|
||||||
|
-- otherwise the original line is converted to a comment
|
||||||
|
-- General prototype of an fx function: function(subs, meta, styles, line, fxdata)
|
||||||
|
-- fxdata are extra data after the effect name in the Effect field
|
||||||
|
function karaskel.fx_library_main(subs)
|
||||||
|
aegisub.progress.task("Collecting header info")
|
||||||
|
meta, styles = karaskel.collect_head(subs)
|
||||||
|
|
||||||
|
aegisub.progress.task("Processing subs")
|
||||||
|
local i, maxi = 1, #subs
|
||||||
|
while i <= maxi do
|
||||||
|
aegisub.progress.set(i/maxi*100)
|
||||||
|
local l = subs[i]
|
||||||
|
|
||||||
|
if l.class == "dialogue" then
|
||||||
|
aegisub.progress.task(l.text)
|
||||||
|
karaskel.preproc_line(subs, meta, styles, l)
|
||||||
|
local keep = true
|
||||||
|
local fx, fxdata = string.headtail(l.effect)
|
||||||
|
if fx == "" then fx = "none" end
|
||||||
|
if _G["fx_" .. fx] then
|
||||||
|
-- note to casual readers: _G is a special global variable that points to the global environment
|
||||||
|
-- specifically, _G["_G"] == _G
|
||||||
|
keep = _G["fx_" .. fx](subs, meta, styles, l, fxdata)
|
||||||
|
end
|
||||||
|
if not keep then
|
||||||
|
l = subs[i]
|
||||||
|
l.comment = true
|
||||||
|
subs[i] = l
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
i = i + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Register an fx_library type karaoke
|
||||||
|
karaskel.fx_library_registered = false
|
||||||
|
function karaskel.use_fx_library(macrotoo)
|
||||||
|
if karaskel.fx_library_registered then return end
|
||||||
|
aegisub.register_filter(script_name or "fx_library", script_description or "Apply karaoke effects (fx_library skeleton)", 2000, karaskel.fx_library_main)
|
||||||
|
if macrotoo then
|
||||||
|
local function fxlibmacro(subs)
|
||||||
|
karaskel.fx_library_main(subs)
|
||||||
|
aegisub.set_undo_point(script_name or "karaoke effect")
|
||||||
|
end
|
||||||
|
aegisub.register_macro(script_name or "fx_library", script_description or "Apply karaoke effects (fx_library skeleton)", fxlibmacro)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in a new issue