@@ -255,7 +255,7 @@ type StyleAttributes struct {
255255 WebVTTItalics bool
256256 WebVTTLine string
257257 WebVTTLines int
258- WebVTTPosition string
258+ WebVTTPosition * WebVTTPosition
259259 WebVTTRegionAnchor string
260260 WebVTTScroll string
261261 WebVTTSize string
@@ -307,28 +307,28 @@ func (sa *StyleAttributes) propagateSRTAttributes() {
307307 switch sa .SRTPosition {
308308 case 7 : // top-left
309309 sa .WebVTTAlign = "left"
310- sa .WebVTTPosition = "10%"
310+ sa .WebVTTPosition = newWebVTTPosition ( "10%" )
311311 case 8 : // top-center
312- sa .WebVTTPosition = "10%"
312+ sa .WebVTTPosition = newWebVTTPosition ( "10%" )
313313 case 9 : // top-right
314314 sa .WebVTTAlign = "right"
315- sa .WebVTTPosition = "10%"
315+ sa .WebVTTPosition = newWebVTTPosition ( "10%" )
316316 case 4 : // middle-left
317317 sa .WebVTTAlign = "left"
318- sa .WebVTTPosition = "50%"
318+ sa .WebVTTPosition = newWebVTTPosition ( "50%" )
319319 case 5 : // middle-center
320- sa .WebVTTPosition = "50%"
320+ sa .WebVTTPosition = newWebVTTPosition ( "50%" )
321321 case 6 : // middle-right
322322 sa .WebVTTAlign = "right"
323- sa .WebVTTPosition = "50%"
323+ sa .WebVTTPosition = newWebVTTPosition ( "50%" )
324324 case 1 : // bottom-left
325325 sa .WebVTTAlign = "left"
326- sa .WebVTTPosition = "90%"
326+ sa .WebVTTPosition = newWebVTTPosition ( "90%" )
327327 case 2 : // bottom-center
328- sa .WebVTTPosition = "90%"
328+ sa .WebVTTPosition = newWebVTTPosition ( "90%" )
329329 case 3 : // bottom-right
330330 sa .WebVTTAlign = "right"
331- sa .WebVTTPosition = "90%"
331+ sa .WebVTTPosition = newWebVTTPosition ( "90%" )
332332 }
333333
334334 sa .WebVTTBold = sa .SRTBold
@@ -411,10 +411,10 @@ func (sa *StyleAttributes) propagateTTMLAttributes() {
411411 coordinates := strings .Split (* sa .TTMLOrigin , " " )
412412 if len (coordinates ) > 1 {
413413 sa .WebVTTLine = coordinates [0 ]
414- sa .WebVTTPosition = coordinates [1 ]
414+ sa .WebVTTPosition = newWebVTTPosition ( coordinates [1 ])
415415 if sa .TTMLWritingMode != nil && strings .HasPrefix (* sa .TTMLWritingMode , "tb" ) {
416416 sa .WebVTTLine = coordinates [1 ]
417- sa .WebVTTPosition = coordinates [0 ]
417+ sa .WebVTTPosition = newWebVTTPosition ( coordinates [0 ])
418418 }
419419 }
420420 }
@@ -428,6 +428,73 @@ func (sa *StyleAttributes) propagateWebVTTAttributes() {
428428 sa .SRTBold = sa .WebVTTBold
429429 sa .SRTItalics = sa .WebVTTItalics
430430 sa .SRTUnderline = sa .WebVTTUnderline
431+
432+ // may be overridden by position parsing later
433+ switch sa .WebVTTAlign {
434+ case "left" , "right" , "center" , "start" , "end" :
435+ sa .TTMLTextAlign = astikit .StrPtr (sa .WebVTTAlign )
436+ }
437+
438+ for _ , tag := range sa .WebVTTTags {
439+ switch tag .Name {
440+ case "c" :
441+ if len (tag .Classes ) > 0 {
442+ for _ , color := range tag .Classes {
443+ if strings .HasPrefix (color , "bg_" ) && len (color ) > 3 {
444+ if bgColor , err := newColorFromWebVTTString (color [3 :]); err == nil {
445+ sa .TTMLBackgroundColor = astikit .StrPtr ("#" + bgColor .TTMLString ())
446+ }
447+ } else {
448+ if fgColor , err := newColorFromWebVTTString (color ); err == nil {
449+ sa .TTMLColor = astikit .StrPtr ("#" + fgColor .TTMLString ())
450+ }
451+ }
452+ }
453+ }
454+ }
455+ }
456+
457+ // Handle WebVTT position and alignment conversion
458+
459+ // Parse position if available
460+ var hasPosition bool
461+ if sa .WebVTTPosition != nil {
462+ hasPosition = true
463+
464+ // Handle position alignment (takes precedence over WebVTTAlign)
465+ switch sa .WebVTTPosition .Alignment {
466+ case "line-left" :
467+ sa .TTMLTextAlign = astikit .StrPtr ("left" )
468+ case "center" :
469+ sa .TTMLTextAlign = astikit .StrPtr ("center" )
470+ case "line-right" :
471+ sa .TTMLTextAlign = astikit .StrPtr ("right" )
472+ }
473+ }
474+
475+ // Handle line if available
476+ var hasLine bool
477+ var yPos string
478+ if sa .WebVTTLine != "" {
479+ hasLine = true
480+ yPos = sa .WebVTTLine
481+ }
482+
483+ // Set TTMLOrigin based on available position and line data
484+ if hasPosition && hasLine {
485+ // Both position and line are available
486+ sa .TTMLOrigin = astikit .StrPtr (fmt .Sprintf ("%s %s" , sa .WebVTTPosition .XPosition , yPos ))
487+ } else if hasPosition {
488+ // Only position is available, use default Y position (80% for bottom)
489+ sa .TTMLOrigin = astikit .StrPtr (fmt .Sprintf ("%s 80%%" , sa .WebVTTPosition .XPosition ))
490+ } else if hasLine {
491+ // Only line is available, use default X position (10% for left)
492+ sa .TTMLOrigin = astikit .StrPtr (fmt .Sprintf ("10%% %s" , yPos ))
493+ }
494+
495+ if sa .WebVTTSize != "" {
496+ sa .TTMLExtent = astikit .StrPtr (fmt .Sprintf ("%s 10%%" , sa .WebVTTSize ))
497+ }
431498}
432499
433500// merge - base on parent, override style attributes if defined in child
0 commit comments