お絵描きソフトInkscape(インクスケープ)の使い方を初級レベルから上級レベルまで広く紹介しています。
情報追加のリクエストや分かりにくい点があれば下のCONTACTフォームからどうぞ。

Inkscapeの自作エクステンション(文字列の置換)

  Inkscapeでエクステンションを自作する方法を試してみました。

 このエクステンションでは、ドキュメント中のテキストオブジェクト(<tspan>要素)を探し出して、その中の文字列の一部を別の文字列に置き換えます。置き換え対象の文字列をPythonコード内に直接記述していますが、Pythonの正規表現操作モジュール「re」を使っているので、いろんな文字列パターンにマッチした部分を別の文字列に置き換えるように拡張することも簡単にできると思います。

 Pythonコードを次のように書いてみました。

import inkex
import sys
import re

class TextReplaceExtension(inkex.extensions.EffectExtension):
    def add_arguments(self, pars):
        pass

    def effect(self):
        root = self.svg.root
        self.searchText(root)
        
    def searchText(self, top):
        for obj1 in top:
            print(obj1.get('id')+": "+str(obj1.__class__), file=sys.stderr)
            if  isinstance(obj1, inkex.elements._text.TextElement):
                tspans = obj1.tspans()
                for tspan in tspans:
                    print(" ←"+tspan.text, file=sys.stderr)
                    replaced = re.sub(r'4月', '5月', tspan.text)
                    if tspan.text != replaced:
                        print(" →"+replaced, file=sys.stderr)
                        tspan.text = replaced  
            else:
                self.searchText(obj1)
       
if __name__ == '__main__':
    TextReplaceExtension().run()

 reモジュールの「sub()」という関数を使って、マッチした部分(4月)を別の文字列(5月)に置き換えています。さらに、Pythonコード内に置き換え対象を直接書くのではなく、エクステンション起動時にダイアログ上で指定させるように改良することも簡単です。

 ただ、実用性について言えば、多くのテキストオブジェクトで「<tspan>〇〇〇<tspan>×××</tspan>〇〇〇</tspan>」のようにtspan要素が入れ子の構造になっているので、このサンプルのような単純なPythonコードではうまく置き換えができません。Inkscapeエクステンション用のinkexモジュールではそういうケースを簡単に処理できる関数などは提供されていないので、XMLコードを直接解析するようなコードを頑張って書くしかなさそうです。

 実行すると次のようになります。