From c6534e2cf47e42a0bece422920353f95f5fba9ef Mon Sep 17 00:00:00 2001 From: JackLee <809262979@qq.com> Date: Fri, 7 Mar 2025 21:44:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=8D=E6=9D=82=E5=85=AC?= =?UTF-8?q?=E5=BC=8Fconvert=20base64=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 4 ++- 3rdparty/MicroTeX | 2 +- CMakeLists.txt | 14 +++++------ src/ctai_history_textedit.cpp | 2 ++ src/ctai_history_textedit.h | 2 +- src/ctai_math_convert.cpp | 47 +++++++++++++++++++++++++++++------ src/ctai_math_convert.h | 37 +++++++++++++++++++++++---- 7 files changed, 86 insertions(+), 22 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 2b5717f..f8394af 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -102,7 +102,9 @@ "qtimer": "cpp", "qstring": "cpp", "qabstracttextdocumentlayout": "cpp", - "qframe": "cpp" + "qframe": "cpp", + "qpixmap": "cpp", + "qpainter": "cpp" }, "editor.gotoLocation.alternativeDeclarationCommand": "editor.action.revealDefinition", "editor.gotoLocation.alternativeDefinitionCommand": "editor.action.revealDefinition", diff --git a/3rdparty/MicroTeX b/3rdparty/MicroTeX index 086f4eb..0e3707f 160000 --- a/3rdparty/MicroTeX +++ b/3rdparty/MicroTeX @@ -1 +1 @@ -Subproject commit 086f4eb740270b28bd0c61a0a359aea9300d61ae +Subproject commit 0e3707f6dafebb121d98b53c64364d16fefe481d diff --git a/CMakeLists.txt b/CMakeLists.txt index a5895d9..9df1a18 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,13 +62,13 @@ include_directories(${JSON}/include) find_package(CURL REQUIRED) #cmark-gfm -add_subdirectory(${PROJECT_SOURCE_DIR}/3rdparty/cmark-gfm) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/cmark-gfm/src) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/cmark-gfm/extensions) +#add_subdirectory(${PROJECT_SOURCE_DIR}/3rdparty/cmark-gfm) +#include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/cmark-gfm/src) +#include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/cmark-gfm/extensions) #MicroTeX add_subdirectory(${PROJECT_SOURCE_DIR}/3rdparty/MicroTeX) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/MicroTeX/lib) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/MicroTeX/src) #查找QT模块 FIND_PACKAGE(Qt6 REQUIRED Core Gui Widgets) @@ -148,9 +148,9 @@ target_link_libraries( Qt6::Gui Qt6::Widgets CURL::libcurl - libcmark-gfm-extensions_static - libcmark-gfm_static - microtex + #libcmark-gfm-extensions_static + #libcmark-gfm_static + LaTeX ) diff --git a/src/ctai_history_textedit.cpp b/src/ctai_history_textedit.cpp index bfee8a0..cb51512 100644 --- a/src/ctai_history_textedit.cpp +++ b/src/ctai_history_textedit.cpp @@ -91,6 +91,7 @@ void ctai_history_textedit::init_layout(msg_type msg_type_mode) // 5. 历史信息QTextEdit historyLayout = new QVBoxLayout(); m_msg_history = new QTextEdit(); + m_math_convert=new ctai_math_convert(); m_msg_history->setUndoRedoEnabled(false); // 关闭撤销历史以节省内存 m_msg_history->setAcceptRichText(true); m_msg_history->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -259,6 +260,7 @@ void ctai_history_textedit::add_user_message(const model_data &message) disp_data = QSL(message.send_user_data); m_msg_sned_id = QSL(message.send_user_id); m_msg_history->setMarkdown(disp_data); + m_math_convert->math_convert_svg(disp_data); } void ctai_history_textedit::add_system_message(const model_data &message) diff --git a/src/ctai_history_textedit.h b/src/ctai_history_textedit.h index 9911236..6df6470 100644 --- a/src/ctai_history_textedit.h +++ b/src/ctai_history_textedit.h @@ -71,7 +71,7 @@ signals: private: void connect_signals(msg_type msg_type_mode);// 连接信号和槽 private: - ctai_math_convert* m_cmark_gfm; + ctai_math_convert* m_math_convert; QFrame *hLine; QSpacerItem *sparcer_item = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed); QVBoxLayout *mainLayout={}; diff --git a/src/ctai_math_convert.cpp b/src/ctai_math_convert.cpp index e6efd22..9adc55b 100644 --- a/src/ctai_math_convert.cpp +++ b/src/ctai_math_convert.cpp @@ -2,15 +2,48 @@ ctai_math_convert::ctai_math_convert() { - } -ctai_math_convert::~ctai_math_convert() { +ctai_math_convert::~ctai_math_convert() +{ } -void ctai_math_convert::math_convert_svg(const QString& text) { - +void ctai_math_convert::set_convert_opts() +{ +} +void ctai_math_convert::save_svg(QPixmap &img, const QString &svg) +{ + QString uid = QUuid::createUuid().toString(QUuid::WithoutBraces); + QString svgName = QDir::currentPath() + "/svg/" + uid + ".png"; + bool ok = img.save(svgName); +} +QByteArray ctai_math_convert::svg_to_base64(QPixmap &pix) +{ + + QByteArray data; + QBuffer buffer(&data); + QImage img = pix.toImage(); + + img.save(&buffer, "PNG"); + data = data.toBase64(); + return data; +} +void ctai_math_convert::math_convert_svg(const QString &latex) +{ + auto render = tex::LaTeX::parse(latex.toStdWString(), m_width, m_text_size, m_lineSpace, m_color); + qDebug() << render->getWidth() << render->getHeight(); + QPixmap pix(render->getWidth(), render->getHeight()); + pix.fill(Qt::white); + QPainter painter(&pix); + painter.setRenderHint(QPainter::Antialiasing, true); + tex::Graphics2D_qt g2(&painter); + render->draw(g2, 0, 0); + if (save_mode) + { + save_svg(pix, latex); + } + else + { + qDebug() << "svg_to_base64:" << QString::fromUtf8(svg_to_base64(pix)); + } } -void ctai_math_convert::svg_convert_base64() { - -} \ No newline at end of file diff --git a/src/ctai_math_convert.h b/src/ctai_math_convert.h index 560894d..f359799 100644 --- a/src/ctai_math_convert.h +++ b/src/ctai_math_convert.h @@ -1,21 +1,48 @@ #ifndef CTAI_MATH_CONVERT_H #define CTAI_MATH_CONVERT_H -#include "microtex.h" +#include "latex.h" +#include "platform/qt/graphic_qt.h" #include #include #include -#include +#include +#include +#include +class TexGuard { + public: + TexGuard() { + tex::LaTeX::init(); + } + + ~TexGuard() { + tex::LaTeX::release(); + } +}; -class ctai_math_convert { +class ctai_math_convert :public QObject +{ + Q_OBJECT public: explicit ctai_math_convert(); ~ctai_math_convert(); // 追加内容并处理Markdown void math_convert_svg(const QString& text); - void svg_convert_base64(); + void set_convert_opts(); + void save_svg(QPixmap& img,const QString& svg); + QByteArray svg_to_base64(QPixmap& pix); private: - + TexGuard texGuard; + //宽度 + int m_width=600; + //文本大小 + int m_text_size=20; + //行距 + float m_lineSpace=20 / 3.f; + //颜色 + tex::color m_color=0xff424242; + //处理后保存模式 + bool save_mode=false; }; #endif \ No newline at end of file