cscg24-lolpython

CSCG 2024 Challenge 'Can I Haz Lolpython?'
git clone https://git.sinitax.com/sinitax/cscg24-lolpython
Log | Files | Refs | sfeed.txt

makedoc.py (5862B)


      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
     15import sys
     16import re
     17import string
     18
     19###############################################################################
     20# Functions
     21###############################################################################
     22
     23# Regexs for <a name="..."></a>
     24alink = re.compile(r"<a *name *= *\"(.*)\"></a>", re.IGNORECASE)
     25heading = re.compile(r"(_nn\d)", re.IGNORECASE)
     26
     27def 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
     45if len(sys.argv) != 2:
     46    print "usage: makedoc.py filename"
     47    sys.exit(1)
     48
     49filename = sys.argv[1]
     50filenamebase = string.split(filename,".")[0]
     51
     52section = 0
     53subsection = 0
     54subsubsection = 0
     55subsubsubsection = 0
     56nameindex = 0
     57
     58name = ""
     59
     60# Regexs for <h1>,... <h5> sections
     61
     62h1 = re.compile(r".*?<H1>(<a.*a>)*[\d\.\s]*(.*?)</H1>", re.IGNORECASE)
     63h2 = re.compile(r".*?<H2>(<a.*a>)*[\d\.\s]*(.*?)</H2>", re.IGNORECASE)
     64h3 = re.compile(r".*?<H3>(<a.*a>)*[\d\.\s]*(.*?)</H3>", re.IGNORECASE)
     65h4 = re.compile(r".*?<H4>(<a.*a>)*[\d\.\s]*(.*?)</H4>", re.IGNORECASE)
     66h5 = re.compile(r".*?<H5>(<a.*a>)*[\d\.\s]*(.*?)</H5>", re.IGNORECASE)
     67
     68data = open(filename).read()            # Read data
     69open(filename+".bak","w").write(data)   # Make backup
     70
     71lines = data.splitlines()
     72result = [ ] # This is the result of postprocessing the file
     73index = "<!-- INDEX -->\n<div class=\"sectiontoc\">\n" # index contains the index for adding at the top of the file. Also printed to stdout.
     74
     75skip = 0
     76skipspace = 0
     77
     78for 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
    173if subsubsubsection:
    174    index += "</ul>\n"
    175
    176if subsubsection:
    177    index += "</ul>\n"
    178
    179if subsection:
    180    index += "</ul>\n"
    181
    182if section:
    183    index += "</ul>\n"
    184
    185index += "</div>\n<!-- INDEX -->\n"
    186
    187data = "\n".join(result)
    188
    189data = data.replace("@INDEX@",index) + "\n";
    190
    191# Write the file back out
    192open(filename,"w").write(data)
    193
    194