Update to generate valid html for the anchor names
Auto generated anchor names won't override a non auto generated anchor name, thereby making it possible to have anchor names that won't change should an extra heading be added earlier in the file git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6073 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
af3c049800
commit
7cb896a5f4
2 changed files with 88 additions and 26 deletions
|
|
@ -1,17 +1,53 @@
|
||||||
#!/usr/local/bin/python
|
#!/usr/local/bin/python
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
# Takes a chapter as input and adds internal links and numbering to all
|
# Takes a chapter as input and adds internal links and numbering to all
|
||||||
# of the h1, h2, h3, h4 sections and so forth.
|
# of the H1, H2, H3, H4 and H5 sections.
|
||||||
#
|
#
|
||||||
|
# Every heading HTML tag (H1, H2 etc) is given an autogenerated name to link
|
||||||
|
# to. However, if the name is not an autogenerated name from a previous run,
|
||||||
|
# it will be kept. If it is autogenerated, it might change on subsequent runs
|
||||||
|
# of this program. Thus if you want to create links to one of the headings,
|
||||||
|
# then change the heading link name to something that does not look like an
|
||||||
|
# autogenerated link name.
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import re
|
import re
|
||||||
|
import string
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Functions
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
# Regexs for <a name="..."></a>
|
||||||
|
alink = re.compile(r"<a *name *= *\"(.*)\"></a>", re.IGNORECASE)
|
||||||
|
heading = re.compile(r"(_nn\d)", re.IGNORECASE)
|
||||||
|
|
||||||
|
def getheadingname(m):
|
||||||
|
autogeneratedheading = True;
|
||||||
|
if m.group(1) != None:
|
||||||
|
amatch = alink.match(m.group(1))
|
||||||
|
if amatch:
|
||||||
|
# A non-autogenerated heading - keep it
|
||||||
|
headingname = amatch.group(1)
|
||||||
|
autogeneratedheading = heading.match(headingname)
|
||||||
|
if autogeneratedheading:
|
||||||
|
# The heading name was either non-existent or autogenerated,
|
||||||
|
# We can create a new heading / change the existing heading
|
||||||
|
headingname = "%s_nn%d" % (filenamebase, nameindex)
|
||||||
|
return headingname
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Main program
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
if len(sys.argv) != 3:
|
if len(sys.argv) != 3:
|
||||||
print "usage: makechap.py filename num"
|
print "usage: makechap.py filename num"
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
filename = sys.argv[1]
|
filename = sys.argv[1]
|
||||||
|
filenamebase = string.split(filename,".")[0]
|
||||||
num = int(sys.argv[2])
|
num = int(sys.argv[2])
|
||||||
|
|
||||||
section = 0
|
section = 0
|
||||||
|
|
@ -21,20 +57,20 @@ nameindex = 0
|
||||||
|
|
||||||
name = ""
|
name = ""
|
||||||
|
|
||||||
# Regexs for <h1>,... <h4> sections
|
# Regexs for <h1>,... <h5> sections
|
||||||
|
|
||||||
h1 = re.compile(r".*?<H1>[\d\.\s]*(.*?)</H1>", re.IGNORECASE)
|
h1 = re.compile(r".*?<H1>(<a.*a>)*[\d\.\s]*(.*?)</H1>", re.IGNORECASE)
|
||||||
h2 = re.compile(r".*?<H2>[\d\.\s]*(.*?)</H2>", re.IGNORECASE)
|
h2 = re.compile(r".*?<H2>(<a.*a>)*[\d\.\s]*(.*?)</H2>", re.IGNORECASE)
|
||||||
h3 = re.compile(r".*?<H3>[\d\.\s]*(.*?)</H3>", re.IGNORECASE)
|
h3 = re.compile(r".*?<H3>(<a.*a>)*[\d\.\s]*(.*?)</H3>", re.IGNORECASE)
|
||||||
h4 = re.compile(r".*?<H4>[\d\.\s]*(.*?)</H4>", re.IGNORECASE)
|
h4 = re.compile(r".*?<H4>(<a.*a>)*[\d\.\s]*(.*?)</H4>", re.IGNORECASE)
|
||||||
h5 = re.compile(r".*?<H5>[\d\.\s]*(.*?)</H5>", re.IGNORECASE)
|
h5 = re.compile(r".*?<H5>(<a.*a>)*[\d\.\s]*(.*?)</H5>", re.IGNORECASE)
|
||||||
|
|
||||||
data = open(filename).read() # Read data
|
data = open(filename).read() # Read data
|
||||||
open(filename+".bak","w").write(data) # Make backup
|
open(filename+".bak","w").write(data) # Make backup
|
||||||
|
|
||||||
lines = data.splitlines()
|
lines = data.splitlines()
|
||||||
result = [ ]
|
result = [ ] # This is the result of postprocessing the file
|
||||||
index = "<!-- INDEX -->\n<ul>\n"
|
index = "<!-- INDEX -->\n" # index contains the index for adding at the top of the file. Also printed to stdout.
|
||||||
|
|
||||||
skip = 0
|
skip = 0
|
||||||
skipspace = 0
|
skipspace = 0
|
||||||
|
|
@ -59,26 +95,36 @@ for s in lines:
|
||||||
|
|
||||||
m = h1.match(s)
|
m = h1.match(s)
|
||||||
if m:
|
if m:
|
||||||
|
prevheadingtext = m.group(2)
|
||||||
nameindex += 1
|
nameindex += 1
|
||||||
result.append("""<a name="n%d"></a><H1>%d %s</H1>""" % (nameindex,num,m.group(1)))
|
headingname = getheadingname(m)
|
||||||
|
result.append("""<H1><a name="%s"></a>%d %s</H1>""" % (headingname,num,prevheadingtext))
|
||||||
result.append("@INDEX@")
|
result.append("@INDEX@")
|
||||||
section = 0
|
section = 0
|
||||||
subsection = 0
|
subsection = 0
|
||||||
subsubsection = 0
|
subsubsection = 0
|
||||||
subsubsubsection = 0
|
subsubsubsection = 0
|
||||||
name = m.group(1)
|
name = prevheadingtext
|
||||||
skipspace = 1
|
skipspace = 1
|
||||||
continue
|
continue
|
||||||
m = h2.match(s)
|
m = h2.match(s)
|
||||||
if m:
|
if m:
|
||||||
|
prevheadingtext = m.group(2)
|
||||||
nameindex += 1
|
nameindex += 1
|
||||||
section += 1
|
section += 1
|
||||||
result.append("""<a name="n%d"></a><H2>%d.%d %s</H2>""" % (nameindex,num,section, m.group(1)))
|
headingname = getheadingname(m)
|
||||||
|
result.append("""<H2><a name="%s"></a>%d.%d %s</H2>""" % (headingname,num,section, prevheadingtext))
|
||||||
|
|
||||||
|
if subsubsubsection:
|
||||||
|
index += "</ul>\n"
|
||||||
if subsubsection:
|
if subsubsection:
|
||||||
index += "</ul>\n"
|
index += "</ul>\n"
|
||||||
if subsection:
|
if subsection:
|
||||||
index += "</ul>\n"
|
index += "</ul>\n"
|
||||||
index += """<li><a href="#n%d">%s</a>\n""" % (nameindex,m.group(1))
|
if section == 1:
|
||||||
|
index += "<ul>\n"
|
||||||
|
|
||||||
|
index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
|
||||||
subsection = 0
|
subsection = 0
|
||||||
subsubsection = 0
|
subsubsection = 0
|
||||||
subsubsubsection = 0
|
subsubsubsection = 0
|
||||||
|
|
@ -86,41 +132,60 @@ for s in lines:
|
||||||
continue
|
continue
|
||||||
m = h3.match(s)
|
m = h3.match(s)
|
||||||
if m:
|
if m:
|
||||||
|
prevheadingtext = m.group(2)
|
||||||
nameindex += 1
|
nameindex += 1
|
||||||
subsection += 1
|
subsection += 1
|
||||||
result.append("""<a name="n%d"></a><H3>%d.%d.%d %s</H3>""" % (nameindex,num,section, subsection, m.group(1)))
|
headingname = getheadingname(m)
|
||||||
|
result.append("""<H3><a name="%s"></a>%d.%d.%d %s</H3>""" % (headingname,num,section, subsection, prevheadingtext))
|
||||||
|
|
||||||
|
if subsubsubsection:
|
||||||
|
index += "</ul>\n"
|
||||||
if subsubsection:
|
if subsubsection:
|
||||||
index += "</ul>\n"
|
index += "</ul>\n"
|
||||||
|
|
||||||
if subsection == 1:
|
if subsection == 1:
|
||||||
index += "<ul>\n"
|
index += "<ul>\n"
|
||||||
index += """<li><a href="#n%d">%s</a>\n""" % (nameindex,m.group(1))
|
|
||||||
|
|
||||||
|
index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
|
||||||
subsubsection = 0
|
subsubsection = 0
|
||||||
skipspace = 1
|
skipspace = 1
|
||||||
continue
|
continue
|
||||||
m = h4.match(s)
|
m = h4.match(s)
|
||||||
if m:
|
if m:
|
||||||
|
prevheadingtext = m.group(2)
|
||||||
nameindex += 1
|
nameindex += 1
|
||||||
subsubsection += 1
|
subsubsection += 1
|
||||||
subsubsubsection = 0
|
subsubsubsection = 0
|
||||||
result.append("""<a name="n%d"></a><H4>%d.%d.%d.%d %s</H4>""" % (nameindex,num,section, subsection, subsubsection, m.group(1)))
|
headingname = getheadingname(m)
|
||||||
|
result.append("""<H4><a name="%s"></a>%d.%d.%d.%d %s</H4>""" % (headingname,num,section, subsection, subsubsection, prevheadingtext))
|
||||||
|
|
||||||
|
if subsubsubsection:
|
||||||
|
index += "</ul>\n"
|
||||||
if subsubsection == 1:
|
if subsubsection == 1:
|
||||||
index += "<ul>\n"
|
index += "<ul>\n"
|
||||||
index += """<li><a href="#n%d">%s</a>\n""" % (nameindex,m.group(1))
|
|
||||||
|
index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
|
||||||
skipspace = 1
|
skipspace = 1
|
||||||
continue
|
continue
|
||||||
m = h5.match(s)
|
m = h5.match(s)
|
||||||
if m:
|
if m:
|
||||||
|
prevheadingtext = m.group(2)
|
||||||
nameindex += 1
|
nameindex += 1
|
||||||
subsubsubsection += 1
|
subsubsubsection += 1
|
||||||
result.append("""<a name="n%d"></a><H5>%d.%d.%d.%d.%d %s</H5>""" % (nameindex,num,second,subsection,subsubsection,subsubsubsection, m.group(1)))
|
headingname = getheadingname(m)
|
||||||
|
result.append("""<H5><a name="%s"></a>%d.%d.%d.%d.%d %s</H5>""" % (headingname,num,section, subsection, subsubsection, subsubsubsection, prevheadingtext))
|
||||||
|
|
||||||
|
if subsubsubsection == 1:
|
||||||
|
index += "<ul>\n"
|
||||||
|
|
||||||
|
index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
|
||||||
skipspace = 1
|
skipspace = 1
|
||||||
continue
|
continue
|
||||||
|
|
||||||
result.append(s)
|
result.append(s)
|
||||||
|
|
||||||
|
if subsubsubsection:
|
||||||
|
index += "</ul>\n"
|
||||||
|
|
||||||
if subsubsection:
|
if subsubsection:
|
||||||
index += "</ul>\n"
|
index += "</ul>\n"
|
||||||
|
|
||||||
|
|
@ -139,12 +204,9 @@ data = data.replace("@INDEX@",index) + "\n";
|
||||||
# Write the file back out
|
# Write the file back out
|
||||||
open(filename,"w").write(data)
|
open(filename,"w").write(data)
|
||||||
|
|
||||||
# Print the TOC data
|
# Print the TOC data to stdout correcting the anchor links for external referencing
|
||||||
|
|
||||||
index = index.replace("#n","%s#n" % filename)
|
index = index.replace("<li><a href=\"#","<li><a href=\"%s#" % filename)
|
||||||
print """<h3><a href="%s">%d %s</a></h3>\n""" % (filename,num,name)
|
print """<h3><a href="%s#%s">%d %s</a></h3>\n""" % (filename,filenamebase,num,name)
|
||||||
print index
|
print index
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ print >>f, """
|
||||||
|
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
num = 0
|
num = 1
|
||||||
|
|
||||||
for c in chs:
|
for c in chs:
|
||||||
c = c.strip()
|
c = c.strip()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue