File indexing completed on 2024-04-28 11:20:47

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2019 Sirgienko Nikita <warquark@gmail.com>
0004 */
0005 
0006 #ifndef JUPYTERUTILS_H
0007 #define JUPYTERUTILS_H
0008 
0009 #include <vector>
0010 
0011 #include <QString>
0012 #include <QMimeDatabase>
0013 #include <QStringList>
0014 
0015 #include "cantor_export.h"
0016 
0017 class QJsonValue;
0018 class QJsonObject;
0019 class QJsonArray;
0020 class QJsonDocument;
0021 class QImage;
0022 class QUrl;
0023 
0024 namespace Cantor {
0025 
0026 class Backend;
0027 
0028 /**
0029  * Static class for storing some common code for working with jupyter json scheme
0030  * Like getting 'metadata', getting source code from 'source' tag, scheme validation
0031  * handleling missing keys, etc.
0032  *
0033  */
0034 class CANTOR_EXPORT JupyterUtils
0035 {
0036   public:
0037     static QJsonObject getMetadata(const QJsonObject& object);
0038     static QJsonObject getCantorMetadata(const QJsonObject object);
0039 
0040     static QJsonArray getCells(const QJsonObject notebook);
0041     static std::tuple<int, int> getNbformatVersion(const QJsonObject& notebook);
0042 
0043     static QString getCellType(const QJsonObject& cell);
0044     static QString getSource(const QJsonObject& cell);
0045     static void setSource(QJsonObject& cell, const QString& source);
0046 
0047     static QString getOutputType(const QJsonObject& output);
0048 
0049     /// Actually, this function handle only Jupyter notebooks version >= 4.0.0
0050     /// Previous versions treats as 'not notebook'
0051     static bool isJupyterNotebook(const QJsonDocument& doc);
0052 
0053     static bool isJupyterCell(const QJsonValue& cell);
0054     static bool isMarkdownCell(const QJsonValue& cell);
0055     static bool isCodeCell(const QJsonValue& cell);
0056     static bool isRawCell(const QJsonValue& cell);
0057 
0058     static bool isJupyterOutput(const QJsonValue& output);
0059     static bool isJupyterDisplayOutput(const QJsonValue& output);
0060     static bool isJupyterTextOutput(const QJsonValue& output);
0061     static bool isJupyterErrorOutput(const QJsonValue& output);
0062     static bool isJupyterExecutionResult(const QJsonValue& output);
0063 
0064     static QJsonValue toJupyterMultiline(const QString& source);
0065     static QString fromJupyterMultiline(const QJsonValue& source);
0066 
0067     static QString getKernelName(const QJsonValue& kernelspecValue);
0068     static QJsonObject getKernelspec(const Cantor::Backend* backend);
0069 
0070     static QImage loadImage(const QJsonValue& mimeBundle, const QString& key);
0071     static QJsonObject packMimeBundle(const QImage& image, const QString& mime);
0072     static QStringList imageKeys(const QJsonValue& mimeBundle);
0073     static QString firstImageKey(const QJsonValue& mimeBundle);
0074     static QString mainBundleKey(const QJsonValue& mimeBundle);
0075 
0076     static bool isGifHtml(const QJsonValue& html);
0077     static QUrl loadGifHtml(const QJsonValue& html);
0078   public:
0079     static const QString cellsKey;
0080     static const QString metadataKey;
0081     static const QString cantorMetadataKey;
0082     static const QString nbformatKey;
0083     static const QString nbformatMinorKey;
0084     static const QString cellTypeKey;
0085     static const QString sourceKey;
0086     static const QString outputTypeKey;
0087     static const QString executionCountKey;
0088     static const QString outputsKey;
0089     static const QString dataKey;
0090 
0091     static const QString pngMime;
0092     static const QString gifMime;
0093     static const QString textMime;
0094     static const QString htmlMime;
0095     static const QString latexMime;
0096     static const QString svgMime;
0097 
0098     static const QMimeDatabase mimeDatabase;
0099 };
0100 }
0101 
0102 #endif // JUPYTERUTILS_H