[GRASS-dev] [GRASS-SVN] r59812 - in grass/branches/releasebranch_7_0: man tools

Vaclav Petras wenzeslaus at gmail.com
Sat Apr 19 13:55:05 PDT 2014


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, <svn_grass at osgeo.org> 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
> grass-commit at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/grass-commit
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/grass-dev/attachments/20140419/8f5d7da7/attachment-0001.html>


More information about the grass-dev mailing list