pydot: handle multiple dot images in one file
This commit is contained in:
parent
9a65dfffaf
commit
08305e26db
|
@ -25,9 +25,12 @@ class InlinePydotPreprocessor(markdown.preprocessors.Preprocessor):
|
||||||
def run(self, lines):
|
def run(self, lines):
|
||||||
"""Match and generate diagrams from dot code blocks."""
|
"""Match and generate diagrams from dot code blocks."""
|
||||||
text = '\n'.join(lines)
|
text = '\n'.join(lines)
|
||||||
for match in self.BLOCK_RE.finditer(text):
|
out = text
|
||||||
filename = match.group(1)
|
for block_match in self.BLOCK_RE.finditer(text):
|
||||||
dot_string = match.group(2)
|
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
|
# use pydot to turn the text into pydot
|
||||||
graphs = pydot.graph_from_dot_data(dot_string)
|
graphs = pydot.graph_from_dot_data(dot_string)
|
||||||
|
@ -41,9 +44,9 @@ class InlinePydotPreprocessor(markdown.preprocessors.Preprocessor):
|
||||||
inline_image = f'![{filename}]({data_path})'
|
inline_image = f'![{filename}]({data_path})'
|
||||||
|
|
||||||
# replace the image in the output markdown
|
# 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):
|
def makeExtension(*args, **kwargs):
|
||||||
|
|
|
@ -29,6 +29,17 @@ def test_graphviz_is_rendered():
|
||||||
assert b'data:image/png;base64' in response.data
|
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():
|
def test_invalid_graphviz_is_not_rendered():
|
||||||
"""Check that invalid graphviz doesn't blow things up."""
|
"""Check that invalid graphviz doesn't blow things up."""
|
||||||
app = app_with_pydot()
|
app = app_with_pydot()
|
||||||
|
|
|
@ -15,6 +15,10 @@ LOGGING = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
'loggers': {
|
'loggers': {
|
||||||
|
'incorporealcms.mdx': {
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'handlers': ['console'],
|
||||||
|
},
|
||||||
'incorporealcms.pages': {
|
'incorporealcms.pages': {
|
||||||
'level': 'DEBUG',
|
'level': 'DEBUG',
|
||||||
'handlers': ['console'],
|
'handlers': ['console'],
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue