Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
        /// <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();
            }
        }