From 9e4532d68910873b65fef8616e7ebde180220b5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Wed, 17 Feb 2016 21:09:28 +0100 Subject: [PATCH] Implement support for [codeblock] tag in help It allows to define a multiline space-indented code block that will be properly parsed by the reST converter for the online docs. The in-editor help understand the [codeblock] tag as it supposedly understand [code] already (i.e. it just seems to discard it, though the code was supposed to switch it to a monospace font, but that's likely another issue. --- doc/base/classes.xml | 63 +++++++++++++++++++----------------- doc/tools/makerst.py | 45 ++++++++++++++++++++++++-- tools/editor/editor_help.cpp | 2 +- 3 files changed, 76 insertions(+), 34 deletions(-) diff --git a/doc/base/classes.xml b/doc/base/classes.xml index 164557578d0..f4035b50be4 100644 --- a/doc/base/classes.xml +++ b/doc/base/classes.xml @@ -9606,26 +9606,26 @@ This approximation makes straight segments between each point, then subdivides t - Directory type. + Type used to handle the filesystem. Directory type. Is used to manage directories and their content (not restricted to the project folder). - -How to iterate through the files of a directory example: - -func dir(path): - var d = Directory.new() - if d.open( path )==0: - d.list_dir_begin() - var file_name = d.get_next() - while(file_name!=""): - if d.current_is_dir(): - print("Is directory: " + file_name) - else: - print("Is File:" + file_name) - file_name = d.get_next() - else: - print("Some open Error, maybe directory not found?") + Example for how to iterate through the files of a directory: + [codeblock] + func dir(path): + var d = Directory.new() + if d.open( path )==0: + d.list_dir_begin() + var file_name = d.get_next() + while(file_name!=""): + if d.current_is_dir(): + print("Found directory: " + file_name) + else: + print("Found file:" + file_name) + file_name = d.get_next() + else: + print("Some open Error, maybe directory not found?") + [/codeblock] @@ -12949,9 +12949,8 @@ Returns an empty String "" at the end of the list. Connect to a host. This needs to be done before any requests are sent. -The host should not have http:// prepended but will strip the protocol identifier if provided. - -verify_host will check the SSL identity of the host if set to true. + The host should not have http:// prepended but will strip the protocol identifier if provided. + verify_host will check the SSL identity of the host if set to true. @@ -12974,11 +12973,13 @@ verify_host will check the SSL identity of the host if set to true. Sends a request to the connected host. The url is what is normally behind the hostname, i.e. in [code]http://somehost.com/index.php[/code], url would be "index.php". Headers are HTTP request headers. - To create a POST request with query strings to push to the server, do:: - var fields = {"username" : "user", "password" : "pass"} - var queryString = httpClient.query_string_from_dict(fields) - var headers = ["Content-Type: application/x-www-form-urlencoded", "Content-Length: " + str(queryString.length())] - var result = httpClient.request(httpClient.METHOD_POST, "index.php", headers, queryString) + To create a POST request with query strings to push to the server, do: + [codeblock] + var fields = {"username" : "user", "password" : "pass"} + var queryString = httpClient.query_string_from_dict(fields) + var headers = ["Content-Type: application/x-www-form-urlencoded", "Content-Length: " + str(queryString.length())] + var result = httpClient.request(httpClient.METHOD_POST, "index.php", headers, queryString) + [/codeblock] @@ -13086,10 +13087,12 @@ verify_host will check the SSL identity of the host if set to true. - Generates a GET/POST application/x-www-form-urlencoded style query string from a provided dictionary, e.g.:: - var fields = {"username": "user", "password": "pass"} - String queryString = httpClient.query_string_from_dict(fields) - returns:= "username=user&password=pass" + Generates a GET/POST application/x-www-form-urlencoded style query string from a provided dictionary, e.g.: + [codeblock] + var fields = {"username": "user", "password": "pass"} + String queryString = httpClient.query_string_from_dict(fields) + returns:= "username=user&password=pass" + [/codeblock] @@ -17992,7 +17995,7 @@ verify_host will check the SSL identity of the host if set to true. MultiMesh provides low level mesh instancing. If the amount of [Mesh] instances needed goes from hundreds to thousands (and most need to be visible at close proximity) creating such a large amount of [MeshInstance] nodes may affect performance by using too much CPU or video memory. For this case a MultiMesh becomes very useful, as it can draw thousands of instances with little API overhead. - As a drawback, if the instances are too far away of each other, performance may be reduced as every single instance will always rendered (they are spatially indexed as one, for the whole object). + As a drawback, if the instances are too far away of each other, performance may be reduced as every single instance will always rendered (they are spatially indexed as one, for the whole object). Since instances may have any behavior, the AABB used for visibility must be provided by the user, or generated with [method generate_aabb]. diff --git a/doc/tools/makerst.py b/doc/tools/makerst.py index 1e2d276fb34..2ba291680d0 100644 --- a/doc/tools/makerst.py +++ b/doc/tools/makerst.py @@ -100,7 +100,7 @@ def make_class_list(class_list, columns): def rstize_text(text,cclass): - # Linebreak + tabs in the XML should become two line breaks + # Linebreak + tabs in the XML should become two line breaks unless in a "codeblock" pos = 0 while True: pos = text.find('\n', pos) @@ -112,8 +112,40 @@ def rstize_text(text,cclass): pos += 1 post_text = text[pos+1:] - text = pre_text + "\n\n" + post_text - pos += 2 + # Handle codeblocks + if post_text.startswith("[codeblock]"): + end_pos = post_text.find("[/codeblock]") + if end_pos == -1: + sys.exit("ERROR! [codeblock] without a closing tag!") + + code_text = post_text[len("[codeblock]"):end_pos] + post_text = post_text[end_pos:] + + # Remove extraneous tabs + code_pos = 0 + while True: + code_pos = code_text.find('\n', code_pos) + if code_pos == -1: + break + + to_skip = 0 + while code_pos+to_skip+1 < len(code_text) and code_text[code_pos+to_skip+1] == '\t': + to_skip += 1 + + if len(code_text[code_pos+to_skip+1:])==0: + code_text = code_text[:code_pos] + "\n" + code_pos += 1 + else: + code_text = code_text[:code_pos] + "\n " + code_text[code_pos+to_skip+1:] + code_pos += 5 - to_skip + + text = pre_text + "\n[codeblock]" + code_text + post_text + pos += len("\n[codeblock]" + code_text) + + # Handle normal text + else: + text = pre_text + "\n\n" + post_text + pos += 2 # Escape * character to avoid interpreting it as emphasis pos = 0 @@ -179,6 +211,13 @@ def rstize_text(text,cclass): tag_text = '' elif cmd == '/center': tag_text = '' + elif cmd == 'codeblock': + tag_text = '\n::\n' + elif cmd == '/codeblock': + tag_text = '' + # Strip newline if the tag was alone on one + if pre_text[-1] == '\n': + pre_text = pre_text[:-1] elif cmd == 'br': # Make a new paragraph instead of a linebreak, rst is not so linebreak friendly tag_text = '\n\n' diff --git a/tools/editor/editor_help.cpp b/tools/editor/editor_help.cpp index 2ece518f8dd..ddcb6341512 100644 --- a/tools/editor/editor_help.cpp +++ b/tools/editor/editor_help.cpp @@ -1201,7 +1201,7 @@ void EditorHelp::_add_text(const String& p_bbcode) { class_desc->push_font(get_font("italic","Fonts")); pos=brk_end+1; tag_stack.push_front(tag); - } else if (tag=="code") { + } else if (tag=="code" || tag=="codeblock") { //use monospace font class_desc->push_font(get_font("source","EditorFonts"));