Value FunLang::evaluate() const { String lang = arg(0)->evaluate().toString(); const Attribute* languageAttribute = 0; Node* node = evaluationContext().node.get(); while (node) { if (node->isElementNode()) { Element* element = toElement(node); if (element->hasAttributes()) languageAttribute = element->getAttributeItem(XMLNames::langAttr); } if (languageAttribute) break; node = node->parentNode(); } if (!languageAttribute) return false; String langValue = languageAttribute->value(); while (true) { if (equalIgnoringCase(langValue, lang)) return true; // Remove suffixes one by one. size_t index = langValue.reverseFind('-'); if (index == notFound) break; langValue = langValue.left(index); } return false; }
Value FunLang::evaluate() const { String lang = arg(0)->evaluate().toString(); Attribute* languageAttribute = 0; Node* node = evaluationContext().node.get(); while (node) { NamedNodeMap* attrs = node->attributes(); if (attrs) languageAttribute = attrs->getAttributeItem(XMLNames::langAttr); if (languageAttribute) break; node = node->parentNode(); } if (!languageAttribute) return BOOL_TO_VALUE_CAST false; String langValue = languageAttribute->value(); while (true) { if (equalIgnoringCase(langValue, lang)) return BOOL_TO_VALUE_CAST true; // Remove suffixes one by one. size_t index = langValue.reverseFind('-'); if (index == notFound) break; langValue = langValue.left(index); } return BOOL_TO_VALUE_CAST false; }
Value FunLang::doEvaluate() const { String lang = arg(0)->evaluate().toString(); RefPtr<Node> langNode = 0; Node* node = evaluationContext().node.get(); String xmsnsURI = node->lookupNamespaceURI("xms"); while (node) { NamedAttrMap* attrs = node->attributes(); langNode = attrs->getNamedItemNS(xmsnsURI, "lang"); if (langNode) break; node = node->parentNode(); } if (!langNode) return false; String langNodeValue = langNode->nodeValue(); // extract 'en' out of 'en-us' int index = langNodeValue.find('-'); if (index != -1) langNodeValue = langNodeValue.left(index); return equalIgnoringCase(langNodeValue, lang); }
Value FunLang::evaluate() const { String lang = arg(0)->evaluate().toString(); RefPtr<Node> langNode = 0; Node* node = evaluationContext().node.get(); while (node) { NamedAttrMap* attrs = node->attributes(); if (attrs) langNode = attrs->getNamedItemNS(XMLNames::xmlNamespaceURI, "lang"); if (langNode) break; node = node->parentNode(); } if (!langNode) return false; String langNodeValue = langNode->nodeValue(); while (true) { if (equalIgnoringCase(langNodeValue, lang)) return true; // Remove suffixes one by one. int index = langNodeValue.reverseFind('-'); if (index == -1) break; langNodeValue = langNodeValue.left(index); } return false; }
Value FunLang::evaluate() const { String lang = argument(0).evaluate().toString(); const Attribute* languageAttribute = nullptr; Node* node = evaluationContext().node.get(); while (node) { if (is<Element>(*node)) { Element& element = downcast<Element>(*node); if (element.hasAttributes()) languageAttribute = element.findAttributeByName(XMLNames::langAttr); } if (languageAttribute) break; node = node->parentNode(); } if (!languageAttribute) return false; String langValue = languageAttribute->value(); while (true) { if (equalIgnoringCase(langValue, lang)) return true; // Remove suffixes one by one. size_t index = langValue.reverseFind('-'); if (index == notFound) break; langValue = langValue.left(index); } return false; }
Value VariableReference::evaluate() const { HashMap<String, String>& bindings = evaluationContext().variableBindings; if (!bindings.contains(m_name)) // FIXME: Is this the right thing to do if an unknown variable is referenced? return ""; return bindings.get(m_name); }
Value FunName::evaluate() const { if (argCount() > 0) { Value a = arg(0)->evaluate(); if (!a.isNodeSet()) return ""; Node* node = a.toNodeSet().firstNode(); return node ? expandedName(node) : ""; } return expandedName(evaluationContext().node.get()); }
Value FunNamespaceURI::evaluate() const { if (argCount() > 0) { Value a = arg(0)->evaluate(); if (!a.isNodeSet()) return ""; Node* node = a.toNodeSet().firstNode(); return node ? node->namespaceURI().string() : ""; } return evaluationContext().node->namespaceURI().string(); }
Value FunName::evaluate() const { if (argumentCount() > 0) { Value a = argument(0).evaluate(); if (!a.isNodeSet()) return emptyString(); Node* node = a.toNodeSet().firstNode(); return node ? expandedName(node) : emptyString(); } return expandedName(evaluationContext().node.get()); }
Value FunNamespaceURI::evaluate() const { if (argumentCount() > 0) { Value a = argument(0).evaluate(); if (!a.isNodeSet()) return emptyString(); Node* node = a.toNodeSet().firstNode(); return node ? node->namespaceURI().string() : emptyString(); } return evaluationContext().node->namespaceURI().string(); }
Value FunName::doEvaluate() const { Node* node = 0; if (argCount() > 0) { Value a = arg(0)->evaluate(); if (!a.isNodeVector() || a.toNodeVector().size() == 0) return ""; node = a.toNodeVector()[0].get(); } if (!node) node = evaluationContext().node.get(); return node->prefix() + ":" + node->localName(); }
Value FunNamespaceURI::doEvaluate() const { Node* node = 0; if (argCount() > 0) { Value a = arg(0)->evaluate(); if (!a.isNodeVector() || a.toNodeVector().size() == 0) return ""; node = a.toNodeVector()[0].get(); } if (!node) node = evaluationContext().node.get(); return Value(node->namespaceURI()); }
Value FunLocalName::evaluate() const { Node* node = 0; if (argCount() > 0) { Value a = arg(0)->evaluate(); if (!a.isNodeSet()) return ""; node = a.toNodeSet().firstNode(); if (!node) return ""; } if (!node) node = evaluationContext().node.get(); return node->localName().string(); }
Value FunId::evaluate() const { Value a = argument(0).evaluate(); StringBuilder idList; // A whitespace-separated list of IDs if (!a.isNodeSet()) idList.append(a.toString()); else { for (auto& node : a.toNodeSet()) { idList.append(stringValue(node.get())); idList.append(' '); } } TreeScope& contextScope = evaluationContext().node->treeScope(); NodeSet result; HashSet<Node*> resultSet; unsigned startPos = 0; unsigned length = idList.length(); while (true) { while (startPos < length && isWhitespace(idList[startPos])) ++startPos; if (startPos == length) break; size_t endPos = startPos; while (endPos < length && !isWhitespace(idList[endPos])) ++endPos; // If there are several nodes with the same id, id() should return the first one. // In WebKit, getElementById behaves so, too, although its behavior in this case is formally undefined. Node* node = contextScope.getElementById(atomicSubstring(idList, startPos, endPos - startPos)); if (node && resultSet.add(node).isNewEntry) result.append(node); startPos = endPos; } result.markSorted(false); return Value(WTFMove(result)); }
Value FunName::evaluate() const { Node* node = 0; if (argCount() > 0) { Value a = arg(0)->evaluate(); if (!a.isNodeSet()) return ""; node = a.toNodeSet().firstNode(); if (!node) return ""; } if (!node) node = evaluationContext().node.get(); const AtomicString& prefix = node->prefix(); return prefix.isEmpty() ? node->localName().string() : prefix + ":" + node->localName(); }