pydot: handle multiple dot images in one file

This commit is contained in:
Brian S. Stephan 2022-04-18 14:40:01 -05:00
parent 9a65dfffaf
commit 08305e26db
Signed by: bss
GPG Key ID: 3DE06D3180895FCB
4 changed files with 48 additions and 5 deletions

View File

@ -25,9 +25,12 @@ class InlinePydotPreprocessor(markdown.preprocessors.Preprocessor):
def run(self, lines):
"""Match and generate diagrams from dot code blocks."""
text = '\n'.join(lines)
for match in self.BLOCK_RE.finditer(text):
filename = match.group(1)
dot_string = match.group(2)
out = text
for block_match in self.BLOCK_RE.finditer(text):
filename = block_match.group(1)
dot_string = block_match.group(2)
logger.debug("matched markdown block: %s", dot_string)
logger.debug("match start/end: %s/%s", block_match.start(), block_match.end())
# use pydot to turn the text into pydot
graphs = pydot.graph_from_dot_data(dot_string)
@ -41,9 +44,9 @@ class InlinePydotPreprocessor(markdown.preprocessors.Preprocessor):
inline_image = f'![{filename}]({data_path})'
# replace the image in the output markdown
text = f'{text[:match.start()]}\n{inline_image}\n{text[match.end():]}'
out = out.replace(block_match.group(0), inline_image)
return text.split('\n')
return out.split('\n')
def makeExtension(*args, **kwargs):

View File

@ -29,6 +29,17 @@ def test_graphviz_is_rendered():
assert b'data:image/png;base64' in response.data
def test_two_graphviz_are_rendered():
"""Test two images are rendered."""
app = app_with_pydot()
client = app.test_client()
response = client.get('/test-two-graphviz')
assert response.status_code == 200
assert b'~~~pydot' not in response.data
assert b'data:image/png;base64' in response.data
def test_invalid_graphviz_is_not_rendered():
"""Check that invalid graphviz doesn't blow things up."""
app = app_with_pydot()

View File

@ -15,6 +15,10 @@ LOGGING = {
},
},
'loggers': {
'incorporealcms.mdx': {
'level': 'DEBUG',
'handlers': ['console'],
},
'incorporealcms.pages': {
'level': 'DEBUG',
'handlers': ['console'],

View File

@ -0,0 +1,25 @@
# test
test
~~~pydot:attack-plan
digraph G {
rankdir=LR
Earth
Mars
Earth -> Mars
}
~~~
more test
~~~pydot:new-attack-plan
digraph H {
rankdir=LR
Venus
Mars
Venus -> Mars
}
~~~
done