1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtXmlPatterns module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#include <QStringList>
41
42#include "private/qxmlutils_p.h"
43#include "qbuiltintypes_p.h"
44#include "qcommonvalues_p.h"
45#include "qnamepool_p.h"
46
47#include "qxpathhelper_p.h"
48
49QT_BEGIN_NAMESPACE
50
51using namespace QPatternist;
52
53bool XPathHelper::isReservedNamespace(const QXmlName::NamespaceCode ns)
54{
55 /* The order is because of that XFN and WXS are the most common. */
56 return ns == StandardNamespaces::fn ||
57 ns == StandardNamespaces::xs ||
58 ns == StandardNamespaces::xml ||
59 ns == StandardNamespaces::xsi;
60}
61
62bool XPathHelper::isQName(const QString &qName)
63{
64 const QStringList result(qName.split(sep: QLatin1Char(':')));
65 const int c = result.count();
66
67 if(c == 2)
68 {
69 return QXmlUtils::isNCName(ncName: result.first()) &&
70 QXmlUtils::isNCName(ncName: result.last());
71 }
72 else if(c == 1)
73 return QXmlUtils::isNCName(ncName: result.first());
74 else
75 return false;
76}
77
78void XPathHelper::splitQName(const QString &qName, QString &prefix, QString &ncName)
79{
80 Q_ASSERT_X(isQName(qName), Q_FUNC_INFO,
81 "qName must be a valid QName.");
82
83 const QStringList result(qName.split(sep: QLatin1Char(':')));
84
85 if(result.count() == 1)
86 {
87 Q_ASSERT(QXmlUtils::isNCName(result.first()));
88 ncName = result.first();
89 }
90 else
91 {
92 Q_ASSERT(result.count() == 2);
93 Q_ASSERT(QXmlUtils::isNCName(result.first()));
94 Q_ASSERT(QXmlUtils::isNCName(result.last()));
95
96 prefix = result.first();
97 ncName = result.last();
98 }
99}
100
101ItemType::Ptr XPathHelper::typeFromKind(const QXmlNodeModelIndex::NodeKind nodeKind)
102{
103 switch(nodeKind)
104 {
105 case QXmlNodeModelIndex::Element:
106 return BuiltinTypes::element;
107 case QXmlNodeModelIndex::Attribute:
108 return BuiltinTypes::attribute;
109 case QXmlNodeModelIndex::Text:
110 return BuiltinTypes::text;
111 case QXmlNodeModelIndex::ProcessingInstruction:
112 return BuiltinTypes::pi;
113 case QXmlNodeModelIndex::Comment:
114 return BuiltinTypes::comment;
115 case QXmlNodeModelIndex::Document:
116 return BuiltinTypes::document;
117 default:
118 {
119 Q_ASSERT_X(false, Q_FUNC_INFO,
120 "A node type that doesn't exist in the XPath Data Model was encountered.");
121 return ItemType::Ptr(); /* Dummy, silence compiler warning. */
122 }
123 }
124}
125
126QUrl XPathHelper::normalizeQueryURI(const QUrl &uri)
127{
128 Q_ASSERT_X(uri.isEmpty() || uri.isValid(), Q_FUNC_INFO,
129 "The URI passed to QXmlQuery::setQuery() must be valid or empty.");
130 if(uri.isEmpty())
131 return QUrl::fromLocalFile(localfile: QCoreApplication::applicationFilePath());
132 else if(uri.isRelative())
133 return QUrl::fromLocalFile(localfile: QCoreApplication::applicationFilePath()).resolved(relative: uri);
134 else
135 return uri;
136}
137
138QT_END_NAMESPACE
139

source code of qtxmlpatterns/src/xmlpatterns/utils/qxpathhelper.cpp