summaryrefslogtreecommitdiffstats
path: root/filters/xsltfilter/import/xsltproc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'filters/xsltfilter/import/xsltproc.cpp')
-rw-r--r--filters/xsltfilter/import/xsltproc.cpp309
1 files changed, 309 insertions, 0 deletions
diff --git a/filters/xsltfilter/import/xsltproc.cpp b/filters/xsltfilter/import/xsltproc.cpp
new file mode 100644
index 000000000..3bd20408a
--- /dev/null
+++ b/filters/xsltfilter/import/xsltproc.cpp
@@ -0,0 +1,309 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Robert JACOLIN <rjacolin@ifrance.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ This file has been made from xsltproc.c from libxslt.
+*/
+
+/*
+ * xsltproc.c: user program for the XSL Transformation 1.0 engine
+ *
+ * See Copyright for the status of this software.
+ *
+ * daniel@veillard.com
+ */
+#include "xsltproc.h"
+
+#include <tqfile.h>
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#include <libxml/debugXML.h>
+#include <libxml/xmlIO.h>
+#include <libxml/parserInternals.h>
+
+#include <libexslt/exsltconfig.h>
+
+#ifdef WIN32
+#ifdef _MSC_VER
+#include <winsock2.h>
+#pragma comment(lib, "ws2_32.lib")
+#define gettimeofday(p1,p2)
+#endif /* _MS_VER */
+#else /* WIN32 */
+#endif /* WIN32 */
+
+#ifndef HAVE_STAT
+# ifdef HAVE__STAT
+ /* MS C library seems to define stat and _stat. The definition
+ * is identical. Still, mapping them to each other causes a warning. */
+# ifndef _MSC_VER
+# define stat(x,y) _stat(x,y)
+# endif
+# define HAVE_STAT
+# endif
+#endif
+
+xmlParserInputPtr xmlNoNetExternalEntityLoader(const char *URL,
+ const char *ID,
+ xmlParserCtxtPtr ctxt);
+
+#if 0
+XSLTProc::XSLTProc(const char* fileIn, const char* fileOut, const char* xsltsheet)
+{
+ _fileIn = fileIn;
+ _fileOut = fileOut;
+ _stylesheet = xsltsheet;
+ nbparams = 0;
+ debug = 0;
+ repeat = 0;
+ novalid = 0;
+ output = NULL;
+}
+#endif
+
+XSLTProc::XSLTProc(TQString fileIn, TQString fileOut, TQString xsltsheet)
+{
+ _fileIn = TQFile::encodeName(fileIn);
+ _fileOut = TQFile::encodeName(fileOut);
+ _stylesheet = TQFile::encodeName(xsltsheet);
+ nbparams = 0;
+ debug = 0;
+ repeat = 0;
+ novalid = 0;
+ output = NULL;
+}
+
+/*static int debug = 0;
+static int repeat = 0;
+static int novalid = 0;*/
+
+/*const char *XSLTProc::params[16 + 1];
+int XSLTProc::nbparams = 0;
+static const char *output = NULL;*/
+
+void
+XSLTProc::xsltProcess(xmlDocPtr doc, xsltStylesheetPtr cur, const char *filename)
+{
+ xmlDocPtr res;
+
+ if (output == NULL)
+ {
+
+ if (repeat)
+ {
+ int j;
+
+ for (j = 1; j < repeat; j++)
+ {
+ res = xsltApplyStylesheet(cur, doc, params);
+ xmlFreeDoc(res);
+ xmlFreeDoc(doc);
+ doc = xmlParseFile(filename);
+ }
+ }
+ res = xsltApplyStylesheet(cur, doc, params);
+ xmlFreeDoc(doc);
+
+ if (res == NULL)
+ {
+ fprintf(stderr, "no result for %s\n", filename);
+ return;
+ }
+#ifdef LIBXML_DEBUG_ENABLED
+ if (debug)
+ xmlDebugDumpDocument(stdout, res);
+ else
+ {
+#endif
+ if (cur->methodURI == NULL)
+ {
+ xsltSaveResultToFile(stdout, res, cur);
+ }
+ else
+ {
+ if (xmlStrEqual
+ (cur->method, (const xmlChar *) "xhtml"))
+ {
+ fprintf(stderr, "non standard output xhtml\n");
+ xsltSaveResultToFile(stdout, res, cur);
+ }
+ else
+ {
+ fprintf(stderr,
+ "Unsupported non standard output %s\n",
+ cur->method);
+ }
+ }
+#ifdef LIBXML_DEBUG_ENABLED
+ }
+#endif
+ xmlFreeDoc(res);
+ }
+ else
+ {
+ xsltRunStylesheet(cur, doc, params, output, NULL, NULL);
+ xmlFreeDoc(doc);
+ }
+}
+
+/*static void usage(const char *name) {
+ printf("Usage: %s [options] stylesheet file [file ...]\n", name);
+ printf(" Options:\n");
+ printf(" --version or -V: show the version of libxml and libxslt used\n");
+ printf(" --verbose or -v: show logs of what's happening\n");
+ printf(" --output file or -o file: save to a given file\n");
+ printf(" --timing: display the time used\n");
+ printf(" --repeat: run the transformation 20 times\n");
+ printf(" --debug: dump the tree of the result instead\n");
+ printf(" --novalid: skip the Dtd loading phase\n");
+ printf(" --noout: do not dump the result\n");
+ printf(" --maxdepth val : increase the maximum depth\n");
+#ifdef LIBXML_HTML_ENABLED
+ printf(" --html: the input document is(are) an HTML file(s)\n");
+#endif
+#ifdef LIBXML_DOCB_ENABLED
+ printf(" --docbook: the input document is SGML docbook\n");
+#endif
+ printf(" --param name value : pass a (parameter,value) pair\n");
+ printf(" string values must be quoted like \"'string'\"\n");
+ printf(" --nonet refuse to fetch DTDs or entities over network\n");
+#ifdef LIBXML_CATALOG_ENABLED
+ printf(" --catalogs : use the catalogs from $SGML_CATALOG_FILES\n");
+#endif
+#ifdef LIBXML_XINCLUDE_ENABLED
+ printf(" --xinclude : do XInclude processing on document intput\n");
+#endif
+ printf(" --profile or --norman : dump profiling informations \n");
+}*/
+
+void XSLTProc::addParam(TQString name, TQString value)
+{
+ if(nbparams < NB_PARAMETER_MAX)
+ {
+ params[nbparams] = strdup(name.latin1());
+ params[nbparams + 1] = strdup(value.latin1());
+ fprintf(stderr, "%s => ", params[0]);
+ fprintf(stderr, "%s\n", params[1]);
+ nbparams = nbparams + 2;
+ }
+}
+
+int XSLTProc::parse()
+{
+ int i = 0;
+ xsltStylesheetPtr cur = NULL;
+ xmlDocPtr doc, style;
+
+ xmlInitMemory();
+
+ LIBXML_TEST_VERSION
+
+ //xmlLineNumbersDefault(1);
+
+ if (novalid == 0)
+ xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
+ else
+ xmlLoadExtDtdDefaultValue = 0;
+
+ /* Options */
+ debug = debug + 1;
+ novalid = novalid + 1;
+ output = _fileOut;
+ repeat = 20;
+ xsltMaxDepth = 5;
+ params[nbparams] = NULL;
+
+ /*
+ * Replace entities with their content.
+ */
+ xmlSubstituteEntitiesDefault(1);
+
+ /*
+ * Register the EXSLT extensions and the test module
+ */
+ //exsltRegisterAll();
+ xsltRegisterTestModule();
+
+
+ style = xmlParseFile((const char *) _stylesheet);
+ if (style == NULL)
+ {
+ fprintf(stderr, "cannot parse %s\n", _stylesheet.data());
+ cur = NULL;
+ }
+ else
+ {
+ cur = xsltLoadStylesheetPI(style);
+ if (cur != NULL)
+ {
+ /* it is an embedded stylesheet */
+ xsltProcess(style, cur, _stylesheet);
+ xsltFreeStylesheet(cur);
+ goto done;
+ }
+ cur = xsltParseStylesheetDoc(style);
+ if (cur != NULL)
+ {
+ if (cur->indent == 1)
+ xmlIndentTreeOutput = 1;
+ else
+ xmlIndentTreeOutput = 0;
+ i++;
+ }
+ else
+ {
+ xmlFreeDoc(style);
+ goto done;
+ }
+ }
+
+ /*
+ * disable CDATA from being built in the document tree
+ */
+ xmlDefaultSAXHandlerInit();
+ xmlDefaultSAXHandler.cdataBlock = NULL;
+
+ if ((cur != NULL) && (cur->errors == 0))
+ {
+ doc = NULL;
+ doc = xmlParseFile(_fileIn);
+ if (doc == NULL)
+ fprintf(stderr, "unable to parse %s\n", _fileIn.data());
+ else
+ xsltProcess(doc, cur, _fileIn);
+ }
+ if (cur != NULL)
+ xsltFreeStylesheet(cur);
+done:
+ xsltCleanupGlobals();
+ xmlCleanupParser();
+ xmlMemoryDump();
+ return (0);
+}
+