def render_svg_image(self, node):
        from abjad.tools import abjadbooktools
        # Get all file and path parts.
        image_layout_specifier = node.get('image_layout_specifier', None)
        if image_layout_specifier is None:
            image_layout_specifier = abjadbooktools.ImageLayoutSpecifier()
        image_render_specifier = node.get('image_render_specifier', None)
        if image_render_specifier is None:
            image_render_specifier = abjadbooktools.ImageRenderSpecifier()
        pages = image_layout_specifier.pages

        target_extension = '.svg'
        file_base_name = SphinxDocumentHandler.get_file_base_name(
            node, image_render_specifier)
        source_extension = SphinxDocumentHandler.get_source_extension(node)
        file_name_pattern = '{}*{}'.format(file_base_name, target_extension)
        absolute_directory_path, relative_directory_path = \
            SphinxDocumentHandler.get_image_directory_paths(self)
        relative_source_file_path = posixpath.join(
            relative_directory_path,
            file_base_name + source_extension,
        )

        # Check for pre-existing target(s).
        target_file_paths, found_all_pages = \
            SphinxDocumentHandler.find_target_file_paths(
                absolute_directory_path, relative_directory_path,
                file_name_pattern, pages)
        if found_all_pages:
            return (relative_source_file_path, target_file_paths)

        # Write and render source to target(s).
        source_file_name = file_base_name + source_extension
        absolute_source_file_path = os.path.join(absolute_directory_path,
                                                 source_file_name)
        target_file_name = file_base_name + target_extension
        absolute_target_file_path = os.path.join(absolute_directory_path,
                                                 target_file_name)
        SphinxDocumentHandler.write_image_source(self, node,
                                                 absolute_source_file_path)
        return_code = SphinxDocumentHandler.interpret_image_source(
            self,
            node,
            absolute_source_file_path,
            absolute_target_file_path,
            file_format='svg')
        if return_code:
            return (relative_directory_path, [])

        # Check for target(s).
        target_file_paths, found_all_pages = \
            SphinxDocumentHandler.find_target_file_paths(
                absolute_directory_path, relative_directory_path,
                file_name_pattern, pages)
        if not found_all_pages:
            return (relative_source_file_path, target_file_paths)

        # Target(s) must exist, so simply return.
        return (relative_source_file_path, target_file_paths)
 def visit_abjad_output_block_html(self, node):
     from abjad.tools import abjadbooktools
     image_layout_specifier = node.get('image_layout_specifier', None)
     if image_layout_specifier is None:
         image_layout_specifier = abjadbooktools.ImageLayoutSpecifier()
     image_render_specifier = node.get('image_render_specifier', None)
     if image_render_specifier is None:
         image_render_specifier = abjadbooktools.ImageRenderSpecifier()
     if node['renderer'] not in ('graphviz', 'lilypond'):
         raise nodes.SkipNode
     absolute_image_directory_path = os.path.join(
         self.builder.outdir,
         self.builder.imagedir,
         'abjadbook',
     )
     if not os.path.exists(absolute_image_directory_path):
         os.makedirs(absolute_image_directory_path)
     try:
         if node['renderer'] == 'graphviz':
             relative_source_file_path, relative_target_file_paths = \
                 SphinxDocumentHandler.render_svg_image(self, node)
         else:
             relative_source_file_path, relative_target_file_paths = \
                 SphinxDocumentHandler.render_png_image(self, node)
         if image_layout_specifier.with_thumbnail:
             for relative_target_file_path in relative_target_file_paths:
                 self.builder.thumbnails.add_file(
                     '', relative_target_file_path)
         css_classes = set(node.get('cls', '').split())
         template = SphinxDocumentHandler._basic_template
         if image_layout_specifier.with_thumbnail:
             css_classes.add('thumbnail')
             template = SphinxDocumentHandler._thumbnail_template
         if image_layout_specifier.with_columns:
             css_classes.add('table-cell')
             stop = len(relative_target_file_paths)
             step = image_layout_specifier.with_columns
             for i in range(0, stop, step):
                 self.body.append(
                     SphinxDocumentHandler._table_row_open_template)
                 paths = relative_target_file_paths[i:i + step]
                 for relative_target_file_path in paths:
                     prefix, suffix = os.path.splitext(
                         relative_target_file_path)
                     if suffix == '.svg':
                         thumbnail_path = relative_target_file_path
                     else:
                         thumbnail_path = '{}-thumbnail{}'.format(
                             prefix, suffix)
                     result = template.format(
                         alt='',
                         cls=' '.join(sorted(css_classes)),
                         group='group-{}'.format(
                             os.path.basename(relative_source_file_path)),
                         source_path=relative_source_file_path,
                         target_path=relative_target_file_path,
                         title='',
                         thumbnail_path=thumbnail_path,
                     )
                     result = stringtools.normalize(result)
                     result = ('    ' + _ for _ in result.splitlines())
                     result = '\n'.join(result)
                     self.body.append(result)
                 self.body.append(
                     SphinxDocumentHandler._table_row_close_template)
         else:
             css_classes.add('abjadbook')
             for relative_target_file_path in relative_target_file_paths:
                 prefix, suffix = os.path.splitext(
                     relative_target_file_path)
                 if suffix == '.svg':
                     thumbnail_path = relative_target_file_path
                 else:
                     thumbnail_path = '{}-thumbnail{}'.format(
                         prefix, suffix)
                 result = template.format(
                     alt='',
                     cls=' '.join(sorted(css_classes)),
                     group='group-{}'.format(
                         os.path.basename(relative_source_file_path)),
                     source_path=relative_source_file_path,
                     target_path=relative_target_file_path,
                     title='',
                     thumbnail_path=thumbnail_path,
                 )
                 result = stringtools.normalize(result)
                 self.body.append(result)
     except:
         traceback.print_exc()
     raise nodes.SkipNode