2013-10-06 165 views
2

我有一個讀取Minecraft控制檯輸出的程序,並將其放入Qt文本編輯字段(不相關)。但是,Minecraft控制檯使用ANSI顏色代碼([0;32;1m)輸出顏色,我希望它們採用HTML格式(因爲Qt文本編輯字段會讀取這些顏色)。Python:將ANSI顏色代碼轉換爲HTML

我研究了一下,發現了一堆需要樣式表的解決方案,這不是我想要的。我想要的是一個簡單的<span style="color: green"></span>或類似的,內聯。

任何人都可以幫助我實現這個目標嗎?

+0

也許[此包](https://pypi.python.org/pypi/ansi2html)可以提供幫助嗎? –

+0

@TimPeters我檢查了一個,但是那樣做了我不想要的一堆類定義的樣式表。 – user1438098

回答

1
import re 

COLOR_DICT = { 
    '31': [(255, 0, 0), (128, 0, 0)], 
    '32': [(0, 255, 0), (0, 128, 0)], 
    '33': [(255, 255, 0), (128, 128, 0)], 
    '34': [(0, 0, 255), (0, 0, 128)], 
    '35': [(255, 0, 255), (128, 0, 128)], 
    '36': [(0, 255, 255), (0, 128, 128)], 
} 

COLOR_REGEX = re.compile(r'\[(?P<arg_1>\d+)(;(?P<arg_2>\d+)(;(?P<arg_3>\d+))?)?m') 

BOLD_TEMPLATE = '<span style="color: rgb{}; font-weight: bolder">' 
LIGHT_TEMPLATE = '<span style="color: rgb{}">' 


def ansi_to_html(text): 
    text = text.replace('[m', '</span>') 

    def single_sub(match): 
     argsdict = match.groupdict() 
     if argsdict['arg_3'] is None: 
      if argsdict['arg_2'] is None: 
       color, bold = argsdict['arg_1'], 0 
      else: 
       color, bold = argsdict['arg_1'], int(argsdict['arg_2']) 
     else: 
      color, bold = argsdict['arg_2'], int(argsdict['arg_3']) 

     if bold: 
      return BOLD_TEMPLATE.format(COLOR_DICT[color][1]) 
     return LIGHT_TEMPLATE.format(COLOR_DICT[color][0]) 

    return COLOR_REGEX.sub(single_sub, text) 

print ansi_to_html('[06-10-13 21:28:23] [INFO] [0;31;1mUsage: /kick [reason ...][m') 
print ansi_to_html('[06-10-13 21:28:23] [INFO] [31;0mUsage: /kick [reason ...][m') 
print ansi_to_html('[06-10-13 21:28:23] [INFO] [31mUsage: /kick [reason ...][m') 

[06-10-13 21:28:23] [INFO] <span style="color: rgb(128, 0, 0); font-weight: bolder">Usage: /kick [reason ...]</span> 
[06-10-13 21:28:23] [INFO] <span style="color: rgb(255, 0, 0)">Usage: /kick [reason ...]</span> 
[06-10-13 21:28:23] [INFO] <span style="color: rgb(255, 0, 0)">Usage: /kick [reason ...]</span> 
+0

「ansi_code」和「text」參數有什麼作用?我把哪個文本放進去?另一個用於什麼? – user1438098

+0

'ansi_code'是你希望'文字'在''元素中具有的ansi顏色代碼。 –

+0

所以......如果我有這樣的文本字符串:'[06-10-13 21:28:23] [INFO] [0; 31; 1mUsage:/ kick [reason ...] [m'怎麼會我將其轉換爲HTML?對不起,如果我看起來很愚蠢,我可能是:) – user1438098