整理功能代码
This commit is contained in:
parent
51778dffbf
commit
742a640c3f
@ -82,7 +82,7 @@ MESSAGE(STATUS "---------- END---------------")
|
|||||||
|
|
||||||
|
|
||||||
#增加sui的cpp
|
#增加sui的cpp
|
||||||
FILE(GLOB src_sui "${PROJECT_SOURCE_DIR}/src/*.*")
|
FILE(GLOB src_sui "${PROJECT_SOURCE_DIR}/src/*.*")
|
||||||
SET(PROJECT_SOURCES ${src_sui})
|
SET(PROJECT_SOURCES ${src_sui})
|
||||||
|
|
||||||
# 设置消息策略为qFatal来禁用qDebug信息
|
# 设置消息策略为qFatal来禁用qDebug信息
|
||||||
@ -150,8 +150,7 @@ target_link_libraries(
|
|||||||
CURL::libcurl
|
CURL::libcurl
|
||||||
LaTeX
|
LaTeX
|
||||||
libcmark-gfm_static
|
libcmark-gfm_static
|
||||||
libcmark-gfm-extensions_static
|
libcmark-gfm-extensions_static
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
cmake_minimum_required(VERSION 3.19)
|
|
||||||
|
|
||||||
project(ctai)
|
|
||||||
# 设置库的版本号
|
|
||||||
set_target_properties(sui PROPERTIES VERSION 1.0 SOVERSION 1)
|
|
||||||
|
|
||||||
#include dir
|
|
||||||
include_directories(${PROJECT_SOURCE_DIR}/include)
|
|
||||||
|
|
||||||
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
|
|
||||||
|
|
||||||
add_library(ctai STATIC ${SRC_LIST})
|
|
||||||
|
|
||||||
@ -60,6 +60,7 @@ void ctaiHistoryTextEdit::init_msg_header_layout(msg_type msg_type_mode)
|
|||||||
m_msg_header = new QLineEdit();
|
m_msg_header = new QLineEdit();
|
||||||
m_msg_header->setObjectName("m_msg_header");
|
m_msg_header->setObjectName("m_msg_header");
|
||||||
m_msg_header->setReadOnly(true);
|
m_msg_header->setReadOnly(true);
|
||||||
|
m_msg_tools = new ctaiHistoryTools();
|
||||||
if (msg_type_mode == SYSTEM)
|
if (msg_type_mode == SYSTEM)
|
||||||
{
|
{
|
||||||
// 1.SYSTEM消息头水平左信息区
|
// 1.SYSTEM消息头水平左信息区
|
||||||
@ -81,8 +82,7 @@ void ctaiHistoryTextEdit::init_msg_header_layout(msg_type msg_type_mode)
|
|||||||
header_info_layout->addWidget(m_msg_tokens);
|
header_info_layout->addWidget(m_msg_tokens);
|
||||||
header_info_layout->addWidget(m_restart_to_send);
|
header_info_layout->addWidget(m_restart_to_send);
|
||||||
header_info_layout->addWidget(m_msg_system_del);
|
header_info_layout->addWidget(m_msg_system_del);
|
||||||
// 3.SYSTEM消息头垂直第二排功能区
|
// 3.SYSTEM消息头垂直第二排功能区
|
||||||
m_msg_tools = new ctaiHistoryTools();
|
|
||||||
header_opts_layout->addWidget(m_msg_tools);
|
header_opts_layout->addWidget(m_msg_tools);
|
||||||
// 4.添加到消息头主布局
|
// 4.添加到消息头主布局
|
||||||
header_layout->addLayout(header_info_layout);
|
header_layout->addLayout(header_info_layout);
|
||||||
@ -111,7 +111,7 @@ void ctaiHistoryTextEdit::init_msg_header_layout(msg_type msg_type_mode)
|
|||||||
}
|
}
|
||||||
void ctaiHistoryTextEdit::set_default_opts()
|
void ctaiHistoryTextEdit::set_default_opts()
|
||||||
{
|
{
|
||||||
m_msg_history->setFont(QFont(m_font, m_font_size));
|
m_msg_history->setFont(QFont(m_msg_tools->getFont(), m_msg_tools->getFontSize().toInt()));
|
||||||
}
|
}
|
||||||
void ctaiHistoryTextEdit::connect_signals(msg_type msg_type_mode)
|
void ctaiHistoryTextEdit::connect_signals(msg_type msg_type_mode)
|
||||||
{
|
{
|
||||||
@ -122,13 +122,9 @@ void ctaiHistoryTextEdit::connect_signals(msg_type msg_type_mode)
|
|||||||
connect(m_msg_tools, SIGNAL(on_signals_fold()), this, SLOT(on_fold_slots()));
|
connect(m_msg_tools, SIGNAL(on_signals_fold()), this, SLOT(on_fold_slots()));
|
||||||
connect(m_msg_tokens, SIGNAL(clicked()), this, SLOT(on_tokens_slots()));
|
connect(m_msg_tokens, SIGNAL(clicked()), this, SLOT(on_tokens_slots()));
|
||||||
connect(m_msg_tools, SIGNAL(on_signals_display_mode(QString)), this, SLOT(on_display_changed(QString)));
|
connect(m_msg_tools, SIGNAL(on_signals_display_mode(QString)), this, SLOT(on_display_changed(QString)));
|
||||||
connect(m_msg_tools, SIGNAL(on_signals_display_font(QString)), this, SLOT(on_display_font_changed(QString)));
|
connect(m_msg_tools, SIGNAL(on_signals_display_font_size()), this, SLOT(on_display_font_size_changed()));
|
||||||
connect(m_msg_tools, SIGNAL(on_signals_display_font_size(QString)), this, SLOT(on_display_font_size_changed(QString)));
|
|
||||||
// save菜单功能
|
// save菜单功能
|
||||||
connect(m_msg_tools, SIGNAL(on_signals_save_text()), this, SLOT(on_save_text()));
|
connect(m_msg_tools, SIGNAL(on_signals_save_file(int)), this, SLOT(on_save_file(int)));
|
||||||
connect(m_msg_tools, SIGNAL(on_signals_save_html()), this, SLOT(on_save_html()));
|
|
||||||
connect(m_msg_tools, SIGNAL(on_signals_save_pdf()), this, SLOT(on_save_pdf()));
|
|
||||||
connect(m_msg_tools, SIGNAL(on_signals_save_markdown()), this, SLOT(on_save_markdown()));
|
|
||||||
// 其他功能菜单
|
// 其他功能菜单
|
||||||
connect(m_msg_tools, SIGNAL(on_signals_menu()), this, SLOT(on_menu_slots()));
|
connect(m_msg_tools, SIGNAL(on_signals_menu()), this, SLOT(on_menu_slots()));
|
||||||
}
|
}
|
||||||
@ -141,15 +137,9 @@ void ctaiHistoryTextEdit::connect_signals(msg_type msg_type_mode)
|
|||||||
void ctaiHistoryTextEdit::on_menu_slots()
|
void ctaiHistoryTextEdit::on_menu_slots()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
void ctaiHistoryTextEdit::on_display_font_size_changed(QString font_size)
|
void ctaiHistoryTextEdit::on_display_font_size_changed()
|
||||||
{
|
{
|
||||||
m_font_size = font_size.toInt();
|
m_msg_history->setFont(QFont(m_msg_tools->getFont(), m_msg_tools->getFontSize().toInt()));
|
||||||
m_msg_history->setFont(QFont(m_font, m_font_size));
|
|
||||||
}
|
|
||||||
void ctaiHistoryTextEdit::on_display_font_changed(QString font)
|
|
||||||
{
|
|
||||||
m_font = font;
|
|
||||||
m_msg_history->setFont(QFont(m_font, m_font_size));
|
|
||||||
}
|
}
|
||||||
void ctaiHistoryTextEdit::on_delete_slots()
|
void ctaiHistoryTextEdit::on_delete_slots()
|
||||||
{
|
{
|
||||||
@ -164,13 +154,16 @@ void ctaiHistoryTextEdit::on_copy_slots()
|
|||||||
QClipboard *clipboard = QApplication::clipboard();
|
QClipboard *clipboard = QApplication::clipboard();
|
||||||
clipboard->setText(text);
|
clipboard->setText(text);
|
||||||
}
|
}
|
||||||
void ctaiHistoryTextEdit::on_save_text()
|
// 保存文件
|
||||||
|
void ctaiHistoryTextEdit::on_save_file(int index)
|
||||||
{
|
{
|
||||||
QString fileName = QFileDialog::getSaveFileName(this,
|
QString fileName;
|
||||||
tr("保存消息"), m_msg_sned_id + ".txt",
|
QString temp_current_content;
|
||||||
tr("文本文件 (*.txt)"));
|
fileName = QFileDialog::getSaveFileName(this, tr("保存消息"), m_msg_sned_id + save_extend[index], save_extend_str[index]);
|
||||||
if (fileName.isEmpty())
|
if (fileName.isEmpty())
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
QFile file(fileName);
|
QFile file(fileName);
|
||||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
|
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
|
||||||
{
|
{
|
||||||
@ -179,57 +172,25 @@ void ctaiHistoryTextEdit::on_save_text()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QTextStream out(&file);
|
QTextStream out(&file);
|
||||||
out << m_msg_history->toPlainText() << "\n\n";
|
switch(index){
|
||||||
file.close();
|
case 0:
|
||||||
}
|
temp_current_content=m_msg_history->toPlainText();
|
||||||
void ctaiHistoryTextEdit::on_save_html()
|
break;
|
||||||
{
|
case 1:
|
||||||
QString fileName = QFileDialog::getSaveFileName(this,
|
temp_current_content=m_msg_history->toHtml();
|
||||||
tr("保存HTML"),
|
break;
|
||||||
m_msg_sned_id + ".html",
|
case 2:
|
||||||
tr("HTML 文件 (*.html)"));
|
temp_current_content=m_msg_history->toMarkdown();
|
||||||
if (fileName.isEmpty())
|
break;
|
||||||
return;
|
case 3:
|
||||||
|
break;
|
||||||
QFile file(fileName);
|
|
||||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
|
|
||||||
{
|
|
||||||
QMessageBox::warning(this, tr("保存失败"),
|
|
||||||
tr("无法保存文件 %1:\n%2").arg(fileName).arg(file.errorString()));
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
if(!temp_current_content.isEmpty()){
|
||||||
QTextStream out(&file);
|
out << m_current_content << "\n\n";
|
||||||
out << m_msg_history->toHtml();
|
}
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctaiHistoryTextEdit::on_save_markdown()
|
|
||||||
{
|
|
||||||
QString fileName = QFileDialog::getSaveFileName(this,
|
|
||||||
tr("保存 Markdown"),
|
|
||||||
m_msg_sned_id + ".md",
|
|
||||||
tr("Markdown 文件 (*.md)"));
|
|
||||||
if (fileName.isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
QFile file(fileName);
|
|
||||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
|
|
||||||
{
|
|
||||||
QMessageBox::warning(this, tr("保存失败"),
|
|
||||||
tr("无法保存文件 %1:\n%2").arg(fileName).arg(file.errorString()));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTextStream out(&file);
|
|
||||||
out << m_msg_history->toMarkdown();
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctaiHistoryTextEdit::on_save_pdf()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// 实现折叠功能的槽函数
|
// 实现折叠功能的槽函数
|
||||||
void ctaiHistoryTextEdit::on_fold_slots()
|
void ctaiHistoryTextEdit::on_fold_slots()
|
||||||
{
|
{
|
||||||
@ -252,12 +213,10 @@ void ctaiHistoryTextEdit::on_display_changed(QString mode)
|
|||||||
}
|
}
|
||||||
else if (mode == "HTML渲染" || mode == "Markdown渲染")
|
else if (mode == "HTML渲染" || mode == "Markdown渲染")
|
||||||
{
|
{
|
||||||
m_msg_history->setHtml(m_math_convert->replace_tags_svg(m_current_content, m_font_size));
|
m_msg_history->setHtml(m_math_convert->replace_tags_svg(m_current_content, m_msg_tools->getFontSize().toInt()));
|
||||||
qDebug() << "LaTeX Markdown:" << m_msg_history->toMarkdown();
|
|
||||||
on_save_html();
|
|
||||||
on_save_markdown();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// tokens按钮实现功能的槽函数
|
// tokens按钮实现功能的槽函数
|
||||||
void ctaiHistoryTextEdit::on_tokens_slots()
|
void ctaiHistoryTextEdit::on_tokens_slots()
|
||||||
{
|
{
|
||||||
@ -343,7 +302,7 @@ void ctaiHistoryTextEdit::add_user_message(const model_data &message)
|
|||||||
QString disp_data;
|
QString disp_data;
|
||||||
disp_data = QSL(message.send_user_data);
|
disp_data = QSL(message.send_user_data);
|
||||||
m_msg_sned_id = QSL(message.send_user_id);
|
m_msg_sned_id = QSL(message.send_user_id);
|
||||||
m_msg_history->setHtml(m_math_convert->replace_tags_svg(disp_data, m_font_size));
|
m_msg_history->setHtml(m_math_convert->replace_tags_svg(disp_data, m_msg_tools->getFontSize().toInt()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctaiHistoryTextEdit::add_system_message(const model_data &message)
|
void ctaiHistoryTextEdit::add_system_message(const model_data &message)
|
||||||
|
|||||||
@ -68,13 +68,9 @@ private slots:
|
|||||||
void on_fold_slots(); // 折叠按钮
|
void on_fold_slots(); // 折叠按钮
|
||||||
void on_tokens_slots(); // tokens按钮
|
void on_tokens_slots(); // tokens按钮
|
||||||
void on_display_changed(QString); // 显示模式改变
|
void on_display_changed(QString); // 显示模式改变
|
||||||
void on_display_font_changed(QString); // 字体大小改变
|
void on_display_font_size_changed(); // 字体大小改变
|
||||||
void on_display_font_size_changed(QString); // 字体大小改变
|
|
||||||
void on_sync_text_height();
|
void on_sync_text_height();
|
||||||
void on_save_text(); // 保存文本
|
void on_save_file(int); // 保存文本
|
||||||
void on_save_html(); // 保存html
|
|
||||||
void on_save_markdown(); // 保存markdown
|
|
||||||
void on_save_pdf(); // 保存pdf
|
|
||||||
void on_menu_slots();
|
void on_menu_slots();
|
||||||
signals:
|
signals:
|
||||||
void delete_requested(QString); // 请求删除此消息
|
void delete_requested(QString); // 请求删除此消息
|
||||||
@ -121,12 +117,10 @@ private:
|
|||||||
QString m_msg_sned_id = {};
|
QString m_msg_sned_id = {};
|
||||||
// 本次信息
|
// 本次信息
|
||||||
QString m_current_content;
|
QString m_current_content;
|
||||||
//默认字体跟随软件全局字体
|
|
||||||
QString m_font = sui_font_table[sui_config.font];//"Arial";
|
|
||||||
//粗体字
|
//粗体字
|
||||||
bool m_bold=false;
|
bool m_bold=false;
|
||||||
//字号大小
|
std::vector<QString> save_extend={".txt",".html",".md",".pdf"};
|
||||||
int m_font_size = 14;
|
std::vector<QString> save_extend_str={"文本文件 (*.txt)","HTML 文件 (*.html)","Markdown 文件 (*.md)","PDF 文件 (*.pdf)"};
|
||||||
QSpacerItem *bottom_spacer = new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
|
QSpacerItem *bottom_spacer = new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -63,7 +63,7 @@ void ctaiHistoryTools::initDisplayMode()
|
|||||||
for(auto str:sui_font_table){
|
for(auto str:sui_font_table){
|
||||||
m_msg_display_font_combobox->addItem(str);
|
m_msg_display_font_combobox->addItem(str);
|
||||||
}
|
}
|
||||||
m_msg_display_font_size_combobox->setCurrentIndex(5);
|
m_msg_display_font_size_combobox->setCurrentIndex(3);
|
||||||
m_msg_display_font_combobox->setCurrentIndex(sui_config.font);
|
m_msg_display_font_combobox->setCurrentIndex(sui_config.font);
|
||||||
}
|
}
|
||||||
void ctaiHistoryTools::initConnect()
|
void ctaiHistoryTools::initConnect()
|
||||||
@ -73,8 +73,8 @@ void ctaiHistoryTools::initConnect()
|
|||||||
connect(m_msg_menu, SIGNAL(clicked()), this, SLOT(on_opts_menu_slots()));
|
connect(m_msg_menu, SIGNAL(clicked()), this, SLOT(on_opts_menu_slots()));
|
||||||
connect(m_msg_fold, SIGNAL(clicked()), this, SIGNAL(on_signals_fold()));
|
connect(m_msg_fold, SIGNAL(clicked()), this, SIGNAL(on_signals_fold()));
|
||||||
connect(m_msg_display_combobox, SIGNAL(currentTextChanged(QString)), this, SIGNAL(on_signals_display_mode(QString)));
|
connect(m_msg_display_combobox, SIGNAL(currentTextChanged(QString)), this, SIGNAL(on_signals_display_mode(QString)));
|
||||||
connect(m_msg_display_font_size_combobox, SIGNAL(currentTextChanged(QString)), this, SIGNAL(on_signals_display_font_size(QString)));
|
connect(m_msg_display_font_size_combobox, SIGNAL(currentTextChanged(QString)), this, SIGNAL(on_signals_display_font_size()));
|
||||||
connect(m_msg_display_font_combobox, SIGNAL(currentTextChanged(QString)), this, SIGNAL(on_signals_display_font(QString)));
|
connect(m_msg_display_font_combobox, SIGNAL(currentTextChanged(QString)), this, SIGNAL(on_signals_display_font_size()));
|
||||||
}
|
}
|
||||||
void ctaiHistoryTools::setFoldIco(QIcon ico)
|
void ctaiHistoryTools::setFoldIco(QIcon ico)
|
||||||
{
|
{
|
||||||
@ -86,33 +86,20 @@ void ctaiHistoryTools::on_save_menu_slots()
|
|||||||
if (!m_msg_save_menu)
|
if (!m_msg_save_menu)
|
||||||
{
|
{
|
||||||
m_msg_save_menu = new QMenu();
|
m_msg_save_menu = new QMenu();
|
||||||
|
for(int i=0;i<=ds_save_menu.count()-1;i++){
|
||||||
|
QAction* action=new QAction(ds_save_menu[i]);
|
||||||
|
action->setObjectName(QString::number(i));
|
||||||
|
connect(action, SIGNAL(triggered(bool)), this, SLOT(on_save_action_slots()));
|
||||||
|
save_ver.push_back(action);
|
||||||
|
m_msg_save_menu->addAction(action);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!m_msg_save_text)
|
|
||||||
{
|
|
||||||
m_msg_save_text = new QAction(tr("另存为文本"));
|
|
||||||
connect(m_msg_save_text, SIGNAL(triggered(bool)), this, SIGNAL(on_signals_save_text()));
|
|
||||||
}
|
|
||||||
if (!m_msg_save_html)
|
|
||||||
{
|
|
||||||
m_msg_save_html = new QAction(tr("另存为HTML"));
|
|
||||||
connect(m_msg_save_html, SIGNAL(triggered(bool)), this, SIGNAL(on_signals_save_html()));
|
|
||||||
}
|
|
||||||
if (!m_msg_save_markdown)
|
|
||||||
{
|
|
||||||
m_msg_save_markdown = new QAction(tr("另存为Markdown"));
|
|
||||||
connect(m_msg_save_markdown, SIGNAL(triggered(bool)), this, SIGNAL(on_signals_save_markdown()));
|
|
||||||
}
|
|
||||||
if (!m_msg_save_pdf)
|
|
||||||
{
|
|
||||||
m_msg_save_pdf = new QAction(tr("另存为PDF"));
|
|
||||||
connect(m_msg_save_pdf, SIGNAL(triggered(bool)), this, SIGNAL(on_signals_save_pdf()));
|
|
||||||
}
|
|
||||||
m_msg_save_menu->addAction(m_msg_save_text);
|
|
||||||
m_msg_save_menu->addAction(m_msg_save_html);
|
|
||||||
m_msg_save_menu->addAction(m_msg_save_markdown);
|
|
||||||
m_msg_save_menu->addAction(m_msg_save_pdf);
|
|
||||||
m_msg_save_menu->exec(QCursor::pos());
|
m_msg_save_menu->exec(QCursor::pos());
|
||||||
}
|
}
|
||||||
|
void ctaiHistoryTools::on_save_action_slots(){
|
||||||
|
save_index=sender()->objectName().toInt();
|
||||||
|
emit on_signals_save_file(save_index);
|
||||||
|
}
|
||||||
void ctaiHistoryTools::on_opts_menu_slots()
|
void ctaiHistoryTools::on_opts_menu_slots()
|
||||||
{
|
{
|
||||||
QMenu menu(this);
|
QMenu menu(this);
|
||||||
@ -126,4 +113,10 @@ void ctaiHistoryTools::on_opts_menu_slots()
|
|||||||
// 显示菜单
|
// 显示菜单
|
||||||
QPoint pos = m_msg_menu->mapToGlobal(m_msg_menu->rect().bottomRight());
|
QPoint pos = m_msg_menu->mapToGlobal(m_msg_menu->rect().bottomRight());
|
||||||
QAction *act = menu.exec(pos);
|
QAction *act = menu.exec(pos);
|
||||||
|
}
|
||||||
|
QString ctaiHistoryTools::getFontSize(){
|
||||||
|
return m_msg_display_font_size_combobox->currentText();
|
||||||
|
}
|
||||||
|
QString ctaiHistoryTools::getFont(){
|
||||||
|
return m_msg_display_font_combobox->currentText();
|
||||||
}
|
}
|
||||||
@ -18,6 +18,8 @@ public:
|
|||||||
void initLayout();
|
void initLayout();
|
||||||
void initConnect();
|
void initConnect();
|
||||||
void setFoldIco(QIcon ico);
|
void setFoldIco(QIcon ico);
|
||||||
|
QString getFontSize();
|
||||||
|
QString getFont();
|
||||||
private:
|
private:
|
||||||
QHBoxLayout *header_opts_Layout = {};
|
QHBoxLayout *header_opts_Layout = {};
|
||||||
QPushButton *m_msg_copy = {};
|
QPushButton *m_msg_copy = {};
|
||||||
@ -35,28 +37,23 @@ private:
|
|||||||
QComboBox *m_msg_display_font_combobox = {};
|
QComboBox *m_msg_display_font_combobox = {};
|
||||||
// save保存菜单
|
// save保存菜单
|
||||||
QMenu *m_msg_save_menu = {};
|
QMenu *m_msg_save_menu = {};
|
||||||
QAction *m_msg_save_text = {};
|
|
||||||
QAction *m_msg_save_html = {};
|
|
||||||
QAction *m_msg_save_markdown = {};
|
|
||||||
QAction *m_msg_save_pdf = {};
|
|
||||||
QSpacerItem *sparcer_item = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed);
|
QSpacerItem *sparcer_item = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed);
|
||||||
QStringList ds_mode_str={"原始文本","HTML源码","HTML渲染","Markdown源码","Markdown渲染"};
|
QStringList ds_mode_str={"原始文本","HTML源码","HTML渲染","Markdown源码","Markdown渲染"};
|
||||||
QStringList ds_font_size_str={"4","6","8","10","12","14","16","18","20"};
|
QStringList ds_font_size_str={"4","6","8","10","12","14","16","18","20"};
|
||||||
|
QStringList ds_save_menu={"另存为文本","另存为HTML","另存为Markdown","另存为PDF"};
|
||||||
|
std::vector<QAction*> save_ver;
|
||||||
|
int save_index;
|
||||||
private:
|
private:
|
||||||
void initDisplayMode();
|
void initDisplayMode();
|
||||||
signals:
|
signals:
|
||||||
void on_signals_copy();
|
void on_signals_copy();
|
||||||
void on_signals_fold();
|
void on_signals_fold();
|
||||||
void on_signals_display_mode(QString);
|
void on_signals_display_mode(QString);
|
||||||
void on_signals_display_font_size(QString);
|
void on_signals_display_font_size();
|
||||||
void on_signals_display_font(QString);
|
void on_signals_save_file(int);
|
||||||
void on_signals_save_text();
|
|
||||||
void on_signals_save_html();
|
|
||||||
void on_signals_save_markdown();
|
|
||||||
void on_signals_save_pdf();
|
|
||||||
public slots:
|
public slots:
|
||||||
void on_save_menu_slots();
|
void on_save_menu_slots();
|
||||||
void on_opts_menu_slots();
|
void on_opts_menu_slots();
|
||||||
|
void on_save_action_slots();
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@ -28,15 +28,14 @@ QByteArray ctaiMathConvert::svg_to_base64(QPixmap &pix)
|
|||||||
}
|
}
|
||||||
QString ctaiMathConvert::math_convert_svg(const QString &math)
|
QString ctaiMathConvert::math_convert_svg(const QString &math)
|
||||||
{
|
{
|
||||||
QString res=QDir::currentPath() + "/res/";
|
QString res = QDir::currentPath() + "/res/";
|
||||||
auto render = LaTeX::parse(math.toStdWString(), m_render_width, m_text_size, m_lineSpace, m_color);
|
auto render = LaTeX::parse(math.toStdWString(), m_render_width, m_text_size, m_lineSpace, m_color);
|
||||||
qDebug() << render->getWidth() << render->getHeight();
|
QPixmap pix(render->getWidth() + m_padding * 2, render->getHeight() + m_padding * 2);
|
||||||
QPixmap pix(render->getWidth()+m_padding*2, render->getHeight()+m_padding*2);
|
|
||||||
pix.fill(Qt::white);
|
pix.fill(Qt::white);
|
||||||
QPainter painter(&pix);
|
QPainter painter(&pix);
|
||||||
painter.setRenderHints(QPainter::TextAntialiasing | QPainter::Antialiasing);
|
painter.setRenderHints(QPainter::TextAntialiasing | QPainter::Antialiasing);
|
||||||
Graphics2D_qt g2(&painter);
|
Graphics2D_qt g2(&painter);
|
||||||
render->draw(g2,m_padding,m_padding);
|
render->draw(g2, m_padding, m_padding);
|
||||||
save_svg(pix);
|
save_svg(pix);
|
||||||
return QString::fromUtf8(svg_to_base64(pix));
|
return QString::fromUtf8(svg_to_base64(pix));
|
||||||
}
|
}
|
||||||
@ -66,16 +65,15 @@ QString ctaiMathConvert::clean_latex_for_mula(const QString &formula)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString ctaiMathConvert::replace_tags_svg(const QString &text,int font_size)
|
QString ctaiMathConvert::replace_tags_svg(const QString &text, int font_size)
|
||||||
{
|
{
|
||||||
m_text_size=font_size;
|
m_text_size = font_size*1.5;
|
||||||
//QString result("4566545646\\[\n f'(a) = \\lim_{h \\to 0} \\frac{f(a + h) - f(a)}{h}\n \\]654564646");
|
QString result = text;
|
||||||
QString result=text;
|
|
||||||
// 使用改进的正则表达式模式
|
// 使用改进的正则表达式模式
|
||||||
QRegularExpression latexPattern(
|
QRegularExpression latexPattern(
|
||||||
QString(R"(\\[(](.*?)\\[)]|\\[{](.*?)\\[}]|\\[[](.*?)\\])"),
|
QString(R"(\\[(](.*?)\\[)]|\\[{](.*?)\\[}]|\\[[](.*?)\\])"),
|
||||||
QRegularExpression::MultilineOption |
|
QRegularExpression::MultilineOption |
|
||||||
QRegularExpression::DotMatchesEverythingOption);
|
QRegularExpression::DotMatchesEverythingOption);
|
||||||
|
|
||||||
// 添加调试信息
|
// 添加调试信息
|
||||||
qDebug() << "输入文本:" << result;
|
qDebug() << "输入文本:" << result;
|
||||||
@ -84,7 +82,7 @@ QString ctaiMathConvert::replace_tags_svg(const QString &text,int font_size)
|
|||||||
|
|
||||||
QRegularExpressionMatchIterator iterator = latexPattern.globalMatch(result);
|
QRegularExpressionMatchIterator iterator = latexPattern.globalMatch(result);
|
||||||
|
|
||||||
//收集所有替换操作
|
// 收集所有替换操作
|
||||||
QList<QPair<int, int>> replacements;
|
QList<QPair<int, int>> replacements;
|
||||||
QStringList svgResults;
|
QStringList svgResults;
|
||||||
// 定义基础图片标签
|
// 定义基础图片标签
|
||||||
@ -93,8 +91,10 @@ QString ctaiMathConvert::replace_tags_svg(const QString &text,int font_size)
|
|||||||
{
|
{
|
||||||
QRegularExpressionMatch match = iterator.next();
|
QRegularExpressionMatch match = iterator.next();
|
||||||
QString matchedText = match.captured(0);
|
QString matchedText = match.captured(0);
|
||||||
// 调试输出
|
if (debug_node_print)
|
||||||
debug_latex_match(result, match);
|
{
|
||||||
|
debug_latex_match(result, match);
|
||||||
|
}
|
||||||
// 清理和转换公式
|
// 清理和转换公式
|
||||||
QString cleanFormula = clean_latex_for_mula(matchedText);
|
QString cleanFormula = clean_latex_for_mula(matchedText);
|
||||||
QString svg_markdown = markdown_base + math_convert_svg(cleanFormula) + ")";
|
QString svg_markdown = markdown_base + math_convert_svg(cleanFormula) + ")";
|
||||||
@ -111,46 +111,80 @@ QString ctaiMathConvert::replace_tags_svg(const QString &text,int font_size)
|
|||||||
}
|
}
|
||||||
return markdown_to_html(result);
|
return markdown_to_html(result);
|
||||||
}
|
}
|
||||||
QString ctaiMathConvert::markdown_to_html(const QString& text){
|
QString ctaiMathConvert::markdown_to_html(const QString &text)
|
||||||
// 转换为UTF-8编码的字符串
|
{
|
||||||
QByteArray markdown = text.toUtf8();
|
// 转换为UTF-8编码的字符串
|
||||||
|
QByteArray markdown = text.toUtf8();
|
||||||
|
|
||||||
// 启用所有 GFM 扩展选项
|
// 启用所有 GFM 扩展选项
|
||||||
int options = CMARK_OPT_SOURCEPOS |
|
int options = CMARK_OPT_SOURCEPOS |
|
||||||
CMARK_OPT_VALIDATE_UTF8 |
|
CMARK_OPT_VALIDATE_UTF8 |
|
||||||
CMARK_OPT_SMART |
|
CMARK_OPT_SMART |
|
||||||
CMARK_OPT_GITHUB_PRE_LANG |
|
CMARK_OPT_GITHUB_PRE_LANG |
|
||||||
CMARK_OPT_LIBERAL_HTML_TAG |
|
CMARK_OPT_LIBERAL_HTML_TAG |
|
||||||
CMARK_OPT_FOOTNOTES|
|
CMARK_OPT_FOOTNOTES |
|
||||||
CMARK_OPT_STRIKETHROUGH_DOUBLE_TILDE|
|
CMARK_OPT_STRIKETHROUGH_DOUBLE_TILDE |
|
||||||
CMARK_OPT_TABLE_PREFER_STYLE_ATTRIBUTES|
|
CMARK_OPT_TABLE_PREFER_STYLE_ATTRIBUTES |
|
||||||
CMARK_OPT_FULL_INFO_STRING;
|
CMARK_OPT_FULL_INFO_STRING;
|
||||||
|
|
||||||
// 使用cmark-gfm解析Markdown
|
// 解析Markdown为AST
|
||||||
char *html = cmark_markdown_to_html(
|
cmark_node *doc = cmark_parse_document(markdown.constData(), markdown.size(), options);
|
||||||
markdown.constData(),
|
if (debug_node_print)
|
||||||
markdown.size(),
|
{
|
||||||
options);
|
// 递归打印AST节点
|
||||||
|
print_ast_node(doc, 0);
|
||||||
|
}
|
||||||
|
// 转换为HTML
|
||||||
|
char *html = cmark_render_html(doc, options, NULL);
|
||||||
|
// 转换回QString并处理代码块
|
||||||
|
QString result = QString::fromUtf8(html);
|
||||||
|
replace_symbol(result);
|
||||||
|
// 释放内存
|
||||||
|
cmark_node_free(doc);
|
||||||
|
free(html);
|
||||||
|
|
||||||
// 转换回QString并处理代码块
|
|
||||||
QString result = QString::fromUtf8(html);
|
|
||||||
free(html);
|
|
||||||
|
|
||||||
return fix_img_str_line_height(result.toUtf8());
|
return fix_img_str_line_height(result.toUtf8());
|
||||||
}
|
}
|
||||||
QString ctaiMathConvert::fix_img_str_line_height(QString html) {
|
void ctaiMathConvert::replace_symbol(QString &context)
|
||||||
// 修正图片样式,使其与文本在同一行显示
|
{
|
||||||
html.replace("<li ", "<li style='vertical-align: middle ;' ");
|
// 执行转换符号为半角
|
||||||
html.replace("<p ", "<p style='vertical-align: middle ;' ");
|
for (auto it = fullToHalfMap.begin(); it != fullToHalfMap.end(); ++it)
|
||||||
html.replace("<img ", "<img style='vertical-align: middle ;' ");
|
|
||||||
QString fileName = QDir::currentPath() + "/"+QUuid::createUuid().toString(QUuid::WithoutBraces) + ".html";
|
|
||||||
QFile file(fileName);
|
|
||||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
|
|
||||||
{
|
{
|
||||||
|
context.replace(it.key(), it.value());
|
||||||
}
|
}
|
||||||
QTextStream out(&file);
|
}
|
||||||
out << html << "\n\n";
|
// 添加新的辅助方法用于打印AST节点
|
||||||
file.close();
|
void ctaiMathConvert::print_ast_node(cmark_node *node, int level)
|
||||||
|
{
|
||||||
|
if (!node)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// 获取节点类型
|
||||||
|
const char *type_str = cmark_node_get_type_string(node);
|
||||||
|
|
||||||
|
// 打印缩进和节点类型
|
||||||
|
QString indent = QString(" ").repeated(level * 2);
|
||||||
|
qDebug() << indent << "Node Type:" << type_str;
|
||||||
|
|
||||||
|
// 获取并打印节点内容(如果有)
|
||||||
|
const char *literal = cmark_node_get_literal(node);
|
||||||
|
if (literal)
|
||||||
|
{
|
||||||
|
qDebug() << indent << "Content:" << literal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 递归处理子节点
|
||||||
|
cmark_node *child = cmark_node_first_child(node);
|
||||||
|
while (child)
|
||||||
|
{
|
||||||
|
print_ast_node(child, level + 1);
|
||||||
|
child = cmark_node_next(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ctaiMathConvert::fix_img_str_line_height(QString html)
|
||||||
|
{
|
||||||
|
// 修正图片样式,使其与文本在同一行显示
|
||||||
|
html.replace("<img ", "<img style='vertical-align: middle ;'");
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
@ -48,7 +48,6 @@ public:
|
|||||||
QString replace_tags_svg(const QString &text,int font_size);
|
QString replace_tags_svg(const QString &text,int font_size);
|
||||||
void set_convert_opts();
|
void set_convert_opts();
|
||||||
void save_svg(QPixmap& img);
|
void save_svg(QPixmap& img);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void debug_latex_match(const QString &text, const QRegularExpressionMatch &match);
|
void debug_latex_match(const QString &text, const QRegularExpressionMatch &match);
|
||||||
QString clean_latex_for_mula(const QString &formula);
|
QString clean_latex_for_mula(const QString &formula);
|
||||||
@ -56,6 +55,8 @@ private:
|
|||||||
QByteArray svg_to_base64(QPixmap& pix);
|
QByteArray svg_to_base64(QPixmap& pix);
|
||||||
QString markdown_to_html(const QString& text);
|
QString markdown_to_html(const QString& text);
|
||||||
QString fix_img_str_line_height(QString html);
|
QString fix_img_str_line_height(QString html);
|
||||||
|
void print_ast_node(cmark_node *node, int level);
|
||||||
|
void replace_symbol(QString& context);
|
||||||
TexGuard texGuard;
|
TexGuard texGuard;
|
||||||
//宽度
|
//宽度
|
||||||
int m_render_width=600;
|
int m_render_width=600;
|
||||||
@ -70,7 +71,8 @@ private:
|
|||||||
int m_padding=3;
|
int m_padding=3;
|
||||||
//处理后保存模式
|
//处理后保存模式
|
||||||
bool save_mode=false;
|
bool save_mode=false;
|
||||||
|
//print node str debug
|
||||||
|
bool debug_node_print=true;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -62,31 +62,39 @@ typedef struct model_data{
|
|||||||
std::string request_body;
|
std::string request_body;
|
||||||
}model_data;
|
}model_data;
|
||||||
|
|
||||||
const QStringList latex_symbols = {
|
// 将全角符号转换为半角符号的映射
|
||||||
"\\Alpha",
|
const QMap<QString, QString> fullToHalfMap = {
|
||||||
"\\Beta",
|
{",", ","},
|
||||||
"\\Gamma",
|
{"。", "."},
|
||||||
"\\Delta",
|
{"!", "!"},
|
||||||
"\\Epsilon",
|
{"?", "?"},
|
||||||
"\\Zeta",
|
{":", ":"},
|
||||||
"\\Eta",
|
{";", ";"},
|
||||||
"\\Theta",
|
{"(", "("},
|
||||||
"\\Iota",
|
{")", ")"},
|
||||||
"\\Kappa",
|
{"[", "["},
|
||||||
"\\Lambda",
|
{"]", "]"},
|
||||||
"\\Mu",
|
{"【", "["},
|
||||||
"\\Nu",
|
{"】", "]"},
|
||||||
"\\Xi",
|
{"{", "{"},
|
||||||
"\\Omicron",
|
{"}", "}"},
|
||||||
"\\Pi",
|
{"|", "|"},
|
||||||
"\\Rho",
|
{""", "\""},
|
||||||
"\\Sigma",
|
{"'", "'"},
|
||||||
"\\Tau",
|
{" ̄", "~"},
|
||||||
"\\Upsilon",
|
{"<", "<"},
|
||||||
"\\Phi",
|
{">", ">"},
|
||||||
"\\Chi",
|
{"=", "="},
|
||||||
"\\Psi",
|
{"+", "+"},
|
||||||
"\\Omega"
|
{"-", "-"},
|
||||||
|
{"*", "*"},
|
||||||
|
{"/", "/"},
|
||||||
|
{"%", "%"},
|
||||||
|
{"#", "#"},
|
||||||
|
{"&", "&"},
|
||||||
|
{"@", "@"},
|
||||||
|
{"`", "`"},
|
||||||
|
{" ", " "} // 全角空格转换为半角空格
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user