DEV Community

Jorge
Jorge

Posted on • Originally published at jorge.aguilera.soy on

Introducción a Asciidoc y Asciidoctor (5): diagramas

| | Este post es la continuación a intro-asciidoctor-4.html |

| | Yo utilizo sistemas Linux por lo que los comando que indico para instalar software estan orientados a este.Si tienes interés en saber cómo hacerlo en Windows, escribeme y lo investigaré |

Objetivo

En este post veremos cómo crear diferentes tipos de diagramas usando sólo un editor de texto.

Los tipos de diagramas son variados y de diferentes ámbitos como:

  • Diagramas de clases, relaciones, actividades, etc tipicos de UML

  • Diagramas de arquitectura software

  • Diagramas Gant para organización de proyectos, tareas, equipos, etc

  • Representación de componentes UI (textbox, listbox, buttons, checks, etc)

  • Gramatica, para representar partes de una sintaxis por ejemplo

  • Otros

Requisitos

El primer requisito que necesitamos es tener instalado asciidoctor, tal como se ha explicadoen los post anteriores de esta serie.

| | Para este post vamos a usar asciidoctorj |

$sdk man install asciidoctorj

La instalacion de asciidoctorj incluye por defecto el segundo requisito que necesitaremos para dotar a nuestros documentosde diagramas, asciidoctor-diagram

En caso de que estés usando la versión ruby deberás instalar la gema correspondiente:

$ gem install asciidoctor-diagram

En realidad asciidoctor_diagram por si mismo NO genera ningun diagrama, sino que podriamos decir que es el "pegamento"entre asciidoctor y los diferentes generadores de diagramas. En la página oficial podemos ver los tipos soportados:

The extensions supports the AsciiToSVG, BlockDiag (BlockDiag, SeqDiag, ActDiag, NwDiag),Ditaa, Erd, GraphViz, Mermaid, Msc, PlantUML, Shaape, SvgBob, Syntrax, UMLet, Vega,Vega-Lite and WaveDrom syntax.
Enter fullscreen mode Exit fullscreen mode

| | Esta lista no es exclusiva, pudiendo incorporar nuevos interpretes gracias al modelo de extensionesde Asciidoctor. Yo mismo he hecho alguna extension en Java y es realmente fácil |

Si utilizamos el método indicado anteriormente para la instalación de Asciidoctor (AsciidoctorJ) tendremos incluidospor defecto los diagramas Ditaa y PlantUML (tal vez algun otro) asi que si vamos a usar algun otro tipo tendremos quetener instalado el ejecutable correspondiente.

De forma generica, y como consejo, yo siempre instalo Graphviz puesto que muchos de estos generadores lo usan

$sudo apt-get install graphviz

Mermaid

Si por ejemplo queremos generar diagramas usando Mermaid tendremos que ejecutar:

$ npm install -g mermaid.cli

o si usamos yarn

$ yarn global add mermaid.cli

Syntrax

Por su parte, syntrax esta desarrollado en python por lo que tendremos que tener instalado este software y ejecutar

$pip install --upgrade syntrax

| | Efectivamente, como has podido adivinar te toca conocer la sintaxis de cada generador que quieras utilizar.Asciidoctor-diagram solo sirve como puente entre tu documento y el generador |

Sintaxis

La potencia de poder adjuntar a nuestra documentacion diagramas definidos en formato texto es inmensa, pudiendo aprovechartodas las caracteristicas propias de la filosofía "doc-as-code", es decir, crear y manejar nuestra documentación igualque lo hacemos con el código: editores de texto, versionable, mergear ramas, aprovaciones, despliegues continuos, etc

Include implícito

Asi pues la sintaxis para definir un diagrama a lo largo de nuestra documentación consiste simplemente en crear unbloque donde se especifique el tipo de diagrama que vamos a usar e incluir el cuerpo del diagrama dentro del mismo:

Por ejemplo:

Este parrafo es parte de nuestra documentacion, donde queremos poner a continuacion un diagrama de clases

plantuml::fichero_mi_diagrama.txt[]
Enter fullscreen mode Exit fullscreen mode

donde fichero_mi_diagrama.txt puede ser un fichero de texto como el siguiente:

class Car

Driver - Car : drives >
Car *- Wheel : have 4 >
Car -- Person : < owns
Enter fullscreen mode Exit fullscreen mode

De tal forma que nuestro documento se vería como:

Este parrafo es parte de nuestra documentación, donde queremos poner a continuación un diagrama de clases

diag ce10eaf325fe034a3c9fe082d7ae5d2e

Bloques

Si no quieres crear más ficheros también puedes usar bloques para incluir tus diagramas junto con la documentacion:

Este parrafo es parte de nuestra documentación, donde queremos poner a continuación un diagrama de clases

[plantuml]
++++
class Car

Driver - Car : drives >
Car *- Wheel : have 4 >
Car -- Person : < owns
++++
Enter fullscreen mode Exit fullscreen mode

Y el resultado sería el mismo.

Ejemplos

A continuacion algunos diagramas de ejemplos generados con Ditaa, PlantUML, Mermaid y Syntrax

Diseño Software

Procesos

[ditaa]
....
                   +-------------+
                   | Asciidoctor |-------+
                   | diagram | |
                   +-------------+ | PNG out
                       ^ |
                       | ditaa in |
                       | v
 +--------+ +--------+----+ /---------------\
 | | --+ Asciidoctor +--> | |
 | Text | +-------------+ | Beautiful |
 |Document| | !magic! | | Output |
 | {d}| | | | |
 +---+----+ +-------------+ \---------------/
     : ^
     | Lots of work |
     +-----------------------------------+
....
Enter fullscreen mode Exit fullscreen mode

Ditaa box

UML

[plantuml]
++++
title Relationships - Class Diagram


class Dwelling {
  +Int Windows
  +void LockTheDoor()
}

class Apartment
class House
class Commune
class Window
class Door

Dwelling <|-down- Apartment: Inheritance
Dwelling <|-down- Commune: Inheritance
Dwelling <|-down- House: Inheritance
Dwelling "1" *-up- "many" Window: Composition
Dwelling "1" *-up- "many" Door: Composition


skinparam componentStyle uml2
class Car {
  .. Field Examples ..
- Name: Type { arg1, arg2, argn }
+Name: Type { arg1, arg2, argn }
#Name: Type { arg1, arg2, argn }
~Name: Type { arg1, arg2, argn }

  .. Method Examples ..
-Name(): Type { arg1, arg2, argn }
+Name(): Type { arg1, arg2, argn }
#Name(): Type { arg1, arg2, argn }
~Name(): Type { arg1, arg2, argn }

  .. Static Example ..
+{static} Name(): Type { arg1, arg2, argn }

  .. Abstract Example ..
+{abstract} Name(): Type { arg1, arg2, argn }
}

class Car
ICar ()- Car
ICar2 ()-- Car
Car -() ICar3
+++
Enter fullscreen mode Exit fullscreen mode

Clases

[plantuml]
++++
title Parallel - Activity Diagram 


start

:Eat Hot Wings;

:Drink Homebrew;

if (Turn On The Game?) then (yes)
  fork
    :__Having Fun__!!!;
  fork again
    :Scream At TV!!;
  end fork
else (no)
  :Not Having Fun;
  :Eat Poptart;
endif

:Go To Bed;

stop
+++
Enter fullscreen mode Exit fullscreen mode

Activiy Parallel

[plantuml]
++++
title Conditional - Activity Diagram 


start

:Eat Hot Wings; 
note right: This is a note to the right

:Drink Homebrew; 
note left: This is a note to the left

if (Turn On The Game?) then (yes)
  :__Having Fun__!!!;
else (no)
  :Not Having Fun;
endif

:Go To Bed;

stop
+++
Enter fullscreen mode Exit fullscreen mode

Activiy Conditional

[mermaid]
++++
classDiagram
    Animal <|-- Duck
    Animal <|-- Fish
    Animal <|-- Zebra
    Animal : +int age
    Animal : +String gender
    Animal: +isMammal()
    Animal: +mate()
    class Duck{
        +String beakColor
        +swim()
        +quack()
    }
    class Fish{
        -int sizeInFeet
        -canEat()
    }
    class Zebra{
        +bool is_wild
        +run()
    }
++++
Enter fullscreen mode Exit fullscreen mode

Clases con Mermaid

Arquitectura

[plantuml]
++++

!define SPRITESURL https://raw.githubusercontent.com/rabelenda/cicon-plantuml-sprites/v1.0/sprites
!includeurl SPRITESURL/tomcat.puml
!includeurl SPRITESURL/kafka.puml
!includeurl SPRITESURL/java.puml
!includeurl SPRITESURL/cassandra.puml
!includeurl SPRITESURL/python.puml
!includeurl SPRITESURL/redis.puml

title Cloudinsight sprites example

skinparam monochrome true

rectangle "<$tomcat>\nwebapp" as webapp
queue "<$kafka>" as kafka
rectangle "<$java>\ndaemon" as daemon
rectangle "<$python>\ndaemon2" as daemon2
database "<$cassandra>" as cassandra
database "<$redis>" as redis

webapp -> kafka
kafka -> daemon
kafka -> daemon2
daemon --> cassandra
daemon2 --> redis
++++
Enter fullscreen mode Exit fullscreen mode

Arquitectura software

Gestion proyectos

[mermaid]
++++
gantt
    title A Gantt Diagram
    dateFormat YYYY-MM-DD
    section Section
    A task :a1, 2014-01-01, 30d
    Another task :after a1 , 20d
    section Another
    Task in sec :2014-01-12 , 12d
    another task : 24d
++++
Enter fullscreen mode Exit fullscreen mode

Grant

UI/UX

[plantuml]
++++
@startsalt
{

Just plain text 
[This is my button]
()  Unchecked radio
(X) Checked radio
[]  Unchecked box
[X] Checked box
"This is a textbox   "
^This is a droplist^

==

User Name:| "Justin     "
Password: | "****       "
[Ok    ]  | [  Close   ]  

==

Name         | "                 "
Direction:   | { (X) Left | () Right | () Up | () Down }
Attending?:  | {  [] Yes | [] No  
                [] Maybe }
[Browse...] }
}
@endsalt
+++
Enter fullscreen mode Exit fullscreen mode

UI

[plantuml]
++++
@startsalt
{+
    {/ <b>General | Fullscreen | Behavior | Saving }
        {
            { Open image in: | ^Smart Mode^ }
            [X] Smooth images when zoomed
            [X] Confirm image deletion
            [ ] Show hidden images
        }
    [Close]
}
@ensalt
++++
Enter fullscreen mode Exit fullscreen mode

UI

[plantuml]
++++
(*) --> "
{{
salt
{+
<b>an example
choose one option
()one
()two
[ok]
}
}}
" as choose

choose -right-> "
{{
salt
{+
<b>please wait
operation in progress
<&clock>
[cancel]
}
}}
" as wait
wait -right-> "
{{
salt
{+
<b>success
congratulations!
[ok]
}
}}
" as success

wait -down-> "
{{
salt
{+
<b>error
failed, sorry
[ok]
}
}}
"
++++
Enter fullscreen mode Exit fullscreen mode

UX

Sintaxis

[syntrax]
++++
stack(
 line('attribute', '/(attribute) identifier', 'of'),
 line(choice(toploop('/entity_designator', ','), 'others', 'all'), ':'),
 opt('bypass'),
 line(optx('A', 'B', 'C')),
 line('/entity_class', 'is', '/expression', ';')
)
++++
Enter fullscreen mode Exit fullscreen mode

Railroad

Otros

Source Tabla periódica

Tabla periodica

Top comments (0)