Как нарисовать коробки и таблицы в виде простого текста
Во многих текстовых документах символы рисования блоков используются для рисования этих блоков на рисунках и в таблицах. Такие примеры (из RFC 5766) приведены ниже. Есть ли лучший способ нарисовать это (например, инструмент командной строки Unix), кроме использования метода проб и ошибок?
Примеры из RFC 5766:
+----------------------------+---------------------+
| TURN client to TURN server | TURN server to peer |
+----------------------------+---------------------+
| UDP | UDP |
| TCP | UDP |
| TLS over TCP | UDP |
+----------------------------+---------------------+
И этот, также из 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
7 ответов
Бесплатный веб-сайт ASCIIflow позволит вам рисовать текстовые поля, текст, линии, стрелки, линии произвольной формы, стирать, импортировать, экспортировать и даже отменять / повторять. Что еще нужно?
Вот мое замечательное творение с использованием этого инструмента:
+-------------------------------+
| |
| My first ASCII box |
| |
+---------+---------------------+
|
|
|
| My first ever ASCII arrow
|
|
|
+---------v----------------------+
| |
| My second ASCII box |
+--------------------------------+
Такие рисунки можно нарисовать с помощью инструментов 30-летнего возраста, а именно: troff
набор команд. В эти дни Гнуgroff
пакет будет содержать pic
команда. Ссылка показывает изображение некоторого типичного вывода PostScript, но с использованием nroff
или соответствующие опции вы получите ascii-art версию. См. Руководство пользователя (pdf) от 1991 года для примеров.
Таблицы в вашем примере, вероятно, создаются этим же набором команд, используя толькоtbl
который производит таблицы из простых списков.
Дляграфической версии вы можете использовать artist-mode
в Emacs рисовать прямоугольники и линии со стрелками и т.д., используя мышь или клавиатуру. Смотрите видео демо YouTube.
Рисование рамок или других фигур с символами известно как искусство ASCII (также искусство ANSI или ISO). Существуют многочисленные инструменты, помогающие в создании искусства ASCII, такие как онлайн ASCIIFlow, рендеринг изображений в ASCII, приложения, такие как figlet и т. Д. Некоторые из них были реализованы на JavaScript и могут быть запущены в браузере на любой ОС.
Под солнцем нет ничего нового - микрография - это подмножество каллиграфии с длинной родословной, используемой в течение сотен лет с использованием букв для формирования рисунков, таких как календарь ниже, с большей частью изображения, образованного из букв.
Как я могу нарисовать таблицы ASCII?
Если вы просто хотите нарисовать таблицы ASCII (как ваш первый пример), см. Генератор таблиц простого текста - TablesGenerator.com для веб-утилиты, которая поможет вам создать красивые таблицы данных:
Из командной строки используется терминал-таблица из GitHub.
устанавливать terminal-table
:
gem install terminal-table
Например:
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
Пример вывода:
+----------------------------+---------------------+
| TURN client to TURN server | TURN server to peer |
+----------------------------+---------------------+
| UDP | UDP |
| TCP | UDP |
| TLS over TCP | UDP |
+----------------------------+---------------------+
Тот же вывод можно получить с помощью python:
pip install terminaltables
например:
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
Добавив к ответу @meuh, я создал мини-демонстрацию
pic
.
$ cat picdemo.roff
.PS
box wid 3 "My first ASCII box"
arrow down 1 from last box.s
box wid 3 "My first ASCII box"
.PE
$ cat picdemo.roff | рис | groff -ms -Tascii
+-----------------------------+
| |
| My first ASCII box |
+--------------+--------------+
|
|
|
|
+
+--------------+--------------+
| |
| My first ASCII box |
+-----------------------------+
Для всех пользователей Vim доступны два почтенных старых плагина:
- Нарисуй это! плагин; Это не было обновлений в течение многих лет, но его автор все еще активен, так что это говорит о его зрелости. Отлично подходит для коробок и соединительных линий; только то, что просят здесь. (Это может даже сделать круги и эллипсы!)
- sketch.vim не поддерживается и более управляемый мышью стиль рисования
Вы можете использовать оба плагина параллельно, но не активировать оба одновременно.
У меня есть это в моем .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
Выбор прямоугольника в блочно-визуальном режиме (<C-v>
) и нажав <leader>[
ставит символы рисования линий на ее границе, объединяя их с любыми ранее существующими символами рисования линий. Если вы настаиваете на чистом ASCII +-|
вместо этого это должно быть легко изменить.