Martin, I'm not sure if this [59812] is appropriate because it is not stabilized yet [59816] and overall, it is a new feature although it is just in documentation.
https://trac.osgeo.org/grass/changeset/59812 https://trac.osgeo.org/grass/changeset/59816 On Sat, Apr 19, 2014 at 2:38 PM, <[email protected]> wrote: > 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)) > > _______________________________________________ > grass-commit mailing list > [email protected] > http://lists.osgeo.org/mailman/listinfo/grass-commit >
_______________________________________________ grass-dev mailing list [email protected] http://lists.osgeo.org/mailman/listinfo/grass-dev
