2012-03-18 15 views
0

gtk.TextViewマークアップのようなテキストを追加したいと思います。これは、gtk.TextTagを使用することで実現できます。これは、Pangoマークアップ文字列と同様のプロパティで作成できます。私はあなたが複数の他のウィジェットと同じようにset_markupをgtk.TextBufferと言う簡単な方法がないことに気付きました。その代わりに、TextTagを作成してプロパティを与え、それをTextBufferのTagTableに挿入して、タグが適用される繰り返しを指定する必要があります。pangoマークアップ文字列をGtkTextTagプロパティに変換する

パンゴマークアップ文字列をテキストタグに変換して同じ効果を得ることができる関数を作成するのが理想的です。しかしgtkはその機能を内蔵していないようです。 マークアップされた文字列にpango.parse_markup()を使用でき、文字列に設定されているプロパティと発生するインデックスに関する情報を含むpango.AttributeListが作成されます。しかし、属性の種類ごとに若干の違いがあり、すべての場合に一般化することが困難です。これについてもっと良い方法がありますか?またはパンゴのマークアップはgtk.TextTagに変換されることを意味しませんか?

答えて

2

私は最終的にこの問題を解決しました。マークアップ文字列を解析する関数を作成しました(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に変換します。

+0

誰かがこのコードに興味があれば、リポジトリを作成しました:https://github.com/wrhansen/MarkupToTextTag – Wes

1

GTK +の開発に従わなかったことがあります。最近、何か追加したかもしれませんが、#59390#505478というバグがあります。彼らは閉じていないので、おそらく何も行われません。

+0

ええと、サポートする予定がないようです。回避策を試しましたか?または何か提案がありますか? – Wes

+0

GTK +やPyGTK、あるいはそれらを使用しているプロジェクトでさえ、私はアクティブではありません。しかし、これはPythonであるため、いくつかの関数をコーディングするのは難しくありません(何らかの理由で 'gtk.TextBuffer'を既にサブクラス化していない限り、メソッドではありません; 1つのメソッドのサブクラス化は、 。私は2番目のバグに記載されている提案に行くだろうが、私は記者だからここに偏っている;) – doublep

+0

ああ、私はバグレポートでそれを一度も言及しなかったと思う。私は、提案された関数と、Pangoのマークアップと同じ/類似のタグを作成する別のものを実装します。したがって、使用法は 'buffer.inject_pango_markup_tags();のようになります。 buffer.insert_parsed(...); '最初の呼び出しは1回だけ実行され、2回目の呼び出しは制限なしに実行されます。 – doublep

関連する問題