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 "qcommonsequencetypes_p.h" 41 #include "qpatternistlocale_p.h" 42 #include "qnodebuilder_p.h" 43 44 #include "qcommentconstructor_p.h" 45 46 QT_BEGIN_NAMESPACE 47 48 using namespace QPatternist; 49 CommentConstructor(const Expression::Ptr & op)50CommentConstructor::CommentConstructor(const Expression::Ptr &op) : SingleContainer(op) 51 { 52 } 53 evaluateContent(const DynamicContext::Ptr & context) const54QString CommentConstructor::evaluateContent(const DynamicContext::Ptr &context) const 55 { 56 const Item item(m_operand->evaluateSingleton(context)); 57 58 if(!item) 59 return QString(); 60 61 const QString content(item.stringValue()); 62 63 if(content.contains(QLatin1String("--"))) 64 { 65 context->error(QtXmlPatterns::tr("A comment cannot contain %1") 66 .arg(formatData("--")), 67 ReportContext::XQDY0072, this); 68 } 69 else if(content.endsWith(QLatin1Char('-'))) 70 { 71 context->error(QtXmlPatterns::tr("A comment cannot end with a %1.") 72 .arg(formatData(QLatin1Char('-'))), 73 ReportContext::XQDY0072, this); 74 } 75 76 return content; 77 } 78 evaluateSingleton(const DynamicContext::Ptr & context) const79Item CommentConstructor::evaluateSingleton(const DynamicContext::Ptr &context) const 80 { 81 const QString content(evaluateContent(context)); 82 const NodeBuilder::Ptr nodeBuilder(context->nodeBuilder(QUrl())); 83 nodeBuilder->comment(content); 84 85 const QAbstractXmlNodeModel::Ptr nm(nodeBuilder->builtDocument()); 86 context->addNodeModel(nm); 87 88 return nm->root(QXmlNodeModelIndex()); 89 } 90 evaluateToSequenceReceiver(const DynamicContext::Ptr & context) const91void CommentConstructor::evaluateToSequenceReceiver(const DynamicContext::Ptr &context) const 92 { 93 const QString content(evaluateContent(context)); 94 QAbstractXmlReceiver *const receiver = context->outputReceiver(); 95 96 receiver->comment(content); 97 } 98 staticType() const99SequenceType::Ptr CommentConstructor::staticType() const 100 { 101 return CommonSequenceTypes::ExactlyOneComment; 102 } 103 expectedOperandTypes() const104SequenceType::List CommentConstructor::expectedOperandTypes() const 105 { 106 SequenceType::List result; 107 result.append(CommonSequenceTypes::ZeroOrOneString); 108 return result; 109 } 110 properties() const111Expression::Properties CommentConstructor::properties() const 112 { 113 return DisableElimination | IsNodeConstructor; 114 } 115 116 ExpressionVisitorResult::Ptr accept(const ExpressionVisitor::Ptr & visitor) const117CommentConstructor::accept(const ExpressionVisitor::Ptr &visitor) const 118 { 119 return visitor->visit(this); 120 } 121 122 QT_END_NAMESPACE 123