File indexing completed on 2024-04-21 03:51:10

0001 /*
0002     SPDX-FileCopyrightText: 2008 Frederik Gladhorn <frederik.gladhorn@kdemail.net>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "exportdialog.h"
0007 
0008 #include "parleydocument.h"
0009 #include <KEduVocDocument>
0010 #include <KEduVocKVTML2Writer>
0011 
0012 #include <KLocalizedString>
0013 #include <KMessageBox>
0014 #include <QDebug>
0015 #include <QFileDialog>
0016 #include <QStandardPaths>
0017 #include <QUrl>
0018 
0019 #include <QDialogButtonBox>
0020 
0021 #include <libxml/HTMLtree.h>
0022 #include <libxml/catalog.h>
0023 #include <libxml/debugXML.h>
0024 #include <libxml/xinclude.h>
0025 #include <libxml/xmlIO.h>
0026 #include <libxml/xmlmemory.h>
0027 #include <libxslt/transform.h>
0028 #include <libxslt/xslt.h>
0029 #include <libxslt/xsltInternals.h>
0030 #include <libxslt/xsltutils.h>
0031 #include <string.h>
0032 
0033 ExportDialog::ExportDialog(ParleyDocument *doc, QWidget *parent)
0034     : QDialog(parent)
0035     , m_doc{doc}
0036 {
0037     ui = new Ui::ExportOptions();
0038     QWidget *widget = new QWidget();
0039     ui->setupUi(widget);
0040 
0041     QDialogButtonBox *button_dialog = new QDialogButtonBox;
0042     button_dialog->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
0043 
0044     QVBoxLayout *layout = new QVBoxLayout;
0045     layout->addWidget(widget);
0046     layout->addWidget(button_dialog);
0047 
0048     setLayout(layout);
0049 
0050     connect(button_dialog, &QDialogButtonBox::accepted, this, &ExportDialog::accept);
0051     connect(button_dialog, &QDialogButtonBox::rejected, this, &ExportDialog::reject);
0052 
0053     setWindowTitle(i18nc("@title:window", "Export"));
0054 }
0055 
0056 void ExportDialog::accept()
0057 {
0058     QDialog::accept();
0059 
0060     if (ui->csvRadio->isChecked()) {
0061         /// Find the CSV filter in the standard filter list
0062         //!@todo: good and clean solution
0063         QStringList defaultFilters = KEduVocDocument::pattern(KEduVocDocument::Writing).split(QStringLiteral(";;"));
0064         QString filter = defaultFilters.filter(QStringLiteral("csv")).join(QStringLiteral(";;"));
0065         QUrl filename = getFileName(filter);
0066         if (filename != QUrl()) {
0067             m_doc->saveAs(filename);
0068         }
0069         return;
0070     }
0071 
0072     QString xslFile;
0073     if (ui->flashCardRadio->isChecked()) {
0074         xslFile = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("parley/xslt/flashcards.xsl"));
0075     } else {
0076         xslFile = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("parley/xslt/table.xsl"));
0077     }
0078 
0079     QString filter = i18n("HTML document") + " (*.html)";
0080     QUrl filename = getFileName(filter);
0081     if (filename.isEmpty()) {
0082         return;
0083     }
0084 
0085     qDebug() << "XSLT starting";
0086 
0087     xsltStylesheetPtr cur = nullptr;
0088     xmlDocPtr doc, res;
0089 
0090     xmlSubstituteEntitiesDefault(1);
0091     xmlLoadExtDtdDefaultValue = 1;
0092     cur = xsltParseStylesheetFile((const xmlChar *)xslFile.toLatin1().constData());
0093 
0094     doc = xmlParseDoc((const xmlChar *)m_doc->document()->toByteArray(m_doc->document()->generator()).constData());
0095 
0096     res = xsltApplyStylesheet(cur, doc, nullptr);
0097     FILE *result = fopen(QFile::encodeName(filename.toLocalFile()).constData(), "w");
0098     if (result != nullptr) {
0099         xsltSaveResultToFile(result, res, cur);
0100         fclose(result);
0101     } else {
0102         KMessageBox::error(this, i18n("Could not write to file \"%1\"", filename.toLocalFile()));
0103     }
0104 
0105     xsltFreeStylesheet(cur);
0106     xmlFreeDoc(res);
0107     xmlFreeDoc(doc);
0108 
0109     xsltCleanupGlobals();
0110     xmlCleanupParser();
0111 
0112     qDebug() << "XSLT finished";
0113 }
0114 
0115 QUrl ExportDialog::getFileName(const QString &filter)
0116 {
0117     return QUrl::fromLocalFile(
0118         QFileDialog::getSaveFileName(parentWidget(),
0119                                      i18n("Export As"),
0120                                      (m_doc->document()->url().fileName() == i18n("Untitled")) ? QLatin1String("") : m_doc->document()->url().toLocalFile(),
0121                                      filter));
0122 }
0123 
0124 #include "moc_exportdialog.cpp"