| # Copyright 2016 The Bazel Authors. All rights reserved. | 
 | # | 
 | # Licensed under the Apache License, Version 2.0 (the "License"); | 
 | # you may not use this file except in compliance with the License. | 
 | # You may obtain a copy of the License at | 
 | # | 
 | #    http://www.apache.org/licenses/LICENSE-2.0 | 
 | # | 
 | # Unless required by applicable law or agreed to in writing, software | 
 | # distributed under the License is distributed on an "AS IS" BASIS, | 
 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | # See the License for the specific language governing permissions and | 
 | # limitations under the License. | 
 | """Graphviz documentation converter library.""" | 
 |  | 
 | import fileinput | 
 | import re | 
 | import subprocess | 
 | import sys | 
 |  | 
 |  | 
 | class DotConverter(object): | 
 |   """Converts dot graphs to SVG format inline.""" | 
 |  | 
 |   def __init__(self, dot_command, dot_env): | 
 |     self.dot_command = dot_command | 
 |     self.dot_env = dot_env | 
 |  | 
 |   def convert(self): | 
 |     collect = False | 
 |     graph = b"" | 
 |     block_num = 0 | 
 |  | 
 |     for line in fileinput.input(): | 
 |       if re.search(r"div class='graphviz dot'><!--", line): | 
 |         collect = True | 
 |         continue | 
 |       elif collect and re.search(r"--></div>", line): | 
 |         dot = subprocess.Popen( | 
 |             self.dot_command, | 
 |             stdin=subprocess.PIPE, stdout=subprocess.PIPE, env=self.dot_env) | 
 |         output = dot.communicate(graph)[0].decode() | 
 |         if dot.returncode == 0: | 
 |           # cut the first few lines (svg header + comments) | 
 |           sys.stdout.write(output.split("\n", 6)[6]) | 
 |         else: | 
 |           sys.stderr.write("inlining block %d failed.\n" % (block_num + 1)) | 
 |         collect = False | 
 |         graph = b"" | 
 |         block_num += 1 | 
 |         continue | 
 |  | 
 |       if collect: | 
 |         graph += str.encode(line) | 
 |       else: | 
 |         sys.stdout.write(line) |