]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Use XSLT file to open JDiveLog logs
authorMiika Turkia <miika.turkia@gmail.com>
Sat, 5 Nov 2011 10:39:17 +0000 (12:39 +0200)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 5 Nov 2011 20:24:53 +0000 (13:24 -0700)
Open JDiveLog files by translating them to subsurface format using XSLT.
These files are identified by the name of the first element (JDiveLog)
and transform is applied to only these.

The XSLT feature is compiled in only if libxslt is installed. The
transformation files are installed globally in Linux under
/usr/share/subsurface/xslt. Windows and OSX still need appropriate Makefile
changes and testing.

Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Makefile
dive.h
packaging/debian/control
parse-xml.c

index 20cbf8a578ba6f2d6673a27799f34c33106a7461..1b1a31a8c6c4f18dedb59ad0201dcd57c62a1412 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -5,6 +5,7 @@ CFLAGS=-Wall -Wno-pointer-sign -g
 INSTALL=install
 PKGCONFIG=pkg-config
 XML2CONFIG=xml2-config
+XSLCONFIG=xslt-config
 
 # these locations seem to work for SuSE and Fedora
 # prefix = $(HOME)
@@ -15,12 +16,14 @@ DESKTOPDIR = $(DATADIR)/applications
 ICONPATH = $(DATADIR)/icons/hicolor
 ICONDIR = $(ICONPATH)/scalable/apps
 MANDIR = $(DATADIR)/man/man1
+XSLTDIR = $(DATADIR)/subsurface/xslt
 gtk_update_icon_cache = gtk-update-icon-cache -f -t $(ICONPATH)
 
 NAME = subsurface
 ICONFILE = $(NAME).svg
 DESKTOPFILE = $(NAME).desktop
 MANFILES = $(NAME).1
+XSLTFILES = xslt/*.xslt
 
 MACOSXINSTALL = /Applications/Subsurface.app
 MACOSXFILES = packaging/macosx
@@ -77,7 +80,7 @@ LIBGTK = $(shell $(PKGCONFIG) --libs gtk+-2.0 glib-2.0 gconf-2.0)
 LIBDIVECOMPUTERCFLAGS = $(LIBDIVECOMPUTERINCLUDES)
 LIBDIVECOMPUTER = $(LIBDIVECOMPUTERARCHIVE) $(LIBUSB)
 
-LIBS = $(LIBXML2) $(LIBGTK) $(LIBDIVECOMPUTER) -lpthread
+LIBS = $(LIBXML2) $(LIBXSLT) $(LIBGTK) $(LIBDIVECOMPUTER) -lpthread
 
 OBJS = main.o dive.o profile.o info.o equipment.o divelist.o \
        parse-xml.o save-xml.o libdivecomputer.o print.o uemis.o \
@@ -98,12 +101,26 @@ install: $(NAME)
        fi
        $(INSTALL) -d -m 755 $(MANDIR)
        $(INSTALL) -m 644 $(MANFILES) $(MANDIR)
+       @-if test ! -z "$(XSLT)"; then \
+               $(INSTALL) -d -m 755 $(DATADIR)/subsurface; \
+               $(INSTALL) -d -m 755 $(XSLTDIR); \
+               $(INSTALL) -m 644 $(XSLTFILES) $(XSLTDIR); \
+       fi
 
 LIBXML2 = $(shell $(XML2CONFIG) --libs)
+LIBXSLT = $(shell $(XSLCONFIG) --libs)
 XML2CFLAGS = $(shell $(XML2CONFIG) --cflags)
 GLIB2CFLAGS = $(shell $(PKGCONFIG) --cflags glib-2.0)
 GCONF2CFLAGS =  $(shell $(PKGCONFIG) --cflags gconf-2.0)
 GTK2CFLAGS = $(shell $(PKGCONFIG) --cflags gtk+-2.0)
+CFLAGS += $(shell $(XSLCONFIG) --cflags)
+
+ifneq ($(strip $(LIBXSLT)),)
+       # We still need proper paths and install options for OSX and Windows
+       ifeq ($(shell sh -c 'uname -s 2>/dev/null || echo not'),Linux)
+               XSLT=-DXSLT='"$(XSLTDIR)"'
+       endif
+endif
 
 install-macosx: $(NAME)
        $(INSTALL) -d -m 755 $(MACOSXINSTALL)/Contents/Resources
@@ -116,7 +133,7 @@ install-macosx: $(NAME)
        $(INSTALL) $(MACOSXFILES)/Subsurface.icns $(MACOSXINSTALL)/Contents/Resources/
 
 parse-xml.o: parse-xml.c dive.h
-       $(CC) $(CFLAGS) $(GLIB2CFLAGS) -c $(XML2CFLAGS)  parse-xml.c
+       $(CC) $(CFLAGS) $(GLIB2CFLAGS) -c $(XML2CFLAGS) $(XSLT) parse-xml.c
 
 save-xml.o: save-xml.c dive.h
        $(CC) $(CFLAGS) $(GLIB2CFLAGS) -c save-xml.c
diff --git a/dive.h b/dive.h
index cf11e1f89384bb34176e9eb5c14879cb89f73be1..36a406c255c690da80da3af767c9cfd035e5d08b 100644 (file)
--- a/dive.h
+++ b/dive.h
@@ -5,6 +5,7 @@
 #include <time.h>
 
 #include <glib.h>
+#include <libxml/tree.h>
 
 /*
  * Some silly typedefs to make our units very explicit.
@@ -253,6 +254,10 @@ extern void parse_xml_init(void);
 extern void parse_xml_file(const char *filename, GError **error);
 extern void set_filename(const char *filename);
 
+#ifdef XSLT
+extern xmlDoc *test_xslt_transforms(xmlDoc *doc);
+#endif
+
 extern void show_dive_info(struct dive *);
 extern void flush_dive_info_changes(struct dive *);
 
index 7c2aa36e25cb3f137446f31d7c62ed9cb1317b92..b90fe1cbe3a232e7d0246277b59ea6105b41ca2c 100644 (file)
@@ -2,7 +2,8 @@ Source: subsurface
 Priority: optional
 Maintainer: Roland Dreier <roland@digitalvampire.org>
 Build-Depends: autoconf, automake, libtool, debhelper (>= 8), dh-autoreconf,
- pkg-config, libgtk2.0-dev, libgconf2-dev, libxml2-dev, libdivecomputer-dev
+ pkg-config, libgtk2.0-dev, libgconf2-dev, libxml2-dev, libdivecomputer-dev,
+ libxslt-dev
 Standards-Version: 3.9.2
 Section: utils
 Homepage: http://subsurface.hohndel.org
index 5eabc353c17c47e4e68db5e0db2ded912f2b1437..ddf93a4b1ad58ff45fdc4790dfe5d5ad005f82dd 100644 (file)
@@ -7,6 +7,9 @@
 #include <time.h>
 #include <libxml/parser.h>
 #include <libxml/tree.h>
+#ifdef XSLT
+#include <libxslt/transform.h>
+#endif
 
 #include "dive.h"
 #include "uemis.h"
@@ -1466,6 +1469,9 @@ void parse_xml_file(const char *filename, GError **error)
        set_filename(filename);
        reset_all();
        dive_start();
+#ifdef XSLT
+       doc = test_xslt_transforms(doc);
+#endif
        traverse(xmlDocGetRootElement(doc));
        dive_end();
        xmlFreeDoc(doc);
@@ -1476,3 +1482,23 @@ void parse_xml_init(void)
 {
        LIBXML_TEST_VERSION
 }
+
+#ifdef XSLT
+xmlDoc *test_xslt_transforms(xmlDoc *doc)
+{
+       xmlDoc *transformed;
+       xsltStylesheetPtr xslt = NULL;
+       xmlNode *root_element = xmlDocGetRootElement(doc);
+       if (strcasecmp(root_element->name, "JDiveLog") == 0) {
+               xmlSubstituteEntitiesDefault(1);
+               xslt = xsltParseStylesheetFile(XSLT G_DIR_SEPARATOR_S "jdivelog2subsurface.xslt");
+               if (xslt == NULL)
+                       return doc;
+               transformed = xsltApplyStylesheet(xslt, doc, NULL);
+               xmlFreeDoc(doc);
+               xsltFreeStylesheet(xslt);
+               return transformed;
+       }
+       return doc;
+}
+#endif