1 #!/usr/local/bin/python 2 3 ############################################################################### 4 # Takes a chapter as input and adds internal links and numbering to all 5 # of the H1, H2, H3, H4 and H5 sections. 6 # 7 # Every heading HTML tag (H1, H2 etc) is given an autogenerated name to link 8 # to. However, if the name is not an autogenerated name from a previous run, 9 # it will be kept. If it is autogenerated, it might change on subsequent runs 10 # of this program. Thus if you want to create links to one of the headings, 11 # then change the heading link name to something that does not look like an 12 # autogenerated link name. 13 ############################################################################### 14 15 import sys 16 import re 17 import string 18 19 ############################################################################### 20 # Functions 21 ############################################################################### 22 23 # Regexs for <a name="..."></a> 24 alink = re.compile(r"<a *name *= *\"(.*)\"></a>", re.IGNORECASE) 25 heading = re.compile(r"(_nn\d)", re.IGNORECASE) 26 27 def getheadingname(m): 28 autogeneratedheading = True; 29 if m.group(1) != None: 30 amatch = alink.match(m.group(1)) 31 if amatch: 32 # A non-autogenerated heading - keep it 33 headingname = amatch.group(1) 34 autogeneratedheading = heading.match(headingname) 35 if autogeneratedheading: 36 # The heading name was either non-existent or autogenerated, 37 # We can create a new heading / change the existing heading 38 headingname = "%s_nn%d" % (filenamebase, nameindex) 39 return headingname 40 41 ############################################################################### 42 # Main program 43 ############################################################################### 44 45 if len(sys.argv) != 2: 46 print "usage: makedoc.py filename" 47 sys.exit(1) 48 49 filename = sys.argv[1] 50 filenamebase = string.split(filename,".")[0] 51 52 section = 0 53 subsection = 0 54 subsubsection = 0 55 subsubsubsection = 0 56 nameindex = 0 57 58 name = "" 59 60 # Regexs for <h1>,... <h5> sections 61 62 h1 = re.compile(r".*?<H1>(<a.*a>)*[\d\.\s]*(.*?)</H1>", re.IGNORECASE) 63 h2 = re.compile(r".*?<H2>(<a.*a>)*[\d\.\s]*(.*?)</H2>", re.IGNORECASE) 64 h3 = re.compile(r".*?<H3>(<a.*a>)*[\d\.\s]*(.*?)</H3>", re.IGNORECASE) 65 h4 = re.compile(r".*?<H4>(<a.*a>)*[\d\.\s]*(.*?)</H4>", re.IGNORECASE) 66 h5 = re.compile(r".*?<H5>(<a.*a>)*[\d\.\s]*(.*?)</H5>", re.IGNORECASE) 67 68 data = open(filename).read() # Read data 69 open(filename+".bak","w").write(data) # Make backup 70 71 lines = data.splitlines() 72 result = [ ] # This is the result of postprocessing the file 73 index = "<!-- INDEX -->\n<div class=\"sectiontoc\">\n" # index contains the index for adding at the top of the file. Also printed to stdout. 74 75 skip = 0 76 skipspace = 0 77 78 for s in lines: 79 if s == "<!-- INDEX -->": 80 if not skip: 81 result.append("@INDEX@") 82 skip = 1 83 else: 84 skip = 0 85 continue; 86 if skip: 87 continue 88 89 if not s and skipspace: 90 continue 91 92 if skipspace: 93 result.append("") 94 result.append("") 95 skipspace = 0 96 97 m = h2.match(s) 98 if m: 99 prevheadingtext = m.group(2) 100 nameindex += 1 101 section += 1 102 headingname = getheadingname(m) 103 result.append("""<H2><a name="%s"></a>%d. %s</H2>""" % (headingname,section, prevheadingtext)) 104 105 if subsubsubsection: 106 index += "</ul>\n" 107 if subsubsection: 108 index += "</ul>\n" 109 if subsection: 110 index += "</ul>\n" 111 if section == 1: 112 index += "<ul>\n" 113 114 index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext) 115 subsection = 0 116 subsubsection = 0 117 subsubsubsection = 0 118 skipspace = 1 119 continue 120 m = h3.match(s) 121 if m: 122 prevheadingtext = m.group(2) 123 nameindex += 1 124 subsection += 1 125 headingname = getheadingname(m) 126 result.append("""<H3><a name="%s"></a>%d.%d %s</H3>""" % (headingname,section, subsection, prevheadingtext)) 127 128 if subsubsubsection: 129 index += "</ul>\n" 130 if subsubsection: 131 index += "</ul>\n" 132 if subsection == 1: 133 index += "<ul>\n" 134 135 index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext) 136 subsubsection = 0 137 skipspace = 1 138 continue 139 m = h4.match(s) 140 if m: 141 prevheadingtext = m.group(2) 142 nameindex += 1 143 subsubsection += 1 144 subsubsubsection = 0 145 headingname = getheadingname(m) 146 result.append("""<H4><a name="%s"></a>%d.%d.%d %s</H4>""" % (headingname,section, subsection, subsubsection, prevheadingtext)) 147 148 if subsubsubsection: 149 index += "</ul>\n" 150 if subsubsection == 1: 151 index += "<ul>\n" 152 153 index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext) 154 skipspace = 1 155 continue 156 m = h5.match(s) 157 if m: 158 prevheadingtext = m.group(2) 159 nameindex += 1 160 subsubsubsection += 1 161 headingname = getheadingname(m) 162 result.append("""<H5><a name="%s"></a>%d.%d.%d.%d %s</H5>""" % (headingname,section, subsection, subsubsection, subsubsubsection, prevheadingtext)) 163 164 if subsubsubsection == 1: 165 index += "<ul>\n" 166 167 index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext) 168 skipspace = 1 169 continue 170 171 result.append(s) 172 173 if subsubsubsection: 174 index += "</ul>\n" 175 176 if subsubsection: 177 index += "</ul>\n" 178 179 if subsection: 180 index += "</ul>\n" 181 182 if section: 183 index += "</ul>\n" 184 185 index += "</div>\n<!-- INDEX -->\n" 186 187 data = "\n".join(result) 188 189 data = data.replace("@INDEX@",index) + "\n"; 190 191 # Write the file back out 192 open(filename,"w").write(data) 193 194 195