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.
This commit is contained in:
Rémi Verschelde 2016-02-17 21:09:28 +01:00
parent 5499755292
commit 9e4532d689
3 changed files with 76 additions and 34 deletions

View file

@ -9606,26 +9606,26 @@ This approximation makes straight segments between each point, then subdivides t
</class>
<class name="Directory" inherits="Reference" category="Core">
<brief_description>
Directory type.
Type used to handle the filesystem.
</brief_description>
<description>
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]
</description>
<methods>
<method name="open">
@ -12949,9 +12949,8 @@ Returns an empty String "" at the end of the list.
</argument>
<description>
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.
</description>
</method>
<method name="set_connection">
@ -12974,11 +12973,13 @@ verify_host will check the SSL identity of the host if set to true.
<description>
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]
</description>
</method>
<method name="send_body_text">
@ -13086,10 +13087,12 @@ verify_host will check the SSL identity of the host if set to true.
<argument index="0" name="fields" type="Dictionary">
</argument>
<description>
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&amp;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&amp;password=pass"
[/codeblock]
</description>
</method>
</methods>
@ -17992,7 +17995,7 @@ verify_host will check the SSL identity of the host if set to true.
<description>
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].
</description>
<methods>

View file

@ -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'

View file

@ -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"));