TUI с использованием сленга с чистыми символами ascii (7 бит) через termcap

Я использую newt/snack (графическая библиотека Widgit TUI для Python, основанная на сленге), чтобы иметь некоторые интерактивные сценарии. Однако для некоторых целевых терминалов вывод этих экранов не очень хорош. Я могу изменить их внешний вид, изменив $TERM переменная для удаления непечатаемых символов и преобразования их во что-то более подходящее. Например:

TERM=linux python myscript.py

Пока значения, которые я проверял $TERMПолучил лишь умеренный успех.

Есть ли известное значение для $TERM, которое последовательно преобразует графические символы:

┌────────────┤ Title ├────────────┐
│                                 │
│ Some text for the entry window  │
│                                 │
│   foo _______________________   │
│   bar _______________________   │
│   baz _______________________   │
│                                 │
│    ┌────┐        ┌────────┐     │
│    │ Ok │        │ Cancel │     │
│    └────┘        └────────┘     │
│                                 │
└─────────────────────────────────┘

на неграфические символы:

+------------| Title |------------+
|                                 |
| Some text for the entry window  |
|                                 |
|   foo _______________________   |
|   bar _______________________   |
|   baz _______________________   |
|                                 |
|    +----+        +--------+     |
|    | Ok |        | Cancel |     |
|    +----+        +--------+     |
|                                 |
+---------------------------------+

2 ответа

Короче говоря: нет - он (тритон и сленг) просто не делает этого.

долго:

тритон использует функцию SLsmg_draw_box который показан здесь для справки:

void SLsmg_draw_box (int r, int c, unsigned int dr, unsigned int dc)
{  
   if (Smg_Mode == SMG_MODE_NONE) return;

   if (!dr || !dc) return;
   This_Row = r;  This_Col = c;
   dr--; dc--;
   SLsmg_draw_hline (dc);
   SLsmg_draw_vline (dr);
   This_Row = r;  This_Col = c;
   SLsmg_draw_vline (dr);
   SLsmg_draw_hline (dc);
   SLsmg_draw_object (r, c, SLSMG_ULCORN_CHAR);
   SLsmg_draw_object (r, c + (int) dc, SLSMG_URCORN_CHAR);
   SLsmg_draw_object (r + (int) dr, c, SLSMG_LLCORN_CHAR);
   SLsmg_draw_object (r + (int) dr, c + (int) dc, SLSMG_LRCORN_CHAR);
   This_Row = r; This_Col = c;
}

в slsmg.c файл, сленг имеет таблицу:

typedef struct
{  
   unsigned char vt100_char;
   unsigned char ascii;
   SLwchar_Type unicode;               /* may have an ambiguous width */
   SLwchar_Type unicode_narrow;        /* has a narrow width */
}
ACS_Def_Type;

static SLCONST ACS_Def_Type UTF8_ACS_Map[] =
{  
   {'+', '>', 0x2192,  '>'}, /* RIGHTWARDS ARROW [A] */
   {',', '<', 0x2190, '<'}, /* LEFTWARDS ARROW [A] */
   {'-', '^', 0x2191, 0x2303}, /* UPWARDS ARROW [A] */
   {'.', 'v', 0x2193, 0x2304}, /* DOWNWARDS ARROW [A] */

но он автоматически выберет значения Unicode, если приложение (newt) скажет использовать кодировку UTF-8. newt делает это безоговорочно, игнорируя информацию о терминале и локали:

/** 
 * @brief Initialize the newt library 
 * @return int - 0 for success, else < 0 
 */
int newtInit(void) {  
    char * MonoValue, * MonoEnv = "NEWT_MONO";
    const char *lang;
    int ret;

    if ((lang = getenv("LC_ALL")) == NULL)
        if ((lang = getenv("LC_CTYPE")) == NULL)
            if ((lang = getenv("LANG")) == NULL)
                lang = "";
    /* slang doesn't support multibyte encodings except UTF-8, 
       avoid character corruption by redrawing the screen */
    if (strstr (lang, ".euc") != NULL)
        trashScreen = 1;

    (void) strlen(ident);

    SLutf8_enable(-1);
    SLtt_get_terminfo();
    SLtt_get_screen_size();

Вернуться в slsmg.c, init_acs() Функция сначала попытается использовать Unicode (и всегда будет успешной, если ваша локаль поддерживает UTF-8). Если случается что-то еще, функции продолжают использовать любую информацию, существующую в описании терминала.

Как правило, если терминал поддерживает символы рисования линий, каждое описание терминала пишется, чтобы рассказать, как рисовать линии. Если вы изменили описание терминала, чтобы удалить эти возможности, вы можете получить только ASCII (но это основано на простом чтении функции: в slang есть множество жестко закодированных случаев, предназначенных для заполнения описаний терминалов, которые не ведут себя так, как хочет автор сленга, и вы могли бы споткнуться о один из них).

Что бы это ни стоило, возможности terminfo, используемые сленгом: acsc, enacs, rmacs, smacs,

Это может быть основано на вашем $LANG быть настроенным на что-то вроде en_US.UTF-8, Попробуйте изменить это на en_US (при условии, что ваша базовая локаль en_US).

Другие вопросы по тегам