Làm thế nào để vẽ hộp và bảng trong văn bản đơn giản


42

Trong nhiều tài liệu văn bản đơn giản, các ký tự vẽ hộp được sử dụng để vẽ các hộp này trong hình và bảng. Các ví dụ như vậy (từ RFC 5766 ) được hiển thị bên dưới. Có cách nào tốt hơn để vẽ cái này ( ví dụ, một công cụ dòng lệnh Unix) , ngoài việc sử dụng phương pháp thử và sai?


Ví dụ từ RFC 5766 :

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

Và cái này, cũng từ 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
Mặc dù điều này đã có rất nhiều câu trả lời, tôi nghĩ rằng có lẽ nó nên được hỏi trên softwarerecs.stackexchange.com Chúng tôi trả lời loại này khá thường xuyên
Mawg


đối với các bảng, bạn có thể sử dụng một cái gì đó như pandoc-placetable để đi từ csv sang bảng đánh dấu ... (hoặc chỉ đơn giản là pandoc nếu đầu vào của bạn là html hoặc docx)
mb21

Câu trả lời:


47

Trang web ASCIIflow miễn phí sẽ cho phép bạn vẽ các hộp văn bản, văn bản, dòng, mũi tên, dòng tự do, xóa, nhập, xuất và thậm chí hoàn tác / làm lại. Những gì người khác sẽ cần?

Đây là sáng tạo tuyệt vời của tôi bằng cách sử dụng công cụ này:

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

Một trong những nhược điểm của trang web đó là việc xử lý clipboard. Bạn không thể sao chép / dán trực tiếp. Bạn phải làm điều đó thông qua các nút ở phía bên phải.
Ismael Miguel

5
Ngoài ra, nút 'Tải xuống' hóa ra là nút nhập. Và nút 'Tải lên' hóa ra là nút xuất. Có lẽ đó là tôi, nhưng điều đó thực sự khó hiểu.
Mixxiphoid

1
@Mixxiphoid Không, không phải chỉ có bạn. Và vâng, nó thực sự khó hiểu, nhưng hoạt động!
Ismael Miguel

17

Có thể vẽ những bức tranh như vậy bằng các công cụ có niên đại 30 năm, cụ thể là pic là một phần của bộ trofflệnh. Những ngày này groffgói của gnu sẽ chứa piclệnh. Liên kết hiển thị hình ảnh của một số đầu ra PostScript điển hình, nhưng bằng cách sử dụng nroffhoặc các tùy chọn phù hợp, bạn sẽ có được một phiên bản nghệ thuật. Xem hướng dẫn sử dụng (pdf) từ năm 1991 để biết ví dụ.

Các bảng trong ví dụ của bạn có thể được tạo bởi cùng bộ lệnh này, chỉ sử dụng tblđể tạo các bảng từ danh sách đơn giản.

Đối với phiên bản gui , bạn có thể sử dụng artist-modetrong emacs để vẽ hộp và các dòng mũi tên, v.v., bằng chuột hoặc bàn phím. Xem video giới thiệu youtube .


Không picgiống với graphviz dot?
hjpotter92

Đúng. graphviz có thể xuất ra ở định dạng pic. Tôi nghĩ rằng cả hai đều từ cùng một nền tảng AT & T Unix, với graphviz là một ứng dụng mục đích đặc biệt được phát triển hơn nữa, trong khi pic nhường chỗ cho các công cụ theo phong cách gui.
meuh

10

Vẽ các hộp hoặc các hình dạng khác với các ký tự được gọi là nghệ thuật ASCII (cũng là nghệ thuật ANSI hoặc ISO). Có nhiều công cụ hỗ trợ tạo nghệ thuật ASCII, chẳng hạn như ASCIIFlow trực tuyến , kết xuất hình ảnh trong ASCII , các ứng dụng như figlet, v.v. Một số đã được triển khai bằng JavaScript và có thể chạy trên trình duyệt trên bất kỳ HĐH nào.

Không có gì mới dưới ánh mặt trời - micrography là một tập hợp thư pháp với một phả hệ dài, được sử dụng trong hàng trăm năm, sử dụng các chữ cái để tạo thành hình ảnh, như lịch bên dưới , với phần lớn hình ảnh được hình thành từ các chữ cái.

Lịch Omer, Sotheby



3

Từ dòng lệnh sử dụng bảng đầu cuối từ GitHub .

Cài đặt terminal-table:

gem install terminal-table

Ví dụ:

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

Đầu ra mẫu:

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

Có thể thu được kết quả tương tự bằng python:

pip install terminaltables

ví dụ:

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

Tôi có cái này trong .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

Chọn một hình chữ nhật ở chế độ hình ảnh khối ( <C-v>) và nhấn <leader>[đặt các ký tự vẽ đường thẳng ở viền của nó, hợp nhất chúng với bất kỳ ký tự vẽ đường thẳng nào có sẵn. Nếu bạn nhấn mạnh vào ASCII thuần túy +-|thay vào đó, nó sẽ dễ dàng sửa đổi.


0

Đối với tất cả người dùng Vim ngoài kia, có hai plugin cũ đáng kính:

  • Vẽ nó! plugin ; Điều này đã không thấy bất kỳ cập nhật nào trong nhiều năm, nhưng tác giả của nó vẫn hoạt động, vì vậy điều này nói lên một điều gì đó về sự trưởng thành của nó. Thật tuyệt vời cho các hộp và đường kết nối; chỉ những gì được yêu cầu ở đây. (Nó thậm chí có thể làm vòng tròn và hình elip!)
  • sketch.vim là không rõ ràng, và nhiều phong cách vẽ chuột

Bạn có thể sử dụng song song cả hai plugin, chỉ cần không có cả hai hoạt động cùng một lúc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.