aboutsummaryrefslogtreecommitdiffstats
path: root/macros/garret.shenanigans.lua
diff options
context:
space:
mode:
Diffstat (limited to 'macros/garret.shenanigans.lua')
-rw-r--r--macros/garret.shenanigans.lua79
1 files changed, 79 insertions, 0 deletions
diff --git a/macros/garret.shenanigans.lua b/macros/garret.shenanigans.lua
new file mode 100644
index 0000000..0f8ff3c
--- /dev/null
+++ b/macros/garret.shenanigans.lua
@@ -0,0 +1,79 @@
+script_name = "Import Shenanigans"
+script_description = "imports shenanigans"
+script_author = "garret"
+script_version = "0.1.0"
+script_namespace = "garret.shenanigans"
+
+local SHENAN_PATTERN = "shenan ([^;]*)"
+
+local haveDepCtrl, DependencyControl, depctrl = pcall(require, "l0.DependencyControl")
+local parser
+if haveDepCtrl then
+ depctrl = DependencyControl({
+ --feed="TODO",
+ {
+ {
+ "myaa.ASSParser",
+ version = "0.0.4", -- very sketch about this
+ url = "http://github.com/TypesettingTools/Myaamori-Aegisub-Scripts",
+ feed = "https://raw.githubusercontent.com/TypesettingTools/Myaamori-Aegisub-Scripts/master/DependencyControl.json",
+ optional = true,
+ },
+ },
+ })
+ parser = depctrl:requireModules()
+end
+
+local function main(sub)
+ local imports = {}
+ local i = 1
+
+ -- using a while/repeat until loop instead of a for here, so i can fuck around with the number
+ -- i do this to skip past shenanigans that've already been added without deleting them
+
+ repeat
+ local line = sub[i]
+ if line.class == "dialogue" then
+ if line.effect == "import" then
+ local f = io.open(aegisub.decode_path(line.text), "r")
+ local imported_sub = parser.parse_file(f).events
+ f:close()
+
+ for _, imported_line in ipairs(imported_sub) do
+ if imported_line.class == "dialogue" then
+ local name = imported_line.effect:match(SHENAN_PATTERN)
+ if name then
+ imports[name] = imports[name] or {} -- declare if not present
+ table.insert(imports[name], imported_line)
+ end
+ end
+ end
+ elseif line.effect ~= "" then
+ aegisub.log(5, i..": has effect: "..line.effect)
+ local name = line.effect:match(SHENAN_PATTERN)
+ local shenans = imports[name]
+ if shenans ~= "done" then
+ for idx, val in ipairs(shenans) do
+ sub.insert(i + idx, val)
+ end
+ sub.delete(sub, i)
+ i = i + #shenans - 1
+ imports[name] = "done"
+ elseif shenans == "done" then
+ aegisub.log(5, "deleting "..line.text)
+ sub.delete(sub, i)
+ i = i - 1 -- the next line has now moved up 1, so we need to move up 1 as well
+ -- something about 2 hard problems
+ end
+ end
+ end
+ if i >= #sub then i = #sub end -- otherwise you can get out of range errors
+ i = i + 1
+ until i == #sub + 1
+end
+
+if haveDepCtrl then
+ depctrl:registerMacro(main)
+else
+ aegisub.register_macro(script_name, script_description, main)
+end