summaryrefslogtreecommitdiff
path: root/core/fxcrt/xml/cfx_xmlelement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/fxcrt/xml/cfx_xmlelement.cpp')
-rw-r--r--core/fxcrt/xml/cfx_xmlelement.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/core/fxcrt/xml/cfx_xmlelement.cpp b/core/fxcrt/xml/cfx_xmlelement.cpp
new file mode 100644
index 0000000000..c6b70e1cc4
--- /dev/null
+++ b/core/fxcrt/xml/cfx_xmlelement.cpp
@@ -0,0 +1,102 @@
+// Copyright 2017 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fxcrt/xml/cfx_xmlelement.h"
+
+#include "core/fxcrt/fx_ext.h"
+#include "core/fxcrt/xml/cfx_xmlchardata.h"
+#include "core/fxcrt/xml/cfx_xmltext.h"
+#include "third_party/base/ptr_util.h"
+#include "third_party/base/stl_util.h"
+
+CFX_XMLElement::CFX_XMLElement(const CFX_WideString& wsTag)
+ : CFX_XMLAttributeNode(wsTag) {}
+
+CFX_XMLElement::~CFX_XMLElement() {}
+
+FX_XMLNODETYPE CFX_XMLElement::GetType() const {
+ return FX_XMLNODE_Element;
+}
+
+std::unique_ptr<CFX_XMLNode> CFX_XMLElement::Clone() {
+ auto pClone = pdfium::MakeUnique<CFX_XMLElement>(GetName());
+ pClone->SetAttributes(GetAttributes());
+
+ CFX_WideString wsText;
+ CFX_XMLNode* pChild = m_pChild;
+ while (pChild) {
+ switch (pChild->GetType()) {
+ case FX_XMLNODE_Text:
+ wsText += static_cast<CFX_XMLText*>(pChild)->GetText();
+ break;
+ default:
+ break;
+ }
+ pChild = pChild->m_pNext;
+ }
+ pClone->SetTextData(wsText);
+ return pClone;
+}
+
+CFX_WideString CFX_XMLElement::GetLocalTagName() const {
+ FX_STRSIZE iFind = GetName().Find(L':', 0);
+ if (iFind < 0)
+ return GetName();
+ return GetName().Right(GetName().GetLength() - iFind - 1);
+}
+
+CFX_WideString CFX_XMLElement::GetNamespacePrefix() const {
+ FX_STRSIZE iFind = GetName().Find(L':', 0);
+ if (iFind < 0)
+ return CFX_WideString();
+ return GetName().Left(iFind);
+}
+
+CFX_WideString CFX_XMLElement::GetNamespaceURI() const {
+ CFX_WideString wsAttri(L"xmlns");
+ CFX_WideString wsPrefix = GetNamespacePrefix();
+ if (wsPrefix.GetLength() > 0) {
+ wsAttri += L":";
+ wsAttri += wsPrefix;
+ }
+
+ auto* pNode = static_cast<const CFX_XMLNode*>(this);
+ while (pNode) {
+ if (pNode->GetType() != FX_XMLNODE_Element)
+ break;
+
+ auto* pElement = static_cast<const CFX_XMLElement*>(pNode);
+ if (!pElement->HasAttribute(wsAttri)) {
+ pNode = pNode->GetNodeItem(CFX_XMLNode::Parent);
+ continue;
+ }
+ return pElement->GetString(wsAttri);
+ }
+ return CFX_WideString();
+}
+
+CFX_WideString CFX_XMLElement::GetTextData() const {
+ CFX_WideTextBuf buffer;
+ CFX_XMLNode* pChild = m_pChild;
+ while (pChild) {
+ switch (pChild->GetType()) {
+ case FX_XMLNODE_Text:
+ case FX_XMLNODE_CharData:
+ buffer << static_cast<CFX_XMLText*>(pChild)->GetText();
+ break;
+ default:
+ break;
+ }
+ pChild = pChild->m_pNext;
+ }
+ return buffer.MakeString();
+}
+
+void CFX_XMLElement::SetTextData(const CFX_WideString& wsText) {
+ if (wsText.GetLength() < 1)
+ return;
+ InsertChildNode(new CFX_XMLText(wsText));
+}