/// <summary> /// Utility method to write region definition block into a buffer. /// </summary> /// <param name="region">Region definition to write.</param> /// <param name="builder">String builder buffer to write into.</param> private static void WriteRegion( RegionDefinition region, StringBuilder builder) { builder.AppendLine(); builder.AppendLine(Constants.RegionToken); if (false == string.IsNullOrWhiteSpace(region.Id)) { builder.Append(Constants.RegionIdName).Append(":"); WebVttSerializer.WriteString(region.Id, true, builder); builder.AppendLine(); } if (region.Lines.HasValue && region.Lines.Value >= 0) { builder.Append(Constants.LinesName).Append(":").AppendLine(region.Lines.Value.ToString()); } if (region.WidthPercent.HasValue) { builder .Append(Constants.WidthName) .Append(":") .AppendLine(WebVttSerializer.GetPercentValue(region.WidthPercent.Value)); } if (region.RegionAnchor.HasValue) { builder .Append(Constants.RegionAnchorName).Append(":") .Append(WebVttSerializer.GetPercentValue(region.RegionAnchor.Value.XPercent)) .Append(',') .AppendLine(WebVttSerializer.GetPercentValue(region.RegionAnchor.Value.YPercent)); } if (region.ViewPortAnchor.HasValue) { builder .Append(Constants.ViewPortAnchorName).Append(":") .Append(WebVttSerializer.GetPercentValue(region.ViewPortAnchor.Value.XPercent)) .Append(',') .AppendLine(WebVttSerializer.GetPercentValue(region.ViewPortAnchor.Value.YPercent)); } if (region.Scroll.HasValue && region.Scroll.Value) { builder.Append(Constants.ScrollName).Append(':').AppendLine(Constants.ScrollUpValue); } }
/// <summary> /// Utility method to write a caption cue into a buffer. /// </summary> /// <param name="cue">Cue to write.</param> /// <param name="builder">String builder buffer to write into.</param> private static void WriteCue( Cue cue, StringBuilder builder) { if (cue.End <= cue.Start) { throw new ArgumentException(string.Format("Cue start time '{0}' must be less than cue end time '{1}'.", cue.Start, cue.End)); } builder.AppendLine(); if (false == string.IsNullOrWhiteSpace(cue.Id)) { builder.AppendLine(cue.Id); } WebVttSerializer.WriteTimeSpanValue(cue.Start, builder); builder .Append(' ') .Append(Constants.ArrowToken) .Append(' '); WebVttSerializer.WriteTimeSpanValue(cue.End, builder); if (false == string.IsNullOrWhiteSpace(cue.Region)) { if (WebVttSerializer.HasWhiteSpace(cue.Region)) { throw new ArgumentException("White space characters are not allowed in cue region id."); } builder .Append(' ') .Append(Constants.RegionName).Append(':').Append(cue.Region); } if (cue.Alignment.HasValue) { builder .Append(' ') .Append(Constants.AlignName).Append(':').Append(WebVttSerializer.GetAlignmentValue(cue.Alignment.Value)); } if (cue.Line.HasValue) { builder .Append(' ') .Append(Constants.LineName).Append(':'); if (cue.Line.Value.Percent.HasValue) { builder.Append(WebVttSerializer.GetPercentValue(cue.Line.Value.Percent.Value)); } else if (cue.Line.Value.LineNumber.HasValue) { builder.Append(cue.Line.Value.LineNumber.Value); } else { throw new ArgumentException("Cue line setting must specify either percent or line number value."); } if (cue.Line.Value.Alignment.HasValue) { builder.Append(',').Append(WebVttSerializer.GetLineAlignmentValue(cue.Line.Value.Alignment.Value)); } } if (cue.Position.HasValue) { builder .Append(' ') .Append(Constants.PositionName).Append(':') .Append(WebVttSerializer.GetPercentValue( cue.Position.Value.PositionPercent.HasValue ? cue.Position.Value.PositionPercent.Value : 0.0)); if (cue.Position.Value.Alignment.HasValue) { builder .Append(',') .Append(WebVttSerializer.GetPositionAlignmentValue(cue.Position.Value.Alignment.Value)); } } if (cue.SizePercent.HasValue) { builder .Append(' ') .Append(Constants.SizeName) .Append(":") .Append(WebVttSerializer.GetPercentValue(cue.SizePercent.Value)); } if (cue.Vertical.HasValue) { builder .Append(' ') .Append(Constants.VerticalName) .Append(":") .Append(WebVttSerializer.GetVerticalAlignmentValue(cue.Vertical.Value)); } builder.AppendLine(); if (cue.Content != null && cue.Content.Length > 0) { Span previousSpan = null; foreach (var span in cue.Content) { if (span == null) { throw new ArgumentException("Cue content cannot be null."); } if (WebVttSerializer.NeedNewLine(previousSpan, span)) { builder.AppendLine(); } WebVttSerializer.WriteSpan(span, builder); previousSpan = span; } builder.AppendLine(); } }