opti:优化替换范围,添加正则替换功能。

This commit is contained in:
taynpg 2024-05-20 00:32:26 +08:00
parent 43c2d8680d
commit aa6481cea4
4 changed files with 69 additions and 39 deletions

View File

@ -100,6 +100,8 @@
"qmenu": "cpp",
"qmessagebox": "cpp",
"qaction": "cpp",
"codecvt": "cpp"
"codecvt": "cpp",
"qregexp": "cpp",
"qregularexpression": "cpp"
}
}

View File

@ -4,6 +4,7 @@
#include <QFile>
#include <QKeyEvent>
#include <QDateTime>
#include <QRegularExpression>
#include <filesystem>
#include "src/data_edit.h"
#include "./ui_MainWidget.h"
@ -52,7 +53,8 @@ MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget
connect(ui->btnSave, &QPushButton::clicked, this, [&]() { save(); });
connect(ui->btnExit, &QPushButton::clicked, this, [&]() { QApplication::exit(0); });
connect(ui->btnReset, &QPushButton::clicked, this, &MainWidget::reset);
connect(ui->btnReplace, &QPushButton::clicked, this, &MainWidget::replace_content);
connect(ui->btnReplace, &QPushButton::clicked, this, [&]() { replace_content(true); });
connect(ui->btnRxReplace, &QPushButton::clicked, this, [&]() { replace_content(false); });
connect(ui->btnExport, &QPushButton::clicked, this, &MainWidget::copy_multi_data);
connect(ui->btnPagePre, &QPushButton::clicked, this, [&]() {
unsigned int cur = ui->edCurPage->text().toUInt();
@ -81,6 +83,9 @@ MainWidget::MainWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MainWidget
push_content(current_, cur);
});
connect(ui->btnResort, &QPushButton::clicked, this, [&]() {
if (tab_widget_ == nullptr) {
return;
}
sort_by_repeat(vec_);
std::vector<Element_t*> nvec{};
xml_.copy_and_del(vec_, nvec);
@ -631,7 +636,7 @@ void MainWidget::copy_multi_data()
edit.exec();
}
void MainWidget::replace_content()
void MainWidget::replace_content(bool is_common)
{
if (tab_widget_ == nullptr) {
return;
@ -654,7 +659,11 @@ void MainWidget::replace_content()
if (e == nullptr) {
continue;
}
replace_str(key, after, e);
if (is_common) {
replace_str(key, after, e);
} else {
replace_str(e, key, after);
}
ele_update_gui(e, indexList[i].row());
}
} else if (ui->rbRepCurPage->isChecked()) {
@ -664,24 +673,24 @@ void MainWidget::replace_content()
if (e == nullptr) {
continue;
}
replace_str(key, after, e);
if (is_common) {
replace_str(key, after, e);
} else {
replace_str(e, key, after);
}
ele_update_gui(e, i);
}
} else {
if (!CUtil::affirm(this, u8"确认", u8"确认进行全局替换吗?")) {
return;
}
for (auto& data : vec_) {
auto* element = data->FirstAttribute();
while (element) {
QString content(element->Value());
content.replace(key, after);
data->SetAttribute(element->Name(), content.toStdString().c_str());
element = element->Next();
if (is_common) {
replace_str(key, after, data);
} else {
replace_str(data, key, after);
}
}
xml_.get_all_elements(vec_);
current_.clear();
current_ = vec_;
@ -694,14 +703,27 @@ void MainWidget::replace_str(const QString& pre, const QString& after, Element_t
if (ele == nullptr) {
return;
}
auto* element = ele->FirstAttribute();
while (element) {
QString content(element->Value());
for (auto i = 0; i < keys_.size(); ++i) {
auto* value = ele->Attribute(keys_[i].c_str());
QString content(value);
if (content.contains(pre)) {
content.replace(pre, after);
ele->SetAttribute(element->Name(), content.toStdString().c_str());
ele->SetAttribute(keys_[i].c_str(), content.toStdString().c_str());
}
element = element->Next();
}
}
void MainWidget::replace_str(Element_t* ele, const QString& rg, const QString& after)
{
QRegularExpression rx(rg);
if (ele == nullptr) {
return;
}
for (auto i = 0; i < keys_.size(); ++i) {
auto* value = ele->Attribute(keys_[i].c_str());
QString content(value);
content.replace(rx, after);
ele->SetAttribute(keys_[i].c_str(), content.toStdString().c_str());
}
}

View File

@ -46,13 +46,14 @@ private:
void show_custom_menu();
void sort_by_repeat(std::vector<Element_t*>& vec);
void copy_multi_data();
void replace_content();
void replace_content(bool is_common = true);
void backup_file();
protected:
void closeEvent(QCloseEvent* event);
void keyPressEvent(QKeyEvent* event);
void replace_str(const QString& pre, const QString& after, Element_t* ele);
void replace_str(Element_t* ele, const QString& rg, const QString& after);
private:
Element_t* get_element_by_key(const QString& key);
Element_t* get_element_by_row(int row);

View File

@ -37,6 +37,20 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnBackup">
<property name="text">
<string>备份</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnResort">
<property name="text">
<string>重排序</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnSave">
<property name="text">
@ -56,21 +70,14 @@
<item>
<widget class="QPushButton" name="btnExport">
<property name="text">
<string>导出选择行</string>
<string>导出</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnImport">
<property name="text">
<string>导入行</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnBackup">
<property name="text">
<string>备份快照</string>
<string>导入</string>
</property>
</widget>
</item>
@ -108,7 +115,14 @@
<item>
<widget class="QPushButton" name="btnReplace">
<property name="text">
<string>替换为</string>
<string>一般替换</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnRxReplace">
<property name="text">
<string>正则替换</string>
</property>
</widget>
</item>
@ -125,7 +139,7 @@
<item>
<widget class="QCheckBox" name="cbCaseSensitive">
<property name="text">
<string>搜索区分大小写</string>
<string>区分大小写</string>
</property>
</widget>
</item>
@ -153,13 +167,6 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnResort">
<property name="text">
<string>重新排序</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -282,7 +289,6 @@
<tabstop>btnSave</tabstop>
<tabstop>btnExport</tabstop>
<tabstop>btnImport</tabstop>
<tabstop>btnBackup</tabstop>
<tabstop>edRepPre</tabstop>
<tabstop>edRepAfter</tabstop>
<tabstop>btnReplace</tabstop>
@ -290,7 +296,6 @@
<tabstop>edSearchKey</tabstop>
<tabstop>btnSearch</tabstop>
<tabstop>btnReset</tabstop>
<tabstop>btnResort</tabstop>
<tabstop>btnExit</tabstop>
<tabstop>edCurPage</tabstop>
<tabstop>edAllPage</tabstop>