Come disegnare caselle e tabelle in testo semplice


42

In molti documenti di testo semplice, i caratteri di disegno delle caselle vengono utilizzati per disegnare queste caselle in figure e tabelle. Tali esempi (da RFC 5766 ) sono mostrati di seguito. Esiste un modo migliore per disegnare questo ( ad esempio uno strumento da riga di comando Unix) , oltre all'utilizzo del metodo di prova ed errore?


Esempi da RFC 5766 :

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

E questo, anche 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

2
Sebbene questo abbia già molte risposte, penso che probabilmente avrebbe dovuto essere chiesto su softwarerecs.stackexchange.com Rispondiamo a questo genere di cose abbastanza spesso
Mawg


per le tabelle, puoi usare qualcosa come pandoc-placetable per passare da CSV a tabelle di markdown ... (o semplicemente pandoc se il tuo input è html o docx)
mb21

Risposte:


47

Il sito Web ASCIIflow gratuito ti consente di disegnare caselle di testo, testo, linee, frecce, linee a forma libera, cancellare, importare, esportare e persino annullare / ripetere. Di cos'altro avremmo bisogno?

Ecco la mia meravigliosa creazione usando questo strumento:

+-------------------------------+
|                               |
|  My first ASCII box           |
|                               |
+---------+---------------------+
          |
          |
          |
          | My first ever ASCII arrow
          |
          |
          |
+---------v----------------------+
|                                |
|  My second ASCII box           |
+--------------------------------+

Uno degli svantaggi di quel sito Web è la gestione degli appunti. Non è possibile copiare / incollare direttamente. Devi farlo attraverso i pulsanti sul lato destro.
Ismael Miguel,

5
Anche il pulsante "Download" si è rivelato essere il pulsante di importazione. E il pulsante "Carica" ​​si è rivelato essere il pulsante di esportazione. Forse sono io, ma è stato davvero confuso.
Mixxiphoid,

1
@Mixxiphoid No, non sei solo tu. E sì, è davvero confuso, ma funziona!
Ismael Miguel,

17

È possibile disegnare tali immagini utilizzando strumenti risalenti a 30 anni fa, vale a dire la foto che fa parte della troffsuite di comandi. In questi giorni il groffpacchetto di gnu conterrà il piccomando. Il link mostra un'immagine di un tipico output PostScript, ma usando nroffo le opzioni appropriate otterrai una versione ascii-art. Vedere il manuale dell'utente (pdf) del 1991 per esempi.

Le tabelle nel tuo esempio sono probabilmente prodotte da questa stessa suite di comandi, usando proprio quella tblche produce tabelle da semplici elenchi.

Per una versione gui , puoi usare artist-modein emacs per disegnare caselle, linee con frecce ecc., Usando il mouse o la tastiera. Guarda la demo video di YouTube .


Non è picsimile a quello di Graphviz dot?
hjpotter92,

Sì. graphviz può essere riprodotto in formato immagine. Penso che entrambi provengano dallo stesso background Unix AT&T, con graphviz un'applicazione per scopi speciali che ha avuto un ulteriore sviluppo, mentre pic ha lasciato il posto a strumenti in stile gui.
Meuh

10

Disegnare caselle o altre forme con caratteri è noto come arte ASCII (anche arte ANSI o ISO). Esistono numerosi strumenti per la creazione di arte ASCII, come ASCIIFlow online , rendering di immagini in ASCII , applicazioni come figlet, ecc. Alcuni sono stati implementati in JavaScript e possono essere eseguiti in un browser su qualsiasi sistema operativo.

Non c'è nulla di nuovo sotto il sole: la micrografia è un sottoinsieme della calligrafia con un lungo pedigree, usato da centinaia di anni, usando lettere per formare immagini, come il calendario in basso , con gran parte dell'immagine formata da lettere.

Omer Calendar, Sotheby's



3

Dalla riga di comando utilizzando la tabella dei terminali di GitHub .

Installa terminal-table:

gem install terminal-table

Per esempio:

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

Uscita campione:

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

Lo stesso output può essere ottenuto usando Python:

pip install terminaltables

per esempio:

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

1

Ho questo nel mio .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

Selezionando un rettangolo in modalità blocco visivo ( <C-v>) e premendo si <leader>[posizionano i caratteri del disegno al limite, unendoli con tutti i caratteri del disegno esistente. Se invece insisti su ASCII puro +-|, dovrebbe essere facile da modificare.


0

Per tutti gli utenti di Vim , sono disponibili due venerabili plugin oldtimer:

  • Disegnalo! plugin ; questo non ha visto alcun aggiornamento da anni, ma il suo autore è ancora attivo, quindi questo dice qualcosa sulla sua maturità. È ottimo per scatole e linee di collegamento; proprio quello che viene richiesto qui. (Può persino fare cerchi ed ellissi!)
  • sketch.vim è non mantenuto, e più guidato dal mouse, in stile pittura

Puoi usare entrambi i plugin in parallelo, ma non entrambi sono attivi contemporaneamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.