-- Aegisub Automation demonstration script -- Original written by Niels Martin Hansen -- Given into the public domain include("utils.lua") name = "Text placement demo" description = "Demonstration of the text_extents function, to do per-syllable placement of text." version, kind, configuration = 3, 'basic_ass', {} function process_lines(meta, styles, lines, config) -- Prepare local variables local output = { n=0 } -- Loop through every line for i = 0, lines.n-1 do aegisub.report_progress(i/lines.n*100) -- Only process dialogue lines if lines[i].kind ~= "dialogue" then output.n = output.n + 1 output[output.n] = lines[i] else -- This is just for making the code a bit easier to read local line = lines[i] -- Get the rendered size of the entire line. (Won't work if there's line breaks in it.) local totalx, totaly = aegisub.text_extents(styles[line.style], line.text_stripped) -- Calculate where the first syllable should be positioned, if the line is to appear centered on screen local curx, cury = (meta.res_x - totalx) / 2, meta.res_y / 2 -- And more preparations for per-syllable placement local startx = curx local tstart, tend = 0, 0 -- Now process each stllable for j = 1, line.karaoke.n-1 do -- A shortcut variable, and, most important: a copy of the original line local syl, syllin = line.karaoke[j], copy_line(line) -- Calculate the ending time of this syllable tend = tstart + syl.duration*10 -- Get the rendered size of this syllable local extx, exty, extd, extl = aegisub.text_extents(styles[line.style], syl.text_stripped) -- Some debug stuff... aegisub.output_debug(string.format("text_extents returned: %d, %d, %d, %d", extx, exty, extd, extl)); -- Replace the text of the copy of the line with this syllable, moving around syllin.text = string.format("{\\an4\\move(%d,%d,%d,%d,%d,%d)\\kf%d\\kf%d}%s", curx, cury, curx, cury-exty, tstart, tend, tstart/10, syl.duration, syl.text) -- Add the line to the output output.n = output.n + 1 output[output.n] = syllin -- And prepare for next iteration curx = curx + extx tstart = tend end -- More debug stuff aegisub.output_debug(string.format("after syllable loop: totalx=%d curx-startx=%d", totalx, curx-startx)) end end -- And remember to return something :) return output end