mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Make the xslt style sheet finding search a set of possible paths
This allows us to install the xslt files in multiple places. Right now the path defaults to the subsurface xslt install directory, the relative directory "xslt" and the current working directory. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
350462949d
commit
6fa702bcbd
1 changed files with 49 additions and 1 deletions
50
parse-xml.c
50
parse-xml.c
|
@ -3,6 +3,7 @@
|
|||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#define __USE_XOPEN
|
||||
#include <time.h>
|
||||
#include <libxml/parser.h>
|
||||
|
@ -1484,6 +1485,53 @@ void parse_xml_init(void)
|
|||
}
|
||||
|
||||
#ifdef XSLT
|
||||
|
||||
/* Maybe we'll want a environment variable that can override this.. */
|
||||
static const char *xslt_path = XSLT ":xslt:.";
|
||||
|
||||
static xsltStylesheetPtr try_get_stylesheet(const char *path, int len, const char *name)
|
||||
{
|
||||
xsltStylesheetPtr ret;
|
||||
int namelen = strlen(name);
|
||||
char *filename = malloc(len+1+namelen+1);
|
||||
|
||||
if (!filename)
|
||||
return NULL;
|
||||
|
||||
memcpy(filename, path, len);
|
||||
filename[len] = G_DIR_SEPARATOR;
|
||||
memcpy(filename + len + 1, name, namelen+1);
|
||||
|
||||
ret = NULL;
|
||||
if (!access(filename, R_OK))
|
||||
ret = xsltParseStylesheetFile(filename);
|
||||
free(filename);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static xsltStylesheetPtr get_stylesheet(const char *name)
|
||||
{
|
||||
const char *path = xslt_path, *next;
|
||||
|
||||
do {
|
||||
int len;
|
||||
xsltStylesheetPtr ret;
|
||||
|
||||
next = strchr(path, ':');
|
||||
len = strlen(path);
|
||||
if (next) {
|
||||
len = next - path;
|
||||
next++;
|
||||
}
|
||||
ret = try_get_stylesheet(path, len, name);
|
||||
if (ret)
|
||||
return ret;
|
||||
} while ((path = next) != NULL);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
xmlDoc *test_xslt_transforms(xmlDoc *doc)
|
||||
{
|
||||
xmlDoc *transformed;
|
||||
|
@ -1491,7 +1539,7 @@ xmlDoc *test_xslt_transforms(xmlDoc *doc)
|
|||
xmlNode *root_element = xmlDocGetRootElement(doc);
|
||||
if (strcasecmp(root_element->name, "JDiveLog") == 0) {
|
||||
xmlSubstituteEntitiesDefault(1);
|
||||
xslt = xsltParseStylesheetFile(XSLT G_DIR_SEPARATOR_S "jdivelog2subsurface.xslt");
|
||||
xslt = get_stylesheet("jdivelog2subsurface.xslt");
|
||||
if (xslt == NULL)
|
||||
return doc;
|
||||
transformed = xsltApplyStylesheet(xslt, doc, NULL);
|
||||
|
|
Loading…
Add table
Reference in a new issue