OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 const unsigned fileIdentifierLength = 6; | 47 const unsigned fileIdentifierLength = 6; |
48 | 48 |
49 String VTTParser::collectDigits(const String& input, unsigned* position) | 49 String VTTParser::collectDigits(const String& input, unsigned* position) |
50 { | 50 { |
51 StringBuilder digits; | 51 StringBuilder digits; |
52 while (*position < input.length() && isASCIIDigit(input[*position])) | 52 while (*position < input.length() && isASCIIDigit(input[*position])) |
53 digits.append(input[(*position)++]); | 53 digits.append(input[(*position)++]); |
54 return digits.toString(); | 54 return digits.toString(); |
55 } | 55 } |
56 | 56 |
| 57 unsigned VTTParser::collectDigitsToInt(const String& input, unsigned* position,
int& number) |
| 58 { |
| 59 String digits = collectDigits(input, position); |
| 60 bool validNumber; |
| 61 number = digits.toInt(&validNumber); |
| 62 // Since we know that |digits| only contain valid (ASCII) digits |
| 63 // (disregarding the 'empty' case), the remaining failure mode for toInt() |
| 64 // is overflow, so if |validNumber| is not true, then set |number| to the |
| 65 // maximum int value. |
| 66 if (!digits.isEmpty() && !validNumber) |
| 67 number = std::numeric_limits<int>::max(); |
| 68 return digits.length(); |
| 69 } |
| 70 |
57 String VTTParser::collectWord(const String& input, unsigned* position) | 71 String VTTParser::collectWord(const String& input, unsigned* position) |
58 { | 72 { |
59 StringBuilder string; | 73 StringBuilder string; |
60 while (*position < input.length() && !isASpace(input[*position])) | 74 while (*position < input.length() && !isASpace(input[*position])) |
61 string.append(input[(*position)++]); | 75 string.append(input[(*position)++]); |
62 return string.toString(); | 76 return string.toString(); |
63 } | 77 } |
64 | 78 |
| 79 void VTTParser::skipWhiteSpace(const String& line, unsigned* position) |
| 80 { |
| 81 while (*position < line.length() && isASpace(line[*position])) |
| 82 (*position)++; |
| 83 } |
| 84 |
65 float VTTParser::parseFloatPercentageValue(const String& value, bool& isValidSet
ting) | 85 float VTTParser::parseFloatPercentageValue(const String& value, bool& isValidSet
ting) |
66 { | 86 { |
67 // '%' must be present and at the end of the setting value. | 87 // '%' must be present and at the end of the setting value. |
68 if (value.find('%', 1) != value.length() - 1) { | 88 if (value.find('%', 1) != value.length() - 1) { |
69 isValidSetting = false; | 89 isValidSetting = false; |
70 return 0; | 90 return 0; |
71 } | 91 } |
72 | 92 |
73 unsigned position = 0; | 93 unsigned position = 0; |
74 | 94 |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 | 464 |
445 double VTTParser::collectTimeStamp(const String& line, unsigned* position) | 465 double VTTParser::collectTimeStamp(const String& line, unsigned* position) |
446 { | 466 { |
447 // Collect a WebVTT timestamp (5.3 WebVTT cue timings and settings parsing.) | 467 // Collect a WebVTT timestamp (5.3 WebVTT cue timings and settings parsing.) |
448 // Steps 1 - 4 - Initial checks, let most significant units be minutes. | 468 // Steps 1 - 4 - Initial checks, let most significant units be minutes. |
449 enum Mode { Minutes, Hours }; | 469 enum Mode { Minutes, Hours }; |
450 Mode mode = Minutes; | 470 Mode mode = Minutes; |
451 if (*position >= line.length() || !isASCIIDigit(line[*position])) | 471 if (*position >= line.length() || !isASCIIDigit(line[*position])) |
452 return malformedTime; | 472 return malformedTime; |
453 | 473 |
454 // Steps 5 - 6 - Collect a sequence of characters that are 0-9. | 474 int value1; |
455 String digits1 = collectDigits(line, position); | 475 // Steps 5 - 7 - Collect a sequence of characters that are 0-9. |
456 int value1 = digits1.toInt(); | 476 // If not 2 characters or value is greater than 59, interpret as hours. |
457 | 477 if (collectDigitsToInt(line, position, value1) != 2 || value1 > 59) |
458 // Step 7 - If not 2 characters or value is greater than 59, interpret as ho
urs. | |
459 if (digits1.length() != 2 || value1 > 59) | |
460 mode = Hours; | 478 mode = Hours; |
461 | 479 |
462 // Steps 8 - 11 - Collect the next sequence of 0-9 after ':' (must be 2 char
s). | 480 // Steps 8 - 11 - Collect the next sequence of 0-9 after ':' (must be 2 char
s). |
463 if (*position >= line.length() || line[(*position)++] != ':') | 481 if (*position >= line.length() || line[(*position)++] != ':') |
464 return malformedTime; | 482 return malformedTime; |
465 if (*position >= line.length() || !isASCIIDigit(line[(*position)])) | 483 if (*position >= line.length() || !isASCIIDigit(line[(*position)])) |
466 return malformedTime; | 484 return malformedTime; |
467 String digits2 = collectDigits(line, position); | 485 int value2; |
468 int value2 = digits2.toInt(); | 486 if (collectDigitsToInt(line, position, value2) != 2) |
469 if (digits2.length() != 2) | |
470 return malformedTime; | 487 return malformedTime; |
471 | 488 |
472 // Step 12 - Detect whether this timestamp includes hours. | 489 // Step 12 - Detect whether this timestamp includes hours. |
473 int value3; | 490 int value3; |
474 if (mode == Hours || (*position < line.length() && line[*position] == ':'))
{ | 491 if (mode == Hours || (*position < line.length() && line[*position] == ':'))
{ |
475 if (*position >= line.length() || line[(*position)++] != ':') | 492 if (*position >= line.length() || line[(*position)++] != ':') |
476 return malformedTime; | 493 return malformedTime; |
477 if (*position >= line.length() || !isASCIIDigit(line[*position])) | 494 if (*position >= line.length() || !isASCIIDigit(line[*position])) |
478 return malformedTime; | 495 return malformedTime; |
479 String digits3 = collectDigits(line, position); | 496 if (collectDigitsToInt(line, position, value3) != 2) |
480 if (digits3.length() != 2) | |
481 return malformedTime; | 497 return malformedTime; |
482 value3 = digits3.toInt(); | |
483 } else { | 498 } else { |
484 value3 = value2; | 499 value3 = value2; |
485 value2 = value1; | 500 value2 = value1; |
486 value1 = 0; | 501 value1 = 0; |
487 } | 502 } |
488 | 503 |
489 // Steps 13 - 17 - Collect next sequence of 0-9 after '.' (must be 3 chars). | 504 // Steps 13 - 17 - Collect next sequence of 0-9 after '.' (must be 3 chars). |
490 if (*position >= line.length() || line[(*position)++] != '.') | 505 if (*position >= line.length() || line[(*position)++] != '.') |
491 return malformedTime; | 506 return malformedTime; |
492 if (*position >= line.length() || !isASCIIDigit(line[*position])) | 507 if (*position >= line.length() || !isASCIIDigit(line[*position])) |
493 return malformedTime; | 508 return malformedTime; |
494 String digits4 = collectDigits(line, position); | 509 int value4; |
495 if (digits4.length() != 3) | 510 if (collectDigitsToInt(line, position, value4) != 3) |
496 return malformedTime; | 511 return malformedTime; |
497 int value4 = digits4.toInt(); | |
498 if (value2 > 59 || value3 > 59) | 512 if (value2 > 59 || value3 > 59) |
499 return malformedTime; | 513 return malformedTime; |
500 | 514 |
501 // Steps 18 - 19 - Calculate result. | 515 // Steps 18 - 19 - Calculate result. |
502 return (value1 * secondsPerHour) + (value2 * secondsPerMinute) + value3 + (v
alue4 * secondsPerMillisecond); | 516 return (value1 * secondsPerHour) + (value2 * secondsPerMinute) + value3 + (v
alue4 * secondsPerMillisecond); |
503 } | 517 } |
504 | 518 |
505 static VTTNodeType tokenToNodeType(VTTToken& token) | 519 static VTTNodeType tokenToNodeType(VTTToken& token) |
506 { | 520 { |
507 switch (token.name().length()) { | 521 switch (token.name().length()) { |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
600 double time = VTTParser::collectTimeStamp(charactersString, &position); | 614 double time = VTTParser::collectTimeStamp(charactersString, &position); |
601 if (time != malformedTime) | 615 if (time != malformedTime) |
602 m_currentNode->parserAppendChild(ProcessingInstruction::create(docum
ent, "timestamp", charactersString)); | 616 m_currentNode->parserAppendChild(ProcessingInstruction::create(docum
ent, "timestamp", charactersString)); |
603 break; | 617 break; |
604 } | 618 } |
605 default: | 619 default: |
606 break; | 620 break; |
607 } | 621 } |
608 } | 622 } |
609 | 623 |
610 void VTTParser::skipWhiteSpace(const String& line, unsigned* position) | |
611 { | |
612 while (*position < line.length() && isASpace(line[*position])) | |
613 (*position)++; | |
614 } | |
615 | |
616 } | 624 } |
617 | 625 |
OLD | NEW |