#include "text_editor_preview.h" #include "core/variant.h" #include "scene/gui/box_container.h" #include "scene/gui/grid_container.h" #include "scene/gui/label.h" #include "scene/gui/rich_text_label.h" #include "modules/regex/regex.h" void TextEditorPreview::print_preview(const String &content) { text_preview->append_bbcode(content); text_preview->show(); } void TextEditorPreview::print_bb(const String &content) { text_preview->append_bbcode(content); text_preview->show(); } void TextEditorPreview::print_markdown(const String &p_content) { String content = p_content; Array result; PoolStringArray bolded; PoolStringArray italics; PoolStringArray striked; PoolStringArray coded; PoolStringArray linknames; PoolStringArray images; PoolStringArray links; PoolStringArray lists; PoolStringArray underlined; Ref regex; regex.instance(); regex->compile("\\*\\*(?.*)\\*\\*"); result = regex->search_all(content); for (int i = 0; i < result.size(); ++i) { //i in range(result.size()) Ref res = result[i]; bolded.append(res->get_string("boldtext")); } regex->compile("\\_\\_(?.*)\\_\\_"); result = regex->search_all(content); for (int i = 0; i < result.size(); ++i) { //i in range(result.size()) Ref res = result[i]; underlined.append(res->get_string("underlinetext")); } regex->compile("\\*(?.*)\\*"); result = regex->search_all(content); for (int i = 0; i < result.size(); ++i) { //i in range(result.size()) Ref res = result[i]; italics.append(res->get_string("italictext")); } regex->compile("~~(?.*)~~"); result = regex->search_all(content); for (int i = 0; i < result.size(); ++i) { //i in range(result.size()) Ref res = result[i]; striked.append(res->get_string("strikedtext")); } regex->compile("`(?.*)`"); result = regex->search_all(content); for (int i = 0; i < result.size(); ++i) { //i in range(result.size()) Ref res = result[i]; coded.append(res->get_string("coded")); } regex->compile("[+-*](?\\s.*)"); result = regex->search_all(content); for (int i = 0; i < result.size(); ++i) { //i in range(result.size()) Ref res = result[i]; lists.append(res->get_string("element")); } regex->compile("(?!\\[.*?\\))"); result = regex->search_all(content); for (int i = 0; i < result.size(); ++i) { //i in range(result.size()) Ref res = result[i]; images.append(res->get_string("img")); } regex->compile("\\[(?.*?)\\]|\\((?[h\\.]\\S*?)\\)"); result = regex->search_all(content); for (int i = 0; i < result.size(); ++i) { //i in range(result.size()) Ref 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 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(); } void TextEditorPreview::print_html(const String &p_content) { String content = p_content; content = content.replace("", "[i]"); content = content.replace("", "[/i]"); content = content.replace("", "[b]"); content = content.replace("", "[/b]"); content = content.replace("", "[u]"); content = content.replace("", "[/u]"); content = content.replace("", "[u]"); content = content.replace("", "[/u]"); content = content.replace("", "[s]"); content = content.replace("", "[/s]"); content = content.replace("", "]"); content = content.replace("", "[/url]"); content = content.replace("", "[/img]"); content = content.replace("\"/>", "[/img]"); content = content.replace("
", "[code]");
	content = content.replace("
", "[/code]"); content = content.replace("
", "[center]"); content = content.replace("
", "[/center]"); content = content.replace("", "[right]"); content = content.replace("", "[/right]"); text_preview->append_bbcode(content); text_preview->show(); } void TextEditorPreview::print_csv(const Array &rows) { if (rows.size() == 0) { return; } Vector r0 = rows[0]; table_preview->set_columns(r0.size()); for (int i = 0; i < rows.size(); ++i) { Vector 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(); } void TextEditorPreview::_on_TextEditorPreview_popup_hide() { queue_delete(); } TextEditorPreview::TextEditorPreview() { set_title("File preview"); set_resizable(true); set_anchors_and_margins_preset(PRESET_WIDE); set_margin(MARGIN_LEFT, 81); set_margin(MARGIN_TOP, 47); set_margin(MARGIN_RIGHT, -80); set_margin(MARGIN_BOTTOM, -48); VBoxContainer *vbc = memnew(VBoxContainer); vbc->set_anchors_and_margins_preset(PRESET_WIDE); add_child(vbc); text_preview = memnew(RichTextLabel); vbc->add_child(text_preview); text_preview->set_scroll_follow(true); text_preview->set_use_bbcode(true); 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(); } TextEditorPreview::~TextEditorPreview() { } void TextEditorPreview::_notification(int p_what) { if (p_what == NOTIFICATION_POSTINITIALIZE) { connect("popup_hide", this, "_on_TextEditorPreview_popup_hide"); } } void TextEditorPreview::_bind_methods() { 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); ClassDB::bind_method(D_METHOD("_on_TextEditorPreview_popup_hide"), &TextEditorPreview::_on_TextEditorPreview_popup_hide); }