Cómo dibujar cuadros y tablas en texto plano

42

En muchos documentos de texto plano, los caracteres de dibujo de cuadro se utilizan para dibujar estos cuadros en figuras y tablas. Tales ejemplos (del RFC 5766 ) se muestran a continuación. ¿Hay una mejor manera de dibujar esto ( por ejemplo, una herramienta de línea de comandos de Unix) , que no sea usar el método de prueba y error?


Ejemplos de RFC 5766 :

       +----------------------------+---------------------+
       | TURN client to TURN server | TURN server to peer |
       +----------------------------+---------------------+
       |             UDP            |         UDP         |
       |             TCP            |         UDP         |
       |        TLS over TCP        |         UDP         |
       +----------------------------+---------------------+

Y este, también del RFC 5766 :

                                        Peer A
                                        Server-Reflexive    +---------+
                                        Transport Address   |         |
                                        192.0.2.150:32102   |         |
                                            |              /|         |
                          TURN              |            / ^|  Peer A |
    Client's              Server            |           /  ||         |
    Host Transport        Transport         |         //   ||         |
    Address               Address           |       //     |+---------+
   10.1.1.2:49721       192.0.2.15:3478     |+-+  //     Peer A
            |               |               ||N| /       Host Transport
            |   +-+         |               ||A|/        Address
            |   | |         |               v|T|     192.168.100.2:49582
            |   | |         |               /+-+
 +---------+|   | |         |+---------+   /              +---------+
 |         ||   |N|         ||         | //               |         |
 | TURN    |v   | |         v| TURN    |/                 |         |
 | Client  |----|A|----------| Server  |------------------|  Peer B |
 |         |    | |^         |         |^                ^|         |
 |         |    |T||         |         ||                ||         |
 +---------+    | ||         +---------+|                |+---------+
                | ||                    |                |
                | ||                    |                |
                +-+|                    |                |
                   |                    |                |
                   |                    |                |
             Client's                   |            Peer B
             Server-Reflexive    Relayed             Transport
             Transport Address   Transport Address   Address
             192.0.2.1:7000      192.0.2.15:50000     192.0.2.210:49191

                                 Figure 1
jackxujh
fuente
2
Si bien esto ya tiene muchas respuestas, creo que probablemente debería haberse preguntado en softwarerecs.stackexchange.com Respondemos a este tipo de cosas con bastante frecuencia
Mawg
para tablas, puede usar algo como pandoc-placetable para ir de csv a tablas de rebajas ... (o simplemente pandoc si su entrada es html o docx)
mb21

Respuestas:

47

El sitio web gratuito ASCIIflow le permitirá dibujar cuadros de texto, texto, líneas, flechas, líneas de forma libre, borrar, importar, exportar e incluso deshacer / rehacer. ¿Qué más se necesitaría?

Aquí está mi maravillosa creación usando esta herramienta:

+-------------------------------+
|                               |
|  My first ASCII box           |
|                               |
+---------+---------------------+
          |
          |
          |
          | My first ever ASCII arrow
          |
          |
          |
+---------v----------------------+
|                                |
|  My second ASCII box           |
+--------------------------------+
harrymc
fuente
Una de las desventajas de ese sitio web es el manejo del portapapeles. No puedes copiar / pegar directamente. Tienes que hacerlo a través de botones en el lado derecho.
Ismael Miguel
55
También el botón 'Descargar' resultó ser el botón de importación. Y el botón 'Cargar' resultó ser el botón de exportación. Tal vez soy yo, pero eso fue realmente confuso.
Mixxiphoid
1
@Mixxiphoid No, no eres solo tú. Y sí, es realmente confuso, ¡pero funciona!
Ismael Miguel
17

Es posible dibujar tales imágenes usando herramientas que datan de hace 30 años, es decir, una imagen que forma parte del troffconjunto de comandos. En estos días, el groffpaquete de gnu contendrá el piccomando. El enlace muestra una imagen de una salida PostScript típica, pero usando nroffo las opciones apropiadas obtendrá una versión de arte ascii. Consulte el manual del usuario (pdf) de 1991 para ver ejemplos.

Las tablas en su ejemplo probablemente sean producidas por este mismo conjunto de comandos, usando solo las tblque producen tablas a partir de listas simples.

Para una versión gui , puede usar artist-modeen emacs para dibujar cuadros y líneas con flechas, etc., usando el mouse o el teclado. Vea la demostración de video de youtube .

meuh
fuente
¿No es picsimilar a la de graphviz dot?
hjpotter92
Si. Graphviz puede salir en formato pic. Creo que ambos son del mismo fondo de AT&T Unix, con graphviz como una aplicación de propósito especial que tuvo un mayor desarrollo, mientras que la imagen dio paso a herramientas de estilo gui.
meuh
10

Los cuadros de dibujo u otras formas con caracteres se conocen como arte ASCII (también arte ANSI o ISO). Existen numerosas herramientas para ayudar a crear arte ASCII, como ASCIIFlow en línea , representación de imágenes en ASCII , aplicaciones como figlet, etc. Algunas se han implementado en JavaScript y se pueden ejecutar en un navegador en cualquier sistema operativo.

No hay nada nuevo bajo el sol: la micrografía es un subconjunto de caligrafía con un pedigrí largo, utilizado durante cientos de años, que usa letras para formar imágenes, como el calendario a continuación , con gran parte de la imagen formada a partir de letras.

Calendario de Omer, Sotheby's

DrMoishe Pippik
fuente
3

Desde la línea de comando usando terminal-table de GitHub .

Instalar terminal-table:

gem install terminal-table

Por ejemplo:

irb
require 'terminal-table'

rows = []
rows << ['UDP', 'UDP']
rows << ['TCP', 'UDP']
rows << ['TLS over TCP ', 'UDP']
table = Terminal::Table.new :headings => ['TURN client to TURN server', 'TURN server to peer'], :rows => rows

puts table

Salida de muestra:

+----------------------------+---------------------+
| TURN client to TURN server | TURN server to peer |
+----------------------------+---------------------+
| UDP                        | UDP                 |
| TCP                        | UDP                 |
| TLS over TCP               | UDP                 |
+----------------------------+---------------------+

Se puede obtener el mismo resultado usando python:

pip install terminaltables

por ejemplo:

from terminaltables import AsciiTable
table_data = [
    ['TURN client to TURN server', 'TURN server to peer'],
    ['UDP', 'UDP'],
    ['TCP', 'UDP'],
    ['TLS over TCP', 'UDP']
]
table = AsciiTable(table_data)
print table.table
GAD3R
fuente
1

Tengo esto en mi .vimrc:

vn<silent> <leader>[ :<c-u>cal<sid>rect(1)<cr>
vn<silent> <leader>] :<c-u>cal<sid>rect(2)<cr>
let s:h=split(' ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋','\zs')
let s:e=map(range(81),'[v:val/27%3,v:val/9%3,v:val/3%3,v:val%3]') "base-3 encode
fu s:rect(x) "x:thickness
 if visualmode()!=#"\<c-v>"|retu|en
 let s=&sel|let&sel='inclusive'|let[ls,cs]=[[line("'<"),line("'>")],[virtcol("'<"),virtcol("'>")]]|let&sel=s
 let[l0,l1,c0,c1]=[min(ls),max(ls),min(cs),max(cs)]
 let a=map(map(getline(l0,l1),"split(v:val,'\\zs')"),"extend(v:val,repeat([' '],max([0,c1-len(v:val)])))")
 let x=a:x|let[V,H]=[[x,0,x,0],[0,x,0,x]] "vertical and horizontal line
 "b:list of changes as [line,column,bitmask]
 if l0<l1&&c0<c1|let b=[[l0,c0,[x,0,0,x]],[l0,c1,[x,x,0,0]],[l1,c0,[0,0,x,x]],[l1,c1,[0,x,x,0]]]
                 let b+=map(range(l0+1,l1-1),'[v:val,c0,V]')+map(range(l0+1,l1-1),'[v:val,c1,V]')
                 let b+=map(range(c0+1,c1-1),'[l0,v:val,H]')+map(range(c0+1,c1-1),'[l1,v:val,H]')
 elsei l0<l1    |let b=[[l0,c0,[x,0,0,0]],[l1,c0,[0,0,x,0]]]+map(range(l0+1,l1-1),'[v:val,c0,V]')
 elsei c0<c1    |let b=[[l0,c0,[0,0,0,x]],[l0,c1,[0,x,0,0]]]+map(range(c0+1,c1-1),'[l0,v:val,H]')
 el             |let b=[]|en
 for[l,c,m]in b
  let i=index(s:h,a[l-l0][c-1])
  if i>=0|let z=map(copy(s:e[i]),'max([v:val,m[v:key]])')|let a[l-l0][c-1]=s:h[27*z[0]+9*z[1]+3*z[2]+z[3]]|en
 endfo
 cal setline(l0,map(a,"join(v:val,'')"))
endf

Al seleccionar un rectángulo en modo visual de bloques ( <C-v>) y presionar <leader>[, se colocan caracteres de dibujo lineal en su borde, fusionándolos con cualquier carácter de dibujo lineal preexistente. Si insiste en ASCII puro +-|, debería ser fácil de modificar.

ngn
fuente
0

Para todos los usuarios de Vim disponibles , hay dos venerables complementos de oldtimer disponibles:

  • ¡Dibujalo! plug-in ; esto no ha visto ninguna actualización en años, pero su autor aún está activo, por lo que dice algo sobre su madurez. Es ideal para cajas y líneas de conexión; justo lo que se pide aquí. (¡Incluso puede hacer círculos y elipses!)
  • sketch.vim no se mantiene y es más estilo de pintura controlado por el mouse

Puede usar ambos complementos en paralelo, pero no tener ambos activos al mismo tiempo.

Ingo Karkat
fuente