123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- ############################################################################
- #
- # MODULE: build_graphical_index
- # AUTHOR(S): Vaclav Petras <wenzeslaus gmail com>
- # PURPOSE: Build index gallery from images from all HTML files
- # COPYRIGHT: (C) 2015 by Vaclav Petras and the GRASS Development Team
- #
- # This program is free software under the GNU General Public
- # License (>=v2). Read the file COPYING that comes with GRASS
- # for details.
- #
- #############################################################################
- import os
- import sys
- import fnmatch
- import re
- from build_html import write_html_footer, grass_version, header1_tmpl
- output_name = 'manual_gallery.html'
- img_extensions = ['png', 'jpg', 'gif']
- img_patterns = ['*.' + extension for extension in img_extensions]
- # we don't want some images to show up
- # logos
- img_blacklist = ['grass_logo.png', 'grass_icon.png']
- # circles with numbers from helptext.html (unfortunate we have to list it here)
- # perhaps some general name ending would be good, like *_noindex.png
- img_blacklist.extend(['circle_{0}.png'.format(num) for num in range(1, 6)])
- year = os.getenv("VERSION_DATE")
- # other similar strings are in a different file
- # TODO: all HTML manual building needs refactoring (perhaps grass.tools?)
- header_graphical_index_tmpl = """\
- <link rel="stylesheet" href="grassdocs.css" type="text/css">
- <style>
- .img-list {
- list-style-type: none;
- margin: 0;
- padding: 0;
- text-align: center;
- }
- .img-list li {
- display: inline-block;
- position: relative;
- width: 7em;
- margin: 0;
- padding: 0.5em;
- }
- .img-list li:hover {
- background-color: #eee;
- }
- .img-list li img {
- float: left;
- max-width: 100%;
- background: white;
- }
- .img-list li span {
- text-align: center;
- }
- .img-list li a {
- color: initial;
- text-decoration: none;
- }
- .img-list li .name {
- margin: 0.1em;
- display: block;
- color: #409940;
- font-weight: normal;
- font-style: italic;
- font-size: 80%;
- }
- </style>
- </head>
- <body style="width: 99%">
- <div id="container">
- <a href="index.html"><img src="grass_logo.png" alt="GRASS logo"></a>
- <hr class="header">
- <h2>GRASS GIS manual gallery</h2>
- """
- def img_in_html(filename, imagename):
- # for some reason, calling search just once is much faster
- # than calling it on every line (time is spent in _compile)
- pattern = re.compile('<img .*src=.{0}.*>'.format(imagename))
- with open(filename) as file:
- if re.search(pattern, file.read()):
- return True
- return False
- def file_matches(filename, patterns):
- for pattern in patterns:
- if fnmatch.fnmatch(filename, pattern):
- return True
- return False
- def get_files(directory, patterns, exclude_patterns):
- files = []
- for filename in sorted(os.listdir(directory)):
- if file_matches(filename, patterns):
- if not file_matches(filename, exclude_patterns):
- files.append(filename)
- return files
- def remove_module_name(string, module):
- string = string.replace(module.replace('wxGUI.', 'g.gui.'), '')
- string = string.replace(module.replace('.', '_'), '') # using _
- string = string.replace(module.replace('.', ''), '') # using nothing
- string = string.replace(module, '') # using original dots
- return string
- def title_from_names(module_name, img_name):
- # we ignore the possibility of having extension at the end of image
- # so possibly r.out.png fails but image name should use _ anyway
- # strictly speaking, it could be also, e.g., index name
- for extension in img_extensions:
- img_name = img_name.replace('.' + extension, '')
- img_name = remove_module_name(img_name, module_name)
- img_name = img_name.replace('_', ' ')
- img_name = img_name.strip()
- if img_name:
- return "{name} ({desc})".format(name=module_name, desc=img_name)
- else:
- return "{name}".format(name=module_name)
- def get_module_name(filename):
- return filename.replace('.html', '')
- def main():
- html_dir = sys.argv[1]
- html_files = get_files(html_dir, ['*.html'],
- exclude_patterns=[output_name, '*_graphical.html', 'graphical_index.html'])
- img_html_files = {}
- for filename in os.listdir(html_dir):
- if filename in img_blacklist:
- continue
- if file_matches(filename, img_patterns):
- for html_file in html_files:
- if img_in_html(os.path.join(html_dir, html_file), filename):
- img_html_files[filename] = html_file
- # for now suppose one image per html
- with open(os.path.join(html_dir, output_name), 'w') as output:
- output.write(header1_tmpl.substitute(title="GRASS GIS %s Reference "
- "Manual: Manual gallery" % grass_version))
- output.write(header_graphical_index_tmpl)
- output.write('<ul class="img-list">\n')
- for image, html_file in sorted(img_html_files.items()):
- name = get_module_name(html_file)
- title = title_from_names(name, image)
- output.write(
- '<li>'
- '<a href="{html}" title="{title}">'
- '<img src="{img}">'
- '<span class="name">{name}</span>'
- '</a>'
- '</li>\n'
- .format(html=html_file, img=image, title=title, name=name))
- output.write('</ul>')
- write_html_footer(output, "index.html", year)
- if __name__ == '__main__':
- main()
|