/ext/ply/doc/makedoc.py
Python | 194 lines | 150 code | 21 blank | 23 comment | 11 complexity | 25f67fd4fc4d9feab13e0cba89390bc6 MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.1, WTFPL
- #!/usr/local/bin/python
- ###############################################################################
- # Takes a chapter as input and adds internal links and numbering to all
- # of the H1, H2, H3, H4 and H5 sections.
- #
- # Every heading HTML tag (H1, H2 etc) is given an autogenerated name to link
- # to. However, if the name is not an autogenerated name from a previous run,
- # it will be kept. If it is autogenerated, it might change on subsequent runs
- # of this program. Thus if you want to create links to one of the headings,
- # then change the heading link name to something that does not look like an
- # autogenerated link name.
- ###############################################################################
- import sys
- import re
- import string
- ###############################################################################
- # Functions
- ###############################################################################
- # Regexs for <a name="..."></a>
- alink = re.compile(r"<a *name *= *\"(.*)\"></a>", re.IGNORECASE)
- heading = re.compile(r"(_nn\d)", re.IGNORECASE)
- def getheadingname(m):
- autogeneratedheading = True;
- if m.group(1) != None:
- amatch = alink.match(m.group(1))
- if amatch:
- # A non-autogenerated heading - keep it
- headingname = amatch.group(1)
- autogeneratedheading = heading.match(headingname)
- if autogeneratedheading:
- # The heading name was either non-existent or autogenerated,
- # We can create a new heading / change the existing heading
- headingname = "%s_nn%d" % (filenamebase, nameindex)
- return headingname
- ###############################################################################
- # Main program
- ###############################################################################
- if len(sys.argv) != 2:
- print "usage: makedoc.py filename"
- sys.exit(1)
- filename = sys.argv[1]
- filenamebase = string.split(filename,".")[0]
- section = 0
- subsection = 0
- subsubsection = 0
- subsubsubsection = 0
- nameindex = 0
- name = ""
- # Regexs for <h1>,... <h5> sections
- h1 = re.compile(r".*?<H1>(<a.*a>)*[\d\.\s]*(.*?)</H1>", re.IGNORECASE)
- h2 = re.compile(r".*?<H2>(<a.*a>)*[\d\.\s]*(.*?)</H2>", re.IGNORECASE)
- h3 = re.compile(r".*?<H3>(<a.*a>)*[\d\.\s]*(.*?)</H3>", re.IGNORECASE)
- h4 = re.compile(r".*?<H4>(<a.*a>)*[\d\.\s]*(.*?)</H4>", re.IGNORECASE)
- h5 = re.compile(r".*?<H5>(<a.*a>)*[\d\.\s]*(.*?)</H5>", re.IGNORECASE)
- data = open(filename).read() # Read data
- open(filename+".bak","w").write(data) # Make backup
- lines = data.splitlines()
- result = [ ] # This is the result of postprocessing the file
- index = "<!-- INDEX -->\n<div class=\"sectiontoc\">\n" # index contains the index for adding at the top of the file. Also printed to stdout.
- skip = 0
- skipspace = 0
- for s in lines:
- if s == "<!-- INDEX -->":
- if not skip:
- result.append("@INDEX@")
- skip = 1
- else:
- skip = 0
- continue;
- if skip:
- continue
- if not s and skipspace:
- continue
- if skipspace:
- result.append("")
- result.append("")
- skipspace = 0
-
- m = h2.match(s)
- if m:
- prevheadingtext = m.group(2)
- nameindex += 1
- section += 1
- headingname = getheadingname(m)
- result.append("""<H2><a name="%s"></a>%d. %s</H2>""" % (headingname,section, prevheadingtext))
- if subsubsubsection:
- index += "</ul>\n"
- if subsubsection:
- index += "</ul>\n"
- if subsection:
- index += "</ul>\n"
- if section == 1:
- index += "<ul>\n"
- index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
- subsection = 0
- subsubsection = 0
- subsubsubsection = 0
- skipspace = 1
- continue
- m = h3.match(s)
- if m:
- prevheadingtext = m.group(2)
- nameindex += 1
- subsection += 1
- headingname = getheadingname(m)
- result.append("""<H3><a name="%s"></a>%d.%d %s</H3>""" % (headingname,section, subsection, prevheadingtext))
- if subsubsubsection:
- index += "</ul>\n"
- if subsubsection:
- index += "</ul>\n"
- if subsection == 1:
- index += "<ul>\n"
- index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
- subsubsection = 0
- skipspace = 1
- continue
- m = h4.match(s)
- if m:
- prevheadingtext = m.group(2)
- nameindex += 1
- subsubsection += 1
- subsubsubsection = 0
- headingname = getheadingname(m)
- result.append("""<H4><a name="%s"></a>%d.%d.%d %s</H4>""" % (headingname,section, subsection, subsubsection, prevheadingtext))
- if subsubsubsection:
- index += "</ul>\n"
- if subsubsection == 1:
- index += "<ul>\n"
- index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
- skipspace = 1
- continue
- m = h5.match(s)
- if m:
- prevheadingtext = m.group(2)
- nameindex += 1
- subsubsubsection += 1
- headingname = getheadingname(m)
- result.append("""<H5><a name="%s"></a>%d.%d.%d.%d %s</H5>""" % (headingname,section, subsection, subsubsection, subsubsubsection, prevheadingtext))
- if subsubsubsection == 1:
- index += "<ul>\n"
- index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
- skipspace = 1
- continue
-
- result.append(s)
- if subsubsubsection:
- index += "</ul>\n"
- if subsubsection:
- index += "</ul>\n"
- if subsection:
- index += "</ul>\n"
- if section:
- index += "</ul>\n"
- index += "</div>\n<!-- INDEX -->\n"
- data = "\n".join(result)
- data = data.replace("@INDEX@",index) + "\n";
- # Write the file back out
- open(filename,"w").write(data)