[DOC] Basic documentation done

This commit is contained in:
Edouard DUPIN 2016-04-11 21:57:33 +02:00
parent b59936f6e5
commit 753c0c0db2
11 changed files with 139 additions and 54 deletions

View File

@ -11,6 +11,9 @@
#include <vector>
namespace exml {
/**
* @brief Single attribute element
*/
class Attribute : public exml::Node {
protected:
/**
@ -46,7 +49,7 @@ namespace exml {
};
public:
enum nodeType getType() const override {
return exml::typeAttribute;
return exml::nodeType_attribute;
};
bool iParse(const std::string& _data, int32_t& _pos, bool _caseSensitive, exml::FilePos& _filePos, exml::Document& _doc) override;
bool iGenerate(std::string& _data, int32_t _indent) const override;

View File

@ -13,6 +13,9 @@
#include <utility>
namespace exml {
/**
* @brief List of all attribute element in a node
*/
class AttributeList : public exml::Node {
protected:
/**

View File

@ -11,6 +11,9 @@
#include <vector>
namespace exml {
/**
* @brief Comment node: &lt;!-- ... --&gt;
*/
class Comment : public exml::Node {
protected:
/**
@ -30,19 +33,19 @@ namespace exml {
Comment(const std::string& _value) :
exml::Node(_value) {
};
}
public:
enum nodeType getType() const override {
return typeAttribute;
};
return nodeType_attribute;
}
bool iParse(const std::string& _data, int32_t& _pos, bool _caseSensitive, exml::FilePos& _filePos, exml::Document& _doc) override;
bool iGenerate(std::string& _data, int32_t _indent) const override;
ememory::SharedPtr<exml::Comment> toComment() override {
return std::static_pointer_cast<exml::Comment>(shared_from_this());
};
}
ememory::SharedPtr<const exml::Comment> toComment() const override {
return std::static_pointer_cast<const exml::Comment>(shared_from_this());
};
}
};
}

View File

@ -10,6 +10,9 @@
#include <exml/AttributeList.h>
namespace exml {
/**
* @brief Declaration node: &lt;?XXXXXX ... &gt;
*/
class Declaration : public exml::AttributeList {
protected:
/**
@ -29,7 +32,7 @@ namespace exml {
static ememory::SharedPtr<Declaration> create(const std::string& _name="");
public:
enum nodeType getType() const override{
return typeAttribute;
return nodeType_attribute;
};
bool iGenerate(std::string& _data, int32_t _indent) const override;
bool iParse(const std::string& _data, int32_t& _pos, bool _caseSensitive, exml::FilePos& _filePos, exml::Document& _doc) override;
@ -40,6 +43,9 @@ namespace exml {
return std::static_pointer_cast<const exml::Declaration>(shared_from_this());
};
};
/**
* @brief Declaration node: &lt;?XML ... &gt;
*/
class DeclarationXML : public exml::Declaration {
public:
/**

View File

@ -11,6 +11,9 @@
#include <vector>
namespace exml {
/**
* @brief Basic document element of a document
*/
class Document : public exml::Element {
public:
/**
@ -78,26 +81,41 @@ namespace exml {
std::string m_Line; //!< Parse line error (copy)
exml::FilePos m_filePos; //!< position of the error
public:
/**
* @brief Request display error when detected (not print only at the end ...)
*/
void displayErrorWhenDetected() {
m_writeErrorWhenDetexted = true;
};
}
/**
* @brief Request NOT display error when detected.
*/
void notDisplayErrorWhenDetected() {
m_writeErrorWhenDetexted = false;
};
}
/**
* @brief Create an error in the parsing (call by the syetm for error management)
* @param[in] _data string of chat is wrong
* @param[in] _pos Position in the file
* @param[in] _filePos human position of the error
* @param[in] _comment Error string to display
*/
void createError(const std::string& _data, int32_t _pos, const exml::FilePos& _filePos, const std::string& _comment);
/**
* @brief request display in log of the error
*/
void displayError();
public:
enum nodeType getType() const override {
return typeDocument;
};
return nodeType_document;
}
bool iGenerate(std::string& _data, int32_t _indent) const override;
ememory::SharedPtr<exml::Document> toDocument() override {
return std::static_pointer_cast<exml::Document>(shared_from_this());
};
}
ememory::SharedPtr<const exml::Document> toDocument() const override {
return std::static_pointer_cast<const exml::Document>(shared_from_this());
};
}
};
};

View File

@ -24,9 +24,6 @@ static bool isWhiteChar(char32_t _val) {
return false;
}
ememory::SharedPtr<exml::Element> exml::Element::create() {
return ememory::SharedPtr<exml::Element>(new exml::Element());
}
ememory::SharedPtr<exml::Element> exml::Element::create(const std::string& _value) {
return ememory::SharedPtr<exml::Element>(new exml::Element(_value));
}
@ -34,7 +31,7 @@ ememory::SharedPtr<exml::Element> exml::Element::create(const std::string& _valu
enum exml::nodeType exml::Element::getType(int32_t _id) const {
ememory::SharedPtr<const exml::Node> tmpp = getNode(_id);
if (tmpp == nullptr) {
return exml::typeUnknow;
return exml::nodeType_unknow;
}
return tmpp->getType();
}
@ -76,7 +73,7 @@ ememory::SharedPtr<exml::Element> exml::Element::getNamed(const std::string& _na
}
for (size_t iii=0; iii<m_listSub.size(); iii++) {
if( m_listSub[iii] != nullptr
&& m_listSub[iii]->getType() == exml::typeElement
&& m_listSub[iii]->getType() == exml::nodeType_element
&& m_listSub[iii]->getValue() == _name) {
if (m_listSub[iii] == nullptr) {
return nullptr;
@ -93,7 +90,7 @@ ememory::SharedPtr<const exml::Element> exml::Element::getNamed(const std::strin
}
for (size_t iii=0; iii<m_listSub.size(); iii++) {
if( m_listSub[iii] != nullptr
&& m_listSub[iii]->getType() == exml::typeElement
&& m_listSub[iii]->getType() == exml::nodeType_element
&& m_listSub[iii]->getValue() == _name) {
if (m_listSub[iii] == nullptr) {
return nullptr;
@ -109,7 +106,7 @@ void exml::Element::append(const ememory::SharedPtr<exml::Node>& _node) {
EXML_ERROR("Try to set an empty node");
return;
}
if (_node->getType() == exml::typeAttribute) {
if (_node->getType() == exml::nodeType_attribute) {
appendAttribute(_node->toAttribute());
return;
}
@ -125,7 +122,7 @@ void exml::Element::append(const ememory::SharedPtr<exml::Node>& _node) {
std::string exml::Element::getText() const {
std::string res;
if (m_listSub.size() == 1) {
if (m_listSub[0]->getType() == typeText) {
if (m_listSub[0]->getType() == nodeType_text) {
res = m_listSub[0]->getValue();
} else {
m_listSub[0]->iGenerate(res, 0);
@ -149,7 +146,7 @@ bool exml::Element::iGenerate(std::string& _data, int32_t _indent) const {
if (m_listSub.size()>0) {
if( m_listSub.size() == 1
&& m_listSub[0] != nullptr
&& m_listSub[0]->getType() == exml::typeText
&& m_listSub[0]->getType() == exml::nodeType_text
&& std::dynamic_pointer_cast<exml::Text>(m_listSub[0])->countLines() == 1) {
_data += ">";
m_listSub[0]->iGenerate(_data,0);

View File

@ -12,6 +12,9 @@
#include <exml/AttributeList.h>
namespace exml {
/**
* @brief Basic element Node of an XML document &lt;YYYYY&gt;
*/
class Element : public exml::AttributeList {
protected:
/**
@ -27,8 +30,12 @@ namespace exml {
};
public:
static ememory::SharedPtr<Element> create();
static ememory::SharedPtr<Element> create(const std::string& _value);
/**
* @brief factory of an exml::Element
* @param[in] _value Name of the node.
* @return Shared pointer on the Element
*/
static ememory::SharedPtr<Element> create(const std::string& _value="");
protected:
std::vector<ememory::SharedPtr<exml::Node>> m_listSub; //!< List of subNodes
public:
@ -56,6 +63,11 @@ namespace exml {
* @return Pointer on node.
*/
ememory::SharedPtr<Node> getNode(int32_t _id);
/**
* @brief get the Node pointer of the element id.
* @param[in] _id Id of the element.
* @return Pointer on node.
*/
ememory::SharedPtr<const Node> getNode(int32_t _id) const;
/**
* @brief get the element casted in Element (if the node is not an element return NULL).
@ -63,6 +75,11 @@ namespace exml {
* @return Pointer on the element or NULL.
*/
ememory::SharedPtr<Element> getElement(int32_t _id);
/**
* @brief get the element casted in Element (if the node is not an element return NULL).
* @param[in] _id Id of the element.
* @return Pointer on the element or NULL.
*/
ememory::SharedPtr<const Element> getElement(int32_t _id) const;
/**
* @brief get an element with his name (work only with exml::Element)
@ -70,6 +87,11 @@ namespace exml {
* @return Pointer on the element or NULL.
*/
ememory::SharedPtr<Element> getNamed(const std::string& _name);
/**
* @brief get an element with his name (work only with exml::Element)
* @param[in] _name Name of the element that is requested
* @return Pointer on the element or NULL.
*/
ememory::SharedPtr<const Element> getNamed(const std::string& _name) const;
/**
* @brief get the internal data of the element (if the element has some sub node thay are converted in xml string == > like this it is not needed to use <![CDATA[...]]>
@ -77,10 +99,26 @@ namespace exml {
*/
std::string getText() const;
protected:
bool subParse(const std::string& _data, int32_t& _pos, bool _caseSensitive, exml::FilePos& _filePos, exml::Document& _doc, bool _mainNode=false);
public: // herited function:
/**
* @brief Parse sub node string
* @param[in] _data all file string data
* @param[in,out] _pos Position to start parsing in the file and return the end of parsing
* @param[in] _caseSensitive Case sensitive parsing (usefull for html)
* @param[in] _filePos Current File position of the parsing
* @param[in] _doc Document base reference
* @param[in] _mainNode if true, this is the first root node
* @return true parsing is done OK
* @return false An error appear in the parsing
*/
bool subParse(const std::string& _data,
int32_t& _pos,
bool _caseSensitive,
exml::FilePos& _filePos,
exml::Document& _doc,
bool _mainNode=false);
public:
enum nodeType getType() const override {
return typeElement;
return nodeType_element;
}
bool iParse(const std::string& _data, int32_t& _pos, bool _caseSensitive, exml::FilePos& _filePos, exml::Document& _doc) override;
bool iGenerate(std::string& _data, int32_t _indent) const override;

View File

@ -126,7 +126,7 @@ const std::string& exml::Node::getValue() const {
}
enum exml::nodeType exml::Node::getType() const {
return typeNode;
return nodeType_node;
}
ememory::SharedPtr<exml::Document> exml::Node::toDocument() {
@ -178,26 +178,26 @@ ememory::SharedPtr<const exml::Text> exml::Node::toText() const{
}
bool exml::Node::isDocument() const {
return getType() == exml::typeDocument;
return getType() == exml::nodeType_document;
}
bool exml::Node::isAttribute() const {
return getType() == exml::typeAttribute;
return getType() == exml::nodeType_attribute;
}
bool exml::Node::isComment() const {
return getType() == exml::typeComment;
return getType() == exml::nodeType_comment;
}
bool exml::Node::isDeclaration() const {
return getType() == exml::typeDeclaration;
return getType() == exml::nodeType_declaration;
}
bool exml::Node::isElement() const {
return getType() == exml::typeElement;
return getType() == exml::nodeType_element;
}
bool exml::Node::isText() const {
return getType() == exml::typeText;
return getType() == exml::nodeType_text;
}

View File

@ -35,15 +35,18 @@ namespace exml {
class Element;
class Text;
/**
* @brief Type of the XML elements.
*/
enum nodeType {
typeUnknow, //!< might be an error ...
typeNode, //!< might be an error ...
typeDocument, //!< all the file main access
typeDeclaration, //!< <?xml ... ?>
typeAttribute, //!< the <Element ATTRIBUTE="ATTRIBUTE_VALUE" />
typeElement, //!< the <XXX> ... </XXX>
typeComment, //!< comment node : <!-- -->
typeText, //!< <XXX> InsideText </XXX>
nodeType_unknow, //!< might be an error ...
nodeType_node, //!< might be an error ...
nodeType_document, //!< all the file main access
nodeType_declaration, //!< &lt;?xml ... ?&gt;
nodeType_attribute, //!< the &lt;Element ATTRIBUTE="ATTRIBUTE_VALUE" /&gt;
nodeType_element, //!< the &lt;XXX&gt; ... &lt;/XXX&gt;
nodeType_comment, //!< comment node : &lt;!-- --&gt;
nodeType_text, //!< &lt;XXX&gt; InsideText &lt;/XXX&gt;
};
/**
* @brief Basic main object of all xml elements.
@ -59,7 +62,7 @@ namespace exml {
};
/**
* @brief basic element of a xml structure
* @param[in] value of the node
* @param[in] _value value of the node
*/
Node(const std::string& _value);
public:
@ -73,14 +76,15 @@ namespace exml {
* @param[in] _data data string to parse.
* @param[in,out] _pos position in the string to start parse, return the position end of parsing.
* @param[in] _caseSensitive Request a parsion of element that is not case sensitive (all element is in low case)
* @param[in,out] file parsing position (line x col x)
* @param[in,out] _filePos file parsing position (line x col x)
* @param[in,out] _doc Base document reference
* @return false if an error occured.
*/
virtual bool iParse(const std::string& _data, int32_t& _pos, bool _caseSensitive, exml::FilePos& _filePos, exml::Document& _doc) = 0;
/**
* @brief generate a string with the tree of the xml
* @param[in,out] _data string where to add the elements
* @param[in] current indentation of the file
* @param[in] _indent current indentation of the file
* @return false if an error occured.
*/
virtual bool iGenerate(std::string& _data, int32_t _indent) const;
@ -89,6 +93,7 @@ namespace exml {
public:
/**
* @brief get the current position where the element is in the file
* @return The file position reference
*/
const exml::FilePos& getPos() const;
protected:
@ -124,9 +129,11 @@ namespace exml {
*/
void drawElementParsed(char32_t _val, const exml::FilePos& _filePos) const;
/**
* @brief check if an element or attribute is availlable (not : !"#$%&'()*+,/;<=>?@[\]^`{|}~ \n\t\r and for first char : not -.0123456789).
* @brief check if an element or attribute is availlable (not : !"#$%&'()*+,/;<=>?@[\]^`{|}~ \\n\\t\\r and for first char : not -.0123456789).
* @param[in] _val Value to check the conformity.
* @param[in] _firstChar True if the element check is the first char.
* @return true The value can be a part of attribute name
* @return false The value can NOT be a part of attribute name
*/
bool checkAvaillable(char32_t _val, bool _firstChar) const;
/**

View File

@ -60,10 +60,6 @@ static bool isWhiteChar(char32_t _val) {
return false;
}
ememory::SharedPtr<exml::Text> exml::Text::create() {
return ememory::SharedPtr<exml::Text>(new exml::Text());
}
ememory::SharedPtr<exml::Text> exml::Text::create(const std::string& _data) {
return ememory::SharedPtr<exml::Text>(new exml::Text(_data));
}

View File

@ -11,6 +11,9 @@
#include <vector>
namespace exml {
/**
* @brief Text node interface (internal data between two balise : &lt;XXX&gt; ALL here &lt;/XXX&gt;
*/
class Text : public exml::Node {
protected:
/**
@ -23,8 +26,12 @@ namespace exml {
*/
Text(const std::string& _data) : exml::Node(_data) { };
public:
static ememory::SharedPtr<exml::Text> create();
static ememory::SharedPtr<exml::Text> create(const std::string& _data);
/**
* @brief defined factory
* @param[in] _data Data in the Text area
* @return Shared pointer on the Text element
*/
static ememory::SharedPtr<exml::Text> create(const std::string& _data="");
/**
* @brief count the number of line in the current text
* @return The number of lines
@ -32,7 +39,7 @@ namespace exml {
int32_t countLines() const;
public:
enum nodeType getType() const override{
return typeText;
return nodeType_text;
};
bool iParse(const std::string& _data, int32_t& _pos, bool _caseSensitive, exml::FilePos& _filePos, exml::Document& _doc) override;
bool iGenerate(std::string& _data, int32_t _indent) const override;
@ -43,6 +50,9 @@ namespace exml {
return std::static_pointer_cast<const exml::Text>(shared_from_this());
};
};
/**
* @brief Text node interface for balise CDATA &lt;![CDATA[*******]]&gt;
*/
class TextCDATA : public exml::Text {
protected:
/**
@ -50,6 +60,10 @@ namespace exml {
*/
TextCDATA() { };
public:
/**
* @brief defined factory
* @return Shared pointer on the Text CDATA element
*/
static ememory::SharedPtr<TextCDATA> create();
public:
bool iParse(const std::string& _data, int32_t& _pos, bool _caseSensitive, exml::FilePos& _filePos, exml::Document& _doc) override;