// For cstd0x compatibility we will use stdint.h types instead of std:: ones on cstdint:
//#include <cstdint> when C++11 available
+// For xml representations (xml::Compiler and json::functions::json2xml)
+#define ANNA_XML_INDENTATION_SPACES 3
+
// Decoding helpers
#define DECODE2BYTES_INDX_VALUETYPE(buffer,indx,value_type) ((((value_type)buffer[indx] << 8) & 0xFF00) + ((value_type)buffer[indx+1] & 0x00FF))
#include <anna/core/RuntimeException.hpp>
#include <anna/core/mt/Mutex.hpp>
-// Three-space tabulator for xml string presentation (node indent)
-#define ANNA_XML_COMPILER_TAB " "
namespace anna {
Visual = 0, /**< Separa cada uno de los componentes con espacios y retornos de carro */
Compact = 1, /**< Los componentes no tienen separacion entre si. Se puede usar para optimizar envios de mensajes */
ShowNullAttribute = 2, /**< Visualiza el valor nulo de un atributo como ="" */
- NoNamespaces = 4 /**<Obtiene el documento XML sin ofrecer informaciĆ³n sobre los namespaces */
+ NoNamespaces = 4, /**<Obtiene el documento XML sin ofrecer informaciĆ³n sobre los namespaces */
+ Sort = 8, /** Sorts attribute names */
};
};
static const Attribute* find(const char* attrName, const_attribute_iterator, const_attribute_iterator) throw();
+ // Allow sort in compiler
+ attribute_iterator attribute_begin() throw() { return a_attributes.begin(); }
+ attribute_iterator attribute_end() throw() { return a_attributes.end(); }
+
friend class Parser;
friend class Allocator<Node>;
friend class XPath;
friend class Decompressor;
+ friend class Compiler;
};
}
#include <anna/core/mt/Guard.hpp>
+#include <anna/core/util/defines.hpp>
#include <anna/xml/Compiler.hpp>
#include <anna/xml/Node.hpp>
#include <anna/xml/Document.hpp>
#include <anna/xml/Namespace.hpp>
+#include <algorithm>
+#include <cstring>
+
+
using namespace anna;
using namespace anna::xml;
const Namespace* ns;
for(int i = 0; i < level; i ++)
- result += ANNA_XML_COMPILER_TAB;
+ result += std::string(ANNA_XML_INDENTATION_SPACES, ' ');
result += '<';
writeFullName(node, result, flags);
}
}
+ // Sort node attributes (this is a compiler used for on-demand representation, this sorting is not permanent in the object which uses it):
+ if(flags & Mode::Sort) {
+ Node *nc_node = const_cast<Node*>(node);
+ std::sort(nc_node->attribute_begin(), nc_node->attribute_end(),
+ [](Attribute *a, Attribute *b) { return (std::strcmp(a->getName(), b->getName()) < 0); }); // sort alphabetically by attribute name
+ }
+
for(Node::const_attribute_iterator ii = node->attribute_begin(), maxii = node->attribute_end(); ii != maxii; ii ++) {
attribute = Node::attribute(ii);
result += ' ';
void Compiler::close(const Node* node, Result& result, const int level, const int flags)
throw(RuntimeException) {
for(int i = 0; i < level; i ++)
- result += ANNA_XML_COMPILER_TAB;
+ result += std::string(ANNA_XML_INDENTATION_SPACES, ' ');
result += "</";
writeFullName(node, result, flags);