なんか

メモのような日記のような、なんか。

サタスペ情報リスト編集ツール作成1

部活動の用事でしばらく更新できない日が続いている。
 とはいえ何もしていないわけではなく、あいまあいまにちょっとPythonで遊んでた。今挑戦しているのはサタスペというTRPGの情報リスト編集ツール。Pythonだと文字列の比較とかが式一つで書けるからすっごいラク。その代わり速度が犠牲になったりするらしいのだけれど、この程度の処理なら速度もくそもないのでまあいいや。

#! /usr/bin/python
# -*- coding: utf- -*-

# 情報リストのクラス
class Tags:
    # タグを定義するクラス
    class Tag:
        def __init__(self, id, rank, parent, type):
            self.id = id            # タグのid
            self.rank = rank        # タグの深度
            self.parent = parent    # タグの親タグ
            self.type = type        # タグの種類
            self.children = []      # 子タグのリスト

    def __init__(self):
        self.latest_id = 0      # id重複を避けるためのカウンタ
        # タグのリスト
        self.list = [Tags.Tag(self.latest_id, 0, None, None)]
    
    # idを検索して、そのidを持つTagインスタンスを返す。どのクラスも持たないときはNoneを返す
    def search(self, id):
        for i in self.list:
            if i.id == id:
                return i
        return None

    # Tagクラスを追加する。親idとタグの種類が引数
    def add(self, parent_id, type):
        parent = self.search(parent_id)     # 親idから親Tagインスタンスを取得
        if parent == None:  # idと一致するTagインスタンスがないとき
            return -1       # 異常終了の意
        self.latest_id += 1                 # id重複を避けるためのカウンタを更新
        rank = parent.rank + 1              # 親タグを元に、タグの深度を決める
        tag = Tags.Tag(self.latest_id, rank, parent, type)
        self.list.append(tag)               # リストにタグ追加
        parent.children.append(tag)         # 親タグの小タグリストにタグ追加
        return 0                            # 正常終了の意

    # Tagインスタンスを削除する。消したいタグのidが引数
    def rm(self, id):
        if id == 0:         # ルートタグを削除しようとしたとき
            print u"ルートタグは削除できません"
            return -1       # 異常終了の意
        tag = self.search(id)   # 削除するTagインスタンスを取得
        parent = tag.parent     # あとそいつの親取得
        self.list.remove(tag)   # リストから削除
        parent.children.remove(tag) # 親の小リストから削除
        return 0        # 正常終了の意

    def ls(self):
        print "ID\tTYPE"
        for i in self.list:
            print "%02d\t%s" % (i.id, i.type)

 ……とっても無駄が多い気がするが、まあ、ご愛嬌。とりあえずデータの構造はこれでいいと思うので、次はこれを木のように枝分かれさせて表示するための捜索メソッドを作る。