web-dev-qa-db-fra.com

Comment dessiner des boîtes et des tableaux en texte brut

Dans de nombreux documents en texte brut, les caractères de dessin de boîtes sont utilisés pour dessiner ces boîtes sous forme de figures et de tableaux. De tels exemples (de RFC 5766 ) sont présentés ci-dessous. Existe-t-il un meilleur moyen de dessiner ceci ( par exemple, un outil de ligne de commande Unix) , autre que l’utilisation de la méthode essai-erreur?


Exemples tirés de RFC 5766 :

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

Et celui-ci, également 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
43
jackxujh

Le site Web gratuit ASCIIflow vous permettra de dessiner des zones de texte, du texte, des lignes, des flèches, des lignes de forme libre, d’effacer, d’importer, d’exporter et même d’annuler/de rétablir. De quoi d'autre aurait-il besoin?

Voici ma merveilleuse création en utilisant cet outil:

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

Il est possible de dessiner de telles images avec des outils datant de 30 ans, à savoir pic , qui fait partie de la suite de commandes troff. Le paquet groff de gnu de ces jours contiendra la commande pic. Le lien affiche une image d'une sortie PostScript typique, mais en utilisant nroff ou les options appropriées, vous obtiendrez une version ascii-art. Voir le manuel de l'utilisateur (pdf) de 1991 pour des exemples.

Les tables de votre exemple sont probablement produites par cette même suite de commandes, en utilisant simplement tbl qui produit des tables à partir de simples listes.

Pour une gui version, vous pouvez utiliser artist-mode dans emacs pour dessiner des boîtes et des lignes fléchées, etc., à l’aide de la souris ou du clavier. Voir vidéo youtube démo.

17
meuh

Le dessin de boîtes ou d’autres formes comportant des caractères est appelé ASCIIart (également l’art ANSI ou ISO). Il existe de nombreux outils pour vous aider à créer ASCII art, tels que le rendu en ligne ASCIIFlow , dans ASCII , des applications telles que figlet, etc. Certains ont été implémentés en JavaScript et peuvent être exécutés dans un navigateur sur n'importe quel système d'exploitation.

Il n'y a rien de nouveau sous le soleil: la micrographie est un sous-ensemble de la calligraphie avec un long pedigree, utilisé depuis des centaines d'années, utilisant des lettres pour former des images, telles que le calendrier ci-dessous , une grande partie de l'image étant composée de lettres.

 Omer Calendar, Sotheby's

10
DrMoishe Pippik

Comment puis-je dessiner ASCII tables?

Si vous voulez seulement dessiner ASCII tableaux (comme dans votre premier exemple), voir Générateur de tableaux en texte brut - TablesGenerator.com pour un utilitaire Web qui vous aidera à créer des tableaux de données Nice:

 enter image description here

8
DavidPostill

Depuis la ligne de commande en utilisant terminal-table de GitHub .

Installez terminal-table:

gem install terminal-table

Par exemple:

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

Exemple de sortie:

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

Le même résultat peut être obtenu en utilisant python:

pip install terminaltables

par exemple:

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
3
GAD3R

J'ai ceci dans mon .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

En sélectionnant un rectangle en mode visuel bloc (<C-v>) et en appuyant sur <leader>[, vous placez des caractères de traçage à la limite de ce dernier, en les fusionnant avec tous les caractères de traçage préexistants. Si vous insistez plutôt sur ASCII +-|, il devrait être facile à modifier.

1
ngn

Pour tous les utilisateurs Vim , deux plugins vénérables oldtimer sont disponibles:

  • Dessine le! brancher ; cela n'a pas vu de mises à jour depuis des années, mais son auteur est toujours actif, donc cela en dit long sur sa maturité. C'est parfait pour les boîtes et les lignes de connexion; exactement ce qui est demandé ici. (Il peut même faire des cercles et des ellipses!)
  • sketch.vim n'est pas maintenu, et est plus orienté vers la souris

Vous pouvez utiliser les deux plugins en parallèle, mais ne pas avoir les deux actifs en même temps.

0
Ingo Karkat