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