Adjustments to allow elements with subelements as parameters. This is

used to deal with the table headings and entries.

An additional flag in the element table is used to indicate elements
which have no "general" content, but which do have subelement
content.  These must be flagged distinctly from empty elements.
Currently used for \lineii, \lineiii, and \lineiv.
This commit is contained in:
Fred Drake 1999-01-14 17:38:12 +00:00
parent 79cbadc194
commit d7acf02290
1 changed files with 145 additions and 95 deletions

View File

@ -2,8 +2,6 @@
"""Generate ESIS events based on a LaTeX source document and configuration
data.
"""
__version__ = '$Revision$'
@ -16,6 +14,9 @@ import sys
from esistools import encode
DEBUG = 0
class Error(Exception):
pass
@ -40,19 +41,30 @@ _start_optional_rx = re.compile("[ \n]*[[]")
ESCAPED_CHARS = "$%#^ {}&~"
def subconvert(line, ofp, table, discards, autoclosing, endchar=None):
def pushing(name, point, depth):
if DEBUG:
sys.stderr.write("%s<%s> at %s\n" % (" "*depth, name, point))
def popping(name, point, depth):
if DEBUG:
sys.stderr.write("%s</%s> at %s\n" % (" "*depth, name, point))
def subconvert(line, ofp, table, discards, autoclosing, endchar=None, depth=0):
if DEBUG and endchar:
sys.stderr.write("subconvert(%s, ..., endchar=%s)\n"
% (`line[:20]`, `endchar`))
stack = []
while line:
if line[0] == endchar and not stack:
if DEBUG:
sys.stderr.write("subconvert() --> %s\n" % `line[1:21]`)
return line[1:]
m = _comment_rx.match(line)
if m:
text = m.group(1)
if text:
ofp.write("(COMMENT\n")
ofp.write("- %s \n" % encode(text))
ofp.write(")COMMENT\n")
ofp.write("-\\n\n")
ofp.write("(COMMENT\n- %s \n)COMMENT\n-\\n\n" % encode(text))
line = line[m.end():]
continue
m = _begin_env_rx.match(line)
@ -60,7 +72,7 @@ def subconvert(line, ofp, table, discards, autoclosing, endchar=None):
# re-write to use the macro handler
line = r"\%s %s" % (m.group(1), line[m.end():])
continue
m =_end_env_rx.match(line)
m = _end_env_rx.match(line)
if m:
# end of environment
envname = m.group(1)
@ -75,8 +87,9 @@ def subconvert(line, ofp, table, discards, autoclosing, endchar=None):
elif envname == stack[-1]:
ofp.write(")%s\n" % envname)
del stack[-1]
popping(envname, "a", len(stack) + depth)
else:
print stack
sys.stderr.write("stack: %s\n" % `stack`)
raise LaTeXFormatError(
"environment close for %s doesn't match" % envname)
line = line[m.end():]
@ -102,20 +115,25 @@ def subconvert(line, ofp, table, discards, autoclosing, endchar=None):
while stack[-1] != macroname:
if stack[-1] and stack[-1] not in discards:
ofp.write(")%s\n-\\n\n" % stack[-1])
popping(stack[-1], "b", len(stack) + depth - 1)
del stack[-1]
if macroname not in discards:
ofp.write("-\\n\n)%s\n-\\n\n" % macroname)
popping(macroname, "c", len(stack) + depth - 1)
del stack[-1]
real_ofp = ofp
if macroname in discards:
ofp = StringIO.StringIO()
#
conversion = table.get(macroname, ([], 0, 0, 0))
params, optional, empty, environ = conversion
conversion = table.get(macroname, ([], 0, 0, 0, 0))
params, optional, empty, environ, nocontent = conversion
if empty:
ofp.write("e\n")
elif nocontent:
empty = 1
if not numbered:
ofp.write("Anumbered TOKEN no\n")
opened = 0
# rip off the macroname
if params:
if optional and len(params) == 1:
@ -133,13 +151,15 @@ def subconvert(line, ofp, table, discards, autoclosing, endchar=None):
#
if optional and type(params[0]) is type(()):
# the attribute name isn't used in this special case
pushing(macroname, "a", depth + len(stack))
stack.append(macroname)
ofp.write("(%s\n" % macroname)
m = _start_optional_rx.match(line)
if m:
line = line[m.end():]
line = subconvert(line, ofp, table, discards,
autoclosing, endchar="]")
autoclosing, endchar="]",
depth=depth + len(stack))
line = "}" + line
continue
# handle attribute mappings here:
@ -155,6 +175,7 @@ def subconvert(line, ofp, table, discards, autoclosing, endchar=None):
elif type(attrname) is type(()):
# This is a sub-element; but don't place the
# element we found on the stack (\section-like)
pushing(macroname, "b", len(stack) + depth)
stack.append(macroname)
ofp.write("(%s\n" % macroname)
macroname = attrname[0]
@ -164,10 +185,17 @@ def subconvert(line, ofp, table, discards, autoclosing, endchar=None):
elif type(attrname) is type([]):
# A normal subelement.
attrname = attrname[0]
stack.append(macroname)
stack.append(attrname)
ofp.write("(%s\n" % macroname)
macroname = attrname
if not opened:
opened = 1
ofp.write("(%s\n" % macroname)
pushing(macroname, "c", len(stack) + depth)
ofp.write("(%s\n" % attrname)
pushing(attrname, "sub-elem", len(stack) + depth + 1)
line = subconvert(skip_white(line)[1:], ofp, table,
discards, autoclosing, endchar="}",
depth=depth + len(stack) + 2)
popping(attrname, "sub-elem", len(stack) + depth + 1)
ofp.write(")%s\n" % attrname)
else:
m = _parameter_rx.match(line)
if not m:
@ -191,12 +219,18 @@ def subconvert(line, ofp, table, discards, autoclosing, endchar=None):
"non-empty element '%s' has no content: %s"
% (macroname, line[:12]))
line = line[m.end():]
stack.append(macroname)
ofp.write("(%s\n" % macroname)
if not opened:
ofp.write("(%s\n" % macroname)
pushing(macroname, "d", len(stack) + depth)
if empty:
line = "}" + line
stack.append(macroname)
ofp = real_ofp
continue
if line[0] == endchar and not stack:
if DEBUG:
sys.stderr.write("subconvert() --> %s\n" % `line[1:21]`)
return line[1:]
if line[0] == "}":
# end of macro
macroname = stack[-1]
@ -206,10 +240,12 @@ def subconvert(line, ofp, table, discards, autoclosing, endchar=None):
and type(conversion) is not type(""):
# otherwise, it was just a bare group
ofp.write(")%s\n" % stack[-1])
popping(macroname, "d", len(stack) + depth - 1)
del stack[-1]
line = line[1:]
continue
if line[0] == "{":
pushing("", "e", len(stack) + depth)
stack.append("")
line = line[1:]
continue
@ -241,10 +277,12 @@ def subconvert(line, ofp, table, discards, autoclosing, endchar=None):
while stack and stack[-1] in autoclosing:
ofp.write("-\\n\n")
ofp.write(")%s\n" % stack[-1])
popping(stack[-1], "e", len(stack) + depth - 1)
del stack[-1]
if stack:
raise LaTeXFormatError("elements remain on stack: "
+ string.join(stack))
# otherwise we just ran out of input here...
def convert(ifp, ofp, table={}, discards=(), autoclosing=()):
@ -259,6 +297,12 @@ def convert(ifp, ofp, table={}, discards=(), autoclosing=()):
raise
def skip_white(line):
while line and line[0] in " %\n\t":
line = string.lstrip(line[1:])
return line
def main():
if len(sys.argv) == 2:
ifp = open(sys.argv[1])
@ -271,87 +315,93 @@ def main():
sys.exit(2)
convert(ifp, ofp, {
# entries have the form:
# name: ([attribute names], first_is_optional, empty, isenv)
"appendix": ([], 0, 1, 0),
"bifuncindex": (["name"], 0, 1, 0),
"catcode": ([], 0, 1, 0),
"cfuncdesc": (["type", "name", ("args",)], 0, 0, 1),
"chapter": ([("title",)], 0, 0, 0),
"chapter*": ([("title",)], 0, 0, 0),
"classdesc": (["name", ("constructor-args",)], 0, 0, 1),
"ctypedesc": (["name"], 0, 0, 1),
"cvardesc": (["type", "name"], 0, 0, 1),
"datadesc": (["name"], 0, 0, 1),
"declaremodule": (["id", "type", "name"], 1, 1, 0),
"deprecated": (["release"], 0, 0, 0),
"documentclass": (["classname"], 0, 1, 0),
"excdesc": (["name"], 0, 0, 1),
"funcdesc": (["name", ("args",)], 0, 0, 1),
"funcdescni": (["name", ("args",)], 0, 0, 1),
"geq": ([], 0, 1, 0),
"hline": ([], 0, 1, 0),
"indexii": (["ie1", "ie2"], 0, 1, 0),
"indexiii": (["ie1", "ie2", "ie3"], 0, 1, 0),
"indexiv": (["ie1", "ie2", "ie3", "ie4"], 0, 1, 0),
"indexname": ([], 0, 0, 0),
"input": (["source"], 0, 1, 0),
"item": ([("leader",)], 1, 0, 0),
"label": (["id"], 0, 1, 0),
"labelwidth": ([], 0, 1, 0),
"LaTeX": ([], 0, 1, 0),
"leftmargin": ([], 0, 1, 0),
"leq": ([], 0, 1, 0),
"localmoduletable": ([], 0, 1, 0),
"makeindex": ([], 0, 1, 0),
"makemodindex": ([], 0, 1, 0),
"maketitle": ([], 0, 1, 0),
"manpage": (["name", "section"], 0, 1, 0),
"memberdesc": (["class", "name"], 1, 0, 1),
"methoddesc": (["class", "name", ("args",)], 1, 0, 1),
"methoddescni": (["class", "name", ("args",)], 1, 0, 1),
"moduleauthor": (["name", "email"], 0, 1, 0),
"opcodedesc": (["name", "var"], 0, 0, 1),
"par": ([], 0, 1, 0),
"paragraph": ([("title",)], 0, 0, 0),
"renewcommand": (["macro"], 0, 0, 0),
"rfc": (["number"], 0, 1, 0),
"section": ([("title",)], 0, 0, 0),
"sectionauthor": (["name", "email"], 0, 1, 0),
"seemodule": (["ref", "name"], 1, 0, 0),
"stindex": (["type"], 0, 1, 0),
"subparagraph": ([("title",)], 0, 0, 0),
"subsection": ([("title",)], 0, 0, 0),
"subsubsection": ([("title",)], 0, 0, 0),
"list": (["bullet", "init"], 0, 0, 1),
"tableii": (["colspec", "style", "head1", "head2"], 0, 0, 1),
"tableiii": (["colspec", "style", "head1", "head2", "head3"], 0, 0, 1),
"tableiv": (["colspec", "style", "head1", "head2", "head3", "head4"],
0, 0, 1),
"version": ([], 0, 1, 0),
"versionadded": (["version"], 0, 1, 0),
"versionchanged": (["version"], 0, 1, 0),
"withsubitem": (["text"], 0, 0, 0),
# name: ([attribute names], first_is_optional, empty, isenv, nocontent)
"appendix": ([], 0, 1, 0, 0),
"bifuncindex": (["name"], 0, 1, 0, 0),
"catcode": ([], 0, 1, 0, 0),
"cfuncdesc": (["type", "name", ("args",)], 0, 0, 1, 0),
"chapter": ([("title",)], 0, 0, 0, 0),
"chapter*": ([("title",)], 0, 0, 0, 0),
"classdesc": (["name", ("constructor-args",)], 0, 0, 1, 0),
"ctypedesc": (["name"], 0, 0, 1, 0),
"cvardesc": (["type", "name"], 0, 0, 1, 0),
"datadesc": (["name"], 0, 0, 1, 0),
"declaremodule": (["id", "type", "name"], 1, 1, 0, 0),
"deprecated": (["release"], 0, 0, 0, 0),
"documentclass": (["classname"], 0, 1, 0, 0),
"excdesc": (["name"], 0, 0, 1, 0),
"funcdesc": (["name", ("args",)], 0, 0, 1, 0),
"funcdescni": (["name", ("args",)], 0, 0, 1, 0),
"geq": ([], 0, 1, 0, 0),
"hline": ([], 0, 1, 0, 0),
"indexii": (["ie1", "ie2"], 0, 1, 0, 0),
"indexiii": (["ie1", "ie2", "ie3"], 0, 1, 0, 0),
"indexiv": (["ie1", "ie2", "ie3", "ie4"], 0, 1, 0, 0),
"indexname": ([], 0, 0, 0, 0),
"input": (["source"], 0, 1, 0, 0),
"item": ([("leader",)], 1, 0, 0, 0),
"label": (["id"], 0, 1, 0, 0),
"labelwidth": ([], 0, 1, 0, 0),
"LaTeX": ([], 0, 1, 0, 0),
"leftmargin": ([], 0, 1, 0, 0),
"leq": ([], 0, 1, 0, 0),
"lineii": ([["entry"], ["entry"]], 0, 0, 0, 1),
"lineiii": ([["entry"], ["entry"], ["entry"]], 0, 0, 0, 1),
"lineiv": ([["entry"], ["entry"], ["entry"], ["entry"]], 0, 0, 0, 1),
"localmoduletable": ([], 0, 1, 0, 0),
"makeindex": ([], 0, 1, 0, 0),
"makemodindex": ([], 0, 1, 0, 0),
"maketitle": ([], 0, 1, 0, 0),
"manpage": (["name", "section"], 0, 1, 0, 0),
"memberdesc": (["class", "name"], 1, 0, 1, 0),
"methoddesc": (["class", "name", ("args",)], 1, 0, 1, 0),
"methoddescni": (["class", "name", ("args",)], 1, 0, 1, 0),
"moduleauthor": (["name", "email"], 0, 1, 0, 0),
"opcodedesc": (["name", "var"], 0, 0, 1, 0),
"par": ([], 0, 1, 0, 0),
"paragraph": ([("title",)], 0, 0, 0, 0),
"renewcommand": (["macro"], 0, 0, 0, 0),
"rfc": (["number"], 0, 1, 0, 0),
"section": ([("title",)], 0, 0, 0, 0),
"sectionauthor": (["name", "email"], 0, 1, 0, 0),
"seemodule": (["ref", "name"], 1, 0, 0, 0),
"stindex": (["type"], 0, 1, 0, 0),
"subparagraph": ([("title",)], 0, 0, 0, 0),
"subsection": ([("title",)], 0, 0, 0, 0),
"subsubsection": ([("title",)], 0, 0, 0, 0),
"list": (["bullet", "init"], 0, 0, 1, 0),
"tableii": (["colspec", "style",
["entry"], ["entry"]], 0, 0, 1, 0),
"tableiii": (["colspec", "style",
["entry"], ["entry"], ["entry"]], 0, 0, 1, 0),
"tableiv": (["colspec", "style",
["entry"], ["entry"], ["entry"], ["entry"]], 0, 0, 1, 0),
"version": ([], 0, 1, 0, 0),
"versionadded": (["version"], 0, 1, 0, 0),
"versionchanged": (["version"], 0, 1, 0, 0),
"withsubitem": (["text"], 0, 0, 0, 0),
#
"ABC": ([], 0, 1, 0),
"ASCII": ([], 0, 1, 0),
"C": ([], 0, 1, 0),
"Cpp": ([], 0, 1, 0),
"EOF": ([], 0, 1, 0),
"e": ([], 0, 1, 0),
"ldots": ([], 0, 1, 0),
"NULL": ([], 0, 1, 0),
"POSIX": ([], 0, 1, 0),
"UNIX": ([], 0, 1, 0),
"ABC": ([], 0, 1, 0, 0),
"ASCII": ([], 0, 1, 0, 0),
"C": ([], 0, 1, 0, 0),
"Cpp": ([], 0, 1, 0, 0),
"EOF": ([], 0, 1, 0, 0),
"e": ([], 0, 1, 0, 0),
"ldots": ([], 0, 1, 0, 0),
"NULL": ([], 0, 1, 0, 0),
"POSIX": ([], 0, 1, 0, 0),
"UNIX": ([], 0, 1, 0, 0),
#
# Things that will actually be going away!
#
"fi": ([], 0, 1, 0),
"ifhtml": ([], 0, 1, 0),
"makeindex": ([], 0, 1, 0),
"makemodindex": ([], 0, 1, 0),
"maketitle": ([], 0, 1, 0),
"noindent": ([], 0, 1, 0),
"tableofcontents": ([], 0, 1, 0),
"fi": ([], 0, 1, 0, 0),
"ifhtml": ([], 0, 1, 0, 0),
"makeindex": ([], 0, 1, 0, 0),
"makemodindex": ([], 0, 1, 0, 0),
"maketitle": ([], 0, 1, 0, 0),
"noindent": ([], 0, 1, 0, 0),
"protect": ([], 0, 1, 0, 0),
"tableofcontents": ([], 0, 1, 0, 0),
},
discards=["fi", "ifhtml", "makeindex", "makemodindex", "maketitle",
"noindent", "tableofcontents"],