Python Pygments и виджет urwid.Edit (список с кортежами) - PullRequest
2 голосов
/ 23 января 2012

У меня проблема. Я пытаюсь сделать редактор для терминала. Поэтому я использую urwid, так как он поддерживает события как клавиш, так и мыши. Моя установка состоит в том, чтобы использовать настраиваемый ListWalker и один виджет редактирования строки, а заголовок - номер строки. Проблема в том, что когда он выделяет фрагменты кода, это делается построчно. Что очень эффективно. Но тут есть подвох. Например, если у вас есть многострочная строка документа, она будет выделена неправильно.

  1 """This is a docstring and it is be highlighted this whole line.
  2 This  is not higlighted"""#This should be a comment but is a part of the doc string

Я не могу обернуть голову вокруг этого. Для выделения кода я использую

list(lex(self._edit_text, self.parent.language))

Это окрашено, используя палитру urwid.

palette = [(token.Token.Literal.String.Doc, "dark magenta", "black"),]
#                              |                 |             |
#                       the identifier          fg            bg
# if it isn't lined up, palette[0] is the identifier('"""*"""'),
# palette[1] is the foreground color and palette[2] is the background color.

строки хранятся в списке смайликов

[urwid.Edit("  1 ",'"""This is a docstring and it's highlighted as a string.'),\
urwid.Edit("  2 ",\
    'This  is not higlighted"""#This should be a comment but is a part of the doc string')]

и функция выделения производит

[(Token.Literal.String.Doc, '"""This is a docstring and it's highlighted as a string.')\
    (Token.Name,\
    'This  is not higlighted"""#This should be a comment but is a part of the doc string')]

И когда он обрабатывается, он делает строку из текста и сохраняется в self._edit_text. Затем он создает список кортежей, сохраненных как

self._attrib = [('ln_sel', 4), (Token.Name, 4), (Token.Text, 2), (Token.Operator.Word, 2),\
    (Token.Text, 1), (Token.Operator.Word, 3), (Token.Text, 1), (Token.Name, 10), \
    (Token.Literal.String, 61)]

Это означает, что self._edit_text [0: 4] окрашен с помощью кортежа палитры «ln_sel», а этот self._edit_text [4: 8] окрашен с помощью кортежа палитры «Token.Name».

Как я могу сделать эту работу?

Спасибо:)

http://excess.org/urwid/
http://pygments.org/

...