Home | History | Annotate | Download | only in doc
      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