Como desenhar caixas e tabelas em texto sem formatação

42

Em muitos documentos de texto sem formatação, caracteres de desenho de caixa são usados ​​para desenhar essas caixas em figuras e tabelas. Tais exemplos (da 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 da RFC 5766 :

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

E este, também da 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
fonte
2
Embora isso já tem muitas respostas, acho que ele provavelmente deveria ter sido perguntado sobre softwarerecs.stackexchange.com Nós responder esse tipo de coisa com frequência
MAWG
para as tabelas, você pode usar algo como pandoc-placetable para ir de CSV para tabelas de remarcação ... (ou pandoc simplesmente se sua entrada é html ou docx)
MB21

Respostas:

47

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

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

+-------------------------------+
|                               |
|  My first ASCII box           |
|                               |
+---------+---------------------+
          |
          |
          |
          | My first ever ASCII arrow
          |
          |
          |
+---------v----------------------+
|                                |
|  My second ASCII box           |
+--------------------------------+
harrymc
fonte
Uma das desvantagens desse site é o manuseio da área de transferência. Você não pode copiar / colar diretamente. Você precisa fazer isso através dos botões no lado direito.
Ismael Miguel
5
Além disso, o botão 'Download' acabou sendo o botão de importação. E o botão 'Upload' acabou sendo o botão de exportação. Talvez seja eu, mas isso foi realmente confuso.
Mixxiphoid
1
@Mixxiphoid Não, não é só você. E sim, é realmente confuso, mas funciona!
Ismael Miguel
17

É possível desenhar essas imagens usando ferramentas que datam de 30 anos, ou seja, foto que faz parte do troffconjunto de comandos. Hoje em dia o groffpacote do gnu conterá o piccomando. O link mostra uma imagem de alguma saída típica de PostScript, mas usando nroffou as opções apropriadas você obterá uma versão ascii-art. Veja o manual do usuário (pdf) de 1991 para exemplos.

As tabelas no seu exemplo provavelmente são produzidas por esse mesmo conjunto de comandos, usando apenas o tblque produz tabelas a partir de listas simples.

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

meuh
fonte
Não é picsemelhante ao graphviz's dot?
hjpotter92
Sim. O graphviz pode imprimir no formato pic. Eu acho que ambos são do mesmo background da AT&T Unix, com o graphviz sendo um aplicativo para fins especiais que teve mais desenvolvimento, enquanto o pic deu lugar a ferramentas no estilo gui.
meuh
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 online , renderização de imagem em ASCII , aplicativos como figlet etc. Algumas foram implementadas em JavaScript e podem ser executadas em um navegador em qualquer sistema operacional.

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

Calendário Omer, Sotheby's

DrMoishe Pippik
fonte
3

Na linha de comando usando a tabela de terminal do GitHub .

Instalar 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

Saída de amostra:

+----------------------------+---------------------+
| 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
GAD3R
fonte
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 quaisquer caracteres de desenho de linha preexistentes. Se você insistir em ASCII puro +-|, será fácil modificá-lo.

ngn
fonte
0

Para todos os usuários do Vim , existem dois plugins veneráveis ​​de oldtimer disponíveis:

  • Desenhe isso! plugin ; isso não vê nenhuma atualização há anos, mas seu autor ainda está ativo, e isso diz algo sobre sua maturidade. É ótimo para caixas e linhas de conexão; exatamente o que é pedido aqui. (Pode até fazer círculos e elipses!)
  • sketch.vim não é mantido e é mais movido por mouse, no estilo de pintura

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

Ingo Karkat
fonte