118 lines
4 KiB
Python
118 lines
4 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
Galleria image collector
|
|
"""
|
|
|
|
import os
|
|
import glob
|
|
import logging
|
|
from copy import copy
|
|
from typing import Set
|
|
from sphinx.environment.collectors import EnvironmentCollector
|
|
from docutils import nodes
|
|
from sphinx.application import Sphinx
|
|
from sphinx.environment import BuildEnvironment
|
|
from sphinx.util import FilenameUniqDict
|
|
from sphinx.locale import __
|
|
|
|
from .directive import galleria
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class GalleriaCollector(EnvironmentCollector):
|
|
""" Collect images for galleria """
|
|
|
|
def clear_doc(
|
|
self, app: Sphinx, env: BuildEnvironment, docname: str) -> None:
|
|
|
|
if not hasattr(env, 'galleria'):
|
|
env.galleria = FilenameUniqDict()
|
|
|
|
if not hasattr(env, 'galleriathumbs'):
|
|
env.galleriathumbs = FilenameUniqDict()
|
|
|
|
env.galleria.purge_doc(docname)
|
|
env.galleriathumbs.purge_doc(docname)
|
|
|
|
def merge_other(
|
|
self, app: Sphinx, env: BuildEnvironment,
|
|
docnames: Set[str], other: BuildEnvironment) -> None:
|
|
|
|
if not hasattr(env, 'galleria'):
|
|
env.galleria = FilenameUniqDict()
|
|
if not hasattr(other, 'galleria'):
|
|
other.galleria = FilenameUniqDict()
|
|
|
|
if not hasattr(env, 'galleriathumbs'):
|
|
env.galleriathumbs = FilenameUniqDict()
|
|
if not hasattr(other, 'galleriathumbs'):
|
|
other.galleriathumbs = FilenameUniqDict()
|
|
|
|
env.galleria.merge_other(docnames, other.galleria)
|
|
env.galleriathumbs.merge_other(docnames, other.galleria)
|
|
|
|
def process_doc(self, app: Sphinx, doctree: nodes.document) -> None:
|
|
|
|
if not hasattr(app.env, 'galleria'):
|
|
app.env.galleria = FilenameUniqDict()
|
|
docname = app.env.docname
|
|
|
|
for node in doctree.traverse(galleria):
|
|
images = []
|
|
for imageglob in node['images']:
|
|
thumbsize = imageglob['thumbsize']
|
|
size_array = []
|
|
try:
|
|
for size in thumbsize.split('x'):
|
|
size_array.append(int(size))
|
|
except ValueError:
|
|
logger.error(
|
|
__('thumbsize %s is invalid (use 100x120 format)'),
|
|
thumbsize)
|
|
raise
|
|
|
|
del imageglob['thumbsize']
|
|
glob_path = os.path.join(
|
|
os.path.dirname(node.source),
|
|
imageglob['path']
|
|
)
|
|
|
|
for image_path in glob.glob(glob_path):
|
|
app.env.galleria.add_file(docname, image_path)
|
|
|
|
basename, ext = os.path.splitext(image_path)
|
|
thumb_path = basename + ".thumb-" + thumbsize + ext
|
|
thumb_path_cropped = basename + ".thumb-" + thumbsize
|
|
thumb_path_cropped += '.png'
|
|
if ext.lower() in ('.svg', '.svgz'):
|
|
thumb_path_cropped = image_path
|
|
thumb_path = image_path
|
|
|
|
jsonimage = copy(imageglob)
|
|
jsonimage['thumbsize'] = size_array
|
|
jsonimage['thumb'] = os.path.relpath(
|
|
thumb_path_cropped,
|
|
app.env.srcdir)
|
|
jsonimage['path'] = os.path.relpath(
|
|
image_path,
|
|
app.env.srcdir
|
|
)
|
|
images.append(jsonimage)
|
|
|
|
app.env.dependencies[docname].add(image_path)
|
|
app.env.dependencies[docname].add(thumb_path_cropped)
|
|
if not os.access(
|
|
os.path.join(
|
|
app.srcdir,
|
|
image_path), os.R_OK):
|
|
logger.warning(
|
|
__('image file not readable %s') %
|
|
image_path)
|
|
|
|
app.env.galleria.add_file(docname, image_path)
|
|
app.env.galleriathumbs.add_file(docname, thumb_path)
|
|
|
|
node['images'] = images
|