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

42

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 (tirés de la RFC 5766 ) sont présentés ci-dessous. Existe-t-il un meilleur moyen de dessiner cela ( par exemple, un outil de ligne de commande Unix) , mis à part l’utilisation de la méthode essai-erreur?


Exemples tirés de la 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
Jackxujh
la source
2
Bien que cela ait déjà de nombreuses réponses, je pense que cela aurait probablement dû être posé sur softwarerecs.stackexchange.com. Nous répondons assez souvent à ce genre de chose
Mawg le
duplication
intersite
pour les tables, vous pouvez utiliser quelque chose comme pandoc-placetable pour passer de csv à des tables de démarcation ... (ou tout simplement pandoc si votre saisie est html ou docx)
mb21

Réponses:

47

Le site Web gratuit ASCIIflow vous permettra de dessiner des zones de texte, du texte, des lignes, des flèches, des lignes de formes libres, 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           |
+--------------------------------+
harrymc
la source
L'un des inconvénients de ce site Web est la manipulation du presse-papiers. Vous ne pouvez pas copier / coller directement. Vous devez le faire via des boutons sur le côté droit.
Ismael Miguel
5
Le bouton "Télécharger" s'est également avéré être le bouton d'importation. Et le bouton 'Télécharger' s'est avéré être le bouton d'exportation. Peut-être que c'est moi, mais c'était vraiment déroutant.
Mixxiphoid
1
@ Mixxiphoid Non, ce n'est pas que vous. Et oui, c'est vraiment déroutant, mais ça marche!
Ismael Miguel
17

Il est possible de dessiner de telles images en utilisant des outils datant de 30 ans, à savoir pic qui fait partie de la troffsuite de commandes. Le groffpaquet de gnu de ces jours contiendra la piccommande. Le lien affiche une image d'une sortie PostScript typique, mais si vous utilisez nroffou les options appropriées, vous obtiendrez une version ascii-art. Voir le manuel d'utilisation (pdf) de 1991 pour des exemples.

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

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

meuh
la source
N'est-ce pas picsemblable à graphviz dot?
hjpotter92
Oui. graphviz peut produire au format pic. Je pense qu'ils sont tous deux issus du même fond Unix d'AT & T, avec graphviz étant une application à but spécifique qui a connu un développement supplémentaire, alors que la photo cédait la place à des outils de style gui.
meuh
10

Dessiner des boîtes ou d’autres formes avec des caractères est appelé art ASCII ( art ANSI ou ISO). Il existe de nombreux outils pour aider à créer de l'art ASCII, tels que ASCIIFlow en ligne , le rendu d'image en 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, comme le calendrier ci - dessous , avec une grande partie de l'image formée de lettres.

Calendrier Omer, Sotheby's

DrMoishe Pippik
la source
8

Comment puis-je dessiner des tables ASCII?

Si vous voulez seulement dessiner des tableaux ASCII (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 de jolis tableaux de données:

entrez la description de l'image ici

DavidPostill
la source
3

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

Installer 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
GAD3R
la source
1

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, vous <leader>[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 l'ASCII pur , il devrait être facile à modifier.

ngn
la source
0

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

  • Dessine le! plugin ; 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.

Ingo Karkat
la source