- 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」の辞書を渡すようにしました。
|