File indexing completed on 2024-05-05 11:56:06

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2019 Nikita Sirgienko <warquark@gmail.com>
0004 */
0005 
0006 #include "mimeresult.h"
0007 
0008 #include <QDebug>
0009 #include <QJsonArray>
0010 #include <QJsonDocument>
0011 #include <QFile>
0012 #include <KLocalizedString>
0013 
0014 #include "jupyterutils.h"
0015 
0016 using namespace Cantor;
0017 
0018 class Cantor::MimeResultPrivate
0019 {
0020 public:
0021     MimeResultPrivate() = default;
0022 
0023     QString plain;
0024     QJsonObject mimeBundle;
0025 };
0026 
0027 MimeResult::MimeResult(const QJsonObject& mimeBundle) : d(new MimeResultPrivate)
0028 {
0029     bool isOriginalPlain = mimeBundle.contains(QLatin1String("text/plain"));
0030     if (isOriginalPlain)
0031         d->plain = JupyterUtils::fromJupyterMultiline(mimeBundle.value(QLatin1String("text/plain")));
0032     else
0033         d->plain = i18n("This is unsupported Jupyter content of types ('%1')", mimeBundle.keys().join(QLatin1String(", ")));
0034     d->mimeBundle = mimeBundle;
0035 }
0036 
0037 MimeResult::~MimeResult()
0038 {
0039     delete d;
0040 }
0041 
0042 QString MimeResult::toHtml()
0043 {
0044     return QLatin1String("<pre>") + d->plain.toHtmlEscaped() + QLatin1String("</pre>");
0045 }
0046 
0047 int MimeResult::type()
0048 {
0049     return MimeResult::Type;
0050 }
0051 
0052 QString MimeResult::mimeType()
0053 {
0054     return QLatin1String("application/json");
0055 }
0056 
0057 QVariant MimeResult::data()
0058 {
0059     return d->mimeBundle;
0060 }
0061 
0062 QString MimeResult::plain()
0063 {
0064     return d->plain;
0065 }
0066 
0067 QDomElement MimeResult::toXml(QDomDocument& doc)
0068 {
0069     qDebug()<<"saving mime result with types" << d->mimeBundle.keys();
0070     QDomElement e=doc.createElement(QStringLiteral("Result"));
0071     e.setAttribute(QStringLiteral("type"), QStringLiteral("mime"));
0072 
0073     for (const QString& key : d->mimeBundle.keys())
0074     {
0075         QJsonDocument jsonDoc;
0076         QJsonObject obj;
0077         obj.insert(QLatin1String("content"), d->mimeBundle[key]);
0078         jsonDoc.setObject(obj);
0079 
0080         QDomElement content = doc.createElement(QStringLiteral("Content"));
0081         content.setAttribute(QStringLiteral("key"), key);
0082         content.appendChild(doc.createTextNode(QString::fromUtf8(jsonDoc.toJson())));
0083         e.appendChild(content);
0084     }
0085 
0086     return e;
0087 }
0088 
0089 QJsonValue Cantor::MimeResult::toJupyterJson()
0090 {
0091     QJsonObject root;
0092     if (executionIndex() != -1)
0093     {
0094         root.insert(QLatin1String("output_type"), QLatin1String("execute_result"));
0095         root.insert(QLatin1String("execution_count"), executionIndex());
0096     }
0097     else
0098         root.insert(QLatin1String("output_type"), QLatin1String("display_data"));
0099 
0100     root.insert(QLatin1String("data"), d->mimeBundle);
0101     root.insert(QLatin1String("metadata"), jupyterMetadata());
0102 
0103     return root;
0104 }
0105 
0106 void Cantor::MimeResult::save(const QString& filename)
0107 {
0108     QFile file(filename);
0109 
0110     if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
0111         return;
0112 
0113     QTextStream stream(&file);
0114 
0115     QJsonDocument jsonDoc;
0116     jsonDoc.setObject(d->mimeBundle);
0117 
0118     stream << jsonDoc.toJson();
0119 
0120     file.close();
0121 }