diff --git a/autodoc/autodoc.py b/autodoc/autodoc.py index e69d790..fb1cdeb 100644 --- a/autodoc/autodoc.py +++ b/autodoc/autodoc.py @@ -7,6 +7,7 @@ from datetime import datetime import common as doc from doc_state import * +from doc_state_machine import doc_state_machine def __doc_app_state__(state, tab=" │ "): @@ -20,7 +21,7 @@ def __doc_app_state__(state, tab=" │ "): def __doc_application__(label, app): - mdapp = f'\n## Real-time application "{label[1:]}"\n\n' + mdapp = f'\n## Real-time application: "{label[1:]}"\n\n' mdapp += f"Below are descrbed the states and threads of the real-time application {label[1:]}.\n" mdapp += "\n" @@ -44,7 +45,7 @@ def __doc_application__(label, app): mdapp += "```\n" for label, obj in states.items(): if label[0] == "+": - mdapp += f'\n### State "{label[1:]}"\n' + mdapp += f'\n### State: "{label[1:]}"\n' mdapp += doc_state(label, obj, app) return mdapp @@ -71,7 +72,8 @@ def document(fname, args, config): if obj["Class"] == "RealTimeApplication": mddoc += __doc_application__(label, obj) if obj["Class"] == "StateMachine": - mddoc += f'\n## State-Machine "{label[1:]}"' + mddoc += f'\n## State-Machine: "{label[1:]}"\n' + mddoc += doc_state_machine(label[1:], obj) fpath = os.path.join(doc.path(), f"{fname}.md") outpath = os.path.join(doc.path(), fname) logging.info(f"Saving markdown: {fpath}") @@ -79,7 +81,7 @@ def document(fname, args, config): file.write(mddoc) logging.info(f"Generating html: {outpath}.html") os.system( - f"pandoc --css styling.css --resource-path={doc.path()} --embed-resource --to html5 -s {fpath} -o {outpath}.html" + f"pandoc --css pandoc/styling.css --resource-path={doc.path()} --embed-resource --to html5 -s {fpath} -o {outpath}.html" ) logging.info(f"Generating pdf: {outpath}.pdf") os.system( diff --git a/autodoc/doc_state.py b/autodoc/doc_state.py index 5710ecf..de2aa4b 100644 --- a/autodoc/doc_state.py +++ b/autodoc/doc_state.py @@ -575,7 +575,7 @@ def __simple_edges__(edges, datasources): def __state_simple_graph__(label, state, app): graph = f"digraph {label[1:]}" + "{\n" graph += "rankdir = LR;\n" - graph += 'node [shape=rect, style="rounded, filled", fillcolor=white];\n' + graph += 'node [shape=rect, style="filled", fillcolor=white];\n' graph += f"label={label[1:]}>;\n" graph += "fontsize=40;\n" graph += "\n" diff --git a/autodoc/doc_state_machine.py b/autodoc/doc_state_machine.py new file mode 100644 index 0000000..2d45e91 --- /dev/null +++ b/autodoc/doc_state_machine.py @@ -0,0 +1,44 @@ +""" +State machine documentation. +""" + +import logging +import os + +import common + + +def doc_state_machine(name, obj): + """Document state machine.""" + graph = f"digraph {name}" + "{\n" + graph += "rankdir = LR;\n" + # graph += "layout = circo;\n" + graph += 'node [shape=egg, style="filled"];\n' + first = True + for key in obj: + if key[0] == "+": + state = key[1:] + ids = common.format_name(state) + graph += f" {ids} [label=<{state}>" + if first: + graph += ", fillcolor=lightblue" + first = False + graph += "];\n" + + for x, y in obj[key].items(): + if x[0] == "+": + for a, b in y.items(): + if a == "NextState": + graph += ( + f" {ids} -> {common.format_name(b)}[label={x[1:]}];\n" + ) + graph += "\n}" + gpath = os.path.join(common.path(), name) + logging.info(f"Saving state machine graph: {gpath}.dot") + with open(gpath + ".dot", "w") as f: + f.write(graph) + + logging.info(f"Converting state machine graph: {gpath}.svg") + os.system(f"dot -Tsvg -o{gpath}.svg {gpath}.dot") + + return f"![{name}]({name}.svg)" + "{width=90%}\n"