[GRASS-SVN] r59812 - in grass/branches/releasebranch_7_0: man tools
svn_grass at osgeo.org
svn_grass at osgeo.org
Sat Apr 19 11:38:08 PDT 2014
Author: martinl
Date: 2014-04-19 11:38:08 -0700 (Sat, 19 Apr 2014)
New Revision: 59812
Modified:
grass/branches/releasebranch_7_0/man/build_html.py
grass/branches/releasebranch_7_0/man/grassdocs.css
grass/branches/releasebranch_7_0/tools/mkhtml.py
Log:
Backport TOC manual generation from trunk
Modified: grass/branches/releasebranch_7_0/man/build_html.py
===================================================================
--- grass/branches/releasebranch_7_0/man/build_html.py 2014-04-19 18:33:48 UTC (rev 59811)
+++ grass/branches/releasebranch_7_0/man/build_html.py 2014-04-19 18:38:08 UTC (rev 59812)
@@ -48,7 +48,7 @@
header2_tmpl = string.Template(\
r""" <link rel="stylesheet" href="grassdocs.css" type="text/css">
</head>
-<body bgcolor="#FFFFFF">
+<body style="width: 99%">
<!-- this file is generated by man/build_html.py -->
@@ -249,7 +249,7 @@
r"""
<link rel="stylesheet" href="grassdocs.css" type="text/css">
</head>
-<body bgcolor="white">
+<body style="width: 99%">
<img src="grass_logo.png" alt="GRASS logo"><hr align=center size=6 noshade>
<h2>Topics</h2>
@@ -261,7 +261,7 @@
r"""
<link rel="stylesheet" href="grassdocs.css" type="text/css">
</head>
-<body bgcolor="white">
+<body style="width: 99%">
<img src="grass_logo.png" alt="GRASS logo"><hr align=center size=6 noshade>
<h2>Keywords - Index of GRASS GIS modules</h2>
Modified: grass/branches/releasebranch_7_0/man/grassdocs.css
===================================================================
--- grass/branches/releasebranch_7_0/man/grassdocs.css 2014-04-19 18:33:48 UTC (rev 59811)
+++ grass/branches/releasebranch_7_0/man/grassdocs.css 2014-04-19 18:38:08 UTC (rev 59812)
@@ -14,6 +14,7 @@
background: white;
color: black;
font-family: arial,sans-serif;
+ width: 80%;
}
h1{
@@ -49,7 +50,7 @@
}
div.code{
- width: 95%;
+ width: 100%;
color : black;
background-color: rgb(90%, 90%, 90%);
padding-left: 1em;
@@ -86,3 +87,32 @@
td {
padding: 5px;
}
+
+div.toc{
+ background-color: transparent;
+ position: fixed;
+ border: solid 1px rgb(25%, 60%, 25%);
+ top: 5px;
+ right: 5px;
+ width: 17%;
+ line-height: 120%;
+ font-weight: bold;
+ font-size: small;
+ font-family: arial,sans-serif;
+}
+
+li.toc {
+ margin-left: -15px;
+ padding: 3px 3px; 3px; 3px;
+ color: rgb(25%, 60%, 25%);
+}
+
+ul.toc {
+ margin-top: 3px;
+ margin-bottom: 3px;
+}
+
+a.toc {
+ color: rgb(25%, 60%, 25%);
+ text-decoration: none;
+}
Modified: grass/branches/releasebranch_7_0/tools/mkhtml.py
===================================================================
--- grass/branches/releasebranch_7_0/tools/mkhtml.py 2014-04-19 18:33:48 UTC (rev 59811)
+++ grass/branches/releasebranch_7_0/tools/mkhtml.py 2014-04-19 18:38:08 UTC (rev 59812)
@@ -2,12 +2,12 @@
############################################################################
#
-# MODULE: mkhtml.py
+# MODULE: Builds manual pages
# AUTHOR(S): Markus Neteler
# Glynn Clements
# Martin Landa <landa.martin gmail.com>
# PURPOSE: Create HTML manual page snippets
-# COPYRIGHT: (C) 2007, 2009, 2011-2012 by Glynn Clements
+# COPYRIGHT: (C) 2007-2014 by Glynn Clements
# and the GRASS Development Team
#
# This program is free software under the GNU General
@@ -21,6 +21,7 @@
import string
import re
from datetime import datetime
+from HTMLParser import HTMLParser
pgm = sys.argv[1]
@@ -61,6 +62,7 @@
</html>
""")
+
def read_file(name):
try:
f = open(name, 'rb')
@@ -70,11 +72,101 @@
except IOError:
return ""
+
+def create_toc(src_data):
+ class MyHTMLParser(HTMLParser):
+ def __init__(self):
+ self.reset()
+ self.idx = 1
+ self.tag_curr = ''
+ self.tag_last = ''
+ self.process_text = False
+ self.data = []
+ self.tags_allowed = ('h1', 'h2', 'h3')
+ self.tags_ignored = ('img')
+ self.text = ''
+
+ def handle_starttag(self, tag, attrs):
+ if tag in self.tags_allowed:
+ self.process_text = True
+ self.tag_last = self.tag_curr
+ self.tag_curr = tag
+
+ def handle_endtag(self, tag):
+ if tag in self.tags_allowed:
+ self.data.append((tag, '%s_%d' % (tag, self.idx),
+ self.text))
+ self.idx += 1
+ self.process_text = False
+ self.text = ''
+
+ self.tag_curr = self.tag_last
+
+ def handle_data(self, data):
+ if not self.process_text:
+ return
+ if self.tag_curr in self.tags_allowed or self.tag_curr in self.tags_ignored:
+ self.text += data
+ else:
+ self.text += '<%s>%s</%s>' % (self.tag_curr, data, self.tag_curr)
+
+ # instantiate the parser and fed it some HTML
+ parser = MyHTMLParser()
+ parser.feed(src_data)
+
+ return parser.data
+
+
+def write_toc(data):
+ if not data:
+ return
+
+ fd = sys.stdout
+ fd.write('<div class="toc">\n')
+ fd.write('<ul class="toc">\n')
+ first = True
+ in_h3 = False
+ indent = 4
+ for tag, href, text in data:
+ if tag == 'h3' and not in_h3:
+ fd.write('\n%s<ul class="toc">\n' % (' ' * indent))
+ indent += 4
+ in_h3 = True
+ elif not first:
+ fd.write('</li>\n')
+
+ if tag == 'h2' and in_h3:
+ indent -= 4
+ fd.write('%s</ul></li>\n' % (' ' * indent))
+ in_h3 = False
+
+ fd.write('%s<li class="toc"><a href="#%s" class="toc">%s</a>' % \
+ (' ' * indent, href, text))
+ first = False
+
+ fd.write('</li>\n</ul>\n')
+ fd.write('</div>\n')
+
+def update_toc(data):
+ ret_data = []
+ pat = re.compile(r'(<(h\d)>)(.+)(</h\d>)')
+ idx = 1
+ for line in data.splitlines():
+ if pat.search(line):
+ xline = pat.split(line)
+ line = xline[1] + '<a name="%s_%d">' % (xline[2], idx) + xline[3] + '</a>' + xline[4]
+ idx += 1
+ ret_data.append(line)
+
+ return '\n'.join(ret_data)
+
+# process header
src_data = read_file(src_file)
name = re.search('(<!-- meta page name:)(.*)(-->)', src_data, re.IGNORECASE)
if name:
pgm = name.group(2).strip().split('-', 1)[0].strip()
-desc = re.search('(<!-- meta page description:)(.*)(-->)', src_data, re.IGNORECASE)
+desc = re.search('(<!-- meta page description:)(.*)(-->)', src_data,
+ re.IGNORECASE)
if desc:
pgm = desc.group(2).strip()
header_tmpl = string.Template(header_base + header_nopgm)
@@ -84,14 +176,18 @@
if not re.search('<html>', src_data, re.IGNORECASE):
tmp_data = read_file(tmp_file)
if not re.search('<html>', tmp_data, re.IGNORECASE):
- sys.stdout.write(header_tmpl.substitute(PGM = pgm))
+ sys.stdout.write(header_tmpl.substitute(PGM=pgm))
if tmp_data:
for line in tmp_data.splitlines(True):
if not re.search('</body>|</html>', line, re.IGNORECASE):
sys.stdout.write(line)
-sys.stdout.write(src_data)
+# create TOC
+write_toc(create_toc(src_data))
+# process body
+sys.stdout.write(update_toc(src_data))
+
# if </html> is found, suppose a complete html is provided.
# otherwise, generate module class reference:
if re.search('</html>', src_data, re.IGNORECASE):
@@ -112,6 +208,7 @@
'v' : 'vector'
}
+# process footer
index = re.search('(<!-- meta page index:)(.*)(-->)', src_data, re.IGNORECASE)
if index:
index_name_cap = index_name = index.group(2).strip()
@@ -120,13 +217,16 @@
index_name = index_names.get(mod_class, '')
index_name_cap = index_name.title()
-grass_version = os.getenv("VERSION_NUMBER", "unknown")
+grass_version = os.getenv("VERSION_NUMBER", "unknown")
year = os.getenv("VERSION_DATE")
if not year:
year = str(datetime.now().year)
if index_name:
- sys.stdout.write(footer_index.substitute(INDEXNAME = index_name, INDEXNAMECAP = index_name_cap,
- YEAR = year, GRASS_VERSION = grass_version))
+ sys.stdout.write(footer_index.substitute(INDEXNAME=index_name,
+ INDEXNAMECAP=index_name_cap,
+ YEAR=year,
+ GRASS_VERSION=grass_version))
else:
- sys.stdout.write(footer_noindex.substitute(YEAR = year, GRASS_VERSION = grass_version))
+ sys.stdout.write(footer_noindex.substitute(YEAR=year,
+ GRASS_VERSION=grass_version))
More information about the grass-commit
mailing list