#!/usr/bin/env python # -*- coding: utf-8 -*- """ Galleria directive """ import uuid import json from docutils import nodes from docutils.parsers.rst import Directive import docutils.parsers.rst.directives as directives from sphinx.writers.html import HTMLTranslator from sphinx.writers.latex import LaTeXTranslator from sphinx.writers.texinfo import TexinfoTranslator from sphinx.writers.text import TextTranslator from sphinx.writers.manpage import ManualPageTranslator from sphinx.util.osutil import relative_uri from sphinx.locale import __ class galleria(nodes.General, nodes.Element): pass def html_visit_galleria(self: HTMLTranslator, node: galleria) -> None: galleria_id = 'galleria-%s' % uuid.uuid4() self.body.append( "
" % ( galleria_id, node['class'] + ' align-%s' % node['options']['align'], node['options']['width'], node['options']['height'], ) ) if len(node['images']) > 0: self.body.append("
") self.body.append("%s" % ( node['images'][0]['image'], node['images'][0]['title'], node['images'][0]['alt'] )) self.body.append('
') self.body.append( "
" % ( galleria_id, json.dumps(node['options']), json.dumps(node['images']) ) ) raise nodes.SkipNode def latex_visit_galleria(self: LaTeXTranslator, node: galleria) -> None: for image in node['images']: self.body.append('[%s]' % image['alt']) raise nodes.SkipNode def texinfo_visit_galleria(self: TexinfoTranslator, node: galleria) -> None: for image in node['images']: self.body.append('[%s]' % image['alt']) raise nodes.SkipNode def text_visit_galleria(self: TextTranslator, node: galleria) -> None: for image in node['images']: self.body.append('[%s]' % image['alt']) raise nodes.SkipNode def gemini_visit_galleria(self, node: galleria) -> None: for image in node['images']: self.body.append('=> %s %s' % (image['path'], image['alt'])) raise nodes.SkipNode def man_visit_galleria(self: ManualPageTranslator, node: galleria) -> None: if 'alt' in node.attributes: self.body.append('[%s]' % node['alt']) raise nodes.SkipNode def align_choices(argument): return directives.choice(argument, ('left', 'right', 'center')) class GalleriaDirective(Directive): has_content = False required_arguments = 1 final_argument_whitespace = True option_spec = { "class": directives.class_option, "galleria": directives.unchanged, "alt": directives.unchanged, "title": directives.unchanged, "thumbsize": directives.unchanged, "transition": directives.unchanged, 'width': directives.length_or_percentage_or_unitless, 'height': directives.length_or_unitless, 'align': align_choices, 'hide_title': directives.flag, 'hide_alt': directives.flag, } def run(self): source = self.state.document.settings._source document = self.state.document if not document.hasattr('galleria_nodes'): document.galleria_nodes = {} if source not in document.galleria_nodes: document.galleria_nodes[source] = {} galleria_name = self.options.get('galleria') or uuid.uuid4() created = False if galleria_name in document.galleria_nodes[source]: node = document.galleria_nodes[source][galleria_name] else: node = galleria() node['class'] = 'galleria' node['options'] = { 'transition': 'fade', 'label_prev': __('Previous'), 'label_next': __('Next'), 'label_close': __('Close'), 'label_thumbnail': __('Thumbnail, click to enlarge'), } node['images'] = [] document.galleria_nodes[source][galleria_name] = node created = True if self.options.get('class'): node['class'] = self.options['class'] if self.options.get('transition'): node['options']['transition'] = self.options['transition'] node['options']["width"] = self.options.get('width') or 'auto' node['options']["height"] = self.options.get('height') or 'auto' node['options']["align"] = self.options.get('align') or 'center' images_path = self.arguments for path in images_path: image = {} image["alt"] = self.options.get('alt') image["title"] = self.options.get('title') image["thumbsize"] = self.options.get('thumbsize') or '100x100' image["hide_alt"] = bool(self.options.get('hide_alt')) image["hide_title"] = bool(self.options.get('hide_title')) image["image"] = path node['images'].append(image) if created: return [node] return []