diff options
author | rootavish <[email protected]> | 2014-05-24 05:38:31 +0530 |
---|---|---|
committer | rootavish <[email protected]> | 2014-05-24 05:38:31 +0530 |
commit | 0a4d3f34a8aee74019759ace24f84672a98122b4 (patch) | |
tree | fc5b775f1656f242e38f23bbf93d86cbcf22d307 /backend | |
parent | 28b2c08f60f54a78596746e204f4d0092587a09a (diff) | |
download | atril-0a4d3f34a8aee74019759ace24f84672a98122b4.tar.bz2 atril-0a4d3f34a8aee74019759ace24f84672a98122b4.tar.xz |
XML parsing for ePub
using libxml some functions were written which will be used to get keywords,attributes from files such as the ePub container.tried to keep the code generalised so as to facilitate reusability of code.
Diffstat (limited to 'backend')
-rw-r--r-- | backend/epub/Makefile.am | 7 | ||||
-rw-r--r-- | backend/epub/epub-document.c | 125 | ||||
-rw-r--r-- | backend/epub/epub-document.h | 25 |
3 files changed, 154 insertions, 3 deletions
diff --git a/backend/epub/Makefile.am b/backend/epub/Makefile.am index 6ecbdb2a..4371cde8 100644 --- a/backend/epub/Makefile.am +++ b/backend/epub/Makefile.am @@ -1,4 +1,4 @@ -AM_CPPFLAGS = \ +AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_srcdir)/libdocument \ -DMATELOCALEDIR=\"$(datadir)/locale\" \ @@ -9,8 +9,9 @@ AM_CPPFLAGS = \ backend_LTLIBRARIES = libepubdocument.la -libepubdocument_la_SOURCES = - +libepubdocument_la_SOURCES = \ + epub-document.c \ + epub-document.h libepubdocument_la_LDFLAGS = $(BACKEND_LIBTOOL_FLAGS) libepubdocument_la_LIBADD = \ diff --git a/backend/epub/epub-document.c b/backend/epub/epub-document.c new file mode 100644 index 00000000..c6bbf684 --- /dev/null +++ b/backend/epub/epub-document.c @@ -0,0 +1,125 @@ +#include "epub-document.h" + +static xmlDocPtr xmldocument ; +static xmlNodePtr xmlroot ; +static xmlChar* xmlkey ; +static xmlChar* retval ; + +/*Open a XML document for reading */ +gboolean +openXmlDocument ( const gchar* filename ) +{ + xmldocument = xmlParseFile(filename); + + if ( xmldocument == NULL ) + { + return FALSE ; + } + else + { + return TRUE ; + } +} + +/** + *Check if the root value is same as rootname . + *if supplied rootvalue = NULL ,just set root to rootnode . +**/ +gboolean +checkRoot(xmlChar* rootname) +{ + xmlroot = xmlDocGetRootElement(xmldocument); + + if (xmlroot == NULL) { + + xmlFreeDoc(xmldocument); + return FALSE; + } + + if ( rootname == NULL ) + { + return TRUE ; + } + + if ( !xmlStrcmp(xmlroot->name,rootname)) + { + return TRUE ; + } + else + { + return FALSE; + } +} + +xmlChar* +parseXMLchildren( xmlChar* parserfor, + XMLparsereturntype rettype, + xmlChar* attributename ) +{ + xmlNodePtr topchild,children ; + + retval = NULL ; + topchild = xmlroot->xmlChildrenNode ; + + while ( topchild != NULL ) + { + if ( !xmlStrcmp(topchild->name,parserfor) ) + { + if ( rettype == xmlattribute ) + { + retval = xmlGetProp(children,attributename); + return retval; + } + else + { + retval = xmlNodeListGetString(xmldocument,topchild->xmlChildrenNode, 1); + return retval ; + } + } + parseChildren( topchild , parserfor,rettype,attributename) ; + + topchild = topchild->next ; + } + + return retval ; +} + +void parseChildren(xmlNodePtr parent, + xmlChar* parserfor, + XMLparsereturntype rettype, + xmlChar* attributename ) +{ + xmlNodePtr child = parent->xmlChildrenNode ; + + while ( child != NULL ) + { + if ( !xmlStrcmp(child->name,parserfor)) + { + if ( rettype == xmlattribute ) + { + retval = xmlGetProp(child,attributename); + } + else + { + retval = xmlNodeListGetString(xmldocument,child->xmlChildrenNode, 1); + } + return ; + } + + /*return already if we have retval set*/ + if ( retval != NULL ) + { + return ; + } + + parseChildren(child,parserfor,rettype,attributename) ; + child = child->next ; + } +} + +void xmlFreeAll() +{ + xmlFreeDoc(xmldocument); + xmlFree(retval); + xmlFree(xmlkey); +}
\ No newline at end of file diff --git a/backend/epub/epub-document.h b/backend/epub/epub-document.h new file mode 100644 index 00000000..157ced04 --- /dev/null +++ b/backend/epub/epub-document.h @@ -0,0 +1,25 @@ +#include <gtk/gtk.h> +#include <glib.h> +#include <libxml/parser.h> +#include <libxml/xmlmemory.h> + +typedef enum +{ + xmlattribute, + xmlkeyword +}XMLparsereturntype; + +gboolean openXmlDocument ( const gchar* filename ); + +gboolean checkRoot (xmlChar* rootname); + +void parseChildren (xmlNodePtr parent, + xmlChar* parserfor, + XMLparsereturntype rettype, + xmlChar* attributename ); + +xmlChar* parseXMLchildren (xmlChar* parserfor, + XMLparsereturntype rettype, + xmlChar* attributename ); + +void xmlFreeAll();
\ No newline at end of file |