Рисование таблиц в терминале с использованием символов окна ANSI
Я пытаюсь напечатать таблицу, которая более приятна для глаз, чем чистое текстовое представление. в основном я хочу преобразовать что-то вроде этого:
+-----+--------+
| age | weight |
+-----+--------+
| 10 | 100 |
| 80 | 500 |
+-----+--------+
примерно так:
┌─────┬────────┐
| age | weight |
├─────┼────────┤
│ 10 │ 100 │
│ 80 │ 500 │
└─────┴────────┘
вот скриншот того, что я вижу в терминале:
![in terminal looks like this]()
Обратите внимание на промежутки между строками. Моя проблема в том, что они не подключаются должным образом, в то время как другие инструменты Unix, которые используют печать ANSI, выглядят отлично в терминале. Например, дерево, если я запустил tree -A
в моем терминале, я получаю следующее:
![tree in terminal]()
Обратите внимание, что вертикальные линии соединены вместе. это смешно, потому что, когда я копирую и вставляю вывод дерева в свой текстовый редактор и запускаю свой script, я получаю что-то вроде этого:
![tree in my code]()
Очевидно, я что-то пропустил для печати символов ANSI в терминале и не смог найти ничего об этом, отправив его в Google. может ли кто-нибудь пролить свет на эту тему?
Ответы
Ответ 1
Думаю, я должен ответить на свой вопрос. После небольшого исследования и помощи друга и босса Линуса я обнаружил, что мне нужно заставить терминал перейти в графический режим, а затем распечатать специальные символы, а затем вернуться в текстовый режим. код ascii для переключения в графический режим - 14 и 15 вернется в текстовый режим. так вот код в рубине:
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)
Ответ 2
Вам действительно нужно исследовать ncurses и его варианты. Существует множество различных языковых привязок, хотя он был первоначально написан для C. Он предоставляет довольно значительный набор библиотек для создания TUI (текстовых интерфейсов) с окнами, меню, рамками в коробке и т.д.
Попадите в wikipedia, чтобы начать с поиска других ссылок.