| 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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 isValidSetting = isFirstValueValid && isSecondValueValid; | 109 isValidSetting = isFirstValueValid && isSecondValueValid; |
| 110 return FloatPoint(firstCoord, secondCoord); | 110 return FloatPoint(firstCoord, secondCoord); |
| 111 } | 111 } |
| 112 | 112 |
| 113 WebVTTParser::WebVTTParser(WebVTTParserClient* client, Document& document) | 113 WebVTTParser::WebVTTParser(WebVTTParserClient* client, Document& document) |
| 114 : m_document(&document) | 114 : m_document(&document) |
| 115 , m_state(Initial) | 115 , m_state(Initial) |
| 116 , m_decoder(TextResourceDecoder::create("text/plain", UTF8Encoding())) | 116 , m_decoder(TextResourceDecoder::create("text/plain", UTF8Encoding())) |
| 117 , m_currentStartTime(0) | 117 , m_currentStartTime(0) |
| 118 , m_currentEndTime(0) | 118 , m_currentEndTime(0) |
| 119 , m_tokenizer(WebVTTTokenizer::create()) | |
| 120 , m_client(client) | 119 , m_client(client) |
| 121 { | 120 { |
| 122 } | 121 } |
| 123 | 122 |
| 124 void WebVTTParser::getNewCues(Vector<RefPtr<TextTrackCue> >& outputCues) | 123 void WebVTTParser::getNewCues(Vector<RefPtr<TextTrackCue> >& outputCues) |
| 125 { | 124 { |
| 126 outputCues = m_cuelist; | 125 outputCues = m_cuelist; |
| 127 m_cuelist.clear(); | 126 m_cuelist.clear(); |
| 128 } | 127 } |
| 129 | 128 |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 return CueText; | 292 return CueText; |
| 294 } | 293 } |
| 295 | 294 |
| 296 WebVTTParser::ParseState WebVTTParser::ignoreBadCue(const String& line) | 295 WebVTTParser::ParseState WebVTTParser::ignoreBadCue(const String& line) |
| 297 { | 296 { |
| 298 if (!line.isEmpty()) | 297 if (!line.isEmpty()) |
| 299 return BadCue; | 298 return BadCue; |
| 300 return Id; | 299 return Id; |
| 301 } | 300 } |
| 302 | 301 |
| 303 PassRefPtr<DocumentFragment> WebVTTParser::createDocumentFragmentFromCueText(co
nst String& text) | 302 // A helper class for the construction of a "cue fragment" from the cue text. |
| 303 class WebVTTTreeBuilder { |
| 304 public: |
| 305 WebVTTTreeBuilder(Document& document) |
| 306 : m_document(document) { } |
| 307 |
| 308 PassRefPtr<DocumentFragment> buildFromString(const String& cueText); |
| 309 |
| 310 private: |
| 311 void constructTreeFromToken(Document&); |
| 312 |
| 313 WebVTTToken m_token; |
| 314 RefPtr<ContainerNode> m_currentNode; |
| 315 Vector<AtomicString> m_languageStack; |
| 316 Document& m_document; |
| 317 }; |
| 318 |
| 319 PassRefPtr<DocumentFragment> WebVTTTreeBuilder::buildFromString(const String& cu
eText) |
| 304 { | 320 { |
| 305 // Cue text processing based on | 321 // Cue text processing based on |
| 306 // 4.8.10.13.4 WebVTT cue text parsing rules and | 322 // 4.8.10.13.4 WebVTT cue text parsing rules and |
| 307 // 4.8.10.13.5 WebVTT cue text DOM construction rules. | 323 // 4.8.10.13.5 WebVTT cue text DOM construction rules. |
| 308 | 324 |
| 309 RefPtr<DocumentFragment> fragment = DocumentFragment::create(*m_document); | 325 RefPtr<DocumentFragment> fragment = DocumentFragment::create(m_document); |
| 310 | 326 |
| 311 if (!text.length()) { | 327 if (cueText.isEmpty()) { |
| 312 fragment->parserAppendChild(Text::create(*m_document, "")); | 328 fragment->parserAppendChild(Text::create(m_document, "")); |
| 313 return fragment; | 329 return fragment; |
| 314 } | 330 } |
| 315 | 331 |
| 316 m_currentNode = fragment; | 332 m_currentNode = fragment; |
| 317 m_tokenizer->reset(); | 333 |
| 334 OwnPtr<WebVTTTokenizer> tokenizer(WebVTTTokenizer::create()); |
| 318 m_token.clear(); | 335 m_token.clear(); |
| 336 m_languageStack.clear(); |
| 319 | 337 |
| 320 m_languageStack.clear(); | 338 SegmentedString content(cueText); |
| 321 SegmentedString content(text); | 339 while (tokenizer->nextToken(content, m_token)) |
| 322 while (m_tokenizer->nextToken(content, m_token)) | 340 constructTreeFromToken(m_document); |
| 323 constructTreeFromToken(*m_document); | |
| 324 | 341 |
| 325 return fragment.release(); | 342 return fragment.release(); |
| 326 } | 343 } |
| 327 | 344 |
| 345 PassRefPtr<DocumentFragment> WebVTTParser::createDocumentFragmentFromCueText(Doc
ument& document, const String& cueText) |
| 346 { |
| 347 WebVTTTreeBuilder treeBuilder(document); |
| 348 return treeBuilder.buildFromString(cueText); |
| 349 } |
| 350 |
| 328 void WebVTTParser::createNewCue() | 351 void WebVTTParser::createNewCue() |
| 329 { | 352 { |
| 330 if (!m_currentContent.length()) | 353 if (!m_currentContent.length()) |
| 331 return; | 354 return; |
| 332 | 355 |
| 333 RefPtr<TextTrackCue> cue = TextTrackCue::create(*m_document, m_currentStartT
ime, m_currentEndTime, m_currentContent.toString()); | 356 RefPtr<TextTrackCue> cue = TextTrackCue::create(*m_document, m_currentStartT
ime, m_currentEndTime, m_currentContent.toString()); |
| 334 cue->setId(m_currentId); | 357 cue->setId(m_currentId); |
| 335 cue->setCueSettings(m_currentSettings); | 358 cue->setCueSettings(m_currentSettings); |
| 336 | 359 |
| 337 m_cuelist.append(cue); | 360 m_cuelist.append(cue); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 case 4: | 472 case 4: |
| 450 if (token.name()[0] == 'r' && token.name()[1] == 'u' && token.name()[2]
== 'b' && token.name()[3] == 'y') | 473 if (token.name()[0] == 'r' && token.name()[1] == 'u' && token.name()[2]
== 'b' && token.name()[3] == 'y') |
| 451 return WebVTTNodeTypeRuby; | 474 return WebVTTNodeTypeRuby; |
| 452 if (token.name()[0] == 'l' && token.name()[1] == 'a' && token.name()[2]
== 'n' && token.name()[3] == 'g') | 475 if (token.name()[0] == 'l' && token.name()[1] == 'a' && token.name()[2]
== 'n' && token.name()[3] == 'g') |
| 453 return WebVTTNodeTypeLanguage; | 476 return WebVTTNodeTypeLanguage; |
| 454 break; | 477 break; |
| 455 } | 478 } |
| 456 return WebVTTNodeTypeNone; | 479 return WebVTTNodeTypeNone; |
| 457 } | 480 } |
| 458 | 481 |
| 459 void WebVTTParser::constructTreeFromToken(Document& document) | 482 void WebVTTTreeBuilder::constructTreeFromToken(Document& document) |
| 460 { | 483 { |
| 461 QualifiedName tagName(nullAtom, AtomicString(m_token.name()), xhtmlNamespace
URI); | 484 QualifiedName tagName(nullAtom, AtomicString(m_token.name()), xhtmlNamespace
URI); |
| 462 | 485 |
| 463 // http://dev.w3.org/html5/webvtt/#webvtt-cue-text-dom-construction-rules | 486 // http://dev.w3.org/html5/webvtt/#webvtt-cue-text-dom-construction-rules |
| 464 | 487 |
| 465 switch (m_token.type()) { | 488 switch (m_token.type()) { |
| 466 case WebVTTTokenTypes::Character: { | 489 case WebVTTTokenTypes::Character: { |
| 467 String content(m_token.characters()); // FIXME: This should be 8bit if p
ossible. | 490 String content(m_token.characters()); // FIXME: This should be 8bit if p
ossible. |
| 468 RefPtr<Text> child = Text::create(document, content); | 491 RefPtr<Text> child = Text::create(document, content); |
| 469 m_currentNode->parserAppendChild(child); | 492 m_currentNode->parserAppendChild(child); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 497 if (nodeType == WebVTTNodeTypeLanguage && m_currentNode->isWebVTTEle
ment() && toWebVTTElement(m_currentNode.get())->webVTTNodeType() == WebVTTNodeTy
peLanguage) | 520 if (nodeType == WebVTTNodeTypeLanguage && m_currentNode->isWebVTTEle
ment() && toWebVTTElement(m_currentNode.get())->webVTTNodeType() == WebVTTNodeTy
peLanguage) |
| 498 m_languageStack.removeLast(); | 521 m_languageStack.removeLast(); |
| 499 if (m_currentNode->parentNode()) | 522 if (m_currentNode->parentNode()) |
| 500 m_currentNode = m_currentNode->parentNode(); | 523 m_currentNode = m_currentNode->parentNode(); |
| 501 } | 524 } |
| 502 break; | 525 break; |
| 503 } | 526 } |
| 504 case WebVTTTokenTypes::TimestampTag: { | 527 case WebVTTTokenTypes::TimestampTag: { |
| 505 unsigned position = 0; | 528 unsigned position = 0; |
| 506 String charactersString(StringImpl::create8BitIfPossible(m_token.charact
ers())); | 529 String charactersString(StringImpl::create8BitIfPossible(m_token.charact
ers())); |
| 507 double time = collectTimeStamp(charactersString, &position); | 530 double time = WebVTTParser::collectTimeStamp(charactersString, &position
); |
| 508 if (time != malformedTime) | 531 if (time != malformedTime) |
| 509 m_currentNode->parserAppendChild(ProcessingInstruction::create(docum
ent, "timestamp", charactersString)); | 532 m_currentNode->parserAppendChild(ProcessingInstruction::create(docum
ent, "timestamp", charactersString)); |
| 510 break; | 533 break; |
| 511 } | 534 } |
| 512 default: | 535 default: |
| 513 break; | 536 break; |
| 514 } | 537 } |
| 515 m_token.clear(); | 538 m_token.clear(); |
| 516 } | 539 } |
| 517 | 540 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 538 unsigned oldPosition = *position; | 561 unsigned oldPosition = *position; |
| 539 while (*position < data.length() && data[*position] != '\r' && data[*positio
n] != '\n') | 562 while (*position < data.length() && data[*position] != '\r' && data[*positio
n] != '\n') |
| 540 (*position)++; | 563 (*position)++; |
| 541 String line = data.substring(oldPosition, *position - oldPosition); | 564 String line = data.substring(oldPosition, *position - oldPosition); |
| 542 skipLineTerminator(data, position); | 565 skipLineTerminator(data, position); |
| 543 return line; | 566 return line; |
| 544 } | 567 } |
| 545 | 568 |
| 546 } | 569 } |
| 547 | 570 |
| OLD | NEW |