mirror of
https://github.com/jezhiggins/arabica
synced 2025-01-30 08:38:15 +01:00
OK, I really think that's it
This commit is contained in:
parent
1ed500107b
commit
4555948aae
10 changed files with 108 additions and 69 deletions
|
@ -176,6 +176,32 @@ public:
|
||||||
return static_cast<wchar_t>(c);
|
return static_cast<wchar_t>(c);
|
||||||
} // makeValueT
|
} // makeValueT
|
||||||
|
|
||||||
|
template<class InputIterator>
|
||||||
|
static inline string_type construct(InputIterator from, InputIterator to)
|
||||||
|
{
|
||||||
|
return string_type(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline string_type construct(const_iterator from, const_iterator to)
|
||||||
|
{
|
||||||
|
return string_type(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline string_type construct(const std::basic_string<value_type>& str)
|
||||||
|
{
|
||||||
|
return construct(str.begin(), str.end());
|
||||||
|
} // construct
|
||||||
|
|
||||||
|
static string_type construct(const value_type* str)
|
||||||
|
{
|
||||||
|
return str ? string_type(str) : string_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::wstring construct(const std::string& str)
|
||||||
|
{
|
||||||
|
return construct_from_utf8(str.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
static std::wstring construct_from_utf8(const char* str)
|
static std::wstring construct_from_utf8(const char* str)
|
||||||
{
|
{
|
||||||
widener_t w;
|
widener_t w;
|
||||||
|
|
|
@ -94,7 +94,7 @@ public:
|
||||||
} // characters
|
} // characters
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CompilationContext<string_type>& context_;
|
CompilationContext<string_type, string_adaptor>& context_;
|
||||||
ApplyTemplates<string_type, string_adaptor>* applyTemplates_;
|
ApplyTemplates<string_type, string_adaptor>* applyTemplates_;
|
||||||
}; // class ApplyTemplatesHandler
|
}; // class ApplyTemplatesHandler
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,8 @@ private:
|
||||||
return elements;
|
return elements;
|
||||||
|
|
||||||
string_type norm_cdata_sec_elements = text::normalize_whitespace<string_type, string_adaptor>(cdata_section_elements);
|
string_type norm_cdata_sec_elements = text::normalize_whitespace<string_type, string_adaptor>(cdata_section_elements);
|
||||||
std::basic_istringstream<typename string_adaptor::value_type> is(string_adaptor::asStdString(norm_cdata_sec_elements));
|
std::basic_stringstream<typename string_adaptor::value_type> is;
|
||||||
|
is << norm_cdata_sec_elements;
|
||||||
while(!is.eof())
|
while(!is.eof())
|
||||||
{
|
{
|
||||||
std::basic_string<typename string_adaptor::value_type> e;
|
std::basic_string<typename string_adaptor::value_type> e;
|
||||||
|
|
|
@ -79,7 +79,7 @@ public:
|
||||||
Disallow current(current_allowed_);
|
Disallow current(current_allowed_);
|
||||||
return xpath_.compile_match(match);
|
return xpath_.compile_match(match);
|
||||||
} // xpath_match
|
} // xpath_match
|
||||||
std::vector<Arabica::XPath::MatchExpr<string_type> > xpath_match_no_variables(const string_type& match) const
|
std::vector<Arabica::XPath::MatchExpr<string_type, string_adaptor> > xpath_match_no_variables(const string_type& match) const
|
||||||
{
|
{
|
||||||
Disallow variables(variables_allowed_);
|
Disallow variables(variables_allowed_);
|
||||||
return xpath_match(match);
|
return xpath_match(match);
|
||||||
|
@ -190,7 +190,7 @@ public:
|
||||||
} // precedence
|
} // precedence
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual Arabica::XPath::XPathExpression_impl<string_type, Arabica::default_string_adaptor<string_type> >*
|
virtual Arabica::XPath::XPathExpression_impl<string_type, string_adaptor>*
|
||||||
compileVariable(const string_type& namespace_uri, const string_type& name) const
|
compileVariable(const string_type& namespace_uri, const string_type& name) const
|
||||||
{
|
{
|
||||||
if(!variables_allowed_)
|
if(!variables_allowed_)
|
||||||
|
@ -199,10 +199,10 @@ private:
|
||||||
} // compileVariable
|
} // compileVariable
|
||||||
|
|
||||||
// FunctionResolver
|
// FunctionResolver
|
||||||
virtual Arabica::XPath::XPathFunction<string_type>* resolveFunction(
|
virtual Arabica::XPath::XPathFunction<string_type, string_adaptor>* resolveFunction(
|
||||||
const string_type& namespace_uri,
|
const string_type& namespace_uri,
|
||||||
const string_type& name,
|
const string_type& name,
|
||||||
const std::vector<Arabica::XPath::XPathExpression<string_type> >& argExprs) const
|
const std::vector<Arabica::XPath::XPathExpression<string_type, string_adaptor> >& argExprs) const
|
||||||
{
|
{
|
||||||
if(!string_adaptor::empty(namespace_uri))
|
if(!string_adaptor::empty(namespace_uri))
|
||||||
return new UndefinedFunction<string_type, string_adaptor>(namespace_uri, name, argExprs);
|
return new UndefinedFunction<string_type, string_adaptor>(namespace_uri, name, argExprs);
|
||||||
|
@ -273,8 +273,8 @@ private:
|
||||||
mutable bool current_allowed_;
|
mutable bool current_allowed_;
|
||||||
mutable bool variables_allowed_;
|
mutable bool variables_allowed_;
|
||||||
Precedence precedence_;
|
Precedence precedence_;
|
||||||
Arabica::XPath::XPath<string_type> xpath_;
|
Arabica::XPath::XPath<string_type, string_adaptor> xpath_;
|
||||||
std::stack<SAX::DefaultHandler<string_type>*> handlerStack_;
|
std::stack<SAX::DefaultHandler<string_type, string_adaptor>*> handlerStack_;
|
||||||
std::stack<ItemContainer<string_type, string_adaptor>*> parentStack_;
|
std::stack<ItemContainer<string_type, string_adaptor>*> parentStack_;
|
||||||
std::map<string_type, Namespace> namespaceRemap_;
|
std::map<string_type, Namespace> namespaceRemap_;
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ protected:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual const string_type& name() const = 0;
|
virtual const string_type& name() const = 0;
|
||||||
virtual Arabica::XPath::XPathValue<string_type> value(const DOM::Node<string_type, string_adaptor>& node,
|
virtual Arabica::XPath::XPathValue<string_type, string_adaptor> value(const DOM::Node<string_type, string_adaptor>& node,
|
||||||
ExecutionContext<string_type, string_adaptor>& context,
|
ExecutionContext<string_type, string_adaptor>& context,
|
||||||
DOMSink<string_type, string_adaptor>& sink) const = 0;
|
DOMSink<string_type, string_adaptor>& sink) const = 0;
|
||||||
virtual const Precedence& precedence() const = 0;
|
virtual const Precedence& precedence() const = 0;
|
||||||
|
|
|
@ -35,7 +35,7 @@ struct QName
|
||||||
string_adaptor::append(qname, lN);
|
string_adaptor::append(qname, lN);
|
||||||
} // QName
|
} // QName
|
||||||
|
|
||||||
static QName create(const XML::QualifiedName<string_type>& qName)
|
static QName create(const XML::QualifiedName<string_type, string_adaptor>& qName)
|
||||||
{
|
{
|
||||||
if(string_adaptor::length(qName.prefix()) && string_adaptor::empty(qName.namespaceUri()))
|
if(string_adaptor::length(qName.prefix()) && string_adaptor::empty(qName.namespaceUri()))
|
||||||
throw SAX::SAXException("Prefix " + string_adaptor::asStdString(qName.prefix()) + " is not declared.");
|
throw SAX::SAXException("Prefix " + string_adaptor::asStdString(qName.prefix()) + " is not declared.");
|
||||||
|
|
|
@ -378,7 +378,7 @@ protected:
|
||||||
|
|
||||||
void do_characters(const string_type& ch)
|
void do_characters(const string_type& ch)
|
||||||
{
|
{
|
||||||
DOM::Node<string_type> lc = current().getLastChild();
|
DOM::Node<string_type, string_adaptor> lc = current().getLastChild();
|
||||||
if(lc == 0 || lc.getNodeType() != DOM::Node_base::TEXT_NODE)
|
if(lc == 0 || lc.getNodeType() != DOM::Node_base::TEXT_NODE)
|
||||||
current().appendChild(document().createTextNode(ch));
|
current().appendChild(document().createTextNode(ch));
|
||||||
else
|
else
|
||||||
|
@ -391,7 +391,7 @@ protected:
|
||||||
|
|
||||||
void do_end_CDATA()
|
void do_end_CDATA()
|
||||||
{
|
{
|
||||||
DOM::Node<string_type> lc = current().getLastChild();
|
DOM::Node<string_type, string_adaptor> lc = current().getLastChild();
|
||||||
if(lc.getNodeType() == DOM::Node_base::TEXT_NODE)
|
if(lc.getNodeType() == DOM::Node_base::TEXT_NODE)
|
||||||
current().replaceChild(document().createCDATASection(lc.getNodeValue()), lc);
|
current().replaceChild(document().createCDATASection(lc.getNodeValue()), lc);
|
||||||
} // do_end_CDATA
|
} // do_end_CDATA
|
||||||
|
@ -434,7 +434,7 @@ protected:
|
||||||
} // do_end_element
|
} // do_end_element
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DOM::Document<string_type>& document()
|
DOM::Document<string_type, string_adaptor>& document()
|
||||||
{
|
{
|
||||||
if(document_ != 0)
|
if(document_ != 0)
|
||||||
return document_;
|
return document_;
|
||||||
|
@ -444,7 +444,7 @@ private:
|
||||||
return document_;
|
return document_;
|
||||||
} // document
|
} // document
|
||||||
|
|
||||||
DOM::Node<string_type>& current()
|
DOM::Node<string_type, string_adaptor>& current()
|
||||||
{
|
{
|
||||||
if(current_ != 0)
|
if(current_ != 0)
|
||||||
return current_;
|
return current_;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning(disable : 4250)
|
#pragma warning(disable : 4250 4244)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -60,26 +60,27 @@ const std::string SEPERATOR = "/";
|
||||||
template<class string_type, class string_adaptor>
|
template<class string_type, class string_adaptor>
|
||||||
Arabica::DOM::Document<string_type, string_adaptor> buildDOM(const std::string& filename)
|
Arabica::DOM::Document<string_type, string_adaptor> buildDOM(const std::string& filename)
|
||||||
{
|
{
|
||||||
Arabica::SAX::InputSource<string_type, string_adaptor> is(filename);
|
Arabica::SAX::InputSource<string_type, string_adaptor> is(string_adaptor::construct(filename));
|
||||||
Arabica::SAX2DOM::Parser<string_type, string_adaptor> parser;
|
Arabica::SAX2DOM::Parser<string_type, string_adaptor> parser;
|
||||||
parser.parse(is);
|
parser.parse(is);
|
||||||
|
|
||||||
Arabica::DOM::Documentstring_type, string_adaptor> d = parser.getDocument();
|
Arabica::DOM::Document<string_type, string_adaptor> d = parser.getDocument();
|
||||||
if(d != 0)
|
if(d != 0)
|
||||||
d.normalize();
|
d.normalize();
|
||||||
return d;
|
return d;
|
||||||
} // buildDOM
|
} // buildDOM
|
||||||
|
|
||||||
Arabica::DOM::Document<std::string> buildDOMFromString(const std::string& xml)
|
template<class string_type, class string_adaptor>
|
||||||
|
Arabica::DOM::Document<string_type, string_adaptor> buildDOMFromString(const std::string& xml)
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << xml;
|
ss << xml;
|
||||||
Arabica::SAX::InputSource<std::string> is(ss);
|
Arabica::SAX::InputSource<string_type, string_adaptor> is(ss);
|
||||||
|
|
||||||
Arabica::SAX2DOM::Parser<std::string> parser;
|
Arabica::SAX2DOM::Parser<string_type, string_adaptor> parser;
|
||||||
parser.parse(is);
|
parser.parse(is);
|
||||||
|
|
||||||
Arabica::DOM::Document<std::string> d = parser.getDocument();
|
Arabica::DOM::Document<string_type, string_adaptor> d = parser.getDocument();
|
||||||
if(d != 0)
|
if(d != 0)
|
||||||
d.normalize();
|
d.normalize();
|
||||||
return d;
|
return d;
|
||||||
|
@ -111,13 +112,17 @@ std::string readFragment(const std::string& filename)
|
||||||
return frag;
|
return frag;
|
||||||
} // readFragment
|
} // readFragment
|
||||||
|
|
||||||
Arabica::XPath::NodeSet<std::string> selectNodes(const std::string& path, const Arabica::DOM::Node<std::string>& node)
|
template<class string_type, class string_adaptor>
|
||||||
|
Arabica::XPath::NodeSet<string_type, string_adaptor> selectNodes(const char* path,
|
||||||
|
const Arabica::DOM::Node<string_type, string_adaptor>& node)
|
||||||
{
|
{
|
||||||
Arabica::XPath::XPath<std::string> xpath;
|
Arabica::XPath::XPath<string_type, string_adaptor> xpath;
|
||||||
return xpath.evaluate(path, node).asNodeSet();
|
return xpath.evaluate(string_adaptor::construct(path), node).asNodeSet();
|
||||||
} // selectNodes
|
} // selectNodes
|
||||||
|
|
||||||
Arabica::DOM::Node<std::string> selectNode(const std::string& path, const Arabica::DOM::Node<std::string>& node)
|
template<class string_type, class string_adaptor>
|
||||||
|
Arabica::DOM::Node<string_type, string_adaptor> selectNode(const char* path,
|
||||||
|
const Arabica::DOM::Node<string_type, string_adaptor>& node)
|
||||||
{
|
{
|
||||||
return selectNodes(path, node)[0];
|
return selectNodes(path, node)[0];
|
||||||
} // selectNode
|
} // selectNode
|
||||||
|
@ -171,7 +176,7 @@ protected:
|
||||||
{
|
{
|
||||||
Arabica::XSLT::StylesheetCompiler<string_type, string_adaptor> compiler;
|
Arabica::XSLT::StylesheetCompiler<string_type, string_adaptor> compiler;
|
||||||
|
|
||||||
Arabica::SAX::InputSource<string_type, string_adaptor> source(input_xslt_);
|
Arabica::SAX::InputSource<string_type, string_adaptor> source(string_adaptor::construct(input_xslt_));
|
||||||
std::auto_ptr<Arabica::XSLT::Stylesheet<string_type, string_adaptor> > stylesheet = compiler.compile(source);
|
std::auto_ptr<Arabica::XSLT::Stylesheet<string_type, string_adaptor> > stylesheet = compiler.compile(source);
|
||||||
if(stylesheet.get() != 0)
|
if(stylesheet.get() != 0)
|
||||||
assertImplementation(false, "Expected " + input_xslt_ + " not to compile. But it did :o");
|
assertImplementation(false, "Expected " + input_xslt_ + " not to compile. But it did :o");
|
||||||
|
@ -203,7 +208,7 @@ protected:
|
||||||
{
|
{
|
||||||
Arabica::XSLT::StylesheetCompiler<string_type, string_adaptor> compiler;
|
Arabica::XSLT::StylesheetCompiler<string_type, string_adaptor> compiler;
|
||||||
|
|
||||||
Arabica::SAX::InputSource<string_type, string_adaptor> source(input_xslt_);
|
Arabica::SAX::InputSource<string_type, string_adaptor> source(string_adaptor::construct(input_xslt_));
|
||||||
std::auto_ptr<Arabica::XSLT::Stylesheet<string_type, string_adaptor> > stylesheet = compiler.compile(source);
|
std::auto_ptr<Arabica::XSLT::Stylesheet<string_type, string_adaptor> > stylesheet = compiler.compile(source);
|
||||||
if(stylesheet.get() == 0)
|
if(stylesheet.get() == 0)
|
||||||
assertImplementation(false, "Failed to compile " + input_xslt_ + " : " + compiler.error());
|
assertImplementation(false, "Failed to compile " + input_xslt_ + " : " + compiler.error());
|
||||||
|
@ -211,10 +216,10 @@ protected:
|
||||||
Arabica::XSLT::DOMSink<string_type, string_adaptor> output;
|
Arabica::XSLT::DOMSink<string_type, string_adaptor> output;
|
||||||
stylesheet->set_output(output);
|
stylesheet->set_output(output);
|
||||||
|
|
||||||
std::ostringstream errors;
|
std::basic_ostringstream<typename string_adaptor::value_type> errors;
|
||||||
stylesheet->set_error_output(errors);
|
stylesheet->set_error_output(errors);
|
||||||
|
|
||||||
Arabica::DOM::Document<string_type, string_adaptor> document = buildDOM(input_xml_);
|
Arabica::DOM::Document<string_type, string_adaptor> document = buildDOM<string_type, string_adaptor>(input_xml_);
|
||||||
try {
|
try {
|
||||||
stylesheet->execute(document);
|
stylesheet->execute(document);
|
||||||
}
|
}
|
||||||
|
@ -248,7 +253,8 @@ protected:
|
||||||
{
|
{
|
||||||
Arabica::XSLT::StylesheetCompiler<string_type, string_adaptor> compiler;
|
Arabica::XSLT::StylesheetCompiler<string_type, string_adaptor> compiler;
|
||||||
|
|
||||||
Arabica::SAX::InputSource<string_type, string_adaptor> source(input_xslt_);
|
string_type input = string_adaptor::construct(input_xslt_);
|
||||||
|
Arabica::SAX::InputSource<string_type, string_adaptor> source(input);
|
||||||
std::auto_ptr<Arabica::XSLT::Stylesheet<string_type, string_adaptor> > stylesheet = compiler.compile(source);
|
std::auto_ptr<Arabica::XSLT::Stylesheet<string_type, string_adaptor> > stylesheet = compiler.compile(source);
|
||||||
if(stylesheet.get() == 0)
|
if(stylesheet.get() == 0)
|
||||||
return;
|
return;
|
||||||
|
@ -256,10 +262,10 @@ protected:
|
||||||
Arabica::XSLT::DOMSink<string_type, string_adaptor> output;
|
Arabica::XSLT::DOMSink<string_type, string_adaptor> output;
|
||||||
stylesheet->set_output(output);
|
stylesheet->set_output(output);
|
||||||
|
|
||||||
std::ostringstream errors;
|
std::basic_ostringstream<typename string_adaptor::value_type> errors;
|
||||||
stylesheet->set_error_output(errors);
|
stylesheet->set_error_output(errors);
|
||||||
|
|
||||||
Arabica::DOM::Document<string_type, string_adaptor> document = buildDOM(input_xml_);
|
Arabica::DOM::Document<string_type, string_adaptor> document = buildDOM<string_type, string_adaptor>(input_xml_);
|
||||||
try {
|
try {
|
||||||
stylesheet->execute(document);
|
stylesheet->execute(document);
|
||||||
}
|
}
|
||||||
|
@ -294,19 +300,19 @@ protected:
|
||||||
{
|
{
|
||||||
Arabica::XSLT::StylesheetCompiler<string_type, string_adaptor> compiler;
|
Arabica::XSLT::StylesheetCompiler<string_type, string_adaptor> compiler;
|
||||||
|
|
||||||
Arabica::SAX::InputSource<string_type, string_adaptor> source(input_xslt_);
|
Arabica::SAX::InputSource<string_type, string_adaptor> source(string_adaptor::construct(input_xslt_));
|
||||||
std::auto_ptr<Arabica::XSLT::Stylesheet<string_type, string_adaptor> > stylesheet = compiler.compile(source);
|
std::auto_ptr<Arabica::XSLT::Stylesheet<string_type, string_adaptor> > stylesheet = compiler.compile(source);
|
||||||
if(stylesheet.get() == 0)
|
if(stylesheet.get() == 0)
|
||||||
assertImplementation(false, "Failed to compile " + input_xslt_ + " : " + compiler.error());
|
assertImplementation(false, "Failed to compile " + input_xslt_ + " : " + compiler.error());
|
||||||
|
|
||||||
std::ostringstream xml_output;
|
std::basic_ostringstream<typename string_adaptor::value_type> xml_output;
|
||||||
Arabica::XSLT::StreamSink<string_type, string_adaptor> output(xml_output);
|
Arabica::XSLT::StreamSink<string_type, string_adaptor> output(xml_output);
|
||||||
stylesheet->set_output(output);
|
stylesheet->set_output(output);
|
||||||
|
|
||||||
std::ostringstream errors;
|
std::basic_ostringstream<typename string_adaptor::value_type> errors;
|
||||||
stylesheet->set_error_output(errors);
|
stylesheet->set_error_output(errors);
|
||||||
|
|
||||||
Arabica::DOM::Document<string_type, string_adaptor> document = buildDOM(input_xml_);
|
Arabica::DOM::Document<string_type, string_adaptor> document = buildDOM<string_type, string_adaptor>(input_xml_);
|
||||||
try {
|
try {
|
||||||
stylesheet->execute(document);
|
stylesheet->execute(document);
|
||||||
}
|
}
|
||||||
|
@ -315,7 +321,7 @@ protected:
|
||||||
} // catch
|
} // catch
|
||||||
|
|
||||||
std::string ref = readFile(output_xml_);
|
std::string ref = readFile(output_xml_);
|
||||||
std::string out = xml_output.str();
|
std::string out = string_adaptor::asStdString(string_adaptor::construct(xml_output.str()));
|
||||||
|
|
||||||
if(ref == out)
|
if(ref == out)
|
||||||
return;
|
return;
|
||||||
|
@ -338,7 +344,7 @@ protected:
|
||||||
private:
|
private:
|
||||||
std::string stripWhitespace(const std::string& str)
|
std::string stripWhitespace(const std::string& str)
|
||||||
{
|
{
|
||||||
std::string s = Arabica::text::normalize_whitespace<string_type, string_adaptor>(str);
|
std::string s = Arabica::text::normalize_whitespace<std::string, Arabica::default_string_adaptor<std::string> >(str);
|
||||||
|
|
||||||
std::string::size_type i = s.find("> ");
|
std::string::size_type i = s.find("> ");
|
||||||
while(i != std::string::npos)
|
while(i != std::string::npos)
|
||||||
|
@ -390,7 +396,7 @@ protected:
|
||||||
{
|
{
|
||||||
Arabica::XSLT::StylesheetCompiler<string_type, string_adaptor> compiler;
|
Arabica::XSLT::StylesheetCompiler<string_type, string_adaptor> compiler;
|
||||||
|
|
||||||
Arabica::SAX::InputSource<string_type, string_adaptor> source(input_xslt_);
|
Arabica::SAX::InputSource<string_type, string_adaptor> source(string_adaptor::construct(input_xslt_));
|
||||||
std::auto_ptr<Arabica::XSLT::Stylesheet<string_type, string_adaptor> > stylesheet = compiler.compile(source);
|
std::auto_ptr<Arabica::XSLT::Stylesheet<string_type, string_adaptor> > stylesheet = compiler.compile(source);
|
||||||
if(stylesheet.get() == 0)
|
if(stylesheet.get() == 0)
|
||||||
assertImplementation(false, "Failed to compile " + input_xslt_ + " : " + compiler.error());
|
assertImplementation(false, "Failed to compile " + input_xslt_ + " : " + compiler.error());
|
||||||
|
@ -398,10 +404,10 @@ protected:
|
||||||
Arabica::XSLT::DOMSink<string_type, string_adaptor> output;
|
Arabica::XSLT::DOMSink<string_type, string_adaptor> output;
|
||||||
stylesheet->set_output(output);
|
stylesheet->set_output(output);
|
||||||
|
|
||||||
std::ostringstream errors;
|
std::basic_ostringstream<typename string_adaptor::value_type> errors;
|
||||||
stylesheet->set_error_output(errors);
|
stylesheet->set_error_output(errors);
|
||||||
|
|
||||||
Arabica::DOM::Document<string_type, string_adaptor> document = buildDOM(input_xml_);
|
Arabica::DOM::Document<string_type, string_adaptor> document = buildDOM<string_type, string_adaptor>(input_xml_);
|
||||||
try {
|
try {
|
||||||
stylesheet->execute(document);
|
stylesheet->execute(document);
|
||||||
}
|
}
|
||||||
|
@ -410,7 +416,7 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string refStr = "<wrapper>" + readFragment(output_xml_) + "</wrapper>";
|
std::string refStr = "<wrapper>" + readFragment(output_xml_) + "</wrapper>";
|
||||||
Arabica::DOM::Document<string_type, string_adaptor> refDoc = buildDOMFromString(refStr);
|
Arabica::DOM::Document<string_type, string_adaptor> refDoc = buildDOMFromString<string_type, string_adaptor>(refStr);
|
||||||
if(refDoc == 0)
|
if(refDoc == 0)
|
||||||
assertImplementation(false, "Couldn't read " + output_xml_ + ". Perhaps it isn't well-formed XML?");
|
assertImplementation(false, "Couldn't read " + output_xml_ + ". Perhaps it isn't well-formed XML?");
|
||||||
Arabica::DOM::DocumentFragment<string_type, string_adaptor> ref = refDoc.createDocumentFragment();
|
Arabica::DOM::DocumentFragment<string_type, string_adaptor> ref = refDoc.createDocumentFragment();
|
||||||
|
@ -439,27 +445,29 @@ protected:
|
||||||
|
|
||||||
std::string docToString(Arabica::DOM::Node<string_type, string_adaptor> node)
|
std::string docToString(Arabica::DOM::Node<string_type, string_adaptor> node)
|
||||||
{
|
{
|
||||||
std::ostringstream ss;
|
std::basic_ostringstream<typename string_adaptor::value_type> ss;
|
||||||
ss << node;
|
ss << node;
|
||||||
return Arabica::text::normalize_whitespace<string_type, string_adaptor>(ss.str());
|
string_type streamed = string_adaptor::construct(ss.str());
|
||||||
|
streamed = Arabica::text::normalize_whitespace<string_type, string_adaptor>(streamed);
|
||||||
|
return string_adaptor::asStdString(streamed);
|
||||||
} // docToString
|
} // docToString
|
||||||
|
|
||||||
void stripWhitespace(Arabica::DOM::Node<string_type, string_adaptor> doc)
|
void stripWhitespace(Arabica::DOM::Node<string_type, string_adaptor> doc)
|
||||||
{
|
{
|
||||||
Arabica::XPath::NodeSet<string_type, string_adaptor> textNodes = selectNodes("//text()", doc);
|
Arabica::XPath::NodeSet<string_type, string_adaptor> textNodes = selectNodes<string_type, string_adaptor>("//text()", doc);
|
||||||
for(size_t i = 0; i != textNodes.size(); ++i)
|
for(size_t i = 0; i != textNodes.size(); ++i)
|
||||||
{
|
{
|
||||||
Arabica::DOM::Node<string_type, string_adaptor> t = textNodes[i];
|
Arabica::DOM::Node<string_type, string_adaptor> t = textNodes[i];
|
||||||
std::string text = t.getNodeValue();
|
string_type text = t.getNodeValue();
|
||||||
text = Arabica::text::normalize_whitespace<string_type, string_adaptor>(text);
|
text = Arabica::text::normalize_whitespace<string_type, string_adaptor>(text);
|
||||||
size_t index = text.find_first_of(" ");
|
size_t index = string_adaptor::find(text, Arabica::text::Unicode<typename string_adaptor::value_type>::SPACE);
|
||||||
while(index != std::string::npos)
|
while(index != string_adaptor::npos())
|
||||||
{
|
{
|
||||||
text.replace(index, 1, "");
|
text = string_adaptor::concat(string_adaptor::substr(text, 0, index), string_adaptor::substr(text, index+1));
|
||||||
index = text.find_first_of(" ");
|
index = string_adaptor::find(text, Arabica::text::Unicode<typename string_adaptor::value_type>::SPACE);
|
||||||
}
|
}
|
||||||
t.setNodeValue(text);
|
t.setNodeValue(text);
|
||||||
if(text.length() == 0)
|
if(string_adaptor::length(text) == 0)
|
||||||
t.getParentNode().removeChild(t);
|
t.getParentNode().removeChild(t);
|
||||||
}
|
}
|
||||||
} // stripWhitespace
|
} // stripWhitespace
|
||||||
|
@ -489,7 +497,7 @@ protected:
|
||||||
{
|
{
|
||||||
Arabica::XSLT::StylesheetCompiler<string_type, string_adaptor> compiler;
|
Arabica::XSLT::StylesheetCompiler<string_type, string_adaptor> compiler;
|
||||||
|
|
||||||
Arabica::SAX::InputSource<string_type, string_adaptor> source(input_xslt_);
|
Arabica::SAX::InputSource<string_type, string_adaptor> source(string_adaptor::construct(input_xslt_));
|
||||||
std::auto_ptr<Arabica::XSLT::Stylesheet<string_type, string_adaptor> > stylesheet = compiler.compile(source);
|
std::auto_ptr<Arabica::XSLT::Stylesheet<string_type, string_adaptor> > stylesheet = compiler.compile(source);
|
||||||
if(stylesheet.get() == 0)
|
if(stylesheet.get() == 0)
|
||||||
assertImplementation(false, "Failed to compile " + input_xslt_ + " : " + compiler.error());
|
assertImplementation(false, "Failed to compile " + input_xslt_ + " : " + compiler.error());
|
||||||
|
@ -497,10 +505,10 @@ protected:
|
||||||
Arabica::XSLT::DOMSink<string_type, string_adaptor> output;
|
Arabica::XSLT::DOMSink<string_type, string_adaptor> output;
|
||||||
stylesheet->set_output(output);
|
stylesheet->set_output(output);
|
||||||
|
|
||||||
std::ostringstream errors;
|
std::basic_ostringstream<typename string_adaptor::value_type> errors;
|
||||||
stylesheet->set_error_output(errors);
|
stylesheet->set_error_output(errors);
|
||||||
|
|
||||||
Arabica::DOM::Document<string_type, string_adaptor> document = buildDOM(input_xml_);
|
Arabica::DOM::Document<string_type, string_adaptor> document = buildDOM<string_type, string_adaptor>(input_xml_);
|
||||||
if(document == 0)
|
if(document == 0)
|
||||||
assertImplementation(false, "Couldn't read " + input_xml_ + ". Perhaps it isn't well-formed XML?");
|
assertImplementation(false, "Couldn't read " + input_xml_ + ". Perhaps it isn't well-formed XML?");
|
||||||
try {
|
try {
|
||||||
|
@ -510,7 +518,7 @@ protected:
|
||||||
assertImplementation(false, "Failed to run " + input_xslt_ + " : " + e.what());
|
assertImplementation(false, "Failed to run " + input_xslt_ + " : " + e.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
Arabica::DOM::Document<string_type, string_adaptor> ref = buildDOM(output_xml_);
|
Arabica::DOM::Document<string_type, string_adaptor> ref = buildDOM<string_type, string_adaptor>(output_xml_);
|
||||||
if(ref == 0)
|
if(ref == 0)
|
||||||
assertImplementation(false, "Couldn't read " + output_xml_ + ". Perhaps it isn't well-formed XML?");
|
assertImplementation(false, "Couldn't read " + output_xml_ + ". Perhaps it isn't well-formed XML?");
|
||||||
Arabica::DOM::Node<string_type, string_adaptor> out = output.node();
|
Arabica::DOM::Node<string_type, string_adaptor> out = output.node();
|
||||||
|
@ -535,9 +543,11 @@ protected:
|
||||||
|
|
||||||
std::string docToString(Arabica::DOM::Node<string_type, string_adaptor> node)
|
std::string docToString(Arabica::DOM::Node<string_type, string_adaptor> node)
|
||||||
{
|
{
|
||||||
std::ostringstream ss;
|
std::basic_ostringstream<typename string_adaptor::value_type> ss;
|
||||||
ss << node;
|
ss << node;
|
||||||
std::string xml = Arabica::text::normalize_whitespace<string_type, string_adaptor>(ss.str());
|
string_type streamed = string_adaptor::construct(ss.str());
|
||||||
|
streamed = Arabica::text::normalize_whitespace<string_type, string_adaptor>(streamed);
|
||||||
|
std::string xml = string_adaptor::asStdString(streamed);
|
||||||
if(xml.find("<?xml version=\"1.0\"?> ") == 0)
|
if(xml.find("<?xml version=\"1.0\"?> ") == 0)
|
||||||
xml.replace(0, 22, "");
|
xml.replace(0, 22, "");
|
||||||
return xml;
|
return xml;
|
||||||
|
@ -545,17 +555,17 @@ protected:
|
||||||
|
|
||||||
void stripWhitespace(Arabica::DOM::Node<string_type, string_adaptor> doc)
|
void stripWhitespace(Arabica::DOM::Node<string_type, string_adaptor> doc)
|
||||||
{
|
{
|
||||||
Arabica::XPath::NodeSet<string_type, string_adaptor> textNodes = selectNodes("//text()", doc);
|
Arabica::XPath::NodeSet<string_type, string_adaptor> textNodes = selectNodes<string_type, string_adaptor>("//text()", doc);
|
||||||
for(size_t i = 0; i != textNodes.size(); ++i)
|
for(size_t i = 0; i != textNodes.size(); ++i)
|
||||||
{
|
{
|
||||||
Arabica::DOM::Node<string_type, string_adaptor> t = textNodes[i];
|
Arabica::DOM::Node<string_type, string_adaptor> t = textNodes[i];
|
||||||
std::string text = t.getNodeValue();
|
string_type text = t.getNodeValue();
|
||||||
text = Arabica::text::normalize_whitespace<string_type, string_adaptor>(text);
|
text = Arabica::text::normalize_whitespace<string_type, string_adaptor>(text);
|
||||||
size_t index = text.find_first_of(" ");
|
size_t index = string_adaptor::find(text, Arabica::text::Unicode<typename string_adaptor::value_type>::SPACE);
|
||||||
while(index != std::string::npos)
|
while(index != string_adaptor::npos())
|
||||||
{
|
{
|
||||||
text.replace(index, 1, "");
|
text = string_adaptor::concat(string_adaptor::substr(text, 0, index), string_adaptor::substr(text, index+1));
|
||||||
index = text.find_first_of(" ");
|
index = string_adaptor::find(text, Arabica::text::Unicode<typename string_adaptor::value_type>::SPACE);
|
||||||
}
|
}
|
||||||
t.setNodeValue(text);
|
t.setNodeValue(text);
|
||||||
}
|
}
|
||||||
|
@ -579,8 +589,8 @@ public:
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::cerr << "Loaded expected fails" << std::endl;
|
std::cerr << "Loaded expected fails" << std::endl;
|
||||||
Arabica::DOM::Document<std::string> fail_doc = buildDOM<std::string>(PATH_PREFIX + "arabica-expected-fails.xml");
|
Arabica::DOM::Document<std::string> fail_doc = buildDOM<std::string, Arabica::default_string_adaptor<std::string> >(PATH_PREFIX + "arabica-expected-fails.xml");
|
||||||
Arabica::XPath::NodeSet<std::string> failcases = selectNodes("/test-suite/test-case", fail_doc);
|
Arabica::XPath::NodeSet<std::string> failcases = selectNodes<std::string, Arabica::default_string_adaptor<std::string> >("/test-suite/test-case", fail_doc);
|
||||||
for(size_t i = 0; i != failcases.size(); ++i)
|
for(size_t i = 0; i != failcases.size(); ++i)
|
||||||
{
|
{
|
||||||
std::string name = selectString("@id", failcases[i]);
|
std::string name = selectString("@id", failcases[i]);
|
||||||
|
@ -637,7 +647,7 @@ Arabica::DOM::Document<std::string> Loader<string_type, string_adaptor>::loadCat
|
||||||
if(c == 0)
|
if(c == 0)
|
||||||
{
|
{
|
||||||
std::cerr << "Loading " << catalog_filename << std::endl;
|
std::cerr << "Loading " << catalog_filename << std::endl;
|
||||||
c = buildDOM(PATH_PREFIX + catalog_filename);
|
c = buildDOM<std::string, Arabica::default_string_adaptor<std::string> >(PATH_PREFIX + catalog_filename);
|
||||||
catalogs_[catalog_filename] = c;
|
catalogs_[catalog_filename] = c;
|
||||||
} // if(c == 0)
|
} // if(c == 0)
|
||||||
|
|
||||||
|
@ -651,8 +661,9 @@ TestSuite* Loader<string_type, string_adaptor>::suite(const std::string& path, c
|
||||||
|
|
||||||
TestSuite *suiteOfTests = new TestSuite;
|
TestSuite *suiteOfTests = new TestSuite;
|
||||||
|
|
||||||
|
std::string testNamesSelector = "/test-suite/test-catalog/test-case[file-path='" + path + "']";
|
||||||
Arabica::XPath::NodeSet<std::string> tests =
|
Arabica::XPath::NodeSet<std::string> tests =
|
||||||
selectNodes("/test-suite/test-catalog/test-case[file-path='" + path + "']", catalog);
|
selectNodes<std::string, Arabica::default_string_adaptor<std::string> >(testNamesSelector.c_str(), catalog);
|
||||||
std::cerr << "There are " << tests.size() << " " << path << " tests." << std::endl;
|
std::cerr << "There are " << tests.size() << " " << path << " tests." << std::endl;
|
||||||
for(size_t i = 0; i != tests.size(); ++i)
|
for(size_t i = 0; i != tests.size(); ++i)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
@ -114,6 +114,7 @@
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\tests\silly_string\silly_string.cpp" />
|
||||||
<ClCompile Include="..\tests\Xslt\main_silly.cpp" />
|
<ClCompile Include="..\tests\Xslt\main_silly.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
Loading…
Add table
Reference in a new issue