Рисование таблиц в терминале с использованием символов поля ANSI - PullRequest
14 голосов
/ 21 декабря 2010

Я пытаюсь напечатать таблицу, которая более приятна для глаз, чем ее чистое текстовое представление. в основном я хочу преобразовать что-то вроде этого:

+-----+--------+
| age | weight |
+-----+--------+
| 10  | 100    |
| 80  | 500    |
+-----+--------+

примерно так:

┌─────┬────────┐
| age | weight |
├─────┼────────┤
│ 10  │   100  │
│ 80  │  500   │
└─────┴────────┘

вот скриншот того, что я вижу в терминале:

in terminal looks like this

Обратите внимание на промежутки между рядами. Моя проблема в том, что они не подключаются должным образом, в то время как другие инструменты Unix, использующие печать ANSI, выглядят хорошо в терминале. Например, дерево, если я запускаю tree -A в моем терминале, `я получаю это:

tree in terminal

обратите внимание, как вертикальные линии связаны друг с другом. это забавно, потому что когда я копирую и вставляю вывод дерева в мой текстовый редактор и запускаю свой скрипт, я получаю что-то вроде этого:

tree in my code

Очевидно, что я что-то упускаю из-за печати символов ANSI в терминале и не могу найти что-либо об этом, прибегая к помощи Google. Кто-нибудь может пролить свет на эту тему?

Ответы [ 2 ]

21 голосов
/ 21 декабря 2010

Полагаю, я должен ответить на свой вопрос. После небольшого исследования и помощи друга и босса, Линуса, я обнаружил, что мне нужно сначала заставить терминал перейти в графический режим, затем распечатать специальные символы и затем вернуться в текстовый режим. код ascii для перехода в графический режим - 14, а 15 вернется в текстовый режим. так вот код в ruby:

printf("%c\n", 14)
printf("%c ", 0x6A) # ┘
printf("%c ", 0x6B) # ┐
printf("%c ", 0x6C) # ┌
printf("%c ", 0x6D) # └
printf("%c ", 0x6E) # ┼ 
printf("%c ", 0x71) # ─
printf("%c ", 0x74) # ├
printf("%c ", 0x75) # ┤
printf("%c ", 0x76) # ┴
printf("%c ", 0x77) # ┬
printf("%c\n", 0x78) # │


a = sprintf("%c", 0x6C) + # ┌
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c\n", 0x6B) +  # ┐
sprintf("%c", 0x78) + # │
#print("      ")
"      " + 
sprintf("%c\n", 0x78) + # │
sprintf("%c", 0x6D) + # └
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x71) + # ─
sprintf("%c", 0x6A)  # ┘

puts a

printf("%c\n", 15)
3 голосов
/ 21 декабря 2010

Вы действительно должны исследовать ncurses и его варианты.Существует целый ряд различных языковых привязок, хотя изначально он был написан для C. Он предоставляет довольно существенный набор библиотек для создания TUI (текстовых интерфейсов) с окнами, меню, рамками и т. Д.другие ссылки.

...