diff --git a/modules/text_editor/preview.cpp b/modules/text_editor/preview.cpp index 76ab3b9f9..098b494a2 100644 --- a/modules/text_editor/preview.cpp +++ b/modules/text_editor/preview.cpp @@ -1,307 +1,258 @@ #include "preview.h" +#include "scene/gui/grid_container.h" +#include "scene/gui/rich_text_label.h" -RichTextLabel Preview::get_*text_preview() { - return *text_preview; +#include "modules/regex/regex.h" + +void Preview::print_preview(const String &content) { + text_preview->append_bbcode(content); + text_preview->show(); } -void Preview::set_*text_preview(const RichTextLabel &val) { -*text_preview = val; +void Preview::print_bb(const String &content) { + text_preview->append_bbcode(content); + text_preview->show(); } +void Preview::print_markdown(const String &p_content) { + String content = p_content; -GridContainer Preview::get_*table_preview() { - return *table_preview; + Array result; + Array bolded; + Array italics; + Array striked; + Array coded; + Array linknames; + Array images; + Array links; + Array lists; + Array 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 Preview::set_*table_preview(const GridContainer &val) { -*table_preview = val; +void Preview::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 Preview::print_csv(const Array &rows) { + table_preview->set_columns(rows[0].size()); + for (item in rows) { + for (string in item) { + Label *label = memnew(Label); + label->set_text(str(string)); + label->set_h_size_flags(SIZE_EXPAND); + label->set_align(1); + label->set_valign(1); + table_preview->add_child(label); + } + } - //tool; - RichTextLabel *text_preview = null; - GridContainer *table_preview = null; - signal image_downloaded(); - signal image_loaded(); - - void Preview::_init() { - window_title = "File preview"; - resizable = true; - set_anchors_and_margins_preset(Control.PRESET_WIDE); - margin_left = 81; - margin_top = 47; - margin_right = -80; - margin_bottom = -48; - VBoxContainer *vbc = VBoxContainer.new(); - vbc.set_anchors_and_margins_preset(Control.PRESET_WIDE); - add_child(vbc); - text_preview = RichTextLabel.new(); - vbc.add_child(text_preview); - text_preview.scroll_following = true; - text_preview.bbcode_enabled = true; - text_preview.size_flags_vertical = SIZE_EXPAND_FILL; - text_preview.hide(); - table_preview = GridContainer.new(); - vbc.add_child(table_preview); - table_preview.columns = 3; - table_preview.size_flags_horizontal = SIZE_EXPAND_FILL; - table_preview.size_flags_vertical = SIZE_EXPAND_FILL; - table_preview.hide(); - connect("popup_hide", self, "_on_Preview_popup_hide"); + table_preview->show(); } - - void Preview::print_preview(const String &content) { - text_preview.append_bbcode(content); - text_preview.show(); +void Preview::_on_Preview_popup_hide() { + queue_delete(); } +Preview::Preview() { + set_window_title("File preview"); + set_resizable(true); + set_anchors_and_margins_preset(PRESET_WIDE); + set_margin_left(81); + set_margin_top(47); + set_margin_right(-80); + set_margin_bottom(-48); - void Preview::print_bb(const String &content) { - text_preview.append_bbcode(content); - text_preview.show(); + 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_following(true); + text_preview->set_bbcode_enabled(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(); + + connect("popup_hide", this, "_on_Preview_popup_hide"); } - - void Preview::print_markdown(const String &content) { - Array result = Array(); - Array bolded = Array(); - Array italics = Array(); - Array striked = Array(); - Array coded = Array(); - Array linknames = Array(); - Array images = Array(); - Array links = Array(); - Array lists = Array(); - Array underlined = Array(); - Ref regex = RegEx.new(); - 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")); +Preview::~Preview() { } - regex.compile('\\_\\_(?.*)\\_\\_'); - result = regex.search_all(content); +void Preview::_bind_methods() { + signal image_downloaded(); + signal image_loaded(); - for (int i = 0; i < result.size(); ++i) { //i in range(result.size()) - Ref res = result[i]; - underlined.append(res.get_string("underlinetext")); + ClassDB::bind_method(D_METHOD("_init"), &Preview::_init); + ClassDB::bind_method(D_METHOD("print_preview", "content"), &Preview::print_preview); + ClassDB::bind_method(D_METHOD("print_bb", "content"), &Preview::print_bb); + ClassDB::bind_method(D_METHOD("print_markdown", "content"), &Preview::print_markdown); + ClassDB::bind_method(D_METHOD("print_html", "content"), &Preview::print_html); + ClassDB::bind_method(D_METHOD("print_csv", "rows"), &Preview::print_csv); + ClassDB::bind_method(D_METHOD("_on_Preview_popup_hide"), &Preview::_on_Preview_popup_hide); } - - 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]; - Variant = image.split("("); - Variant = substr[1].rstrip(")"); - content = content.replace(image,"[img]"+imglink+"[/img]"); -} - - - for (i in links.size()) { - 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 Preview::print_html(const String &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 Preview::print_csv(const Array &rows) { - table_preview.columns = rows[0].size(); - - for (item in rows) { - - for (string in item) { - Variant = Label.new(); - label.text = str(string); - label.set_h_size_flags(SIZE_EXPAND); - label.set_align(1); - label.set_valign(1); - table_preview.add_child(label); -} - -} - - table_preview.show(); -} - - - void Preview::_on_Preview_popup_hide() { - queue_free(); -} - -} - - Preview::Preview() { - *text_preview = null; - *table_preview = null; - } - - Preview::~Preview() { - } - - - static void Preview::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_*text_preview"), &Preview::get_*text_preview); - ClassDB::bind_method(D_METHOD("set_*text_preview", "value"), &Preview::set_*text_preview); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "*text_preview", PROPERTY_HINT_RESOURCE_TYPE, "RichTextLabel"), "set_*text_preview", "get_*text_preview"); - - - ClassDB::bind_method(D_METHOD("get_*table_preview"), &Preview::get_*table_preview); - ClassDB::bind_method(D_METHOD("set_*table_preview", "value"), &Preview::set_*table_preview); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "*table_preview", PROPERTY_HINT_RESOURCE_TYPE, "GridContainer"), "set_*table_preview", "get_*table_preview"); - - - ClassDB::bind_method(D_METHOD("_init"), &Preview::_init); - ClassDB::bind_method(D_METHOD("print_preview", "content"), &Preview::print_preview); - ClassDB::bind_method(D_METHOD("print_bb", "content"), &Preview::print_bb); - ClassDB::bind_method(D_METHOD("print_markdown", "content"), &Preview::print_markdown); - ClassDB::bind_method(D_METHOD("print_html", "content"), &Preview::print_html); - ClassDB::bind_method(D_METHOD("print_csv", "rows"), &Preview::print_csv); - ClassDB::bind_method(D_METHOD("_on_Preview_popup_hide"), &Preview::_on_Preview_popup_hide); - - } - - - diff --git a/modules/text_editor/preview.h b/modules/text_editor/preview.h index e082c6b40..ade32be30 100644 --- a/modules/text_editor/preview.h +++ b/modules/text_editor/preview.h @@ -1,38 +1,32 @@ #ifndef PREVIEW_H #define PREVIEW_H +#include "core/ustring.h" + +#include "scene/gui/dialogs.h" + +class RichTextLabel; +class GridContainer; class Preview : public WindowDialog { - GDCLASS(Preview, WindowDialog); + GDCLASS(Preview, WindowDialog); - public: +public: + void print_preview(const String &content); + void print_bb(const String &content); + void print_markdown(const String &content); + void print_html(const String &content); + void print_csv(const Array &rows); + void _on_Preview_popup_hide(); - RichTextLabel get_*text_preview(); - void set_*text_preview(const RichTextLabel &val); + Preview(); + ~Preview(); - GridContainer get_*table_preview(); - void set_*table_preview(const GridContainer &val); +protected: + static void _bind_methods(); - void _init(); - void print_preview(const String &content); - void print_bb(const String &content); - void print_markdown(const String &content); - void print_html(const String &content); - void print_csv(const Array &rows); - void _on_Preview_popup_hide(); - - Preview(); - ~Preview(); - - protected: - static void _bind_methods(); - - //tool - RichTextLabel *text_preview = null; - GridContainer *table_preview = null; - signal image_downloaded(); - signal image_loaded(); + RichTextLabel *text_preview; + GridContainer *table_preview; }; - #endif