void WebVTTParser::constructTreeFromToken(Document* document) { AtomicString tokenTagName(m_token.name().data(), m_token.name().size()); QualifiedName tagName(nullAtom, tokenTagName, xhtmlNamespaceURI); switch (m_token.type()) { case WebVTTTokenTypes::Character: { String content(m_token.characters().data(), m_token.characters().size()); RefPtr<Text> child = Text::create(document, content); m_currentNode->parserAddChild(child); break; } case WebVTTTokenTypes::StartTag: { RefPtr<HTMLElement> child; if (isRecognizedTag(tokenTagName)) child = HTMLElement::create(tagName, document); else if (m_token.name().size() == 1 && m_token.name()[0] == 'c') child = HTMLElement::create(spanTag, document); else if (m_token.name().size() == 1 && m_token.name()[0] == 'v') child = HTMLElement::create(qTag, document); if (child) { if (m_token.classes().size() > 0) { RefPtr<NamedNodeMap> attributeMap = NamedNodeMap::create(); attributeMap->addAttribute(Attribute::createMapped(classAttr, AtomicString(m_token.classes().data(), m_token.classes().size()))); child->setAttributeMap(attributeMap.release()); } if (child->hasTagName(qTag)) child->setAttribute(titleAttr, String(m_token.annotation().data(), m_token.annotation().size())); m_currentNode->parserAddChild(child); m_currentNode = child; } break; } case WebVTTTokenTypes::EndTag: if (isRecognizedTag(tokenTagName) || (m_token.name().size() == 1 && m_token.name()[0] == 'c') || (m_token.name().size() == 1 && m_token.name()[0] == 'v')) { if (m_currentNode->parentNode()) m_currentNode = m_currentNode->parentNode(); } break; case WebVTTTokenTypes::TimestampTag: { unsigned position = 0; double time = collectTimeStamp(m_token.characters().data(), &position); if (time != malformedTime) m_currentNode->parserAddChild(ProcessingInstruction::create(document, "timestamp", String(m_token.characters().data(), m_token.characters().size()))); break; } default: break; } m_token.clear(); }
void WebVTTParser::constructTreeFromToken(Document* document) { AtomicString tokenTagName(m_token.name().data(), m_token.name().size()); QualifiedName tagName(nullAtom, tokenTagName, xhtmlNamespaceURI); // http://dev.w3.org/html5/webvtt/#webvtt-cue-text-dom-construction-rules switch (m_token.type()) { case WebVTTTokenTypes::Character: { String content(m_token.characters().data(), m_token.characters().size()); RefPtr<Text> child = Text::create(document, content); m_currentNode->parserAppendChild(child); break; } case WebVTTTokenTypes::StartTag: { RefPtr<WebVTTElement> child; if (isRecognizedTag(tokenTagName)) child = WebVTTElement::create(tagName, document); else if (m_token.name().size() == 1 && m_token.name()[0] == 'c') child = WebVTTElement::create(TextTrackCue::classElementTagName(), document); else if (m_token.name().size() == 1 && m_token.name()[0] == 'v') child = WebVTTElement::create(TextTrackCue::voiceElementTagName(), document); else if (isLangToken(m_token)) child = WebVTTElement::create(TextTrackCue::langElementTagName(), document); if (child) { if (m_token.classes().size() > 0) child->setAttribute(classAttr, AtomicString(m_token.classes().data(), m_token.classes().size())); if (child->hasTagName(TextTrackCue::voiceElementTagName())) child->setAttribute(TextTrackCue::voiceAttributeName(), AtomicString(m_token.annotation().data(), m_token.annotation().size())); if (child->hasTagName(TextTrackCue::langElementTagName())) m_languageStack.append(AtomicString(m_token.annotation().data(), m_token.annotation().size())); if (!m_languageStack.isEmpty()) child->setAttribute(TextTrackCue::langAttributeName(), m_languageStack.last()); m_currentNode->parserAppendChild(child); m_currentNode = child; } break; } case WebVTTTokenTypes::EndTag: if (isRecognizedTag(tokenTagName) || (m_token.name().size() == 1 && m_token.name()[0] == 'c') || (m_token.name().size() == 1 && m_token.name()[0] == 'v')) { if (m_currentNode->parentNode()) m_currentNode = m_currentNode->parentNode(); } if (isLangToken(m_token)) { if (m_currentNode->hasTagName(TextTrackCue::langElementTagName())) m_languageStack.removeLast(); if (m_currentNode->parentNode()) m_currentNode = m_currentNode->parentNode(); } break; case WebVTTTokenTypes::TimestampTag: { unsigned position = 0; double time = collectTimeStamp(m_token.characters().data(), &position); if (time != malformedTime) m_currentNode->parserAppendChild(ProcessingInstruction::create(document, "timestamp", String(m_token.characters().data(), m_token.characters().size()))); break; } default: break; } m_token.clear(); }