私は最終的にこの問題を解決しました。マークアップ文字列を解析する関数を作成しました(pango.parse_markup
を使用)。ドキュメントとPythonのイントロスペクションを読んで、pango.Attribute
を使って、GtkTextTag
が使用できるプロパティに変換する方法を考え出すことができました。
ここでは、関数の:
def parse_markup_string(string):
'''
Parses the string and returns a MarkupProps instance
'''
#The 'value' of an attribute...for some reason the same attribute is called several different things...
attr_values = ('value', 'ink_rect', 'logical_rect', 'desc', 'color')
#Get the AttributeList and text
attr_list, text, accel = pango.parse_markup(string)
attr_iter = attr_list.get_iterator()
#Create the converter
props = MarkupProps()
props.text = text
val = True
while val:
attrs = attr_iter.get_attrs()
for attr in attrs:
name = attr.type
start = attr.start_index
end = attr.end_index
name = pango.AttrType(name).value_nick
value = None
#Figure out which 'value' attribute to use...there's only one per pango.Attribute
for attr_value in attr_values:
if hasattr(attr, attr_value):
value = getattr(attr, attr_value)
break
#There are some irregularities...'font_desc' of the pango.Attribute
#should be mapped to the 'font' property of a GtkTextTag
if name == 'font_desc':
name = 'font'
props.add(name, value, start, end)
val = attr_iter.next()
return props
この関数は、それらを適用するテキストインデックスと一緒にGtkTextTag
Sを生成する能力を持ってMarkupProps()
オブジェクトを作成します。私は、Pangoのマークアップ文字列、内訳それのプロパティに文字列、およびテキスト形式を指定したことができていますし、その変換し、この機能を持つので、
class MarkupProps():
'''
Stores properties that contain indices and appropriate values for that property.
Includes an iterator that generates GtkTextTags with the start and end indices to
apply them to
'''
def __init__(self):
'''
properties = ( {
'properties': {'foreground': 'green', 'background': 'red'}
'start': 0,
'end': 3
},
{
'properties': {'font': 'Lucida Sans 10'},
'start': 1,
'end':2,
},
)
'''
self.properties = []#Sequence containing all the properties, and values, organized by like start and end indices
self.text = ""#The raw text without any markup
def add(self, label, value, start, end):
'''
Add a property to MarkupProps. If the start and end indices are already in
a property dictionary, then add the property:value entry into
that property, otherwise create a new one
'''
for prop in self.properties:
if prop['start'] == start and prop['end'] == end:
prop['properties'].update({label:value})
else:
new_prop = {
'properties': {label:value},
'start': start,
'end':end,
}
self.properties.append(new_prop)
def __iter__(self):
'''
Creates a GtkTextTag for each dict of properties
Yields (TextTag, start, end)
'''
for prop in self.properties:
tag = gtk.TextTag()
tag.set_properties(**prop['properties'])
yield (tag, prop['start'], prop['end'])
とMarkupProps
対象:ここ
は、オブジェクトの
GtkTextTag
に変換します。
誰かがこのコードに興味があれば、リポジトリを作成しました:https://github.com/wrhansen/MarkupToTextTag – Wes