How can we use plantuml UML tool in iPython notebook? It should helpful for us since UML figure is frequently used during paper work.
After some google from internet, I have found one excellent reference for Using Asymptote in iPython notebook, then I have created a plantuml extension for iPython notebook. Below is detail steps:
Start iPython notebook from my working directory.e.g:$HOME/workshop.
# cd $HOME/workshop
# ipython notebook --pylab inline
Create a extension script at $HOME/workshop.e.g:plantuml.py
"""
An Plantuml extension for generating UML figures from within ipython notebook.
"""
import os
from IPython.core.magic import magics_class, cell_magic, Magics
from IPython.display import Image, SVG
@magics_class
class Plantuml(Magics):
@cell_magic
def plantuml(self, line, cell):
"""Generate and display a figure using Plantuml.
Usage:
%java -jar plantuml.jar -tsvg filname
"""
self.filename = line
self.code = cell
with open(self.filename + ".plt", "w") as file:
file.write(self.code)
os.system("java -jar plantuml.jar -tsvg %s.plt" % self.filename)
return SVG(filename=self.filename+".svg")
def load_ipython_extension(ipython):
ipython.register_magics(Plantuml)
Download plantuml.jar from official website to $HOME/workshop.
Create a new iPython notebook,run below cell to load extension and use the extension:
%install_ext plantuml.py
%reload_ext plantuml
Create a plantuml cell to test the result.
%%plantuml figure1
@startuml
Alice -> Bob: Authentication Request
Bob --> Alice: Authentication Response
@enduml
Then,everything from plantuml will work within iPython notebook.
Some questions are:
Plantuml UML tool in iPython notebook is a great idea!
Instead of adding the jar, you can also use the web service. You can get the error message this way.
Based on the javascript API, I wrote a small python encoder to send strings to the plantUML server.
Now, the extension looks like this
import urllib
import plantumlencoder
from IPython.core.magic import magics_class, cell_magic, Magics
from IPython.display import Image, SVG
@magics_class
class Plantuml(Magics):
@cell_magic
def plantuml(self, line, cell):
self.filename = line
self.code = ""
for line in cell.split('\n'):
newline = line.strip()
if newline:
self.code += newline + '\n'
uri = "http://www.plantuml.com/plantuml/svg/" + plantumlencoder.compress(self.code)
urllib.urlretrieve(uri, self.filename)
return SVG(filename=self.filename)
def load_ipython_extension(ipython):
ipython.register_magics(Plantuml)
To use other image formats you can change the URL, and the image code. For example : This extension produces png
import urllib
import plantumlencoder
from IPython.core.magic import magics_class, cell_magic, Magics
from IPython.display import Image, PNG
@magics_class
class Plantuml(Magics):
@cell_magic
def plantuml(self, line, cell):
self.filename = line
self.code = ""
for line in cell.split('\n'):
newline = line.strip()
if newline:
self.code += newline + '\n'
uri = "http://www.plantuml.com/plantuml/png/" + plantumlencoder.compress(self.code)
urllib.urlretrieve(uri, self.filename)
return PNG(filename=self.filename)
def load_ipython_extension(ipython):
ipython.register_magics(Plantuml)