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