1 /*
2     SPDX-FileCopyrightText: 2008 Frederik Gladhorn <frederik.gladhorn@kdemail.net>
3     SPDX-License-Identifier: GPL-2.0-or-later
4 */
5 
6 #include "exportdialog.h"
7 
8 #include <KEduVocDocument>
9 #include <KEduVocKVTML2Writer>
10 #include <parleydocument.h>
11 
12 #include <KLocalizedString>
13 #include <KMessageBox>
14 #include <QDebug>
15 #include <QFileDialog>
16 #include <QStandardPaths>
17 #include <QUrl>
18 
19 #include <QDialogButtonBox>
20 
21 #include <libxml/HTMLtree.h>
22 #include <libxml/catalog.h>
23 #include <libxml/debugXML.h>
24 #include <libxml/xinclude.h>
25 #include <libxml/xmlIO.h>
26 #include <libxml/xmlmemory.h>
27 #include <libxslt/transform.h>
28 #include <libxslt/xslt.h>
29 #include <libxslt/xsltInternals.h>
30 #include <libxslt/xsltutils.h>
31 #include <string.h>
32 
ExportDialog(ParleyDocument * doc,QWidget * parent)33 ExportDialog::ExportDialog(ParleyDocument *doc, QWidget *parent)
34     : QDialog(parent)
35     , m_doc{doc}
36 {
37     ui = new Ui::ExportOptions();
38     QWidget *widget = new QWidget();
39     ui->setupUi(widget);
40 
41     QDialogButtonBox *button_dialog = new QDialogButtonBox;
42     button_dialog->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
43 
44     QVBoxLayout *layout = new QVBoxLayout;
45     layout->addWidget(widget);
46     layout->addWidget(button_dialog);
47 
48     setLayout(layout);
49 
50     connect(button_dialog, &QDialogButtonBox::accepted, this, &ExportDialog::accept);
51     connect(button_dialog, &QDialogButtonBox::rejected, this, &ExportDialog::reject);
52 
53     setWindowTitle(i18nc("@title:window", "Export"));
54 }
55 
accept()56 void ExportDialog::accept()
57 {
58     QDialog::accept();
59 
60     if (ui->csvRadio->isChecked()) {
61         /// Find the CSV filter in the standard filter list
62         //!@todo: good and clean solution
63         QStringList defaultFilters = KEduVocDocument::pattern(KEduVocDocument::Writing).split(QStringLiteral(";;"));
64         QString filter = defaultFilters.filter(QStringLiteral("csv")).join(QStringLiteral(";;"));
65         QUrl filename = getFileName(filter);
66         if (filename != QUrl()) {
67             m_doc->saveAs(filename);
68         }
69         return;
70     }
71 
72     QString xslFile;
73     if (ui->flashCardRadio->isChecked()) {
74         xslFile = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("parley/xslt/flashcards.xsl"));
75     } else {
76         xslFile = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("parley/xslt/table.xsl"));
77     }
78 
79     QString filter = i18n("HTML document") + " (*.html)";
80     QUrl filename = getFileName(filter);
81     if (filename.isEmpty()) {
82         return;
83     }
84 
85     qDebug() << "XSLT starting";
86 
87     xsltStylesheetPtr cur = NULL;
88     xmlDocPtr doc, res;
89 
90     xmlSubstituteEntitiesDefault(1);
91     xmlLoadExtDtdDefaultValue = 1;
92     cur = xsltParseStylesheetFile((const xmlChar *)xslFile.toLatin1().constData());
93 
94     doc = xmlParseDoc((const xmlChar *)m_doc->document()->toByteArray(m_doc->document()->generator()).constData());
95 
96     res = xsltApplyStylesheet(cur, doc, 0);
97     FILE *result = fopen(QFile::encodeName(filename.toLocalFile()).constData(), "w");
98     if (result != NULL) {
99         xsltSaveResultToFile(result, res, cur);
100         fclose(result);
101     } else {
102         KMessageBox::error(this, i18n("Could not write to file \"%1\"", filename.toLocalFile()));
103     }
104 
105     xsltFreeStylesheet(cur);
106     xmlFreeDoc(res);
107     xmlFreeDoc(doc);
108 
109     xsltCleanupGlobals();
110     xmlCleanupParser();
111 
112     qDebug() << "XSLT finished";
113 }
114 
getFileName(const QString & filter)115 QUrl ExportDialog::getFileName(const QString &filter)
116 {
117     return QUrl::fromLocalFile(
118         QFileDialog::getSaveFileName(parentWidget(),
119                                      i18n("Export As"),
120                                      (m_doc->document()->url().fileName() == i18n("Untitled")) ? QLatin1String("") : m_doc->document()->url().toLocalFile(),
121                                      filter));
122 }
123