From 32c65970263c65022f5278b568c07b63c3d5d64b Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Sun, 15 Jun 2014 15:14:46 +0200 Subject: Merged "read-xml-file" and "read-file" into "read-file" * FunctionReadFile is now able to distinguish between XML files and plain text files ** it selects the appropriate course of action automatically ** reading the file as XML into the DOM or reading it as a string * the current selection criteria is the file extension ** I am thinking about trying to import every file into the DOM and using the result state of that action as selection criteria * Updated README.md and test cases accordingly --- CMakeLists.txt | 1 - README.md | 7 ++- src/function/read_file.cc | 53 +++++++++++++++++++-- src/function/read_xml_file.cc | 86 ----------------------------------- src/function/read_xml_file.h | 27 ----------- src/plattform_guard.cc | 7 --- test/common/test.md | 28 ++++++++++++ test/common/test.txt | 7 --- test/common/test.xml | 7 +++ test/external_text_formatter/test.md | 28 ------------ test/read_file/reference.xml | 35 +++++++++++--- test/read_file/transformation.xsl | 2 +- test/read_xml_file/transformation.xsl | 2 +- test/transform/transformation.xsl | 2 +- 14 files changed, 118 insertions(+), 174 deletions(-) delete mode 100644 src/function/read_xml_file.cc delete mode 100644 src/function/read_xml_file.h create mode 100644 test/common/test.md delete mode 100644 test/common/test.txt create mode 100644 test/common/test.xml delete mode 100644 test/external_text_formatter/test.md diff --git a/CMakeLists.txt b/CMakeLists.txt index 1aeec10..1df6b5c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,6 @@ set( src/plattform_guard.cc src/transformation_facade.cc src/function/read_file.cc - src/function/read_xml_file.cc src/function/read_directory.cc src/function/transform.cc src/function/external_text_formatter.cc diff --git a/README.md b/README.md index 6e8b4fa..513e930 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,7 @@ Contrary to popular opinion I actually like XSLT as a content transformation lan ## Current features: -- external `read-file` function for read-only access to text files -- external `read-xml-file` function for read-only access to XML files +- external `read-file` function for read-only access to both plain and xml files - external `read-directory` function for read-only directory traversal - external `transform` function for executing transformations inside transformations - external `external-text-formatter` function for executing text formatters and capturing their XML output @@ -18,8 +17,8 @@ Contrary to popular opinion I actually like XSLT as a content transformation lan The `test` directory contains black-box test cases for every external function provided by this application which may be used as basic usage examples. -- [`InputXSLT:read-file`](test/read_file/transformation.xsl) -- [`InputXSLT:read-xml-file`](test/read_xml_file/transformation.xsl) +- [`InputXSLT:read-file` (plain)](test/read_file/transformation.xsl) +- [`InputXSLT:read-file` (xml)](test/read_xml_file/transformation.xsl) - [`InputXSLT:read-directory`](test/read_directory/transformation.xsl) - [`InputXSLT:transform`](test/transform/transformation.xsl) - [`InputXSLT:external-text-formatter`](test/external_text_formatter/transformation.xsl) (requires [markdown.pl](http://daringfireball.net/projects/markdown/)) diff --git a/src/function/read_file.cc b/src/function/read_file.cc index 22e96d7..7603ad1 100644 --- a/src/function/read_file.cc +++ b/src/function/read_file.cc @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include "boost/filesystem/fstream.hpp" @@ -11,7 +13,28 @@ namespace { -inline std::string readFile(const boost::filesystem::path& filePath) { +inline bool isXmlFile(const boost::filesystem::path& filePath) { + return filePath.extension() == ".xml"; +} + +inline xercesc::DOMNode* readXmlFile( + const boost::filesystem::path& filePath, + xercesc::DOMDocument* const domDocument +) { + const xercesc::LocalFileInputSource file( + *InputXSLT::XercesStringGuard(filePath.string().data()) + ); + + xercesc::XercesDOMParser parser; + parser.parse(file); + + return domDocument->importNode( + parser.getDocument()->getDocumentElement(), + true + ); +} + +inline std::string readPlainFile(const boost::filesystem::path& filePath) { boost::filesystem::ifstream file(filePath); return std::string( @@ -53,11 +76,33 @@ xercesc::DOMDocument* FunctionReadFile::constructDocument( result.setAttribute("path", filePath.string()); if ( boost::filesystem::is_regular_file(filePath) ) { - result.setAttribute("result", "success"); + try { + if ( isXmlFile(filePath) ) { + result.setAttribute("type", "xml"); + + result.setContent( + readXmlFile(filePath.string(), domDocument) + ); + } else { + result.setAttribute("type", "plain"); + + result.setContent( + readPlainFile(filePath) + ); + } + + result.setAttribute("result", "success"); + } + catch ( const xercesc::DOMException& exception ) { + result.setAttribute("result", "error"); - result.setContent(readFile(filePath)); + result.setValueNode( + "error", + *XercesStringGuard(exception.msg) + ); + } } else { - result.setAttribute("result", "success"); + result.setAttribute("result", "error"); } return domDocument; diff --git a/src/function/read_xml_file.cc b/src/function/read_xml_file.cc deleted file mode 100644 index e4d256d..0000000 --- a/src/function/read_xml_file.cc +++ /dev/null @@ -1,86 +0,0 @@ -#include "read_xml_file.h" - -#include -#include -#include -#include -#include - -#include "support/xerces_string_guard.h" -#include "support/dom/result_node_facade.h" - -namespace { - -inline xercesc::DOMNode* importDocumentElement( - const std::string& filePath, - xercesc::DOMDocument* const domDocument -) { - const xercesc::LocalFileInputSource file( - *InputXSLT::XercesStringGuard(filePath.data()) - ); - - xercesc::XercesDOMParser parser; - parser.parse(file); - - return domDocument->importNode( - parser.getDocument()->getDocumentElement(), - true - ); -} - -} - -namespace InputXSLT { - -xercesc::DOMDocument* FunctionReadXmlFile::constructDocument( - const FilesystemContext& fsContext, - std::string rawPath -) { - boost::filesystem::path filePath(fsContext.resolve(rawPath)); - - if ( !(boost::filesystem::exists(filePath) && - boost::filesystem::is_regular_file(filePath)) ) { - if ( auto resolvedPath = this->include_resolver_->resolve(rawPath) ) { - filePath = *resolvedPath; - } - } - - xercesc::DOMDocument* const domDocument( - xercesc::DOMImplementation::getImplementation()->createDocument( - nullptr, - *XercesStringGuard("content"), - nullptr - ) - ); - - xercesc::DOMNode* const rootNode( - domDocument->getDocumentElement() - ); - - ResultNodeFacade result(domDocument, rootNode, "file"); - result.setAttribute("path", filePath.string()); - - if ( boost::filesystem::is_regular_file(filePath) ) { - try { - result.setContent( - importDocumentElement(filePath.string(), domDocument) - ); - - result.setAttribute("result", "success"); - } - catch ( const xercesc::DOMException& exception ) { - result.setAttribute("result", "error"); - - result.setValueNode( - "error", - *XercesStringGuard(exception.msg) - ); - } - } else { - result.setAttribute("result", "error"); - } - - return domDocument; -} - -} diff --git a/src/function/read_xml_file.h b/src/function/read_xml_file.h deleted file mode 100644 index 7fe949a..0000000 --- a/src/function/read_xml_file.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef INPUTXSLT_SRC_FUNCTION_READ_XML_FILE_H_ -#define INPUTXSLT_SRC_FUNCTION_READ_XML_FILE_H_ - -#include "base.h" - -namespace InputXSLT { - -class FunctionReadXmlFile : public FunctionBase< - FunctionReadXmlFile, - std::string -> { - public: - using FunctionBase::FunctionBase; - - protected: - friend FunctionBase; - - xercesc::DOMDocument* constructDocument( - const FilesystemContext&, - std::string - ); - -}; - -} - -#endif // INPUTXSLT_SRC_FUNCTION_READ_XML_FILE_H_ diff --git a/src/plattform_guard.cc b/src/plattform_guard.cc index d787adf..e232d2b 100644 --- a/src/plattform_guard.cc +++ b/src/plattform_guard.cc @@ -7,7 +7,6 @@ #include "common.h" #include "function/read_file.h" -#include "function/read_xml_file.h" #include "function/read_directory.h" #include "function/transform.h" #include "function/external_text_formatter.h" @@ -29,12 +28,6 @@ PlattformGuard::PlattformGuard(const std::vector& path): InputXSLT::FunctionReadFile(&this->include_resolver_) ); - xalan::XalanTransformer::installExternalFunctionGlobal( - customNamespace, - xalan::XalanDOMString("read-xml-file"), - InputXSLT::FunctionReadXmlFile(&this->include_resolver_) - ); - xalan::XalanTransformer::installExternalFunctionGlobal( customNamespace, xalan::XalanDOMString("read-directory"), diff --git a/test/common/test.md b/test/common/test.md new file mode 100644 index 0000000..9402e4f --- /dev/null +++ b/test/common/test.md @@ -0,0 +1,28 @@ +# Markdown Test + +__Lorem ipsum__ dolor sit amet, _consectetur_ adipisicing elit, sed do `eiusmod` tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + +> Duis aute irure dolor in reprehenderit in voluptate +> velit esse cillum dolore eu fugiat nulla pariatur. + +Excepteur sint **occaecat** cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +* Test 1 +* Test 2 +* Test 3 +* Test 4 + +Test Test Test + + template < + typename Target, + std::size_t Index = 0, + typename Current = std::tuple<>, + enable_if::value> = 0 + > + inline Target construct( + const xalan::XPathExecutionContext::XObjectArgVectorType&, + Current&& current + ) { + return current; + } diff --git a/test/common/test.txt b/test/common/test.txt deleted file mode 100644 index 046a6ef..0000000 --- a/test/common/test.txt +++ /dev/null @@ -1,7 +0,0 @@ - - - Hello 1 - Hello 2 - Hello 3 - Hello 4 - diff --git a/test/common/test.xml b/test/common/test.xml new file mode 100644 index 0000000..046a6ef --- /dev/null +++ b/test/common/test.xml @@ -0,0 +1,7 @@ + + + Hello 1 + Hello 2 + Hello 3 + Hello 4 + diff --git a/test/external_text_formatter/test.md b/test/external_text_formatter/test.md deleted file mode 100644 index 9402e4f..0000000 --- a/test/external_text_formatter/test.md +++ /dev/null @@ -1,28 +0,0 @@ -# Markdown Test - -__Lorem ipsum__ dolor sit amet, _consectetur_ adipisicing elit, sed do `eiusmod` tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. - -> Duis aute irure dolor in reprehenderit in voluptate -> velit esse cillum dolore eu fugiat nulla pariatur. - -Excepteur sint **occaecat** cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. - -* Test 1 -* Test 2 -* Test 3 -* Test 4 - -Test Test Test - - template < - typename Target, - std::size_t Index = 0, - typename Current = std::tuple<>, - enable_if::value> = 0 - > - inline Target construct( - const xalan::XPathExecutionContext::XObjectArgVectorType&, - Current&& current - ) { - return current; - } diff --git a/test/read_file/reference.xml b/test/read_file/reference.xml index 0bca6f7..4500216 100644 --- a/test/read_file/reference.xml +++ b/test/read_file/reference.xml @@ -1,9 +1,30 @@ -<?xml version="1.0"?> -<tester> - <eintrag>Hello 1</eintrag> - <eintrag>Hello 2</eintrag> - <eintrag>Hello 3</eintrag> - <eintrag>Hello 4</eintrag> -</tester> +# Markdown Test + +__Lorem ipsum__ dolor sit amet, _consectetur_ adipisicing elit, sed do `eiusmod` tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + +> Duis aute irure dolor in reprehenderit in voluptate +> velit esse cillum dolore eu fugiat nulla pariatur. + +Excepteur sint **occaecat** cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +* Test 1 +* Test 2 +* Test 3 +* Test 4 + +Test Test Test + + template < + typename Target, + std::size_t Index = 0, + typename Current = std::tuple<>, + enable_if<Index == std::tuple_size<Target>::value> = 0 + > + inline Target construct( + const xalan::XPathExecutionContext::XObjectArgVectorType&, + Current&& current + ) { + return current; + } diff --git a/test/read_file/transformation.xsl b/test/read_file/transformation.xsl index a968f35..53a815c 100644 --- a/test/read_file/transformation.xsl +++ b/test/read_file/transformation.xsl @@ -10,7 +10,7 @@ - + diff --git a/test/read_xml_file/transformation.xsl b/test/read_xml_file/transformation.xsl index ae54099..98ae358 100644 --- a/test/read_xml_file/transformation.xsl +++ b/test/read_xml_file/transformation.xsl @@ -10,7 +10,7 @@ - + diff --git a/test/transform/transformation.xsl b/test/transform/transformation.xsl index 6bc759d..0c6173d 100644 --- a/test/transform/transformation.xsl +++ b/test/transform/transformation.xsl @@ -40,7 +40,7 @@ -- cgit v1.2.3