Python - MenuMaker 日本語化 - その後の修正 - モジュール構成・メイン

 クラウディア
1. モジュール構成
2. メイン CLI.py
3. 変更点

1. モジュール構成

 モジュール構成は、変わっていません。  ログインユーザのホームディレクトリに展開するものとして、以下のような構造になっています。

jmenumaker
┣ CLI.py
┣ jmmaker.py
┗ MenuMaker
   ┣ __init__.py
   ┣ CLI.py
   ┣ Env.py
   ┣ Fluxbox.py
   ┣ IceWM.py
   ┣ JWM.py
   ┗ Openbox.py
 このうち、「__init__.py」は、実はよくわかっていないので、ソース内には何も記述していません。  実行文のあるソースに関しては、「Doxygen」でドキュメント化できるようにコメントをいれています。  「Doxgen」によるドキュメント化に関しては、「Eclipse - ドキュメント自動化」をご参照ください。  ユーザインタフェースとな、「jmmaker.py」については、変更していません。

python3.7 ~/jmenumaker/jmmaker.py
 で起動します(バージョンはインストールしている「python」によって異なりますが、「3.6」か「3.7」以外では動作確認していません)。

2. メイン CLI.py

 これがメインのプログラムになります。
##
# @file CLI.py
# @version 0.1
# @author 作成:Show.Kit
# @date 2020年6月6日
# @brief jmmaker のほぼメイン

import os
import pprint
import subprocess
import MenuMaker
from MenuMaker import Env

##
# カテゴリ名 英語→日本語 辞書

label_dict = {
    "Configure"   : "設定",
    "Development" : "開発",
    "Editors"     : "エディタ",
    "Exit"        : "終了",
    "Files"       : "ファイル",
    "GNOME"       : "GNOME",
    "Graphics"    : "グラフィックス",
    "Multimedia"  : "マルチメディア",
    "Network"     : "ネットワーク",
    "Office"      : "オフィス",
    "OpenBox"     : "OpenBox",
    "Reconfig"    : "再設定",
    "Reconfigure" : "再設定",
    "Restart"     : "再起動",
    "Settings"    : "設定",
    "Shells"      : "シェル",
    "Styles"      : "スタイル",
    "System"      : "システム",
    "Utilities"   : "ユーティリティ",
    "Workspaces"  : "ワークスペース",
}

##
# カテゴリに名→アイコン 辞書

dic_category_icon = {
    "Configure"   : "configurator",
    "Development" : "applications-development",
    "Editors"     : "accessories-text-editor",
    "Exit"        : "computer-log-out",
    "Files"       : "system-file-manager",
    "GNOME"       : "gnome_apps",
    "Graphics"    : "applications-graphics",
    "Multimedia"  : "applications-multimedia",
    "Network"     : "applications-internet",
    "OpenBox"     : "openbox",
    "Office"      : "applications-office",
    "Reconfig"    : "system-reboot",
    "Reconfigure" : "system-reboot",
    "Restart"     : "system-restart",
    "Settings"    : "configurator",
    "Shells"      : "terminal",
    "Styles"      : "style",
    "System"      : "applications-system",
    "Utilities"   : "applications-utilities",
    "Workspaces"  : "workspace-switcher",
}

##
# LibreOffice 項目名→実行文 辞書

dic_libreoffice_exe = {
    "LibreOffice Base"    : "libreoffice --base",
    "LibreOffice Calc"    : "libreoffice --calc",
    "LibreOffice Draw"    : "libreoffice --draw",
    "LibreOffice Impress" : "libreoffice --impress",
    "LibreOffice Math"    : "libreoffice --math",
    "LibreOffice Writer"  : "libreoffice --writer",
    "LibreOffice"         : "libreoffice",
}

##
# LibreOffice 項目名→アイコン 辞書

dic_libreoffice_icon = {
    "LibreOffice Base"    : "libreoffice-base",
    "LibreOffice Calc"    : "libreoffice-calc",
    "LibreOffice Draw"    : "libreoffice-draw",
    "LibreOffice Impress" : "libreoffice-impress",
    "LibreOffice Math"    : "libreoffice-math",
    "LibreOffice Writer"  : "libreoffice-writer",
    "LibreOffice"         : "libreoffice-startcenter",
}

##
# メニューファイル読み込み
# @brief メニューファイルのフルパスをもらい、読み込んで全行を返す
# @param filename メニューファイル名フルパス
# @return lines メニューファイル全行

def read_menu(filename):
    f = open(filename, "r")                                                     ## File Open
    lines = f.readlines()                                                       ## Read
    f.close()                                                                   ## Close
    return lines

##
# @brief メニューファイルの内容書き換え
# @param lines         更新前 メニューファイルの中身
# @param env           プラットフォーム特有の項目
# @param dic_exec_icon exec : icon 辞書

def update_menu(lines, env, dic_exec_icon):
    for i in range(0, len(lines)-1):                                            ## 全行検索
        for key, value in label_dict.items():                                   ## カテゴリ名辞書検索
            if (env.prefix + key + env.suffix in lines[i]):                     ## カテゴリ名のラベルであれば
                try:                                                            ## 更新
                    lines[i] = env.update_category(lines[i], key, value, dic_category_icon[key])
                except:
                    pass

        for key, value in dic_libreoffice_exe.items():                          ## LibreOffice 検索
            if (key in lines[i]):                                               ## LibreOffice の項目であれば
                try:                                                            ## 更新
                    [lines[i], lines[i+1]] = env.update_libreoffice(lines[i], lines[i+1], key, value, dic_exec_icon[dic_libreoffice_icon[key]])
                except:
                    print('in CLI Exception update_libreoffice')

        ## exec キーワードが含まれている行であれば icon 設定

        try:
            if (env.exec_keyword != None):
                if ('LibreOffice' in lines[i]):
                    continue

                if (env.exec_keyword in lines[i]):
                    lines[i] = env.set_menu_icon(lines[i], lines[i+1], dic_exec_icon)

        except AttributeError:
            pass

    env.set_end_menu(dic_exec_icon, lines)                                      # 終了メニュー書込み

##
# exec → icon 辞書を作成する
# @param  env 環境クラス
# @return dic_exec_icon exec → icon 辞書

def get_dic_exec_icon(env):

    ## exec → icon 辞書
    dic_exec_icon = None

    try:
        dic_exec_icon = env.get_dic_exec_icon(dic_libreoffice_icon)             ## get_dic_exec_icon  メソッドがあれば検索
    except AttributeError:
        pass

    return dic_exec_icon

##
# @brief 出来上がったメニューを更新する
# @param filename メニューファイル フルパス
# @param lines    メニューの全行

def write_menu(filename, lines):
    f = open(filename, "w")                                                     ## File Open
    f.writelines(lines)                                                         ## Write
    f.close()                                                                   ## Close

##
# @brief メイン

def main():
    env = Env.Env()                                                             ## 環境設定

    if (not os.path.exists(env.mmaker)):
        print('MenuMaker を先にインストールしてください')
        return

    print("mmaker -vf --no-debian --no-legacy --no-merge "+env.name)
    result = subprocess.call(['mmaker', '-vf', '--no-debian', '--no-legacy', '--no-merge', env.name])

    l = read_menu(env.filename)
    lines = list()

    for i in l:
        lines.append(i)

    dic_exec_icon = get_dic_exec_icon(env)                                      ## exec → icon 辞書作成
    update_menu(lines, env, dic_exec_icon)
    write_menu(env.filename, lines)

if __name__=='__main__':
    main()


3. 変更点


##
# LibreOffice 項目名→実行文 辞書

dic_libreoffice_exe = {
    "LibreOffice Base"    : "libreoffice --base",
    "LibreOffice Calc"    : "libreoffice --calc",
    "LibreOffice Draw"    : "libreoffice --draw",
    "LibreOffice Impress" : "libreoffice --impress",
    "LibreOffice Math"    : "libreoffice --math",
    "LibreOffice Writer"  : "libreoffice --writer",
    "LibreOffice"         : "libreoffice",
}

##
# LibreOffice 項目名→アイコン 辞書

dic_libreoffice_icon = {
    "LibreOffice Base"    : "libreoffice-base",
    "LibreOffice Calc"    : "libreoffice-calc",
    "LibreOffice Draw"    : "libreoffice-draw",
    "LibreOffice Impress" : "libreoffice-impress",
    "LibreOffice Math"    : "libreoffice-math",
    "LibreOffice Writer"  : "libreoffice-writer",
    "LibreOffice"         : "libreoffice-startcenter",
}
 まるっと追加しています。  前半部分が、項目名から実行文の辞書。  後半部分が、項目名からアイコン名への辞書となります。

##
# @brief メニューファイルの内容書き換え
# @param lines         更新前 メニューファイルの中身
# @param env           プラットフォーム特有の項目
# @param dic_exec_icon exec : icon 辞書

def update_menu(lines, env, dic_exec_icon):

    for i in range(0, len(lines)-1):                                            ## 全行検索
        for key, value in label_dict.items():                                   ## カテゴリ名辞書検索
            if (env.prefix + key + env.suffix in lines[i]):                     ## カテゴリ名のラベルであれば
                try:                                                            ## 更新
                    lines[i] = env.update_category(lines[i], key, value, dic_category_icon[key])
                except AttributeError:
                    pass

        ## exec キーワードが含まれている行であれば icon 設定

        try:
            if (env.exec_keyword != None):
                if (env.exec_keyword in lines[i]):
                    lines[i] = env.set_menu_icon(lines[i], lines[i+1], dic_exec_icon)

        except AttributeError:
            pass

    env.set_end_menu(lines)                                                     # 終了メニュー書込み
 を

##
# @brief メニューファイルの内容書き換え
# @param lines         更新前 メニューファイルの中身
# @param env           プラットフォーム特有の項目
# @param dic_exec_icon exec : icon 辞書

def update_menu(lines, env, dic_exec_icon):
    for i in range(0, len(lines)-1):                                            ## 全行検索
        for key, value in label_dict.items():                                   ## カテゴリ名辞書検索
            if (env.prefix + key + env.suffix in lines[i]):                     ## カテゴリ名のラベルであれば
                try:                                                            ## 更新
                    lines[i] = env.update_category(lines[i], key, value, dic_category_icon[key])
                except:
                    pass

        for key, value in dic_libreoffice_exe.items():                          ## LibreOffice 検索
            if (key in lines[i]):                                               ## LibreOffice の項目であれば
                try:                                                            ## 更新
                    [lines[i], lines[i+1]] = env.update_libreoffice(lines[i], lines[i+1], key, value, dic_exec_icon[dic_libreoffice_icon[key]])
                except:
                    print('in CLI Exception update_libreoffice')

        ## exec キーワードが含まれている行であれば icon 設定

        try:
            if (env.exec_keyword != None):
                if ('LibreOffice' in lines[i]):
                    continue

                if (env.exec_keyword in lines[i]):
                    lines[i] = env.set_menu_icon(lines[i], lines[i+1], dic_exec_icon)

        except AttributeError:
            pass

    env.set_end_menu(dic_exec_icon, lines)                                      # 終了メニュー書込み

 へと更新しています。  「LibreOffice」の項目を変更する部分をいれて、逆に、実行モジュールからアイコンを作成する部分で変な上書きをしないよう「LibreOffice」の項目は渡さないようにしています。  末尾で終了メニューを作成するメソッドに、アイコンを渡しています。

# exec → icon 辞書を作成する
# @param  env 環境クラス
# @return dic_exec_icon exec → icon 辞書

def get_dic_exec_icon(env):

    ## exec → icon 辞書
    dic_exec_icon = None

    try:
        dic_exec_icon = env.get_dic_exec_icon(dic_libreoffice_icon)             ## get_dic_exec_icon  メソッドがあれば検索
    except AttributeError:
        pass

    return dic_exec_icon

 153行の「実行モジュール → アイコン」の辞書を作成するメソッドへ渡す引数として「LibreOffice」の辞書を渡すようにしました。
ハイスピードプランメンズミレット損保との違い