Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 0b05c82c3371f690571880591256d01099ff5696
  • master par défaut protégée
2 résultats

scene.cpp

Blame
  • karaoke-adjust-1sec.lua 5,11 Kio
    local tr = aegisub.gettext
    
    script_name = tr"Karaoke 1sec adjust lead-in"
    script_description = tr"Adjust karaoke leadin to 1sec"
    script_author = "Flore"
    script_version = "1.00"
    
    include("cleantags.lua")
    
    leadinmsec = 1000 --lead in time can be changed here
    
    ktag = "\\[kK][fo]?%d+" --pattern used to detect karaoke tags
    
    -- KM template line definition
    km_template_effect = "template pre-line all keeptags"
    km_template_text = '!retime("line",$start < 900 and -$start or -900,200)!{!$start < 900 and "\\\\k" .. ($start/10) or "\\\\k90"!\\fad(!$start < 900 and $start or 300!,200)}'
    
    function hasleadin(line)--check if there is an existing lead in (2 consecutive bracket with karaoke tags at the start of the line)
            return line.text:find("^{[^{}]-" .. ktag .. "[^{}]-}%s*{[^{}]-" .. ktag .. "[^{}]-}")
    end
    
    
    function removeleadin(line)
        if not hasleadin(line) then
            return line
        end
    
        leadin = tonumber( line.text:match("^{[^{}]-\\[kK][fo]?(%d+)[^{}]-}%s*{[^{}]-" .. ktag .. "[^{}]-}") ) --read lead-in value
        line.text = line.text:gsub("^({[^{}]-)\\[kK][fo]?%d+(.-}%s*{[^{}]-" .. ktag .. ".-})","%1%2")  --remove lead in
    
        line.text = cleantags(line.text) --clean tags
    
        line.start_time = line.start_time +  leadin*10 --adjust start time
    
        --aegisub.log(line.text)
    
        return line
    end
    
    
    function adjust_1sec(subs, sel)
    
        for _, i in ipairs(sel) do
            local line = subs[i]
    
            line.text = cleantags(line.text)
    
            if( line.text:find(ktag)) then--don't do anything if there is no ktags in this line
    
                --start by removing existing lead-in
                while hasleadin(line) do
                        if aegisub.progress.is_cancelled() then return end
                        line = removeleadin(line)
                end
    
                --then add our lead in
    
                if line.start_time >= leadinmsec then
                        line.text = string.format("{\\k%d}%s",leadinmsec/10, line.text)
                        line.start_time = line.start_time - leadinmsec
    
                else --if line starts too early to put the needed lead in, make the line start at time 0 and fill with appropriate lead in
                        line.text = string.format("{\\k%d}%s",line.start_time/10, line.text)
                        line.start_time = 0
                end
    
                subs[i] = line
            end
        end
    
        aegisub.set_undo_point(tr"1sec adjust lead-in")
    end
    
    
    function remove_tag(line, tag)
        local expr = "^(.-{[^}]*)\\" .. tag .. "[^\\}]*(.*)"
        while true do
            before, after = line.text:match(expr)
            if before == nil then
                return line
            else
                line.text = cleantags(before .. after)
            end
        end
    end
    
    
    function is_template_line(line)
        return (line.class == "dialogue"
            and line.effect == km_template_effect
            and line.text == km_template_text)
    end
    
    
    function mugenizer(subs)
        local first = nil
        local styles_different = false
        local styles = 0
        local i_styles = {}
        local template_present = false
    
        for i, line in ipairs(subs) do
            if line.class == "info" then
                if line.key == "PlayResX" or line.key == "PlayResY" then
                    line.value = "0"
                end
            end
    
            if line.class == "style" then
                line.fontname = "Arial"
                line.fontsize = "24"
                line.outline = "1.5"
                line.shadow = "0"
                line.margin_l = "15"
                line.margin_r = "15"
                line.margin_t = "20"
                line.margin_b = "20"
    
                i_styles[styles] = i
                if styles > 0 then
                    styles_different = styles_different or line.color1 ~= subs[i_styles[styles-1]].color1 or line.color2 ~= subs[i_styles[styles-1]].color2 or line.color3 ~= subs[i_styles[styles-1]].color3 or line.color4 ~= subs[i_styles[styles-1]].color4
                end
                styles = styles + 1
            end
    
            if is_template_line(line) then
                line.comment = true
                template_present = true
            end
    
            if line.class == "dialogue" and not line.comment and line.effect ~= "fx" then
                if first == nil then
                    first = i
                end
    
                line.text = cleantags(line.text)
    
                while hasleadin(line) do
                    if aegisub.progress.is_cancelled() then return end
                    line = removeleadin(line)
                end
    
                line = remove_tag(line, "fad")
            end
    
            subs[i] = line
        end
    
        if not styles_different then
            for i = 0, styles-1, 1 do
                line = subs[i_styles[i]]
                line.color1 = "&H008AFF"
                line.color2 = "&HFFFFFF"
                line.color3 = "&H000000"
                line.color4 = "&H000000"
                subs[i_styles[i]] = line
            end
        end
    
        if not template_present then
            -- add mugen's magic line
            line = subs[first]
            line.comment = true
            line.start_time = 0
            line.end_time = 0
            line.effect = km_template_effect
            line.text = km_template_text
            subs.insert(first, line)
        end
    end
    
    aegisub.register_macro(script_name, script_description, adjust_1sec)
    aegisub.register_macro(tr"Mugenizer", tr"Mugenize your subs", mugenizer)