summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrootavish <[email protected]>2014-05-24 05:38:31 +0530
committerrootavish <[email protected]>2014-05-24 05:38:31 +0530
commit0a4d3f34a8aee74019759ace24f84672a98122b4 (patch)
treefc5b775f1656f242e38f23bbf93d86cbcf22d307
parent28b2c08f60f54a78596746e204f4d0092587a09a (diff)
downloadatril-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.
-rw-r--r--backend/epub/Makefile.am7
-rw-r--r--backend/epub/epub-document.c125
-rw-r--r--backend/epub/epub-document.h25
-rw-r--r--configure.ac2
4 files changed, 155 insertions, 4 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
diff --git a/configure.ac b/configure.ac
index e0df6cf0..9532b744 100644
--- a/configure.ac
+++ b/configure.ac
@@ -884,5 +884,5 @@ Configure summary:
Pixbuf Backend.....: $enable_pixbuf
Comics Backend.....: $enable_comics
XPS Backend........: $enable_xps
- EPUB Backend.......: $enable_epub
+ ePub Backend.......: $enable_epub
"