14479Sbinkertn@umich.edu#!/usr/local/bin/python
24479Sbinkertn@umich.edu
34479Sbinkertn@umich.edu###############################################################################
44479Sbinkertn@umich.edu# Takes a chapter as input and adds internal links and numbering to all
54479Sbinkertn@umich.edu# of the H1, H2, H3, H4 and H5 sections.
64479Sbinkertn@umich.edu#
74479Sbinkertn@umich.edu# Every heading HTML tag (H1, H2 etc) is given an autogenerated name to link
84479Sbinkertn@umich.edu# to. However, if the name is not an autogenerated name from a previous run,
94479Sbinkertn@umich.edu# it will be kept. If it is autogenerated, it might change on subsequent runs
104479Sbinkertn@umich.edu# of this program. Thus if you want to create links to one of the headings,
114479Sbinkertn@umich.edu# then change the heading link name to something that does not look like an
124479Sbinkertn@umich.edu# autogenerated link name.
134479Sbinkertn@umich.edu###############################################################################
144479Sbinkertn@umich.edu
154479Sbinkertn@umich.eduimport sys
164479Sbinkertn@umich.eduimport re
174479Sbinkertn@umich.eduimport string
184479Sbinkertn@umich.edu
194479Sbinkertn@umich.edu###############################################################################
204479Sbinkertn@umich.edu# Functions
214479Sbinkertn@umich.edu###############################################################################
224479Sbinkertn@umich.edu
234479Sbinkertn@umich.edu# Regexs for <a name="..."></a>
244479Sbinkertn@umich.edualink = re.compile(r"<a *name *= *\"(.*)\"></a>", re.IGNORECASE)
254479Sbinkertn@umich.eduheading = re.compile(r"(_nn\d)", re.IGNORECASE)
264479Sbinkertn@umich.edu
274479Sbinkertn@umich.edudef getheadingname(m):
284479Sbinkertn@umich.edu    autogeneratedheading = True;
294479Sbinkertn@umich.edu    if m.group(1) != None:
304479Sbinkertn@umich.edu        amatch = alink.match(m.group(1))
314479Sbinkertn@umich.edu        if amatch:
324479Sbinkertn@umich.edu            # A non-autogenerated heading - keep it
334479Sbinkertn@umich.edu            headingname = amatch.group(1)
344479Sbinkertn@umich.edu            autogeneratedheading = heading.match(headingname)
354479Sbinkertn@umich.edu    if autogeneratedheading:
364479Sbinkertn@umich.edu        # The heading name was either non-existent or autogenerated,
374479Sbinkertn@umich.edu        # We can create a new heading / change the existing heading
384479Sbinkertn@umich.edu        headingname = "%s_nn%d" % (filenamebase, nameindex)
394479Sbinkertn@umich.edu    return headingname
404479Sbinkertn@umich.edu
414479Sbinkertn@umich.edu###############################################################################
424479Sbinkertn@umich.edu# Main program
434479Sbinkertn@umich.edu###############################################################################
444479Sbinkertn@umich.edu
454479Sbinkertn@umich.eduif len(sys.argv) != 2:
464479Sbinkertn@umich.edu    print "usage: makedoc.py filename"
474479Sbinkertn@umich.edu    sys.exit(1)
484479Sbinkertn@umich.edu
494479Sbinkertn@umich.edufilename = sys.argv[1]
504479Sbinkertn@umich.edufilenamebase = string.split(filename,".")[0]
514479Sbinkertn@umich.edu
524479Sbinkertn@umich.edusection = 0
534479Sbinkertn@umich.edusubsection = 0
544479Sbinkertn@umich.edusubsubsection = 0
554479Sbinkertn@umich.edusubsubsubsection = 0
564479Sbinkertn@umich.edunameindex = 0
574479Sbinkertn@umich.edu
584479Sbinkertn@umich.eduname = ""
594479Sbinkertn@umich.edu
604479Sbinkertn@umich.edu# Regexs for <h1>,... <h5> sections
614479Sbinkertn@umich.edu
624479Sbinkertn@umich.eduh1 = re.compile(r".*?<H1>(<a.*a>)*[\d\.\s]*(.*?)</H1>", re.IGNORECASE)
634479Sbinkertn@umich.eduh2 = re.compile(r".*?<H2>(<a.*a>)*[\d\.\s]*(.*?)</H2>", re.IGNORECASE)
644479Sbinkertn@umich.eduh3 = re.compile(r".*?<H3>(<a.*a>)*[\d\.\s]*(.*?)</H3>", re.IGNORECASE)
654479Sbinkertn@umich.eduh4 = re.compile(r".*?<H4>(<a.*a>)*[\d\.\s]*(.*?)</H4>", re.IGNORECASE)
664479Sbinkertn@umich.eduh5 = re.compile(r".*?<H5>(<a.*a>)*[\d\.\s]*(.*?)</H5>", re.IGNORECASE)
674479Sbinkertn@umich.edu
684479Sbinkertn@umich.edudata = open(filename).read()            # Read data
694479Sbinkertn@umich.eduopen(filename+".bak","w").write(data)   # Make backup
704479Sbinkertn@umich.edu
714479Sbinkertn@umich.edulines = data.splitlines()
724479Sbinkertn@umich.eduresult = [ ] # This is the result of postprocessing the file
734479Sbinkertn@umich.eduindex = "<!-- INDEX -->\n<div class=\"sectiontoc\">\n" # index contains the index for adding at the top of the file. Also printed to stdout.
744479Sbinkertn@umich.edu
754479Sbinkertn@umich.eduskip = 0
764479Sbinkertn@umich.eduskipspace = 0
774479Sbinkertn@umich.edu
784479Sbinkertn@umich.edufor s in lines:
794479Sbinkertn@umich.edu    if s == "<!-- INDEX -->":
804479Sbinkertn@umich.edu        if not skip:
814479Sbinkertn@umich.edu            result.append("@INDEX@")
824479Sbinkertn@umich.edu            skip = 1
834479Sbinkertn@umich.edu        else:
844479Sbinkertn@umich.edu            skip = 0
854479Sbinkertn@umich.edu        continue;
864479Sbinkertn@umich.edu    if skip:
874479Sbinkertn@umich.edu        continue
884479Sbinkertn@umich.edu
894479Sbinkertn@umich.edu    if not s and skipspace:
904479Sbinkertn@umich.edu        continue
914479Sbinkertn@umich.edu
924479Sbinkertn@umich.edu    if skipspace:
934479Sbinkertn@umich.edu        result.append("")
944479Sbinkertn@umich.edu        result.append("")
954479Sbinkertn@umich.edu        skipspace = 0
966498Snate@binkert.org
974479Sbinkertn@umich.edu    m = h2.match(s)
984479Sbinkertn@umich.edu    if m:
994479Sbinkertn@umich.edu        prevheadingtext = m.group(2)
1004479Sbinkertn@umich.edu        nameindex += 1
1014479Sbinkertn@umich.edu        section += 1
1024479Sbinkertn@umich.edu        headingname = getheadingname(m)
1034479Sbinkertn@umich.edu        result.append("""<H2><a name="%s"></a>%d. %s</H2>""" % (headingname,section, prevheadingtext))
1044479Sbinkertn@umich.edu
1054479Sbinkertn@umich.edu        if subsubsubsection:
1064479Sbinkertn@umich.edu            index += "</ul>\n"
1074479Sbinkertn@umich.edu        if subsubsection:
1084479Sbinkertn@umich.edu            index += "</ul>\n"
1094479Sbinkertn@umich.edu        if subsection:
1104479Sbinkertn@umich.edu            index += "</ul>\n"
1114479Sbinkertn@umich.edu        if section == 1:
1124479Sbinkertn@umich.edu            index += "<ul>\n"
1134479Sbinkertn@umich.edu
1144479Sbinkertn@umich.edu        index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
1154479Sbinkertn@umich.edu        subsection = 0
1164479Sbinkertn@umich.edu        subsubsection = 0
1174479Sbinkertn@umich.edu        subsubsubsection = 0
1186498Snate@binkert.org        skipspace = 1
1194479Sbinkertn@umich.edu        continue
1204479Sbinkertn@umich.edu    m = h3.match(s)
1214479Sbinkertn@umich.edu    if m:
1224479Sbinkertn@umich.edu        prevheadingtext = m.group(2)
1234479Sbinkertn@umich.edu        nameindex += 1
1244479Sbinkertn@umich.edu        subsection += 1
1254479Sbinkertn@umich.edu        headingname = getheadingname(m)
1264479Sbinkertn@umich.edu        result.append("""<H3><a name="%s"></a>%d.%d %s</H3>""" % (headingname,section, subsection, prevheadingtext))
1274479Sbinkertn@umich.edu
1284479Sbinkertn@umich.edu        if subsubsubsection:
1294479Sbinkertn@umich.edu            index += "</ul>\n"
1304479Sbinkertn@umich.edu        if subsubsection:
1314479Sbinkertn@umich.edu            index += "</ul>\n"
1324479Sbinkertn@umich.edu        if subsection == 1:
1334479Sbinkertn@umich.edu            index += "<ul>\n"
1344479Sbinkertn@umich.edu
1354479Sbinkertn@umich.edu        index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
1364479Sbinkertn@umich.edu        subsubsection = 0
1376498Snate@binkert.org        skipspace = 1
1384479Sbinkertn@umich.edu        continue
1394479Sbinkertn@umich.edu    m = h4.match(s)
1404479Sbinkertn@umich.edu    if m:
1414479Sbinkertn@umich.edu        prevheadingtext = m.group(2)
1424479Sbinkertn@umich.edu        nameindex += 1
1434479Sbinkertn@umich.edu        subsubsection += 1
1444479Sbinkertn@umich.edu        subsubsubsection = 0
1454479Sbinkertn@umich.edu        headingname = getheadingname(m)
1464479Sbinkertn@umich.edu        result.append("""<H4><a name="%s"></a>%d.%d.%d %s</H4>""" % (headingname,section, subsection, subsubsection, prevheadingtext))
1474479Sbinkertn@umich.edu
1484479Sbinkertn@umich.edu        if subsubsubsection:
1494479Sbinkertn@umich.edu            index += "</ul>\n"
1504479Sbinkertn@umich.edu        if subsubsection == 1:
1514479Sbinkertn@umich.edu            index += "<ul>\n"
1524479Sbinkertn@umich.edu
1534479Sbinkertn@umich.edu        index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
1546498Snate@binkert.org        skipspace = 1
1554479Sbinkertn@umich.edu        continue
1564479Sbinkertn@umich.edu    m = h5.match(s)
1574479Sbinkertn@umich.edu    if m:
1584479Sbinkertn@umich.edu        prevheadingtext = m.group(2)
1594479Sbinkertn@umich.edu        nameindex += 1
1604479Sbinkertn@umich.edu        subsubsubsection += 1
1614479Sbinkertn@umich.edu        headingname = getheadingname(m)
1624479Sbinkertn@umich.edu        result.append("""<H5><a name="%s"></a>%d.%d.%d.%d %s</H5>""" % (headingname,section, subsection, subsubsection, subsubsubsection, prevheadingtext))
1634479Sbinkertn@umich.edu
1644479Sbinkertn@umich.edu        if subsubsubsection == 1:
1654479Sbinkertn@umich.edu            index += "<ul>\n"
1664479Sbinkertn@umich.edu
1674479Sbinkertn@umich.edu        index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
1684479Sbinkertn@umich.edu        skipspace = 1
1694479Sbinkertn@umich.edu        continue
1706498Snate@binkert.org
1714479Sbinkertn@umich.edu    result.append(s)
1724479Sbinkertn@umich.edu
1734479Sbinkertn@umich.eduif subsubsubsection:
1744479Sbinkertn@umich.edu    index += "</ul>\n"
1754479Sbinkertn@umich.edu
1764479Sbinkertn@umich.eduif subsubsection:
1774479Sbinkertn@umich.edu    index += "</ul>\n"
1784479Sbinkertn@umich.edu
1794479Sbinkertn@umich.eduif subsection:
1804479Sbinkertn@umich.edu    index += "</ul>\n"
1814479Sbinkertn@umich.edu
1824479Sbinkertn@umich.eduif section:
1834479Sbinkertn@umich.edu    index += "</ul>\n"
1844479Sbinkertn@umich.edu
1854479Sbinkertn@umich.eduindex += "</div>\n<!-- INDEX -->\n"
1864479Sbinkertn@umich.edu
1874479Sbinkertn@umich.edudata = "\n".join(result)
1884479Sbinkertn@umich.edu
1894479Sbinkertn@umich.edudata = data.replace("@INDEX@",index) + "\n";
1904479Sbinkertn@umich.edu
1914479Sbinkertn@umich.edu# Write the file back out
1924479Sbinkertn@umich.eduopen(filename,"w").write(data)
1934479Sbinkertn@umich.edu
1944479Sbinkertn@umich.edu
195