TUI с использованием сленга с чистыми символами ascii (7 бит) через termcap - PullRequest
0 голосов
/ 25 февраля 2010

Я использую 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 ]

1 голос
/ 22 мая 2017

short: нет - он (тритон и сленг) просто не делает , что.

long:

newt использует функцию 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.

0 голосов
/ 05 января 2011

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

...