1 /*
2 SPDX-License-Identifier: GPL-2.0-or-later
3 SPDX-FileCopyrightText: 2007-2020 Umbrello UML Modeller Authors <umbrello-devel@kde.org>
4 */
5
6 #include "docbook2xhtmlgeneratorjob.h"
7
8 #include "debug_utils.h"
9 #include "file_utils.h"
10 #include "uml.h"
11 #include "umldoc.h"
12 #include "xhtmlgenerator.h"
13
14 #include <libxml/xmlmemory.h>
15 #include <libxml/debugXML.h>
16 #include <libxml/HTMLtree.h>
17 #include <libxml/xmlIO.h>
18 #include <libxml/xinclude.h>
19 #include <libxml/catalog.h>
20 #include <libxslt/xslt.h>
21 #include <libxslt/xsltInternals.h>
22 #include <libxslt/transform.h>
23 #include <libxslt/xsltutils.h>
24
25 // kde includes
26 #include <KLocalizedString>
27 #if QT_VERSION < 0x050000
28 #include <kstandarddirs.h>
29 #include <ktemporaryfile.h>
30 #include <KUrl>
31 #endif
32
33 // qt includes
34 #if QT_VERSION >= 0x050000
35 #include <QStandardPaths>
36 #include <QTemporaryFile>
37 #include <QUrl>
38 #endif
39
40 #include <QTextStream>
41
42 extern int xmlLoadExtDtdDefaultValue;
43
44 /**
45 * Constructor
46 * @param docBookUrl The Url of the Docbook that is to be converted to XHtml
47 * @param parent Parent object for QThread constructor
48 */
49
50 #if QT_VERSION >= 0x050000
Docbook2XhtmlGeneratorJob(QUrl & docBookUrl,QObject * parent)51 Docbook2XhtmlGeneratorJob::Docbook2XhtmlGeneratorJob(QUrl& docBookUrl, QObject* parent)
52 :QThread(parent), m_docbookUrl(docBookUrl)
53 #else
54 Docbook2XhtmlGeneratorJob::Docbook2XhtmlGeneratorJob(KUrl& docBookUrl, QObject* parent)
55 :QThread(parent), m_docbookUrl(docBookUrl)
56 #endif
57 {
58 }
59
run()60 void Docbook2XhtmlGeneratorJob::run()
61 {
62 UMLDoc* umlDoc = UMLApp::app()->document();
63 xsltStylesheetPtr cur = 0;
64 xmlDocPtr doc, res;
65
66 const char *params[16 + 1];
67 int nbparams = 0;
68 params[nbparams] = 0;
69
70 umlDoc->writeToStatusBar(i18n("Exporting to XHTML..."));
71 QString xsltFileName = XhtmlGenerator::customXslFile();
72
73 // use public xml catalogs
74 xmlLoadCatalogs(File_Utils::xmlCatalogFilePath().toLocal8Bit().constData());
75
76 xmlSubstituteEntitiesDefault(1);
77 xmlLoadExtDtdDefaultValue = 1;
78 uDebug() << "Parsing stylesheet " << xsltFileName;
79 cur = xsltParseStylesheetFile((const xmlChar *)xsltFileName.toLatin1().constData());
80 uDebug() << "Parsing file " << m_docbookUrl.path();
81 doc = xmlParseFile((const char*)(m_docbookUrl.path().toUtf8()));
82 uDebug() << "Applying stylesheet ";
83 res = xsltApplyStylesheet(cur, doc, params);
84
85 #if QT_VERSION >= 0x050000
86 QTemporaryFile tmpXhtml;
87 #else
88 KTemporaryFile tmpXhtml;
89 #endif
90 tmpXhtml.setAutoRemove(false);
91 tmpXhtml.open();
92
93 uDebug() << "Writing HTML result to temp file: " << tmpXhtml.fileName();
94 xsltSaveResultToFd(tmpXhtml.handle(), res, cur);
95
96 xsltFreeStylesheet(cur);
97 xmlFreeDoc(res);
98 xmlFreeDoc(doc);
99
100 xsltCleanupGlobals();
101 xmlCleanupParser();
102
103 emit xhtmlGenerated(tmpXhtml.fileName());
104 }
105
106
107
108