-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathKaraoke_Templater_Reference__Template_execution_rules_and_order.html
496 lines (483 loc) · 32.1 KB
/
Karaoke_Templater_Reference__Template_execution_rules_and_order.html
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="keywords" content="Karaoke Templater Reference: Template execution rules and order,Automation,Automation 4 Lua Configuration dialogues,Automation 4 Lua Miscellaneous APIs,Automation 4 Lua Progress reporting,Automation 4 Lua Registration,Automation 4 Lua Subtitle file interface,Automation 4 karaskel.lua,Automation 4 unicode.lua,Automation 4 utils.lua,Automation Manager" />
<link rel="shortcut icon" href="/favicon.ico" />
<link rel="search" type="application/opensearchdescription+xml" href="./opensearch_desc.php" title="Aegisub Manual (English)" />
<title>Karaoke Templater Reference: Template execution rules and order - Aegisub Manual</title>
<style type="text/css" media="screen,projection">/*<![CDATA[*/ @import "./skins/aegisub/main.css"; /*]]>*/</style>
<link rel="stylesheet" type="text/css" media="print" href="./skins/common/commonPrint.css" />
<!--[if lt IE 5.5000]><style type="text/css">@import "./skins/aegisub/IE50Fixes.css";</style><![endif]-->
<!--[if IE 5.5000]><style type="text/css">@import "./skins/aegisub/IE55Fixes.css";</style><![endif]-->
<!--[if gte IE 6]><style type="text/css">@import "./skins/aegisub/IE60Fixes.css";</style><![endif]-->
<!--[if IE]><script type="text/javascript" src="/docs/skins/common/IEFixes.js"></script>
<meta http-equiv="imagetoolbar" content="no" /><![endif]-->
<script type= "text/javascript">/*<![CDATA[*/
var skin = "aegisub";
var stylepath = "/docs/skins";
var wgArticlePath = "/docs/$1";
var wgScriptPath = "/docs";
var wgServer = "http://aegisub.cellosoft.com";
var wgCanonicalNamespace = "";
var wgCanonicalSpecialPageName = false;
var wgNamespaceNumber = 0;
var wgPageName = "Karaoke_Templater_Reference:_Template_execution_rules_and_order";
var wgTitle = "Karaoke Templater Reference: Template execution rules and order";
var wgAction = "view";
var wgArticleId = "71";
var wgIsArticle = true;
var wgUserName = null;
var wgUserGroups = null;
var wgUserLanguage = "en";
var wgContentLanguage = "en";
var wgBreakFrames = false;
var wgCurRevisionId = "713";
/*]]>*/</script>
<script type="text/javascript" src="./skins/common/wikibits.js_63.html"><!-- wikibits js --></script>
<script type="text/javascript" src="/docs/index.php?title=-&action=raw&gen=js"><!-- site js --></script>
<style type="text/css">/*<![CDATA[*/
@import "./Common.css";
@import "./Aegisub.css";
@import "/docs/index.php?title=-&action=raw&gen=css&maxage=18000";
/*]]>*/</style>
<!-- Head Scripts -->
<style>
.editsection { display: none; }
</style>
</head>
<body class="mediawiki ns-0 ltr page-Karaoke_Templater_Reference_Template_execution_rules_and_order">
<div id="globalWrapper">
<div id="column-content">
<div id="content">
<a name="top" id="contentTop"></a>
<h1 class="firstHeading">Karaoke Templater Reference: Template execution rules and order</h1>
<div id="bodyContent">
<h3 id="siteSub">From Aegisub Manual</h3>
<div id="contentSub"></div>
<!-- start content -->
<p>This page describes various technical details about how Karaoke Templater (<i>kara-templater</i>) works and will try to explain why various things work as they do and why some things can't and won't work.
</p><p>Most of this is technical details you don't need to know to use kara-templater, but if you see some behaviour you don't understand this page might explain it.
</p>
<table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1"><a href="#Concepts"><span class="tocnumber">1</span> <span class="toctext">Concepts</span></a></li>
<li class="toclevel-1"><a href="#Startup"><span class="tocnumber">2</span> <span class="toctext">Startup</span></a>
<ul>
<li class="toclevel-2"><a href="#Collecting.2C_parsing_and_compiling_templates"><span class="tocnumber">2.1</span> <span class="toctext">Collecting, parsing and compiling templates</span></a></li>
<li class="toclevel-2"><a href="#Clean-up"><span class="tocnumber">2.2</span> <span class="toctext">Clean-up</span></a></li>
<li class="toclevel-2"><a href="#Initialising_the_tenv"><span class="tocnumber">2.3</span> <span class="toctext">Initialising the tenv</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="#Run_once_templates"><span class="tocnumber">3</span> <span class="toctext">Run once templates</span></a></li>
<li class="toclevel-1"><a href="#Iterate_through_karaoke_lines_in_file"><span class="tocnumber">4</span> <span class="toctext">Iterate through karaoke lines in file</span></a>
<ul>
<li class="toclevel-2"><a href="#Matching_a_template_against_a_line"><span class="tocnumber">4.1</span> <span class="toctext">Matching a template against a line</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="#Applying_line_class_templates"><span class="tocnumber">5</span> <span class="toctext">Applying line class templates</span></a></li>
<li class="toclevel-1"><a href="#Applying_syl_and_furi_class_templates"><span class="tocnumber">6</span> <span class="toctext">Applying syl and furi class templates</span></a></li>
<li class="toclevel-1"><a href="#Old_mid-level_description"><span class="tocnumber">7</span> <span class="toctext">Old mid-level description</span></a></li>
</ul>
</td></tr></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
<a name="Concepts"></a><h2><span class="editsection">[edit]</span> <span class="mw-headline"> Concepts </span></h2>
<p>These are some terms and concepts used throughout the description. The names are close to or the same as those used in the actual script.
</p>
<ul><li> <b>tenv</b> - The <b>t</b>emplate <b>env</b>ironment, or <a href="./Karaoke_Templater_Reference__Code_execution_environment.html" title="Karaoke Templater Reference: Code execution environment">code execution environment</a>.
</li><li> <b>varctx</b> - The inline <b>var</b>iable <b>c</b>on<b>t</b>e<b>x</b>t, the storage for the actual values of the <a href="./Karaoke_Templater_Reference__Inline_variables.html" title="Karaoke Templater Reference: Inline variables">inline variables</a>.
</li><li> <b>template</b> - The basic "execution unit" of kara-templater, a template is essentially a mini-program compiled and executed by kara-templater.
</li><li> <b>code template</b> - A template that runs a chunk of Lua code but doesn't produce output. (Declared with the <i>code</i> keyword.)
</li><li> <b>output template</b> - A template that produces output lines from some karaoke data input. (Declared with the <i>template</i> keyword.)
</li><li> <b>code line</b> - A line in the subtitle that defines a code template.
</li><li> <b>template line</b> - A line in the subtitle file that defines an output template, or part of one. (One <i>line</i> class output template can span multiple template lines.)
</li><li> <b>class</b> - A class is a kind of template. There's four basic classes, <i>once</i>, <i>line</i>, <i>syl</i> and <i>furi</i>, the first only available for code templates.
</li><li> <b>modifier</b> - Modifiers affect how and when templates are executed.
</li><li> <b>template text</b> or just <b>text</b> - The "text" part of a template, either the Lua code in a code template or the template code in output templates. <i>line</i> class output templates also have a <i>pre-line text</i>.
</li></ul>
<a name="Startup"></a><h2><span class="editsection">[edit]</span> <span class="mw-headline"> Startup </span></h2>
<p>The first thing kara-templater does is simply use <a href="./Automation_4_karaskel.lua.html" title="Automation 4 karaskel.lua">karaskel</a> to collect some basic information on the subtitle file. It always passes <code>true</code> for <i>generate_furigana</i> in the <code>karaskel.collect_head</code> function, meaning that <a href="./Furigana_karaoke.html" title="Furigana karaoke">furigana</a> styles are always generated, unless they already exist.
</p><p>It then collects all template lines in the file.
</p>
<a name="Collecting.2C_parsing_and_compiling_templates"></a><h3><span class="editsection">[edit]</span> <span class="mw-headline"> Collecting, parsing and compiling templates </span></h3>
<p>Every line in the file is visited and checked for being a template line, ie. be a comment and have the first word in the Effect field be <i>code</i> or <i>template</i>.
</p><p>The details aren't important here, but every modifier name found in the Effect field either sets a flag in the template or a value corresponding to the parameter given to the modifier.
</p><p>When a named <i>line</i> class template lines is encountered, first it's checked if there is already a <i>line</i> class template with that name. If there isn't one, a new one is created with that name and initialised with the given modifiers. If there is already one with that name, <i>the text of the template line is appended to the current text of the template</i> and modifiers present in the new template line but not in the current template are added to the template. Modifiers cannot be removed from templates in this way or any other way. The text of <i>pre-line</i> template lines is added to the <i>pre-line text</i> of the template rather than the regular text.
</p><p>The templates of different classes are each put in their own "bucket", so for example <i>line</i> and <i>syl</i> templates are not kept together.
</p>
<a name="Clean-up"></a><h3><span class="editsection">[edit]</span> <span class="mw-headline"> Clean-up </span></h3>
<p>After all templates have been collected etc., all old and no longer needed lines are deleted from the subtitle file. This mainly includes lines with <i>fx</i> in the Effect field, as those are assumed to have been generated in a previous run of kara-templater, so they should be replaced in this new run.
</p>
<a name="Initialising_the_tenv"></a><h3><span class="editsection">[edit]</span> <span class="mw-headline"> Initialising the <i>tenv</i> </span></h3>
<p>The last thing done before starting actually running the templates is initialising the runtime environment for the templates. Basically, as much as possible before any templates are run, is put into <i>tenv</i>. See <a href="./Karaoke_Templater_Reference__Code_execution_environment.html" title="Karaoke Templater Reference: Code execution environment">Code execution environment</a> for more details on what's in there. (Basically everything but <code>line</code>, <code>orgline</code>, <code>syl</code> and <code>basesyl</code>.)
</p>
<a name="Run_once_templates"></a><h2><span class="editsection">[edit]</span> <span class="mw-headline"> Run <i>once</i> templates </span></h2>
<p>All templates in the <i>once</i> class are executed first. Nothing truly exciting happens here, the main thing that can happen is that some more things are added to <i>tenv</i>.
</p>
<a name="Iterate_through_karaoke_lines_in_file"></a><h2><span class="editsection">[edit]</span> <span class="mw-headline"> Iterate through karaoke lines in file </span></h2>
<p>Every non-template line in the file is now run through and has all templates attempted applied in order.
</p>
<ul><li> If a line is a comment and its Effect field doesn't contain <tt>Karaoke</tt> it is skipped immediately.
</li><li> If a line is not a comment and its Effect field contains anything else that <tt>Karaoke</tt> or nothing (is blank) it is skipped immediately.
</li><li> Kara-templater attempts to match all templates against all other lines.
</li></ul>
<p>Each line that hasn't been rejected by the above points is now run through all templates in three steps.
</p><p>First, all <i>line</i> class templates are attempted matched against the line and then run on the line. See below for a definition of when a template matches a line.
</p><p>Next, all syllables on the line are run through in order and for each, all <i>syl</i> class templates are attempted matched against the line and then run on the syllable.
</p><p>Finally, all furigana syllables on the line are run through in order, for each every <i>furi</i> class template is attempted matched against the line and then run on the furigana syllable.
</p><p>It is important to note that the syllables and furigana syllables looped through are the parsed-stored syllables, not multi-highlight virtual syllables, not per-character virtual syllables and not a combination.
</p>
<div style="margin: 0.3em 2em; padding: 0.3em; padding-left: 0.8em; background: #f0f0e9; border-left: 1px solid #aaa;"><p style="margin: 0; padding-bottom: 0.3em; font-size: 115%; font-weight: bold;">Example</p><div style="margin-left: 1em;">
<p>Assume there are three <i>syl</i> class templates: A, B and C.
</p>
<ul><li> A is a regular template with neither <i>multi</i> nor <i>char</i> modifier.
</li><li> B has the <i>multi</i> modifier but not <i>char</i>.
</li><li> C has both the <i>char</i> and <i>multi</i> modifiers.
</li></ul>
<p>Now these templates are applied against a line with 2 syllables. This happens in order:
</p>
<ul><li> Syllable 1 is picked.
<ul><li> Template A is matched against the line. It matches.
<ul><li> Template A is applied on syllable 1.
</li></ul>
</li><li> Template B is matched against the line. It matches.
<ul><li> Syllable 1 is split into multi-highlight pseudo-sylables 1.1 and 1.2
</li><li> Template B is applied on pseudo-syllable 1.1.
</li><li> Template B is applied on pseudo-syllable 1.2.
</li></ul>
</li><li> Template C is matched against the line. It matches.
<ul><li> Syllable 1 is split into per-character pseudo-syllables 1.a and 1.b
</li><li> Syllable 1.a and 1.b are further split into per-character pseudo-sylables 1.a1, 1.a2, 1.b1 and 1.b2.
</li><li> Template C is applied on pseudo-syllable 1.a1.
</li><li> Template C is applied on pseudo-syllable 1.a2.
</li><li> Template C is applied on pseudo-syllable 1.b1.
</li><li> Template C is applied on pseudo-syllable 1.b2.
</li></ul>
</li></ul>
</li><li> Syllable 2 is picked.
<ul><li> Processing proceeds similar to syllable 1.
</li></ul>
</li></ul>
<p>Also see later down for more details on multi-highlight and per-character pseudo-syllables.
</p>
</div></div>
<p><br />
If any template matches at any time during the three steps above the (original) line is marked as "timed karaoke" and is then made into a comment with <tt>karaoke</tt> in the Effect field.
</p>
<a name="Matching_a_template_against_a_line"></a><h3><span class="editsection">[edit]</span> <span class="mw-headline"> Matching a template against a line </span></h3>
<p>Templates are always matched against a line, not against a syllable or otherwise.
</p>
<ul><li> If the template has the <i>fxgroup</i> modifier and the fxgroup named is disabled, the template never matches anything.
</li><li> If the template has the <i>all</i> modifier it always matches any line.
</li><li> If the template has the same Style as a line, it matches the line.
</li><li> Otherwise the template does not match the line.
</li></ul>
<a name="Applying_line_class_templates"></a><h2><span class="editsection">[edit]</span> <span class="mw-headline"> Applying <i>line</i> class templates </span></h2>
<div style="margin-left: 2em; margin-right: 3em; margin-top: 0.5em; padding-left: 1em; padding-right: 4em; background-color: #FDFEE7; border: 1px solid #F9FD96;"><b>Todo:</b> write this</div>
<p><br />
</p>
<a name="Applying_syl_and_furi_class_templates"></a><h2><span class="editsection">[edit]</span> <span class="mw-headline"> Applying <i>syl</i> and <i>furi</i> class templates </span></h2>
<div style="margin-left: 2em; margin-right: 3em; margin-top: 0.5em; padding-left: 1em; padding-right: 4em; background-color: #FDFEE7; border: 1px solid #F9FD96;"><b>Todo:</b> write this</div>
<p><br />
</p>
<a name="Old_mid-level_description"></a><h2><span class="editsection">[edit]</span> <span class="mw-headline"> Old mid-level description </span></h2>
<pre>Main kara-templater process:
1. Collect header
1. Find all header information, primarily PlayResX and PlayResY
2. Find all styles
3. Generate furigana styles for styles missing them
2. Collect templates and delete existing "fx" lines
3. Initialise tenv
1. Add "string", "math" and "_G" references
2. Add "tenv" self-reference
3. Add "retime" function
4. Add empty "fxgroup" table
4. Run every "code once" template
5. For every pre-existing dialogue line in subtitle file:
a. If Effect field start with "code" or "template":
1. Skip line
b. Else:
1. If Effect field is not empty and not "karaoke":
a. Skip line
2. If Effect field is empty and line is a Comment:
a. Skip line
3. Preprocess line with karaskel
4. Initialise varctx
5. Reset tenv
1. Set "orgline" to input line
2. Set "line", "syl" and "basesyl" to nil
6. For every "line" template:
If template matches line style or template is "all":
Repeat this "template.loops" number of times:
1. Set "tenv.j" to loop counter
2. a. If template is a code line:
1. Set "tenv.line" to input line
2. Run code
b. Else:
1. Produce output line as copy of input line
2. Set "tenv.line" to output line
3. Initialise output line Layer to template Layer
4. Initialise output line Text to empty
5. If template has pre-line:
1. Run pre-line template
2. Append result to output Text
6. a. If template has regular line:
For every syllable in input line:
1. Set "tenv.syl" to syllable
2. Update varctx for syllable
3. Run line template
4. Append result to output Text
5. If "notext" is not set:
a. If "keeptags" is set:
1. Append "syl.text" to output Text
b. Else:
1. Append "syl.text_stripped" to output Text
b. Else:
a. If "keeptags" is set:
1. Append "syl.text" to output Text
b. Else:
1. Append "syl.text_stripped" to output Text
7. Set Effect field of output line to "fx"
8. Append output line to subtitle file
7. For every main syllable in line:
For every "syl" template:
If template matches line style or template is "all":
If template is not in a disabled fxgroup:
1. Set "tenv.syl" to syllable
2. Update varctx for syllable
3. If syllable inlinefx does not match template inlinefx:
1. Skip syllable
4. If template has "noblank" set and syllable is blank:
1. Skip syllable
5. If template is "char":
1. Create "charsyl" as copy of syllable
2. Set "tenv.basesyl" to current "tenv.syl"
3. Set "tenv.syl" to "charsyl"
4. For every Unicode character in syllable:
1. Calculate virtual syllable characteristics for "charsyl"
2. Update varctx for "charsyl"
3. Continue syllable processing for the virtual syllable (from 5.b.7.6.)
6. If template is "multi":
1. Create "hlsyl" as copy of syllable
2. Unless "tenv.basesyl" already exists, set it to "hlsyl"
3. Set "tenv.syl" to "hlsyl"
4. For every highlight on syllable:
1. Calculate virtual syllable characteristics for "hlsyl"
2. Update varctx for "hlsyl"
3. Continue syllable processing for the virtual syllable (from 5.b.7.7.)
7. a. If template is a code line:
1. Set "tenv.line" to input line
2. Run code
b. Else:
Repeat this "template.loops" number of times:
1. Set "tenv.j" to loop counter
2. Create output line
3. Set output line Style to virtual syllable style
4. Set output line Layer to template layer
5. Set "tenv.line" to output line
6. Run template
7. Set output line Text to result
8. a. If "keeptags" is set:
1. Append "syl.text" to output line Text
b. If "notext" is not set:
1. Append "syl.text_stripped" to output line Text
c. Otherwise nothing is appended
9. Set output line Effect to "fx"
10. Append output line to subtitle file
8. For every furigana part in line:
Same process as for main syllables (5.b.7.)
9. If any non-code templates were applied to the line:
1. Set input line to Comment
2. Set input line Effect field to "karaoke"
3. Store modified input line back to subtitle file
Running a code line:
1. Compile line text to a Lua function
2. If compilation failed, report error
3. Set compiled function's environment to tenv
4. Repeat this "template.loops" number of times:
1. Set "tenv.j" to loop counter
2. Run compiled function
3. If an error occurred, report it
Running a single template:
1. Set result text to template
2. If there is a varctx:
For every match of "$([a-zA-Z_]+)" in result text:
1. Lowercase the captured name
2. a. If the captured name is a field in varctx:
1. Replace match in result text with value from varctx
b. Else:
1. Report warning
2. Keep match as-is in result text
3. For every match of "!(.-)!" in result text:
1. Append "result " to captured code
2. Compile captured code to a Lua function
3. If compilation failed, report error
4. Set compiled function's environment to tenv
5. Run compiled function
a. If compiled function produced an error:
1. Report error
2. Leave match in result text
b. Else:
1. Replace match with result of running the function</pre>
<p><br />
</p>
<div style="margin-left: 2em; margin-right: 3em; margin-top: 0.5em; padding-left: 1em; padding-right: 4em; background-color: #FDFEE7; border: 1px solid #F9FD96;"><b>Todo:</b> Turn this into something more reasonable?</div>
<p><br />
</p>
<div style="border-top: 2px solid #448; border-bottom: 1px solid #448; background: #f0f0ff; margin: 1em; padding: 0.5em;">
<div style="text-align:center; font-weight:bold; background:#ddf;"><a href="./Automation.html" title="Automation">Automation 4</a></div>
<table style="width:100%; font-size: smaller;">
<tr><th>Overview:</th><td style="text-align: center; background:#f8f8ff;">
<p><a href="./Automation_Manager.html" title="Automation Manager">Automation Manager</a> •
<a href="./Running_Automation_macros.html" title="Running Automation macros">Running macros</a> •
<a href="./Exporting.html" title="Exporting">Using export filters</a> •
<a href="./Using_the_included_macros.html" title="Using the included macros">Standard macros</a> •
<a href="./Overview_of_changes_from_Automation_3.html" title="Overview of changes from Automation 3">Changes from Automation 3</a> •
<a href="./Moving_from_Automation_3.html" title="Moving from Automation 3">Moving from Automation 3</a>
</p>
</td></tr>
<tr><th><a href="./Karaoke_Templater.html" title="Karaoke Templater">Karaoke Templater</a> reference:</th><td style="text-align: center; background:#f8f8ff;">
<p><a href="./Karaoke_Templater_Reference__Declaring_template_and_code_lines.html" title="Karaoke Templater Reference: Declaring template and code lines">Declaring templates</a> •
<strong class="selflink">Execution order</strong> •
<a href="./Karaoke_Templater_Reference__Template_modifiers.html" title="Karaoke Templater Reference: Template modifiers">Modifiers</a> •
<a href="./Karaoke_Templater_Reference__Inline_variables.html" title="Karaoke Templater Reference: Inline variables">Inline-variables ($-variables)</a> •
<a href="./Karaoke_Templater_Reference__Code_lines_and_blocks.html" title="Karaoke Templater Reference: Code lines and blocks">Code lines and blocks</a> •
<a href="./Karaoke_Templater_Reference__Code_execution_environment.html" title="Karaoke Templater Reference: Code execution environment">Execution envirionment</a>
</p>
</td></tr>
<tr><th><a href="./Lua_Reference.html" title="Lua Reference">Lua</a> reference:</th><td style="text-align: center; background:#f8f8ff;">
<p><a href="./Automation_4_Lua_Registration.html" title="Automation 4 Lua Registration">Registration</a> •
<a href="./Automation_4_Lua_Subtitle_file_interface.html" title="Automation 4 Lua Subtitle file interface">Subtitles object</a> •
<a href="./Automation_4_Lua_Progress_reporting.html" title="Automation 4 Lua Progress reporting">Progress reporting</a> •
<a href="./Automation_4_Lua_Configuration_dialogues.html" title="Automation 4 Lua Configuration dialogues">Config dialogues</a> •
<a href="./Automation_4_Lua_Miscellaneous_APIs.html" title="Automation 4 Lua Miscellaneous APIs">Misc. APIs</a> •
<a href="./Automation_4_karaskel.lua.html" title="Automation 4 karaskel.lua">karaskel.lua</a> •
<a href="./Automation_4_utils.lua.html" title="Automation 4 utils.lua">utils.lua</a> •
<a href="./Automation_4_unicode.lua.html" title="Automation 4 unicode.lua">unicode.lua</a> •
cleantags.lua
</p>
</td></tr>
<tr><th>Karaskel concepts:</th><td style="text-align: center; background:#f8f8ff;">
<p><a href="./Automation_4_karaskel.lua.html#Style_table" title="Automation 4 karaskel.lua">Style tables</a> •
<a href="./Automation_4_karaskel.lua.html#Dialogue_line_table" title="Automation 4 karaskel.lua">Dialogue line tables</a> •
<a href="./Automation_4_karaskel.lua.html#Karaoke_and_furigana_syllable_tables" title="Automation 4 karaskel.lua">Syllable tables</a> •
<a href="./Karaoke_inline-fx.html" title="Karaoke inline-fx">Inline effects</a> •
<a href="./Furigana_karaoke.html" title="Furigana karaoke">Furigana</a>
</p>
</td></tr>
</table>
</div>
<!--
Pre-expand include size: 9793 bytes
Post-expand include size: 4937 bytes
Template argument size: 1333 bytes
Maximum: 2097152 bytes
-->
<!-- Saved in parser cache with key zeratul-aegimanual_:pcache:idhash:71-0!1!0!!en!2 and timestamp 20090615005931 -->
<div class="printfooter">
Retrieved from "<a href="./Karaoke_Templater_Reference__Template_execution_rules_and_order.html">http://aegisub.cellosoft.com/docs/Karaoke_Templater_Reference:_Template_execution_rules_and_order</a>"</div>
<div id="catlinks"><p class='catlinks'>Category: <span dir='ltr'><a href="./Category_Pages_with_Todo_items.html" title="Category:Pages with Todo items">Pages with Todo items</a></span></p></div> <!-- end content -->
<div class="visualClear"></div>
</div>
</div>
</div>
<div id="column-one">
<div class="portlet" id="p-logo">
<a style="background-image: url(/docs/skins/common/images/wiki.png);"
href="./Main_Page.html"
title="Main Page"></a>
</div>
<script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
<div class='portlet' id='p-navigation'>
<h5>Navigation</h5>
<div class='pBody'>
<ul>
<li id="n-mainpage"><a href="./Main_Page.html">Main Page</a></li>
</ul>
</div>
</div>
<div class='portlet' id='p-Introduction'>
<h5>Introduction</h5>
<div class='pBody'>
<ul>
<li id="n-What-is-Aegisub?"><a href="./About.html">What is Aegisub?</a></li>
<li id="n-Highlights"><a href="./Highlights.html">Highlights</a></li>
<li id="n-Credits"><a href="./Credits.html">Credits</a></li>
<li id="n-Support-Aegisub"><a href="./Support.html">Support Aegisub</a></li>
<li id="n-FAQ"><a href="./FAQ.html">FAQ</a></li>
<li id="n-Tutorials"><a href="./Tutorials.html">Tutorials</a></li>
</ul>
</div>
</div>
<div class='portlet' id='p-Working with Subtitles'>
<h5>Working with Subtitles</h5>
<div class='pBody'>
<ul>
<li id="n-Editing-Subtitles"><a href="./Editing_Subtitles.html">Editing Subtitles</a></li>
<li id="n-Exporting-Subtitles"><a href="./Exporting.html">Exporting Subtitles</a></li>
<li id="n-Applying-Subtitles"><a href="./Attaching_subtitles_to_video.html">Applying Subtitles</a></li>
<li id="n-Spell-Checker"><a href="./Spell_Checker.html">Spell Checker</a></li>
<li id="n-Translation-Assistant"><a href="./Translation_Assistant.html">Translation Assistant</a></li>
<li id="n-Paste-Over"><a href="./Paste_Over.html">Paste Over</a></li>
<li id="n-Select-Lines"><a href="./Select_Lines.html">Select Lines</a></li>
</ul>
</div>
</div>
<div class='portlet' id='p-Typesetting'>
<h5>Typesetting</h5>
<div class='pBody'>
<ul>
<li id="n-Introduction"><a href="./Typesetting.html">Introduction</a></li>
<li id="n-Working-with-Video"><a href="./Video.html">Working with Video</a></li>
<li id="n-Editing-styles"><a href="./Styles.html">Editing styles</a></li>
<li id="n-Visual-Typesetting"><a href="./Visual_Typesetting.html">Visual Typesetting</a></li>
<li id="n-ASS-Override-Tags"><a href="./ASS_Tags.html">ASS Override Tags</a></li>
<li id="n-Colour-Picker"><a href="./Colour_Picker.html">Colour Picker</a></li>
<li id="n-Styling-Assistant"><a href="./Styling_Assistant.html">Styling Assistant</a></li>
<li id="n-Resolution-Resampler"><a href="./Resolution_Resampler.html">Resolution Resampler</a></li>
<li id="n-Fonts-Collector"><a href="./Fonts_Collector.html">Fonts Collector</a></li>
</ul>
</div>
</div>
<div class='portlet' id='p-Timing'>
<h5>Timing</h5>
<div class='pBody'>
<ul>
<li id="n-Working-with-Audio"><a href="./Audio.html">Working with Audio</a></li>
<li id="n-Shift-times"><a href="./Shift_Times.html">Shift times</a></li>
<li id="n-Timing-Post-Processor"><a href="./Timing_Post-Processor.html">Timing Post-Processor</a></li>
<li id="n-Kanji-Timer"><a href="./Kanji_Timer.html">Kanji Timer</a></li>
</ul>
</div>
</div>
<div class='portlet' id='p-Automation'>
<h5>Automation</h5>
<div class='pBody'>
<ul>
<li id="n-Overview"><a href="./Automation.html">Overview</a></li>
<li id="n-Karaoke-Templater"><a href="./Karaoke_Templater.html">Karaoke Templater</a></li>
<li id="n-Lua-Reference"><a href="./Lua_Reference.html">Lua Reference</a></li>
</ul>
</div>
</div>
<div class='portlet' id='p-Miscellaneous'>
<h5>Miscellaneous</h5>
<div class='pBody'>
<ul>
<li id="n-Aegisub-Options"><a href="./Options.html">Aegisub Options</a></li>
<li id="n-Script-Properties"><a href="./Properties.html">Script Properties</a></li>
<li id="n-Attachment-Manager"><a href="./Attachment_Manager.html">Attachment Manager</a></li>
</ul>
</div>
</div>
<!-- end of the left (by default at least) column -->
<div class="visualClear"></div>
<div id="footer">
<table width = "100%">
<tr><td width="5%" align="left" nowrap='nowrap'></td>
<td align="center"></td>
<td width="5%" align="right" nowrap='nowrap'></td></tr></table>
</div>
<script type="text/javascript">if (window.runOnloadHook) runOnloadHook();</script>
</div>
<!-- Served by cellosoft.com in 0.152 secs. --> </body>
</html>