import sys
import re
import parser
'''
TODO: Allow inner data parsing (this will allow to parse the examples provided in an arguments block)
'''
class Parser(parser.Parser):
def __init__(self, pctxt):
parser.Parser.__init__(self, pctxt)
#template = pctxt.templates.get_template("parser/arguments.tpl")
#self.replace = template.render().strip()
def parse(self, line):
#return re.sub(r'(Arguments *:)', self.replace, line)
pctxt = self.pctxt
result = re.search(r'(Arguments? *:)', line)
if result:
label = result.group(0)
content = []
desc_indent = False
desc = re.sub(r'.*Arguments? *:', '', line).strip()
indent = parser.get_indent(line)
pctxt.next()
pctxt.eat_empty_lines()
arglines = []
if desc != "none":
add_empty_lines = 0
while pctxt.has_more_lines() and (parser.get_indent(pctxt.get_line()) > indent):
for j in range(0, add_empty_lines):
arglines.append("")
arglines.append(pctxt.get_line())
pctxt.next()
add_empty_lines = pctxt.eat_empty_lines()
'''
print line
if parser.get_indent(line) == arg_indent:
argument = re.sub(r' *([^ ]+).*', r'\1', line)
if argument:
#content.append("%s" % argument)
arg_desc = [line.replace(argument, " " * len(self.unescape(argument)), 1)]
#arg_desc = re.sub(r'( *)([^ ]+)(.*)', r'\1\2\3', line)
arg_desc_indent = parser.get_indent(arg_desc[0])
arg_desc[0] = arg_desc[0][arg_indent:]
pctxt.next()
add_empty_lines = 0
while pctxt.has_more_lines and parser.get_indent(pctxt.get_line()) >= arg_indent:
for i in range(0, add_empty_lines):
arg_desc.append("")
arg_desc.append(pctxt.get_line()[arg_indent:])
pctxt.next()
add_empty_lines = pctxt.eat_empty_lines()
# TODO : reduce space at the beginnning
content.append({
'name': argument,
'desc': arg_desc
})
'''
if arglines:
new_arglines = []
#content = self.parse_args(arglines)
parser.remove_indent(arglines)
'''
pctxt2 = parser.PContext(pctxt.templates)
pctxt2.set_content_list(arglines)
while pctxt2.has_more_lines():
new_arglines.append(parser.example.Parser(pctxt2).parse(pctxt2.get_line()))
pctxt2.next()
arglines = new_arglines
'''
pctxt.stop = True
template = pctxt.templates.get_template("parser/arguments.tpl")
return template.render(
pctxt=pctxt,
label=label,
desc=desc,
content=arglines
#content=content
)
return line
return line
'''
def parse_args(self, data):
args = []
pctxt = parser.PContext()
pctxt.set_content_list(data)
while pctxt.has_more_lines():
line = pctxt.get_line()
arg_indent = parser.get_indent(line)
argument = re.sub(r' *([^ ]+).*', r'\1', line)
if True or argument:
arg_desc = []
trailing_desc = line.replace(argument, " " * len(self.unescape(argument)), 1)[arg_indent:]
if trailing_desc.strip():
arg_desc.append(trailing_desc)
pctxt.next()
add_empty_lines = 0
while pctxt.has_more_lines() and parser.get_indent(pctxt.get_line()) > arg_indent:
for i in range(0, add_empty_lines):
arg_desc.append("")
arg_desc.append(pctxt.get_line()[arg_indent:])
pctxt.next()
add_empty_lines = pctxt.eat_empty_lines()
parser.remove_indent(arg_desc)
args.append({
'name': argument,
'desc': arg_desc
})
return args
def unescape(self, s):
s = s.replace("<", "<")
s = s.replace(">", ">")
# this has to be last:
s = s.replace("&", "&")
return s
'''