@@ -5,8 +5,11 @@ Transform = require 'a-mo.Transform'
55util = require ' aegisub.util'
66bit = require ' bit'
77
8+ frameFromMs = aegisub. frame_from_ms
9+ msFromFrame = aegisub. ms_from_frame
10+
811class Line
9- @version : 0x010300
12+ @version : 0x010400
1013 @version_major : bit. rshift( @version , 16 )
1114 @version_minor : bit. band( bit. rshift( @version , 8 ) , 0xFF )
1215 @version_patch : bit. band( @version , 0xFF )
@@ -24,7 +27,8 @@ class Line
2427 }
2528
2629 splitChar : " \\\6 "
27- tPlaceholder : " \\\3 "
30+ tPlaceholder : ( count ) -> " \\\3 #{count}\\\3 "
31+ tTokenPattern : " \\\3 (%d+)\\\3 "
2832
2933 defaultXPosition : {
3034 -- align 3, 6, 9
@@ -103,6 +107,10 @@ class Line
103107 hours = minutes/ 60
104108 return ( " %d:%02d:%05.2f" ) \ format math.floor ( hours ) , math.floor ( minutes% 60 ) , seconds% 60
105109
110+ __tostring : =>
111+ @createRaw !
112+ return @raw
113+
106114 createRaw : =>
107115 line = {
108116 ( @comment and ( " Comment: %d" ) \ format( @layer ) or ( " Dialogue: %d" ) \ format( @layer ))
@@ -142,14 +150,13 @@ class Line
142150 tagCollection = { }
143151 positions = { }
144152 @runCallbackOnOverrides ( tagBlock, major ) =>
145- for tagName in * tags. oneTimeTags
146- tag = tags. allTags[ tagName]
153+ for tag in * tags. oneTimeTags
147154 tagBlock = tagBlock\ gsub tag. pattern, ( value ) ->
148- unless tagCollection[ tagName ]
149- tagCollection[ tagName ] = @. generateTagIndex major, tagBlock\ find tag. pattern
155+ unless tagCollection[ tag . name ]
156+ tagCollection[ tag . name ] = @. generateTagIndex major, tagBlock\ find tag. pattern
150157 return nil
151158 else
152- log. debug " #{tagName } previously found at #{tagCollection[tagName ]}"
159+ log. debug " #{tag.name } previously found at #{tagCollection[tag.name ]}"
153160 return " "
154161 return tagBlock
155162
@@ -177,8 +184,7 @@ class Line
177184 tagBlock = tagBlock\ gsub tags. allTags[ v[ 1 ]] . pattern, " "
178185
179186 @runCallbackOnOverrides ( tagBlock ) =>
180- for tagName in * tags. repeatTags
181- tag = tags. allTags[ tagName]
187+ for tag in * tags. repeatTags
182188 -- Calculates the number of times the pattern will be replaced.
183189 _, num = tagBlock\ gsub tag. pattern, " "
184190 -- Replaces all instances except the last one.
@@ -279,17 +285,16 @@ class Line
279285
280286 getPropertiesFromStyle : ( styleRef = @styleRef ) =>
281287 @properties = { }
282- for name, tag in pairs tags. allTags
283- if tag. style
284- switch tag. type
285- when " alpha"
286- @properties [ name] = tag\ convert styleRef[ tag. style] \ sub( 3 , 4 )
288+ for tag in * tags. styleTags
289+ switch tag. type
290+ when " alpha"
291+ @properties [ tag] = tag\ convert styleRef[ tag. style] \ sub( 3 , 4 )
287292
288- when " color"
289- @properties [ name ] = tag\ convert styleRef[ tag. style] \ sub( 5 , 10 )
293+ when " color"
294+ @properties [ tag ] = tag\ convert styleRef[ tag. style] \ sub( 5 , 10 )
290295
291- else
292- @properties [ name ] = tag\ convert styleRef[ tag. style]
296+ else
297+ @properties [ tag ] = tag\ convert styleRef[ tag. style]
293298
294299 -- Because duplicate tags may exist within transforms, it becomes
295300 -- useful to remove transforms from a line before doing various
@@ -301,16 +306,18 @@ class Line
301306 @runCallbackOnOverrides ( tagBlock ) =>
302307 return tagBlock\ gsub tags. allTags. transform. pattern, ( transform ) ->
303308 count += 1
309+ token = @. tPlaceholder count
304310 transform = Transform \ fromString transform, @duration , @. generateTagIndex( tagBlock\ find transform ) , @
311+ transform. token = token
305312 @transforms [ count] = transform
306313 -- create a token for the transforms
307- return @tPlaceholder .. tostring ( count ) .. @tPlaceholder
314+ return token
308315 @transformsAreTokenized = true
309316
310317 loopOverTokenizedTransforms : ( callback ) =>
311318 if @transformsAreTokenized
312319 @runCallbackOnOverrides ( tagBlock ) =>
313- return tagBlock\ gsub @tPlaceholder .. " (%d+) " .. @tPlaceholder , callback
320+ return tagBlock\ gsub @tTokenPattern , callback
314321
315322 @transformsAreTokenized = false
316323
@@ -333,16 +340,21 @@ class Line
333340 return " \\ t" .. @transforms [ tonumber index] . rawString
334341
335342 interpolateTransforms : =>
336- @loopOverTokenizedTransforms ( index ) ->
337- transform = @transforms [ tonumber index]
343+ for transform in * @transforms
338344 transform. startTime -= @transformShift
339345 transform. endTime -= @transformShift
340- transform\ gatherTagsInEffect!
341- transform\ collectPriorState @
342- result = transform\ interpolate aegisub. ms_from_frame( aegisub. frame_from_ms( @start_time ) + 1 ) - @start_time
346+
347+ newText = @text
348+ @loopOverTokenizedTransforms ( index ) ->
349+ transform = @transforms [ tonumber index]
350+ frame = frameFromMs @start_time
351+ newText = transform\ interpolate @, newText, index, math.floor ( 0.5 * ( msFromFrame( frame ) + msFromFrame( frame + 1 ) ) ) - @start_time
352+ return nil
353+ @text = newText
354+
355+ for transform in * @transforms
343356 transform. startTime += @transformShift
344357 transform. endTime += @transformShift
345- return result
346358
347359 shiftKaraoke : ( shift = @karaokeShift ) =>
348360 karaokeTag = tags. allTags. karaoke
0 commit comments