1#!/usr/bin/env python3 2 3# Protocol Buffers - Google's data interchange format 4# Copyright 2023 Google LLC. All rights reserved. 5# https://developers.google.com/protocol-buffers/ 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions are 9# met: 10# 11# * Redistributions of source code must retain the above copyright 12# notice, this list of conditions and the following disclaimer. 13# * Redistributions in binary form must reproduce the above 14# copyright notice, this list of conditions and the following disclaimer 15# in the documentation and/or other materials provided with the 16# distribution. 17# * Neither the name of Google LLC nor the names of its 18# contributors may be used to endorse or promote products derived from 19# this software without specific prior written permission. 20# 21# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 33import subprocess 34import sys 35import shutil 36import os 37 38if len(sys.argv) < 2: 39 print("Must pass a filename argument") 40 sys.exit(1) 41 42in_filename = sys.argv[1] 43out_filename = in_filename.replace(".in.md", ".md") 44out_dir = in_filename.replace(".in.md", "") 45 46if in_filename == out_filename: 47 print("File must end in .in.md") 48 sys.exit(1) 49 50if os.path.isdir(out_dir): 51 shutil.rmtree(out_dir) 52 53os.mkdir(out_dir) 54file_num = 1 55 56with open(out_filename, "wb") as out_file, open(in_filename, "rb") as in_file: 57 for line in in_file: 58 if line.startswith(b"```dot"): 59 dot_lines = [] 60 while True: 61 dot_line = next(in_file) 62 if dot_line == b"```\n": 63 break 64 dot_lines.append(dot_line) 65 dot_input = b"".join(dot_lines) 66 svg_filename = out_dir + "/" + str(file_num) + ".svg" 67 svg = subprocess.check_output(['dot', '-Tsvg', '-o', svg_filename], input=dot_input) 68 out_file.write(b"<div align=center>\n") 69 out_file.write(b"<img src='%s'/>\n" % (svg_filename.encode('utf-8'))) 70 out_file.write(b"</div>\n") 71 file_num += 1 72 else: 73 out_file.write(line) 74