summaryrefslogtreecommitdiff
path: root/doc/tools
diff options
context:
space:
mode:
Diffstat (limited to 'doc/tools')
-rw-r--r--doc/tools/makemd.py25
-rwxr-xr-x[-rw-r--r--]doc/tools/makerst.py64
2 files changed, 71 insertions, 18 deletions
diff --git a/doc/tools/makemd.py b/doc/tools/makemd.py
index b2444eb47b..056f1ca82d 100644
--- a/doc/tools/makemd.py
+++ b/doc/tools/makemd.py
@@ -2,12 +2,19 @@
# -*- coding: utf-8 -*-
import sys
+import os.path as path
+import os
import xml.etree.ElementTree as ET
input_list = []
for arg in sys.argv[1:]:
- input_list.append(arg)
+ if not path.exists(arg):
+ exit("path {} doesn't exist".format(arg))
+ elif path.isdir(arg):
+ input_list += filter(path.isfile, [path.join(arg, f) for f in os.listdir(arg)])
+ else: # assuming is a file
+ input_list.append(arg)
if len(input_list) < 1:
print 'usage: makemd.py <classes.xml>'
@@ -29,7 +36,6 @@ def make_class_list(class_list, columns):
f = open('class_list.md', 'wb')
prev = 0
col_max = len(class_list) / columns + 1
- print ('col max is ', col_max)
col_count = 0
row_count = 0
last_initial = ''
@@ -87,6 +93,8 @@ def make_class_list(class_list, columns):
s += '\n'
f.write(s)
+ f.close()
+
def dokuize_text(txt):
@@ -324,6 +332,8 @@ def make_doku_class(node):
f.write('\n')
f.write(dokuize_text(d.text.strip()))
f.write('\n')
+
+ f.close()
for file in input_list:
@@ -335,12 +345,11 @@ for file in input_list:
sys.exit(255)
version = doc.attrib['version']
-
- for c in list(doc):
- if c.attrib['name'] in class_names:
- continue
- class_names.append(c.attrib['name'])
- classes[c.attrib['name']] = c
+ class_name = doc.attrib['name']
+ if class_name in class_names:
+ continue
+ class_names.append(class_name)
+ classes[class_name] = doc
class_names.sort()
diff --git a/doc/tools/makerst.py b/doc/tools/makerst.py
index 492f3b6d54..adbd810d11 100644..100755
--- a/doc/tools/makerst.py
+++ b/doc/tools/makerst.py
@@ -104,6 +104,8 @@ def make_class_list(class_list, columns):
f.write("--+-------+")
f.write("\n")
+ f.close()
+
def rstize_text(text, cclass):
# Linebreak + tabs in the XML should become two line breaks unless in a "codeblock"
@@ -155,8 +157,9 @@ def rstize_text(text, cclass):
# Escape * character to avoid interpreting it as emphasis
pos = 0
+ next_brac_pos = text.find('[')
while True:
- pos = text.find('*', pos)
+ pos = text.find('*', pos, next_brac_pos)
if pos == -1:
break
text = text[:pos] + "\*" + text[pos + 1:]
@@ -165,7 +168,7 @@ def rstize_text(text, cclass):
# Escape _ character at the end of a word to avoid interpreting it as an inline hyperlink
pos = 0
while True:
- pos = text.find('_', pos)
+ pos = text.find('_', pos, next_brac_pos)
if pos == -1:
break
if not text[pos + 1].isalnum(): # don't escape within a snake_case word
@@ -256,14 +259,36 @@ def rstize_text(text, cclass):
elif cmd == 'code':
tag_text = '``'
inside_code = True
+ elif cmd.startswith('enum '):
+ tag_text = make_enum(cmd[5:])
else:
tag_text = make_type(tag_text)
escape_post = True
# Properly escape things like `[Node]s`
- if escape_post and post_text and post_text[0].isalnum(): # not punctuation, escape
+ if escape_post and post_text and post_text[0].isalnum(): # not punctuation, escape
post_text = '\ ' + post_text
+ next_brac_pos = post_text.find('[', 0)
+ iter_pos = 0
+ while not inside_code:
+ iter_pos = post_text.find('*', iter_pos, next_brac_pos)
+ if iter_pos == -1:
+ break
+ post_text = post_text[:iter_pos] + "\*" + post_text[iter_pos + 1:]
+ iter_pos += 2
+
+ iter_pos = 0
+ while not inside_code:
+ iter_pos = post_text.find('_', iter_pos, next_brac_pos)
+ if iter_pos == -1:
+ break
+ if not post_text[iter_pos + 1].isalnum(): # don't escape within a snake_case word
+ post_text = post_text[:iter_pos] + "\_" + post_text[iter_pos + 1:]
+ iter_pos += 2
+ else:
+ iter_pos += 1
+
text = pre_text + tag_text + post_text
pos = len(pre_text) + len(tag_text)
@@ -276,16 +301,27 @@ def make_type(t):
return ':ref:`' + t + '<class_' + t.lower() + '>`'
return t
+
def make_enum(t):
global class_names
p = t.find(".")
+ # Global enums such as Error are relative to @GlobalScope.
if p >= 0:
c = t[0:p]
- e = t[p+1:]
- if c in class_names:
- return ':ref:`' + e + '<enum_' + c.lower() + '_' + e.lower() + '>`'
+ e = t[p + 1:]
+ # Variant enums live in GlobalScope but still use periods.
+ if c == "Variant":
+ c = "@GlobalScope"
+ e = "Variant." + e
+ else:
+ # Things in GlobalScope don't have a period.
+ c = "@GlobalScope"
+ e = t
+ if c in class_names:
+ return ':ref:`' + e + '<enum_' + c.lower() + '_' + e.lower() + '>`'
return t
+
def make_method(
f,
name,
@@ -317,7 +353,10 @@ def make_method(
if not event:
if -1 in mdata['argidx']:
- t += make_type(mdata[-1].attrib['type'])
+ if 'enum' in mdata[-1].attrib:
+ t += make_enum(mdata[-1].attrib['enum'])
+ else:
+ t += make_type(mdata[-1].attrib['type'])
else:
t += 'void'
t += ' '
@@ -339,7 +378,10 @@ def make_method(
else:
s += ' '
- s += make_type(arg.attrib['type'])
+ if 'enum' in arg.attrib:
+ s += make_enum(arg.attrib['enum'])
+ else:
+ s += make_type(arg.attrib['type'])
if 'name' in arg.attrib:
s += ' ' + arg.attrib['name']
else:
@@ -500,7 +542,7 @@ def make_rst_class(node):
enums.append(c)
else:
consts.append(c)
-
+
if len(consts) > 0:
f.write(make_heading('Numeric Constants', '-'))
for c in list(consts):
@@ -512,7 +554,7 @@ def make_rst_class(node):
s += ' --- ' + rstize_text(c.text.strip(), name)
f.write(s + '\n')
f.write('\n')
-
+
if len(enum_names) > 0:
f.write(make_heading('Enums', '-'))
for e in enum_names:
@@ -550,6 +592,8 @@ def make_rst_class(node):
f.write("\n\n")
f.write('\n')
+ f.close()
+
file_list = []