#!/usr/bin/env python3 # -*- coding: utf-8 -*- ############################################################################ # # MODULE: build_graphical_index # AUTHOR(S): Vaclav Petras # 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 = """\
GRASS logo

GRASS GIS manual gallery

""" 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(''.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('') write_html_footer(output, "index.html", year) if __name__ == '__main__': main()