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

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2018 Yifei Wu <kqwyfg@gmail.com>
0004 */
0005 
0006 #ifndef MARKDOWNENTRY_H
0007 #define MARKDOWNENTRY_H
0008 
0009 #include <vector>
0010 
0011 #include <QSharedPointer>
0012 
0013 #include "worksheetentry.h"
0014 #include "worksheettextitem.h"
0015 
0016 #include "mathrendertask.h"
0017 #include "lib/latexrenderer.h"
0018 
0019 class QJsonObject;
0020 
0021 class MarkdownEntry : public WorksheetEntry
0022 {
0023   Q_OBJECT
0024   public:
0025     explicit MarkdownEntry(Worksheet* worksheet);
0026     ~MarkdownEntry() override = default;
0027 
0028     enum {Type = UserType + 7};
0029     int type() const override;
0030 
0031     bool isEmpty() override;
0032 
0033     bool acceptRichText() override;
0034 
0035     bool focusEntry(int pos = WorksheetTextItem::TopLeft, qreal xCoord=0) override;
0036 
0037     void setContent(const QString& content) override;
0038     void setContent(const QDomElement& content, const KZip& file) override;
0039     void setContentFromJupyter(const QJsonObject& cell) override;
0040 
0041     QDomElement toXml(QDomDocument& doc, KZip* archive) override;
0042     QJsonValue toJupyterJson() override;
0043     QString toPlain(const QString& commandSep, const QString& commentStartingSeq, const QString& commentEndingSeq) override;
0044 
0045     QString plainText() const;
0046 
0047     void layOutForWidth(qreal entry_zone_x, qreal w, bool force = false) override;
0048 
0049     WorksheetCursor search(const QString& pattern, unsigned flags,
0050                            QTextDocument::FindFlags qt_flags,
0051                            const WorksheetCursor& pos = WorksheetCursor()) override;
0052 
0053   public Q_SLOTS:
0054     bool evaluate(WorksheetEntry::EvaluationOption evalOp = FocusNext) override;
0055     void updateEntry() override;
0056     void populateMenu(QMenu* menu, QPointF pos) override;
0057 
0058   protected:
0059     bool renderMarkdown(QString& plain);
0060     bool eventFilter(QObject* object, QEvent* event) override;
0061     bool wantToEvaluate() override;
0062     void setRenderedHtml(const QString& html);
0063     void setPlainText(const QString& plain);
0064     void renderMath();
0065     void renderMathExpression(int jobId, QString mathCode);
0066     void setRenderedMath(int jobId, const QTextImageFormat& format, const QUrl& internal, const QImage& image);
0067     QTextCursor findMath(int id);
0068     void markUpMath();
0069     void addImageAttachment(const QString& name, const QImage& image);
0070 
0071     static std::pair<QString, Cantor::LatexRenderer::EquationType> parseMathCode(QString mathCode);
0072 
0073   protected Q_SLOTS:
0074     void handleMathRender(QSharedPointer<MathRenderResult> result);
0075     void insertImage();
0076     void clearAttachments();
0077     void enterEditMode();
0078 
0079   protected:
0080     WorksheetTextItem* m_textItem;
0081     QString plain;
0082     QString html;
0083     bool rendered;
0084     std::vector<std::pair<QUrl,QString>> attachedImages;
0085     std::vector<std::pair<QString, bool>> foundMath;
0086     static const int JobProperty = 10000;
0087 };
0088 
0089 #endif //MARKDOWNENTRY_H