extends Node var heading1_font = "res://addons/dialogic/Documentation/Theme/DocumentationH1.tres" var heading2_font = "res://addons/dialogic/Documentation/Theme/DocumentationH2.tres" var heading3_font = "res://addons/dialogic/Documentation/Theme/DocumentationH3.tres" var heading4_font = "res://addons/dialogic/Documentation/Theme/DocumentationH4.tres" var heading5_font = "res://addons/dialogic/Documentation/Theme/DocumentationH5.tres" ## These will change with each parsing, but can be saved manually after parsing var heading1s = [] var heading2s = [] var heading3s = [] var heading4s = [] var heading5s = [] var result = "" var bolded = [] var italics = [] var striked = [] var coded = [] var linknames = [] var links = [] var imagenames = [] var imagelinks = [] var lists = [] var underlined = [] var accent_color := Color() var sub_accent_color := Color() var editor_scale := 1.0 ################################################################################ ## PUBLIC FUNCTIONS ## ################################################################################ func set_accent_colors(new_accent_color : Color, new_sub_accent_color : Color) -> void: accent_color = new_accent_color sub_accent_color = new_sub_accent_color ### Takes a markdown string and returns it as BBCode func parse(content : String, file_path:String = '', docs_path:String = ''): heading1s = [] heading2s = [] heading3s = [] heading4s = [] heading5s = [] result = "" bolded = [] italics = [] striked = [] coded = [] linknames = [] links = [] imagenames = [] imagelinks = [] lists = [] underlined = [] var parsed_text = content var regex = RegEx.new() ## Remove all comments # TODO: remove comments ## Find all occurences of bold text regex.compile('\\*\\*(?(\\.|[^(\\*\\*)])*)\\*\\*') result = regex.search_all(content) if result: for res in result: parsed_text = parsed_text.replace("**"+res.get_string("boldtext")+"**","[b]"+res.get_string("boldtext")+"[/b]") ## Find all occurences of underlined text regex.compile('\\_\\_(?.*)\\_\\_') result = regex.search_all(content) if result: for res in result: parsed_text = parsed_text.replace("__"+res.get_string("underlinetext")+"__","[u]"+res.get_string("underlinetext")+"[/u]") ## Find all occurences of italic text regex.compile("\\*(?[^\\*]*)\\*") result = regex.search_all(content) if result: for res in result: parsed_text = parsed_text.replace("*"+res.get_string('italictext')+'*', "[i]"+res.get_string('italictext')+"[/i]") # italics.append(res.get_string("italictext")) # for italic in italics: # content = content.replace("*"+italic+"*",) ## Find all occurences of underlined text regex.compile("~~(?.*)~~") result = regex.search_all(content) if result: for res in result: parsed_text = parsed_text.replace("~~"+res.get_string("strikedtext")+"~~","[s]"+res.get_string("strikedtext")+"[/s]") ## Find all occurences of code snippets regex.compile("(([^`]`)|(```))(?[^`]+)(?(2)(`)|(```))") result = regex.search_all(content) if result: for res in result: if res.get_string().begins_with("```"): parsed_text = parsed_text.replace("```"+res.get_string("coded")+"```","[indent][color=#"+accent_color.lightened(0.6).to_html()+"][code]"+res.get_string("coded")+"[/code][/color][/indent]") else: parsed_text = parsed_text.replace("`"+res.get_string("coded")+"`","[color=#"+accent_color.lightened(0.6).to_html()+"][code]"+res.get_string("coded")+"[/code][/color]") ## Find all occurences of list items regex.compile("\\n\\s*(?[-+*])(?\\s.*)") result = regex.search_all(parsed_text) if result: for res in result: var symbol = res.get_string('symbol') var element = res.get_string("element") if parsed_text.find(symbol+" "+element): parsed_text = parsed_text.replace(symbol+" "+element,"[indent]"+symbol+" "+element+"[/indent]") ## Find all occurences of images regex.compile("!\\[(?.*)\\]\\((?.*)\\)") result = regex.search_all(content) if result: for res in result: if res.get_string("imglink")!="": imagelinks.append(res.get_string("imglink")) if res.get_string("imgname")!="": imagenames.append(res.get_string("imgname")) ## Find all occurences of links (that are not images) regex.compile("[^!]\\[(?[^\\[]+)\\]\\((?[^\\)]*\\S*?)\\)") result = regex.search_all(content) if result: for res in result: if res.get_string("link")!="": links.append(res.get_string("link")) if res.get_string("linkname")!="": linknames.append(res.get_string("linkname")) ## Find all heading1s regex.compile("(?:\\n|^)#(?[^#\\n]+[^\\n]+)") result = regex.search_all(content) if result: for res in result: var heading = res.get_string("heading") heading1s.append(heading) parsed_text = parsed_text.replace("#"+heading, "[color=#"+accent_color.lightened(0.2).to_html()+"][font="+heading1_font+"]"+heading.strip_edges()+"[/font][/color]") ## Find all heading2s regex.compile("(?:\\n|^)##(?[^#\\n]+[^\\n]+)") result = regex.search_all(content) if result: for res in result: var heading = res.get_string("heading") heading2s.append(heading) parsed_text = parsed_text.replace("\n##"+heading, "\n[color=#"+accent_color.lightened(0.5).to_html()+"][font="+heading2_font+"]"+heading.strip_edges()+"[/font][/color]") ## Find all heading3s regex.compile("(?:\\n|^)###(?[^#\\n]+[^\\n]+)") result = regex.search_all(content) if result: for res in result: var heading = res.get_string("heading") parsed_text = parsed_text.replace("\n###"+heading, "\n[color=#"+accent_color.lightened(0.7).to_html()+"][font="+heading3_font+"]"+heading.strip_edges()+"[/font][/color]") ## Find all heading4s regex.compile("(?:\\n|^)####(?[^#\\n]+[^\\n]+)") result = regex.search_all(content) if result: for res in result: var heading = res.get_string("heading") parsed_text = parsed_text.replace("\n####"+heading, "\n[color=#"+accent_color.lightened(0.85).to_html()+"][font="+heading4_font+"]"+heading.strip_edges()+"[/font][/color]") ## Find all heading5s regex.compile("(?:\\n|^)#####(?[^#\\n]+[^\\n]+)") result = regex.search_all(content) if result: for res in result: var heading = res.get_string("heading") parsed_text = parsed_text.replace("\n#####"+heading, "\n[color=#"+accent_color.lightened(0.85).to_html()+"][font="+heading5_font+"]"+heading.strip_edges()+"[/font][/color]") for i in links.size(): parsed_text = parsed_text.replace("["+linknames[i]+"]("+links[i]+")","[color=#"+accent_color.to_html()+"][url="+links[i]+"]"+linknames[i]+"[/url][/color]") for i in imagenames.size(): var imagelink_to_use = imagelinks[i] if imagelink_to_use.begins_with("http"): var path_parts = imagelink_to_use.split("/Documentation/") if path_parts.size() > 1: imagelink_to_use = docs_path +"/"+ path_parts[1] else: imagelink_to_use = "icon.png" if imagelink_to_use.begins_with(".") and file_path: imagelink_to_use = file_path.trim_suffix(file_path.get_file()).trim_suffix("/") + imagelink_to_use.trim_prefix(".") parsed_text = parsed_text.replace("!["+imagenames[i]+"]("+imagelinks[i]+")","[img="+str(int(700*editor_scale))+"]"+imagelink_to_use+"[/img]") parsed_text += "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" return parsed_text