Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PlantUML Support #236

Open
JonTheBurger opened this issue Mar 22, 2023 · 1 comment
Open

PlantUML Support #236

JonTheBurger opened this issue Mar 22, 2023 · 1 comment

Comments

@JonTheBurger
Copy link

Currently, m.css skips plantuml diagrams with the following message: "ignoring <plantuml> in desc". It looks like some manual workarounds are already required for doxygen limitations, and we have a similar case here. I wrote a quick and dirty snippet that seemed to work at least in the simple case. Is PlantUML similar to the following something you would be interested in accepting upstream? I would be willing to help out with this.

diff --git a/documentation/doxygen.py b/documentation/doxygen.py
index 2d5a6f9..3ed9613 100755
--- a/documentation/doxygen.py
+++ b/documentation/doxygen.py
@@ -1083,6 +1083,54 @@ def parse_desc_internal(state: State, element: ET.Element, immediate_parent: ET.
                     out.parsed += '<img class="m-image{}" src="{}" alt="Image"{} />'.format(
                         ' ' + add_css_class if add_css_class else '', name, sizespec)
 
+        elif i.tag == 'plantuml':
+            import shutil
+            import uuid
+
+            java_home = os.environ.get('JAVA_HOME')
+            if java_home:
+                java_home = os.path.join(java_home, '/bin/')
+            java = shutil.which('java', path=java_home)
+            if not os.path.exists(java):
+                logging.warning('PlantUML failed; Could not find java. Please set environment variable JAVA_HOME or add java to your PATH.')
+                continue
+
+            jar = state.doxyfile.get('PLANTUML_JAR_PATH')
+            print(state.doxyfile)
+            if not os.path.exists(jar):
+                logging.warning('PlantUML failed; Please set PLANTUML_JAR_PATH in your Doxyfile.')
+                continue
+
+            has_block_elements = True
+
+            dot_path = state.doxyfile.get('DOT_PATH')
+            plantuml_config = state.doxyfile.get('PLANTUML_CFG_FILE')
+            plantuml_includes = state.doxyfile.get('PLANTUML_INCLUDE_PATH')
+            name = str(uuid.uuid4())
+            out_path = os.path.join(state.basedir, state.doxyfile['OUTPUT_DIRECTORY'], state.doxyfile['XML_OUTPUT'])
+            img_path = os.path.join(out_path, name + '.png')
+            uml_path = os.path.join(out_path, name + '.uml')
+            with open(uml_path, 'w', encoding='utf-8') as uml:
+                uml.write('@startuml\n' + i.text + '\n@enduml\n')
+
+            plantuml_cmd = [java]
+            if plantuml_includes:
+                plantuml_cmd += ['-Dplantuml.include.path="' + os.pathsep.join(plantuml_includes) + '"']
+            plantuml_cmd += ['-jar', jar]
+            if plantuml_config:
+                plantuml_cmd += ['-config', plantuml_config]
+            if dot_path:
+                plantuml_cmd += ['-graphvizdot', dot_path]
+            plantuml_cmd += [uml_path]
+
+            print(plantuml_cmd)
+            logging.debug('running {}'.format(' '.join(plantuml_cmd)))
+            subprocess.run(plantuml_cmd, cwd=out_path, check=True)
+
+            state.images += [img_path]
+            out.parsed += '<img class="m-image{}" src="{}" alt="Image" />'.format(
+                ' ' + add_css_class if add_css_class else '', name + '.png')
+
         elif i.tag in ['dot', 'dotfile']:
             assert element.tag in ['para', '{http://mcss.mosra.cz/doxygen/}div']
             has_block_elements = True
@@ -3635,6 +3683,10 @@ def parse_doxyfile(state: State, doxyfile, values = None):
 
         ('DOT_FONTNAME', None, str),
         ('DOT_FONTSIZE', None, int),
+        ('DOT_PATH', None, str),
+        ('PLANTUML_CFG_FILE', None, str),
+        ('PLANTUML_JAR_PATH', None, str),
+        ('PLANTUML_INCLUDE_PATH', None, list),
         ('CREATE_SUBDIRS', None, bool), # processing fails below if this is set
         ('JAVADOC_AUTOBRIEF', None, bool),
         ('QT_AUTOBRIEF', None, bool),
@mathisloge
Copy link

I would love that feature

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants