Como desenhar caixas e tabelas em texto simples

44

Em muitos documentos de texto simples, os caracteres de desenho de caixa são usados para desenhar essas caixas em figuras e tabelas. Tais exemplos (de RFC 5766 ) são mostrados abaixo. Existe uma maneira melhor de desenhar isso (, por exemplo, uma ferramenta de linha de comando Unix) , além de usar o método de tentativa e erro?

Exemplos de RFC 5766 :

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

E este, também de 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
    
por jackxujh 03.06.2018 / 20:30

7 respostas

49

O site ASCIIflow gratuito permite-lhe desenhar caixas de texto, texto, linhas, setas, linhas de forma livre, apagar, importar, exportar e até mesmo desfazer refazer. O que mais alguém precisaria?

Aqui está a minha maravilhosa criação usando esta ferramenta:

+-------------------------------+
|                               |
|  My first ASCII box           |
|                               |
+---------+---------------------+
          |
          |
          |
          | My first ever ASCII arrow
          |
          |
          |
+---------v----------------------+
|                                |
|  My second ASCII box           |
+--------------------------------+
    
por 03.06.2018 / 21:12
17

É possível desenhar essas imagens usando ferramentas que datam de 30 anos, ou seja, foto , que faz parte do troff suite de comandos. Atualmente, o pacote groff do gnu conterá o comando pic . O link mostra uma imagem de uma saída PostScript típica, mas usando nroff ou as opções apropriadas, você terá uma versão ascii-art. Consulte o manual do usuário (pdf) do 1991 para exemplos.

As tabelas em seu exemplo provavelmente são produzidas por este mesmo conjunto de comandos, usando apenas tbl , o que produz tabelas a partir de listas simples.

Para uma versão gui , você pode usar artist-mode no emacs para desenhar caixas e linhas com setas, etc., usando o mouse ou o teclado. Veja vídeo do youtube de demonstração.

    
por 03.06.2018 / 21:43
10

Caixas de desenho ou outras formas com caracteres são conhecidas como arte ASCII (também arte ANSI ou ISO). Existem inúmeras ferramentas para ajudar na criação de arte ASCII, como ASCIIFlow , renderização de imagem em ASCII , aplicativos como figlet, etc. Alguns foram implementados em JavaScript e podem ser executados em um navegador em qualquer sistema operacional.

Não há nada de novo sob o sol - a micrografia é um subconjunto da caligrafia com um longo pedigree, usado por centenas de anos, usando letras para formar imagens, como o calendário abaixo , com grande parte da imagem formada por letras.

    
por 03.06.2018 / 21:17
8

Como posso desenhar tabelas ASCII?

Se você quiser apenas desenhar tabelas ASCII (como seu primeiro exemplo), consulte Gerador de tabelas de texto simples - TablesGenerator.com para obter uma Utilitário da Web que ajudará você a criar tabelas de dados agradáveis:

    
por 03.06.2018 / 21:43
3

Na linha de comando, usando a tabela de terminais do GitHub .

Instale terminal-table :

gem install terminal-table

Por exemplo:

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

Exemplo de saída:

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

A mesma saída pode ser obtida usando python:

pip install terminaltables

por exemplo:

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
    
por 04.06.2018 / 11:16
1

Eu tenho isso no meu .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

Selecionar um retângulo no modo visual de bloco ( <C-v> ) e pressionar <leader>[ coloca os caracteres de desenho de linha em sua borda, mesclando-os com qualquer caractere de desenho de linha pré-existente. Se você insistir em puro ASCII +-| , deve ser fácil modificá-lo.

    
por 04.06.2018 / 01:31
0

Para todos os usuários Vim disponíveis, dois plug-ins venerable oldtimer estão disponíveis:

  • DrawIt! plugin ; Isso não tem nenhuma atualização em anos, mas seu autor ainda está ativo, então isso diz algo sobre sua maturidade. É ótimo para caixas e linhas de conexão; apenas o que é pedido aqui. (Pode até fazer círculos e elipses!)
  • sketch.vim não é mantido e é mais orientado pelo mouse, em estilo de pintura

Você pode usar os dois plug-ins em paralelo, mas não os dois ativos ao mesmo tempo.

    
por 05.06.2018 / 12:16