2016-05-11 3 views
4

J'écris beaucoup de petits scripts d'aide, et souvent ceux-ci impriment du texte coloré dans le terminal. Pour la simplicité de leur packaging et de leur distribution, je souhaite souvent que ces petits scripts soient sans dépendances.Existe-t-il une liste de codes d'échappement ANSI dans les bibliothèques standard?

D'où je suis duplication des données apprecier dans les scripts:

ansi_colors = { 
    None: '\x1b[0m', # actually black but whatevs 
    'red': '\x1b[31m', 
    'green' : '\x1b[32m', 
    ... 
} 

Est-ce que ces données existent partout dans les bibliothèques de base? J'ai creusé et j'ai trouvé que curses avait des constantes COLOR_*, mais ce ne sont que des entiers et il n'est pas évident de voir comment ceux-ci se transforment en codes d'échappement ANSI.

Je suis déjà au courant des modules comme termcolor, colorama, blessings, donc s'il vous plaît ne suggère pas d'utiliser ceux-ci - Je veux dépendre uniquement des bibliothèques standard.

+0

'man terminfo' est un un peu d'aide, montrant deux cartes de couleurs standard. – mpez0

Répondre

2

Vous pouvez consulter la page de manuel console_codes(4). Ce que vous voulez est l'ECMA-48 Set Graphics Rendition:

L'ECMA-48 séquence SGR ESC [ parameters m ensembles attributs d'affichage. Plusieurs attributs peuvent être définis dans la même séquence, séparés par points-virgules. Un paramètre vide (entre les points-virgules ou la chaîne initiateur ou terminateur) est interprété comme un zéro.

param result 
    0  reset all attributes to their defaults 
    1  set bold 
    2  set half-bright (simulated with color on a color display) 
    4  set underscore (simulated with color on a color display) (the colors used to 
      simulate dim or underline are set using ESC ] ...) 
    5  set blink 
    7  set reverse video 
    10  reset selected mapping, display control flag, and toggle meta flag (ECMA-48 
      says "primary font"). 
    11  select null mapping, set display control flag, reset toggle meta flag 
      (ECMA-48 says "first alternate font"). 
    12  select null mapping, set display control flag, set toggle meta flag (ECMA-48 
      says "second alternate font"). The toggle meta flag causes the high bit of a 
      byte to be toggled before the mapping table translation is done. 
    21  set normal intensity (ECMA-48 says "doubly underlined") 
    22  set normal intensity 
    24  underline off 
    25  blink off 
    27  reverse video off 
    30  set black foreground 
    31  set red foreground 
    32  set green foreground 
    33  set brown foreground 
    34  set blue foreground 
    35  set magenta foreground 
    36  set cyan foreground 
    37  set white foreground 
    38  set underscore on, set default foreground color 
    39  set underscore off, set default foreground color 
    40  set black background 
    41  set red background 
    42  set green background 
    43  set brown background 
    44  set blue background 
    45  set magenta background 
    46  set cyan background 
    47  set white background 
    49  set default background color 

Je ne pense pas qu'ils sont disponibles en-est en tout module Python standard. Mais si vous regardez attentivement, vous remarquerez que les couleurs de premier plan sont 30 plus la constante curses, tandis que les couleurs de fond sont 40 plus la constante curses. Ainsi, vous pouvez écrire quelque chose comme ceci:

import curses 
def fcolor(c): 
    return '\x1B[{0}m'.format(30 + c) 
def bcolor(c): 
    return '\x1B[{0}m'.format(40 + c) 
def fbcolor(f, b): 
    return '\x1B[{0};{1}m'.format(30 + f, 40 + b) 

print(fbcolor(curses.COLOR_RED, curses.COLOR_YELLOW) + "hello!") 
2

Cela dépend de ce que vous voulez. Les couleurs ANSI se réfèrent techniquement à la palette de 8 couleurs impliquée par ECMA-48 (ISO-6429) qui a nommé des constantes dans les malédictions. Les bibliothèques ne stockent pas les séquences d'échappement; ceux-ci sont dans une base de données . Pour un terminal ANSI (sic), ceux-ci correspondent à des séquences d'échappement qui définissent le rendu graphique (attributs vidéo tels que gras, souligné, inverse — et couleur). Termcap, terminfo et curses utilisent une notion plus générale où vous commencez avec un numéro de couleur et générez la séquence d'échappement qui peut produire la couleur correspondante.

Les terminaux peuvent ne pas avoir de couleurs, de couleurs multiples (8 par exemple, mais peut-être 16, 88, 256 pour les terminaux xterm et similaires). Les informations indiquant comment procéder sont stockées dans la base de données du terminal sous la forme capacités. Pour définir la couleur de premier plan ANSI, utilisez setaf, que ce soit au moyen d'un appel de bibliothèque ou une application en ligne de commande, comme tput, par exemple,

tput setaf 4 

pour la couleur 4 (bleu).Les applications simples utilisent les interfaces termcap ou terminfo de bas niveau, généralement avec les bases de données terminfo. Bien que vous soyez enclin à formater vos propres séquences d'échappement, ces interfaces fournissent des fonctions de formatage qui vous permettent d'éviter de connaître le nombre de couleurs qu'un terminal peut prendre en charge. La base de données du terminal indique à votre programme, à l'aide de la variable d'environnement TERM, de sélectionner la description du terminal. Si vous avez un terminal supportant plus de 8 couleurs, la séquence d'échappement est et non formée en ajoutant 30 ou 40 au numéro de couleur.

Voici un exemple en utilisant l'interface terminfo de bas niveau de Python:

import curses 

curses.setupterm() 
curses.putp(curses.tparm(curses.tigetstr("setaf"), curses.COLOR_RED)) 
curses.putp(curses.tparm(curses.tigetstr("setab"), curses.COLOR_YELLOW)) 
curses.putp("hello!") 
curses.putp(curses.tigetstr("sgr0")) 
curses.putp("\n") 

Pour en savoir plus: