aboutsummaryrefslogtreecommitdiffstats
path: root/macros/garret.shenanigans.lua
blob: 0f8ff3c3b4dc91919662d71fa5994d5219bc2b70 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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