如何用纯文本绘制框和表


42

在许多纯文本文档中,使用方框图字符在图形和表格中绘制这些方框。此类示例(来自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

2
尽管这已经有很多答案,但我认为应该应该在softwarerecs.stackexchange.com上进行询问。 我们经常回答此类问题
Mawg


对于表格,您可以使用pandoc-placetable之类的东西从csv到markdown表格...(如果您输入的是html或docx ,也可以使用简单的pandoc)
mb21

Answers:


47

免费的ASCIIflow网站可让您绘制文本框,文本,线条,箭头,自由格式的线条,擦除,导入,导出,甚至撤消/重做。还需要什么呢?

这是使用此工具的精彩创作:

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

该网站的缺点之一是剪贴板处理。您不能直接复制/粘贴。您必须通过右侧的按钮进行操作。
Ismael Miguel

5
同样,“下载”按钮也是导入按钮。然后,“上传”按钮原来是导出按钮。也许是我,但这确实令人困惑。
Mixxiphoid

1
@Mixxiphoid不,不只是你。是的,这确实令人困惑,但是有效!
Ismael Miguel

17

可以使用30年前的工具绘制此类图片,即pictroff命令套件的一部分。这些天,gnu的groff软件包将包含pic命令。链接显示了一些典型的PostScript输出图片,但是使用nroff或适当的选项,您将获得ascii-art版本。有关示例,请参见1991年的用户手册(pdf)。

您的示例中的表可能是由同一命令套件tbl生成的,仅使用从简单列表生成表的方式。

对于gui版本,您可以artist-mode在emacs中使用鼠标或键盘绘制框和箭头线等。参见youtube视频演示。


是不是pic类似的graphviz的dot
hjpotter92

是。graphviz可以pic格式输出。我认为它们都来自相同的AT&T Unix背景,graphviz是一个特殊的应用程序,它得到了进一步的开发,而pic被gui风格的工具所取代。
meuh

10

带有字符的绘图框或其他形状被称为ASCII艺术(也称为ANSI或ISO艺术)。有许多工具可以帮助创建ASCII艺术作品,例如在线ASCIIFlow以ASCII形式进行图像渲染,诸如figlet之类的应用程序其中一些工具已经用JavaScript实现,并且可以在任何OS的浏览器中运行。

在阳光下没有什么新鲜的东西-缩影是具有悠久血统的书法的一个子集,已有数百年的历史,它使用字母形成图片,例如下面的日历,其中大部分图像由字母组成。

苏富比Omer Calendar



3

从命令行使用GitHub的terminal-table

安装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

1

我在我的.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 +-|,则应该易于修改。


0

对于所有Vim用户,有两个古老的oldtimer插件可用:

  • 画出来!插件 ; 几年来还没有任何更新,但是它的作者仍然活跃,所以这说明了它的成熟度。非常适合用于盒子和连接线;正是这里的要求。(它甚至可以做圆和椭圆!)
  • sketch.vim不需要维护的,更像是鼠标驱动的绘画风格

您可以并行使用两个插件,只是不能同时激活两个插件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.