void TextTrackCue::setAlign(const String& value, ExceptionCode& ec) { // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-texttrackcue-align // On setting, the text track cue alignment must be set to the value given in the // first cell of the row in the table above whose second cell is a case-sensitive // match for the new value, if any. If none of the values match, then the user // agent must instead throw a SyntaxError exception. CueAlignment alignment = m_cueAlignment; if (value == startKeyword()) alignment = Start; else if (value == middleKeyword()) alignment = Middle; else if (value == endKeyword()) alignment = End; else ec = SYNTAX_ERR; if (alignment == m_cueAlignment) return; cueWillChange(); m_cueAlignment = alignment; cueDidChange(); }
void VTTCue::setAlign(const String& value, ExceptionState& exceptionState) { // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-texttrackcue-align // On setting, the text track cue alignment must be set to the value given in the // first cell of the row in the table above whose second cell is a case-sensitive // match for the new value, if any. If none of the values match, then the user // agent must instead throw a SyntaxError exception. CueAlignment alignment = m_cueAlignment; if (value == startKeyword()) alignment = Start; else if (value == middleKeyword()) alignment = Middle; else if (value == endKeyword()) alignment = End; else if (value == leftKeyword()) alignment = Left; else if (value == rightKeyword()) alignment = Right; else exceptionState.throwDOMException(SyntaxError, ExceptionMessages::failedToSet("align", "TextTrackCue", "The value provided ('" + value + "') is invalid. Only 'start', 'middle', 'end', 'left', and 'right' are accepted.")); if (alignment == m_cueAlignment) return; cueWillChange(); m_cueAlignment = alignment; cueDidChange(); }
const String& TextTrackCue::align() const { switch (m_cueAlignment) { case Start: return startKeyword(); case Middle: return middleKeyword(); case End: return endKeyword(); default: ASSERT_NOT_REACHED(); return emptyString(); } }
const String& VTTCue::align() const { switch (m_cueAlignment) { case Start: return startKeyword(); case Middle: return middleKeyword(); case End: return endKeyword(); case Left: return leftKeyword(); case Right: return rightKeyword(); default: ASSERT_NOT_REACHED(); return emptyString(); } }
void VTTCue::setAlign(const String& value) { CueAlignment alignment = m_cueAlignment; if (value == startKeyword()) alignment = Start; else if (value == middleKeyword()) alignment = Middle; else if (value == endKeyword()) alignment = End; else if (value == leftKeyword()) alignment = Left; else if (value == rightKeyword()) alignment = Right; else ASSERT_NOT_REACHED(); if (alignment == m_cueAlignment) return; cueWillChange(); m_cueAlignment = alignment; cueDidChange(); }
void VTTCue::parseSettings(const String& inputString) { VTTScanner input(inputString); while (!input.isAtEnd()) { // The WebVTT cue settings part of a WebVTT cue consists of zero or more of the following components, in any order, // separated from each other by one or more U+0020 SPACE characters or U+0009 CHARACTER TABULATION (tab) characters. input.skipWhile<VTTParser::isValidSettingDelimiter>(); if (input.isAtEnd()) break; // When the user agent is to parse the WebVTT settings given by a string input for a text track cue cue, // the user agent must run the following steps: // 1. Let settings be the result of splitting input on spaces. // 2. For each token setting in the list settings, run the following substeps: // 1. If setting does not contain a U+003A COLON character (:), or if the first U+003A COLON character (:) // in setting is either the first or last character of setting, then jump to the step labeled next setting. // 2. Let name be the leading substring of setting up to and excluding the first U+003A COLON character (:) in that string. CueSetting name = settingName(input); // 3. Let value be the trailing substring of setting starting from the character immediately after the first U+003A COLON character (:) in that string. VTTScanner::Run valueRun = input.collectUntil<VTTParser::isValidSettingDelimiter>(); // 4. Run the appropriate substeps that apply for the value of name, as follows: switch (name) { case Vertical: { // If name is a case-sensitive match for "vertical" // 1. If value is a case-sensitive match for the string "rl", then let cue's text track cue writing direction // be vertical growing left. if (input.scanRun(valueRun, verticalGrowingLeftKeyword())) m_writingDirection = VerticalGrowingLeft; // 2. Otherwise, if value is a case-sensitive match for the string "lr", then let cue's text track cue writing // direction be vertical growing right. else if (input.scanRun(valueRun, verticalGrowingRightKeyword())) m_writingDirection = VerticalGrowingRight; break; } case Line: { // 1-2 - Collect chars that are either '-', '%', or a digit. // 1. If value contains any characters other than U+002D HYPHEN-MINUS characters (-), U+0025 PERCENT SIGN // characters (%), and characters in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then jump // to the step labeled next setting. bool isNegative = input.scan('-'); int linePosition; unsigned numDigits = input.scanDigits(linePosition); bool isPercentage = input.scan('%'); if (!input.isAt(valueRun.end())) break; // 2. If value does not contain at least one character in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT // NINE (9), then jump to the step labeled next setting. // 3. If any character in value other than the first character is a U+002D HYPHEN-MINUS character (-), then // jump to the step labeled next setting. // 4. If any character in value other than the last character is a U+0025 PERCENT SIGN character (%), then // jump to the step labeled next setting. // 5. If the first character in value is a U+002D HYPHEN-MINUS character (-) and the last character in value is a // U+0025 PERCENT SIGN character (%), then jump to the step labeled next setting. if (!numDigits || (isPercentage && isNegative)) break; // 6. Ignoring the trailing percent sign, if any, interpret value as a (potentially signed) integer, and // let number be that number. // 7. If the last character in value is a U+0025 PERCENT SIGN character (%), but number is not in the range // 0 ≤ number ≤ 100, then jump to the step labeled next setting. // 8. Let cue's text track cue line position be number. // 9. If the last character in value is a U+0025 PERCENT SIGN character (%), then let cue's text track cue // snap-to-lines flag be false. Otherwise, let it be true. if (isPercentage) { if (linePosition < 0 || linePosition > 100) break; // 10 - If '%' then set snap-to-lines flag to false. m_snapToLines = false; } else { if (isNegative) linePosition = -linePosition; m_snapToLines = true; } m_linePosition = linePosition; break; } case Position: { int number; // Steps 1 - 6. if (!scanPercentage(input, valueRun, number)) break; // 7. Let cue's text track cue text position be number. m_textPosition = number; break; } case Size: { int number; // Steps 1 - 6. if (!scanPercentage(input, valueRun, number)) break; // 7. Let cue's text track cue size be number. m_cueSize = number; break; } case Align: { // 1. If value is a case-sensitive match for the string "start", then let cue's text track cue alignment be start alignment. if (input.scanRun(valueRun, startKeyword())) m_cueAlignment = Start; // 2. If value is a case-sensitive match for the string "middle", then let cue's text track cue alignment be middle alignment. else if (input.scanRun(valueRun, middleKeyword())) m_cueAlignment = Middle; // 3. If value is a case-sensitive match for the string "end", then let cue's text track cue alignment be end alignment. else if (input.scanRun(valueRun, endKeyword())) m_cueAlignment = End; // 4. If value is a case-sensitive match for the string "left", then let cue's text track cue alignment be left alignment. else if (input.scanRun(valueRun, leftKeyword())) m_cueAlignment = Left; // 5. If value is a case-sensitive match for the string "right", then let cue's text track cue alignment be right alignment. else if (input.scanRun(valueRun, rightKeyword())) m_cueAlignment = Right; break; } case RegionId: m_regionId = input.extractString(valueRun); break; case None: break; } // Make sure the entire run is consumed. input.skipRun(valueRun); } // If cue's line position is not auto or cue's size is not 100 or cue's // writing direction is not horizontal, but cue's region identifier is not // the empty string, let cue's region identifier be the empty string. if (m_regionId.isEmpty()) return; if (m_linePosition != undefinedPosition || m_cueSize != 100 || m_writingDirection != Horizontal) m_regionId = emptyString(); }
void TextTrackCue::setCueSettings(const String& input) { m_settings = input; unsigned position = 0; while (position < input.length()) { // The WebVTT cue settings part of a WebVTT cue consists of zero or more of the following components, in any order, // separated from each other by one or more U+0020 SPACE characters or U+0009 CHARACTER TABULATION (tab) characters. while (position < input.length() && WebVTTParser::isValidSettingDelimiter(input[position])) position++; if (position >= input.length()) break; // When the user agent is to parse the WebVTT settings given by a string input for a text track cue cue, // the user agent must run the following steps: // 1. Let settings be the result of splitting input on spaces. // 2. For each token setting in the list settings, run the following substeps: // 1. If setting does not contain a U+003A COLON character (:), or if the first U+003A COLON character (:) // in setting is either the first or last character of setting, then jump to the step labeled next setting. unsigned endOfSetting = position; String setting = WebVTTParser::collectWord(input, &endOfSetting); CueSetting name; size_t colonOffset = setting.find(':', 1); if (colonOffset == notFound || colonOffset == 0 || colonOffset == setting.length() - 1) goto NextSetting; // 2. Let name be the leading substring of setting up to and excluding the first U+003A COLON character (:) in that string. name = settingName(setting.substring(0, colonOffset)); // 3. Let value be the trailing substring of setting starting from the character immediately after the first U+003A COLON character (:) in that string. position += colonOffset + 1; if (position >= input.length()) break; // 4. Run the appropriate substeps that apply for the value of name, as follows: switch (name) { case Vertical: { // If name is a case-sensitive match for "vertical" // 1. If value is a case-sensitive match for the string "rl", then let cue's text track cue writing direction // be vertical growing left. String writingDirection = WebVTTParser::collectWord(input, &position); if (writingDirection == verticalGrowingLeftKeyword()) m_writingDirection = VerticalGrowingLeft; // 2. Otherwise, if value is a case-sensitive match for the string "lr", then let cue's text track cue writing // direction be vertical growing right. else if (writingDirection == verticalGrowingRightKeyword()) m_writingDirection = VerticalGrowingRight; } break; case Line: { // 1-2 - Collect chars that are either '-', '%', or a digit. // 1. If value contains any characters other than U+002D HYPHEN-MINUS characters (-), U+0025 PERCENT SIGN // characters (%), and characters in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then jump // to the step labeled next setting. StringBuilder linePositionBuilder; while (position < input.length() && (input[position] == '-' || input[position] == '%' || isASCIIDigit(input[position]))) linePositionBuilder.append(input[position++]); if (position < input.length() && !WebVTTParser::isValidSettingDelimiter(input[position])) break; // 2. If value does not contain at least one character in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT // NINE (9), then jump to the step labeled next setting. // 3. If any character in value other than the first character is a U+002D HYPHEN-MINUS character (-), then // jump to the step labeled next setting. // 4. If any character in value other than the last character is a U+0025 PERCENT SIGN character (%), then // jump to the step labeled next setting. String linePosition = linePositionBuilder.toString(); if (linePosition.find('-', 1) != notFound || linePosition.reverseFind("%", linePosition.length() - 2) != notFound) break; // 5. If the first character in value is a U+002D HYPHEN-MINUS character (-) and the last character in value is a // U+0025 PERCENT SIGN character (%), then jump to the step labeled next setting. if (linePosition[0] == '-' && linePosition[linePosition.length() - 1] == '%') break; // 6. Ignoring the trailing percent sign, if any, interpret value as a (potentially signed) integer, and // let number be that number. // NOTE: toInt ignores trailing non-digit characters, such as '%'. bool validNumber; int number = linePosition.toInt(&validNumber); if (!validNumber) break; // 7. If the last character in value is a U+0025 PERCENT SIGN character (%), but number is not in the range // 0 ≤ number ≤ 100, then jump to the step labeled next setting. // 8. Let cue's text track cue line position be number. // 9. If the last character in value is a U+0025 PERCENT SIGN character (%), then let cue's text track cue // snap-to-lines flag be false. Otherwise, let it be true. if (linePosition[linePosition.length() - 1] == '%') { if (number < 0 || number > 100) break; // 10 - If '%' then set snap-to-lines flag to false. m_snapToLines = false; } m_linePosition = number; } break; case Position: { // 1. If value contains any characters other than U+0025 PERCENT SIGN characters (%) and characters in the range // U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then jump to the step labeled next setting. // 2. If value does not contain at least one character in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), // then jump to the step labeled next setting. String textPosition = WebVTTParser::collectDigits(input, &position); if (textPosition.isEmpty()) break; if (position >= input.length()) break; // 3. If any character in value other than the last character is a U+0025 PERCENT SIGN character (%), then jump // to the step labeled next setting. // 4. If the last character in value is not a U+0025 PERCENT SIGN character (%), then jump to the step labeled // next setting. if (input[position++] != '%') break; if (position < input.length() && !WebVTTParser::isValidSettingDelimiter(input[position])) break; // 5. Ignoring the trailing percent sign, interpret value as an integer, and let number be that number. // 6. If number is not in the range 0 ≤ number ≤ 100, then jump to the step labeled next setting. // NOTE: toInt ignores trailing non-digit characters, such as '%'. bool validNumber; int number = textPosition.toInt(&validNumber); if (!validNumber) break; if (number < 0 || number > 100) break; // 7. Let cue's text track cue text position be number. m_textPosition = number; } break; case Size: { // 1. If value contains any characters other than U+0025 PERCENT SIGN characters (%) and characters in the // range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), then jump to the step labeled next setting. // 2. If value does not contain at least one character in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT // NINE (9), then jump to the step labeled next setting. String cueSize = WebVTTParser::collectDigits(input, &position); if (cueSize.isEmpty()) break; if (position >= input.length()) break; // 3. If any character in value other than the last character is a U+0025 PERCENT SIGN character (%), // then jump to the step labeled next setting. // 4. If the last character in value is not a U+0025 PERCENT SIGN character (%), then jump to the step // labeled next setting. if (input[position++] != '%') break; if (position < input.length() && !WebVTTParser::isValidSettingDelimiter(input[position])) break; // 5. Ignoring the trailing percent sign, interpret value as an integer, and let number be that number. // 6. If number is not in the range 0 ≤ number ≤ 100, then jump to the step labeled next setting. bool validNumber; int number = cueSize.toInt(&validNumber); if (!validNumber) break; if (number < 0 || number > 100) break; // 7. Let cue's text track cue size be number. m_cueSize = number; } break; case Align: { String cueAlignment = WebVTTParser::collectWord(input, &position); // 1. If value is a case-sensitive match for the string "start", then let cue's text track cue alignment be start alignment. if (cueAlignment == startKeyword()) m_cueAlignment = Start; // 2. If value is a case-sensitive match for the string "middle", then let cue's text track cue alignment be middle alignment. else if (cueAlignment == middleKeyword()) m_cueAlignment = Middle; // 3. If value is a case-sensitive match for the string "end", then let cue's text track cue alignment be end alignment. else if (cueAlignment == endKeyword()) m_cueAlignment = End; } break; #if ENABLE(WEBVTT_REGIONS) case RegionId: m_regionId = WebVTTParser::collectWord(input, &position); break; #endif case None: break; } NextSetting: position = endOfSetting; } #if ENABLE(WEBVTT_REGIONS) // If cue's line position is not auto or cue's size is not 100 or cue's // writing direction is not horizontal, but cue's region identifier is not // the empty string, let cue's region identifier be the empty string. if (m_regionId.isEmpty()) return; if (m_linePosition != undefinedPosition || m_cueSize != 100 || m_writingDirection != Horizontal) m_regionId = emptyString(); #endif }
void TextTrackCueBox::applyCSSProperties(const IntSize&) { // FIXME: Apply all the initial CSS positioning properties. http://wkb.ug/79916 // 3.5.1 On the (root) List of WebVTT Node Objects: // the 'position' property must be set to 'absolute' setInlineStyleProperty(CSSPropertyPosition, CSSValueAbsolute); // the 'unicode-bidi' property must be set to 'plaintext' setInlineStyleProperty(CSSPropertyUnicodeBidi, CSSValueWebkitPlaintext); // the 'direction' property must be set to direction setInlineStyleProperty(CSSPropertyDirection, m_cue->getCSSWritingDirection()); // the 'writing-mode' property must be set to writing-mode setInlineStyleProperty(CSSPropertyWebkitWritingMode, m_cue->getCSSWritingMode(), false); std::pair<float, float> position = m_cue->getCSSPosition(); // the 'top' property must be set to top, setInlineStyleProperty(CSSPropertyTop, static_cast<double>(position.second), CSSPrimitiveValue::CSS_PERCENTAGE); // the 'left' property must be set to left setInlineStyleProperty(CSSPropertyLeft, static_cast<double>(position.first), CSSPrimitiveValue::CSS_PERCENTAGE); // the 'width' property must be set to width, and the 'height' property must be set to height if (m_cue->vertical() == horizontalKeyword()) { setInlineStyleProperty(CSSPropertyWidth, static_cast<double>(m_cue->getCSSSize()), CSSPrimitiveValue::CSS_PERCENTAGE); setInlineStyleProperty(CSSPropertyHeight, CSSValueAuto); } else { setInlineStyleProperty(CSSPropertyWidth, CSSValueAuto); setInlineStyleProperty(CSSPropertyHeight, static_cast<double>(m_cue->getCSSSize()), CSSPrimitiveValue::CSS_PERCENTAGE); } // The 'text-align' property on the (root) List of WebVTT Node Objects must // be set to the value in the second cell of the row of the table below // whose first cell is the value of the corresponding cue's text track cue // alignment: if (m_cue->align() == startKeyword()) setInlineStyleProperty(CSSPropertyTextAlign, CSSValueStart); else if (m_cue->align() == endKeyword()) setInlineStyleProperty(CSSPropertyTextAlign, CSSValueEnd); else setInlineStyleProperty(CSSPropertyTextAlign, CSSValueCenter); if (!m_cue->snapToLines()) { // 10.13.1 Set up x and y: // Note: x and y are set through the CSS left and top above. // 10.13.2 Position the boxes in boxes such that the point x% along the // width of the bounding box of the boxes in boxes is x% of the way // across the width of the video's rendering area, and the point y% // along the height of the bounding box of the boxes in boxes is y% // of the way across the height of the video's rendering area, while // maintaining the relative positions of the boxes in boxes to each // other. setInlineStyleProperty(CSSPropertyWebkitTransform, String::format("translate(-%.2f%%, -%.2f%%)", position.first, position.second)); setInlineStyleProperty(CSSPropertyWhiteSpace, CSSValuePre); } }
void VTTCue::parseSettings(const String& inputString) { VTTScanner input(inputString); while (!input.isAtEnd()) { // The WebVTT cue settings part of a WebVTT cue consists of zero or more of the following components, in any order, // separated from each other by one or more U+0020 SPACE characters or U+0009 CHARACTER TABULATION (tab) characters. input.skipWhile<VTTParser::isValidSettingDelimiter>(); if (input.isAtEnd()) break; // When the user agent is to parse the WebVTT settings given by a string input for a text track cue cue, // the user agent must run the following steps: // 1. Let settings be the result of splitting input on spaces. // 2. For each token setting in the list settings, run the following substeps: // 1. If setting does not contain a U+003A COLON character (:), or if the first U+003A COLON character (:) // in setting is either the first or last character of setting, then jump to the step labeled next setting. // 2. Let name be the leading substring of setting up to and excluding the first U+003A COLON character (:) in that string. CueSetting name = settingName(input); // 3. Let value be the trailing substring of setting starting from the character immediately after the first U+003A COLON character (:) in that string. VTTScanner::Run valueRun = input.collectUntil<VTTParser::isValidSettingDelimiter>(); // 4. Run the appropriate substeps that apply for the value of name, as follows: switch (name) { case Vertical: { // If name is a case-sensitive match for "vertical" // 1. If value is a case-sensitive match for the string "rl", then // let cue's WebVTT cue writing direction be vertical // growing left. if (input.scanRun(valueRun, verticalGrowingLeftKeyword())) m_writingDirection = VerticalGrowingLeft; // 2. Otherwise, if value is a case-sensitive match for the string // "lr", then let cue's WebVTT cue writing direction be // vertical growing right. else if (input.scanRun(valueRun, verticalGrowingRightKeyword())) m_writingDirection = VerticalGrowingRight; break; } case Line: { // If name is a case-sensitive match for "line" // Steps 1 - 2 skipped. float number; // 3. If linepos does not contain at least one ASCII digit, then // jump to the step labeled next setting. // 4. If the last character in linepos is a U+0025 PERCENT SIGN character (%) // // If parse a percentage string from linepos doesn't fail, let // number be the returned percentage, otherwise jump to the step // labeled next setting. bool isPercentage = scanPercentage(input, number); if (!isPercentage) { // Otherwise // // 1. If linepos contains any characters other than U+002D // HYPHEN-MINUS characters (-) and ASCII digits, then jump to // the step labeled next setting. // 2. If any character in linepos other than the first character is // a U+002D HYPHEN-MINUS character (-), then jump to the step // labeled next setting. bool isNegative = input.scan('-'); int intLinePosition; if (!input.scanDigits(intLinePosition)) break; // 3. Interpret linepos as a (potentially signed) integer, and let // number be that number. number = isNegative ? -intLinePosition : intLinePosition; } if (!input.isAt(valueRun.end())) break; // 5. Let cue's WebVTT cue line be number. m_linePosition = number; // 6. If the last character in linepos is a U+0025 PERCENT SIGN // character (%), then let cue's WebVTT cue snap-to-lines // flag be false. Otherwise, let it be true. m_snapToLines = !isPercentage; // Steps 7 - 9 skipped. break; } case Position: { // If name is a case-sensitive match for "position". float number; // Steps 1 - 2 skipped. // 3. If parse a percentage string from colpos doesn't fail, let // number be the returned percentage, otherwise jump to the step // labeled next setting (text track cue text position's value // remains the special value auto). if (!scanPercentage(input, number)) break; if (!input.isAt(valueRun.end())) break; // 4. Let cue's cue position be number. m_textPosition = number; // Steps 5 - 7 skipped. break; } case Size: { // If name is a case-sensitive match for "size" float number; // 1. If parse a percentage string from value doesn't fail, let // number be the returned percentage, otherwise jump to the step // labeled next setting. if (!scanPercentage(input, number)) break; if (!input.isAt(valueRun.end())) break; // 2. Let cue's WebVTT cue size be number. m_cueSize = number; break; } case Align: { // If name is a case-sensitive match for "align" // 1. If value is a case-sensitive match for the string "start", // then let cue's WebVTT cue text alignment be start alignment. if (input.scanRun(valueRun, startKeyword())) m_cueAlignment = Start; // 2. If value is a case-sensitive match for the string "middle", // then let cue's WebVTT cue text alignment be middle alignment. else if (input.scanRun(valueRun, middleKeyword())) m_cueAlignment = Middle; // 3. If value is a case-sensitive match for the string "end", then // let cue's WebVTT cue text alignment be end alignment. else if (input.scanRun(valueRun, endKeyword())) m_cueAlignment = End; // 4. If value is a case-sensitive match for the string "left", // then let cue's WebVTT cue text alignment be left alignment. else if (input.scanRun(valueRun, leftKeyword())) m_cueAlignment = Left; // 5. If value is a case-sensitive match for the string "right", // then let cue's WebVTT cue text alignment be right alignment. else if (input.scanRun(valueRun, rightKeyword())) m_cueAlignment = Right; break; } case RegionId: m_regionId = input.extractString(valueRun); break; case None: break; } // Make sure the entire run is consumed. input.skipRun(valueRun); } // If cue's line position is not auto or cue's size is not 100 or cue's // writing direction is not horizontal, but cue's region identifier is not // the empty string, let cue's region identifier be the empty string. if (m_regionId.isEmpty()) return; if (!lineIsAuto() || m_cueSize != 100 || m_writingDirection != Horizontal) m_regionId = emptyString(); }
void TextTrackCue::parseSettings(const String& input) { // 4.8.10.13.3 Parse the WebVTT settings. // 1 - Initial setup. unsigned position = 0; while (position < input.length()) { // Discard any space characters between or after settings (not in the spec, but we think it should be). while (position < input.length() && WebVTTParser::isASpace(input[position])) position++; // 2-4 Settings - get the next character representing a settings. char setting = input[position++]; if (position >= input.length()) return; // 5-7 - If the character at position is not ':', set setting to empty string. if (input[position++] != ':') setting = '\0'; if (position >= input.length()) return; // 8 - Gather settings based on value of setting. switch (setting) { case 'D': { // 1-3 - Collect the next word and set the writing direction accordingly. String writingDirection = WebVTTParser::collectWord(input, &position); if (writingDirection == verticalKeyword()) m_writingDirection = VerticalGrowingLeft; else if (writingDirection == verticallrKeyword()) m_writingDirection = VerticalGrowingRight; } break; case 'L': { // 1-2 - Collect chars that are either '-', '%', or a digit. StringBuilder linePositionBuilder; while (position < input.length() && (input[position] == '-' || input[position] == '%' || isASCIIDigit(input[position]))) linePositionBuilder.append(input[position++]); if (position < input.length() && !WebVTTParser::isASpace(input[position])) goto Otherwise; String linePosition = linePositionBuilder.toString(); // 3-5 - If there is not at least one digit character, // a '-' occurs anywhere other than the front, or // a '%' occurs anywhere other than the end, then // ignore this setting and keep looking. if (linePosition.find('-', 1) != notFound || linePosition.reverseFind("%", linePosition.length() - 2) != notFound) break; // 6 - If the first char is a '-' and the last char is a '%', ignore and keep looking. if (linePosition[0] == '-' && linePosition[linePosition.length() - 1] == '%') break; // 7 - Interpret as number (toInt ignores trailing non-digit characters, // such as a possible '%'). bool validNumber; int number = linePosition.toInt(&validNumber); if (!validNumber) break; // 8 - If the last char is a '%' and the value is not between 0 and 100, ignore and keep looking. if (linePosition[linePosition.length() - 1] == '%') { if (number < 0 || number > 100) break; // 10 - If '%' then set snap-to-lines flag to false. m_snapToLines = false; } // 9 - Set cue line position to the number found. m_linePosition = number; } break; case 'T': { // 1-2 - Collect characters that are digits. String textPosition = WebVTTParser::collectDigits(input, &position); if (position >= input.length()) break; // 3 - Character at end must be '%', otherwise ignore and keep looking. if (input[position++] != '%') goto Otherwise; // 4-6 - Ensure no other chars in this setting and setting is not empty. if (position < input.length() && !WebVTTParser::isASpace(input[position])) goto Otherwise; if (textPosition.isEmpty()) break; // 7-8 - Interpret as number and make sure it is between 0 and 100 // (toInt ignores trailing non-digit characters, such as a possible '%'). bool validNumber; int number = textPosition.toInt(&validNumber); if (!validNumber) break; if (number < 0 || number > 100) break; // 9 - Set cue text position to the number found. m_textPosition = number; } break; case 'S': { // 1-2 - Collect characters that are digits. String cueSize = WebVTTParser::collectDigits(input, &position); if (position >= input.length()) break; // 3 - Character at end must be '%', otherwise ignore and keep looking. if (input[position++] != '%') goto Otherwise; // 4-6 - Ensure no other chars in this setting and setting is not empty. if (position < input.length() && !WebVTTParser::isASpace(input[position])) goto Otherwise; if (cueSize.isEmpty()) break; // 7-8 - Interpret as number and make sure it is between 0 and 100. bool validNumber; int number = cueSize.toInt(&validNumber); if (!validNumber) break; if (number < 0 || number > 100) break; // 9 - Set cue size to the number found. m_cueSize = number; } break; case 'A': { // 1-4 - Collect the next word and set the cue alignment accordingly. String cueAlignment = WebVTTParser::collectWord(input, &position); if (cueAlignment == startKeyword()) m_cueAlignment = Start; else if (cueAlignment == middleKeyword()) m_cueAlignment = Middle; else if (cueAlignment == endKeyword()) m_cueAlignment = End; } break; } continue; Otherwise: // Collect a sequence of characters that are not space characters and discard them. WebVTTParser::collectWord(input, &position); } }