2022-07-15 14:55:18 +02:00
|
|
|
|
2022-07-15 22:13:18 +02:00
|
|
|
#include "text_editor_preview.h"
|
2022-07-15 14:55:18 +02:00
|
|
|
|
2022-07-16 00:23:07 +02:00
|
|
|
#include "core/variant.h"
|
|
|
|
#include "scene/gui/box_container.h"
|
2022-07-15 18:48:35 +02:00
|
|
|
#include "scene/gui/grid_container.h"
|
2022-07-16 15:32:23 +02:00
|
|
|
#include "scene/gui/label.h"
|
2022-07-15 18:48:35 +02:00
|
|
|
#include "scene/gui/rich_text_label.h"
|
2022-07-15 14:55:18 +02:00
|
|
|
|
2022-07-15 18:48:35 +02:00
|
|
|
#include "modules/regex/regex.h"
|
2022-07-15 14:55:18 +02:00
|
|
|
|
2022-07-15 22:13:18 +02:00
|
|
|
void TextEditorPreview::print_preview(const String &content) {
|
2022-07-15 18:48:35 +02:00
|
|
|
text_preview->append_bbcode(content);
|
|
|
|
text_preview->show();
|
2022-07-15 14:55:18 +02:00
|
|
|
}
|
|
|
|
|
2022-07-15 22:13:18 +02:00
|
|
|
void TextEditorPreview::print_bb(const String &content) {
|
2022-07-15 18:48:35 +02:00
|
|
|
text_preview->append_bbcode(content);
|
|
|
|
text_preview->show();
|
2022-07-15 14:55:18 +02:00
|
|
|
}
|
|
|
|
|
2022-07-15 22:13:18 +02:00
|
|
|
void TextEditorPreview::print_markdown(const String &p_content) {
|
2022-07-15 18:48:35 +02:00
|
|
|
String content = p_content;
|
2022-07-15 14:55:18 +02:00
|
|
|
|
2022-07-15 18:48:35 +02:00
|
|
|
Array result;
|
2022-07-16 00:23:07 +02:00
|
|
|
|
|
|
|
PoolStringArray bolded;
|
|
|
|
PoolStringArray italics;
|
|
|
|
PoolStringArray striked;
|
|
|
|
PoolStringArray coded;
|
|
|
|
PoolStringArray linknames;
|
|
|
|
PoolStringArray images;
|
|
|
|
PoolStringArray links;
|
|
|
|
PoolStringArray lists;
|
|
|
|
PoolStringArray underlined;
|
2022-07-15 14:55:18 +02:00
|
|
|
|
2022-07-15 18:48:35 +02:00
|
|
|
Ref<RegEx> regex;
|
|
|
|
regex.instance();
|
|
|
|
|
|
|
|
regex->compile("\\*\\*(?<boldtext>.*)\\*\\*");
|
|
|
|
result = regex->search_all(content);
|
2022-07-15 14:55:18 +02:00
|
|
|
|
2022-07-15 18:48:35 +02:00
|
|
|
for (int i = 0; i < result.size(); ++i) { //i in range(result.size())
|
|
|
|
Ref<RegExMatch> res = result[i];
|
|
|
|
bolded.append(res->get_string("boldtext"));
|
|
|
|
}
|
|
|
|
|
|
|
|
regex->compile("\\_\\_(?<underlinetext>.*)\\_\\_");
|
|
|
|
result = regex->search_all(content);
|
2022-07-15 14:55:18 +02:00
|
|
|
|
2022-07-15 18:48:35 +02:00
|
|
|
for (int i = 0; i < result.size(); ++i) { //i in range(result.size())
|
|
|
|
Ref<RegExMatch> res = result[i];
|
|
|
|
underlined.append(res->get_string("underlinetext"));
|
|
|
|
}
|
|
|
|
|
|
|
|
regex->compile("\\*(?<italictext>.*)\\*");
|
|
|
|
result = regex->search_all(content);
|
2022-07-15 14:55:18 +02:00
|
|
|
|
2022-07-15 18:48:35 +02:00
|
|
|
for (int i = 0; i < result.size(); ++i) { //i in range(result.size())
|
|
|
|
Ref<RegExMatch> res = result[i];
|
|
|
|
italics.append(res->get_string("italictext"));
|
|
|
|
}
|
|
|
|
|
|
|
|
regex->compile("~~(?<strikedtext>.*)~~");
|
|
|
|
result = regex->search_all(content);
|
2022-07-15 14:55:18 +02:00
|
|
|
|
2022-07-15 18:48:35 +02:00
|
|
|
for (int i = 0; i < result.size(); ++i) { //i in range(result.size())
|
|
|
|
Ref<RegExMatch> res = result[i];
|
|
|
|
striked.append(res->get_string("strikedtext"));
|
|
|
|
}
|
2022-07-15 14:55:18 +02:00
|
|
|
|
2022-07-15 18:48:35 +02:00
|
|
|
regex->compile("`(?<coded>.*)`");
|
|
|
|
result = regex->search_all(content);
|
2022-07-15 14:55:18 +02:00
|
|
|
|
2022-07-15 18:48:35 +02:00
|
|
|
for (int i = 0; i < result.size(); ++i) { //i in range(result.size())
|
|
|
|
Ref<RegExMatch> res = result[i];
|
|
|
|
coded.append(res->get_string("coded"));
|
|
|
|
}
|
|
|
|
|
|
|
|
regex->compile("[+-*](?<element>\\s.*)");
|
|
|
|
result = regex->search_all(content);
|
|
|
|
|
|
|
|
for (int i = 0; i < result.size(); ++i) { //i in range(result.size())
|
|
|
|
Ref<RegExMatch> res = result[i];
|
|
|
|
lists.append(res->get_string("element"));
|
|
|
|
}
|
|
|
|
|
|
|
|
regex->compile("(?<img>!\\[.*?\\))");
|
|
|
|
result = regex->search_all(content);
|
|
|
|
|
|
|
|
for (int i = 0; i < result.size(); ++i) { //i in range(result.size())
|
|
|
|
Ref<RegExMatch> res = result[i];
|
|
|
|
images.append(res->get_string("img"));
|
|
|
|
}
|
|
|
|
|
|
|
|
regex->compile("\\[(?<linkname>.*?)\\]|\\((?<link>[h\\.]\\S*?)\\)");
|
|
|
|
result = regex->search_all(content);
|
|
|
|
|
|
|
|
for (int i = 0; i < result.size(); ++i) { //i in range(result.size())
|
|
|
|
Ref<RegExMatch> res = result[i];
|
|
|
|
|
|
|
|
if (res->get_string("link") != "") {
|
|
|
|
links.append(res->get_string("link"));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (res->get_string("linkname") != "") {
|
|
|
|
linknames.append(res->get_string("linkname"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < bolded.size(); ++i) { //i in range(bolded.size())
|
|
|
|
String bold = bolded[i];
|
|
|
|
content = content.replace("**" + bold + "**", "[b]" + bold + "[/b]");
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < italics.size(); ++i) { //i in range(italics.size())
|
|
|
|
String italic = italics[i];
|
|
|
|
content = content.replace("*" + italic + "*", "[i]" + italic + "[/i]");
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < striked.size(); ++i) { //i in range(striked.size())
|
|
|
|
String strik = striked[i];
|
|
|
|
content = content.replace("~~" + strik + "~~", "[s]" + strik + "[/s]");
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < underlined.size(); ++i) { //i in range(underlined.size())
|
|
|
|
String underline = underlined[i];
|
|
|
|
content = content.replace("__" + underline + "__", "[u]" + underline + "[/u]");
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < coded.size(); ++i) { //i in range(coded.size())
|
|
|
|
String code = coded[i];
|
|
|
|
content = content.replace("`" + code + "`", "[code]" + code + "[/code]");
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < images.size(); ++i) { //i in range(images.size())
|
|
|
|
String image = images[i];
|
|
|
|
Vector<String> substr = image.split("(");
|
|
|
|
String imglink = substr[1].rstrip(")");
|
|
|
|
content = content.replace(image, "[img]" + imglink + "[/img]");
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < links.size(); ++i) {
|
|
|
|
content = content.replace("[" + linknames[i] + "](" + links[i] + ")", "[url=" + links[i] + "]" + linknames[i] + "[/url]");
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < lists.size(); ++i) { //i in range(lists.size())
|
|
|
|
String element = lists[i];
|
|
|
|
|
|
|
|
if (content.find("- " + element)) {
|
|
|
|
content = content.replace("-" + element, "[indent]-" + element + "[/indent]");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (content.find("+ " + element)) {
|
|
|
|
content = content.replace("+" + element, "[indent]-" + element + "[/indent]");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (content.find("* " + element)) {
|
|
|
|
content = content.replace("+" + element, "[indent]-" + element + "[/indent]");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
text_preview->append_bbcode(content);
|
|
|
|
text_preview->show();
|
|
|
|
}
|
|
|
|
|
2022-07-15 22:13:18 +02:00
|
|
|
void TextEditorPreview::print_html(const String &p_content) {
|
2022-07-15 18:48:35 +02:00
|
|
|
String content = p_content;
|
|
|
|
|
|
|
|
content = content.replace("<i>", "[i]");
|
|
|
|
content = content.replace("</i>", "[/i]");
|
|
|
|
content = content.replace("<b>", "[b]");
|
|
|
|
content = content.replace("</b>", "[/b]");
|
|
|
|
content = content.replace("<u>", "[u]");
|
|
|
|
content = content.replace("</u>", "[/u]");
|
|
|
|
content = content.replace("<ins>", "[u]");
|
|
|
|
content = content.replace("</ins>", "[/u]");
|
|
|
|
content = content.replace("<del>", "[s]");
|
|
|
|
content = content.replace("</del>", "[/s]");
|
|
|
|
content = content.replace("<a href=\"", "[url=");
|
|
|
|
content = content.replace("\">", "]");
|
|
|
|
content = content.replace("</a>", "[/url]");
|
|
|
|
content = content.replace("<img src=\"", "[img]");
|
|
|
|
content = content.replace("\" />", "[/img]");
|
|
|
|
content = content.replace("\"/>", "[/img]");
|
|
|
|
content = content.replace("<pre>", "[code]");
|
|
|
|
content = content.replace("</pre>", "[/code]");
|
|
|
|
content = content.replace("<center>", "[center]");
|
|
|
|
content = content.replace("</center>", "[/center]");
|
|
|
|
content = content.replace("<right>", "[right]");
|
|
|
|
content = content.replace("</right>", "[/right]");
|
|
|
|
|
|
|
|
text_preview->append_bbcode(content);
|
|
|
|
text_preview->show();
|
|
|
|
}
|
|
|
|
|
2022-07-15 22:13:18 +02:00
|
|
|
void TextEditorPreview::print_csv(const Array &rows) {
|
2022-07-16 15:32:23 +02:00
|
|
|
if (rows.size() == 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
Vector<String> r0 = rows[0];
|
|
|
|
|
|
|
|
table_preview->set_columns(r0.size());
|
|
|
|
|
|
|
|
for (int i = 0; i < rows.size(); ++i) {
|
|
|
|
Vector<String> item = rows[i];
|
|
|
|
|
|
|
|
for (int j = 0; j < item.size(); ++j) {
|
|
|
|
String string = item[j];
|
|
|
|
|
|
|
|
Label *label = memnew(Label);
|
|
|
|
label->set_text(string);
|
|
|
|
label->set_h_size_flags(SIZE_EXPAND);
|
|
|
|
label->set_align(Label::ALIGN_CENTER);
|
|
|
|
label->set_valign(Label::VALIGN_CENTER);
|
|
|
|
table_preview->add_child(label);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
table_preview->show();
|
2022-07-15 18:48:35 +02:00
|
|
|
}
|
|
|
|
|
2022-07-15 22:13:18 +02:00
|
|
|
void TextEditorPreview::_on_TextEditorPreview_popup_hide() {
|
2022-07-15 18:48:35 +02:00
|
|
|
queue_delete();
|
|
|
|
}
|
|
|
|
|
2022-07-15 22:13:18 +02:00
|
|
|
TextEditorPreview::TextEditorPreview() {
|
2022-07-16 00:23:07 +02:00
|
|
|
set_title("File preview");
|
2022-07-15 18:48:35 +02:00
|
|
|
set_resizable(true);
|
|
|
|
set_anchors_and_margins_preset(PRESET_WIDE);
|
2022-07-16 00:23:07 +02:00
|
|
|
set_margin(MARGIN_LEFT, 81);
|
|
|
|
set_margin(MARGIN_TOP, 47);
|
|
|
|
set_margin(MARGIN_RIGHT, -80);
|
|
|
|
set_margin(MARGIN_BOTTOM, -48);
|
2022-07-15 18:48:35 +02:00
|
|
|
|
|
|
|
VBoxContainer *vbc = memnew(VBoxContainer);
|
|
|
|
vbc->set_anchors_and_margins_preset(PRESET_WIDE);
|
|
|
|
add_child(vbc);
|
|
|
|
|
|
|
|
text_preview = memnew(RichTextLabel);
|
|
|
|
vbc->add_child(text_preview);
|
2022-07-16 00:23:07 +02:00
|
|
|
text_preview->set_scroll_follow(true);
|
|
|
|
text_preview->set_use_bbcode(true);
|
2022-07-15 18:48:35 +02:00
|
|
|
text_preview->set_v_size_flags(SIZE_EXPAND_FILL);
|
|
|
|
text_preview->hide();
|
|
|
|
|
|
|
|
table_preview = memnew(GridContainer);
|
|
|
|
vbc->add_child(table_preview);
|
|
|
|
table_preview->set_columns(3);
|
|
|
|
table_preview->set_h_size_flags(SIZE_EXPAND_FILL);
|
|
|
|
table_preview->set_v_size_flags(SIZE_EXPAND_FILL);
|
|
|
|
table_preview->hide();
|
|
|
|
}
|
|
|
|
|
2022-07-15 22:13:18 +02:00
|
|
|
TextEditorPreview::~TextEditorPreview() {
|
2022-07-15 18:48:35 +02:00
|
|
|
}
|
|
|
|
|
2022-07-16 00:36:35 +02:00
|
|
|
void TextEditorPreview::_notification(int p_what) {
|
|
|
|
if (p_what == NOTIFICATION_POSTINITIALIZE) {
|
|
|
|
connect("popup_hide", this, "_on_TextEditorPreview_popup_hide");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-15 22:13:18 +02:00
|
|
|
void TextEditorPreview::_bind_methods() {
|
2022-07-16 00:23:07 +02:00
|
|
|
ADD_SIGNAL(MethodInfo("image_downloaded"));
|
|
|
|
ADD_SIGNAL(MethodInfo("image_loaded"));
|
|
|
|
|
|
|
|
//ClassDB::bind_method(D_METHOD("print_preview", "content"), &TextEditorPreview::print_preview);
|
|
|
|
//ClassDB::bind_method(D_METHOD("print_bb", "content"), &TextEditorPreview::print_bb);
|
|
|
|
// ClassDB::bind_method(D_METHOD("print_markdown", "content"), &TextEditorPreview::print_markdown);
|
|
|
|
//ClassDB::bind_method(D_METHOD("print_html", "content"), &TextEditorPreview::print_html);
|
|
|
|
//ClassDB::bind_method(D_METHOD("print_csv", "rows"), &TextEditorPreview::print_csv);
|
2022-07-15 22:13:18 +02:00
|
|
|
ClassDB::bind_method(D_METHOD("_on_TextEditorPreview_popup_hide"), &TextEditorPreview::_on_TextEditorPreview_popup_hide);
|
2022-07-15 14:55:18 +02:00
|
|
|
}
|