Python - MenuMaker 日本語化 - その後の修正 - Fluxbox

 クラウディア
1. Fluxbox
2. ソース
3. 変更点

1. Fluxbox

 「Fluxbox」では、「Fluxbox」の操作や、終了メニューもいじれそうなので、その部分も含めて、変更してみました。  改めて。  「Fluxbox」のメニューの構造は

[submenu] (カテゴリ名) <アイコンファイル名>
    [exec] (アイテム名) {ロードモジュール} <アイコンファイル名>
    [exec] (アイテム名) {ロードモジュール} <アイコンファイル名>
[end]
 という形式になっています。  サブカテゴリを分ける場合は、「[submenu]」をネストさせます。  「<アイコンファイル名>」は、オリジナルの「MenuMaker」では、カッコを含めて何も出力されません。  何故か、「FreeBSD」の「Fluxbox」は、「.png」も「.svg」も表示できないので、すべて「.xpm」に変換してやる必要があります。

2. ソース

 ソースは、以下になります。
##
# @file Fluxbox.py
# @version 0.1
# @author show.kit・更新者
# @date 2020年6月5日-2020年6月5日
# @brief Fluxbox の環境変数設定ファイル

import os
import pprint
import re
import sys
from _ast import Try

##
# @class Fluxbox
# @brief Fluxbox の環境変数設定

class Fluxbox:

    ## Fluxbox::__init__
    # @brief 初期化関数
    # @return 戻り値なし
    def __init__(self):

        ## デスクトップ名
        self.frontend = 'Fluxbox'

        ## メニューファイル名
        self.filename = os.environ.get('HOME') + '/.fluxbox/menu'

        ## 項目名の先頭括弧
        self.prefix = "("

        ## 項目名の括弧閉じ
        self.suffix = ")"

        ## カスタムアイコンディレクトリ
        self.icon_directory = os.environ.get('HOME') + '/.fluxbox/icons'

        if (not os.path.exists(self.icon_directory)):
            os.mkdir(self.icon_directory)

        ## メニューのプログラム行検出キーワード
        self.exec_keyword = '[exec]'

    ##
    # メニューのカテゴリ行を日本語に変える
    # @param env            環境クラス
    # @param line           対象行
    # @param label_en       カテゴリ名英語
    # @param label_jp       カテゴリ名日本語
    # @param directory_icon カテゴリアイコンのディレクトリ
    # @param icon           アイコンファイル(拡張子なし)
    # @return line          変換後の行

    def update_category(self, env, line, label_en, label_jp, directory_icon, icon):

        ## カテゴリ名を英語から日本語へ

        line = line.replace(self.prefix + label_en + self.suffix, self.prefix + label_jp + self.suffix)

        ## メニューアイコンの .svg は使えないので .xpm に変換して使用する
        if (not os.path.exists(self.icon_directory)):                           ## カスタムディレクトリがなければ
            os.mkdir(self.icon_directory)                                       ## 作成する

        icon_fullpath = self.icon_directory + '/' + icon + '.xpm'               ## アイコンのフルパス

        if (not os.path.exists(icon_fullpath)):                                 ## アイコンファイルがなければ
            from_file_path = directory_icon + '/' + icon + '.svg'               ## .svg を変換して
            env.convert(from_file_path, icon_fullpath)                          ## .xpm へする

        ## icon 追加

        line = line.rstrip('\n')                                                ## 末尾を削除
        return line + " <" + icon_fullpath + ">\n"                              ## icon 定義を追加して戻す

    ##
    # メニューの LibreOffice 行にアイコンを追加して、個別の実行文にする
    # @param line         対象行
    # @param nextline     対象行の次の行(本クラスでは使用しない)
    # @param label        項目名
    # @param exe_sentence 実行文
    # @param icon         アイコンファイル(拡張子なし)

    def update_libreoffice(self, line, nextline, label, exe_sentence, icon):
        line = line.replace('[exec] ('+label+') {libreoffice}', '[exec] ('+label+') {'+exe_sentence+'} <'+icon+'>')
        return [line, nextline]

#####
    # 終了メニュー設定
    # @param env   環境変数クラス(本メソッドでは未使用)
    # @param  dic_exec_icon exec → icon 辞書
    # @param lines メニューファイル全行

    def set_end_menu(self, env, dic_exec_icon, lines):
        ## Fluxbox のアイコンをつける

        for i in range(0, len(lines)-1):                                        ## 全行検索
            if ('[submenu] (FluxBox)' in lines[i]):
                try:
                    lines[i] = lines[i].replace('[submenu] (FluxBox)', '[submenu] (FluxBox) <'+dic_exec_icon['fluxgui']+'>')
                except:
                    print('except だべ')

        ## 終了メニュー用アイコン

        try:
            lines.insert(-2, '        [exec] (メニュー更新) {python3.7 ~/jmenumaker/jmmaker.py > /dev/null} <'+dic_exec_icon['reboot']+'>'+"\n")
            lines.insert(-2, '        [exec] (システム再起動) {sudo /sbin/reboot} <'+dic_exec_icon['reboot']+'>'+"\n")
            lines.insert(-2, '        [exec] (シャットダウン) {sudo /sbin/poweroff} <'+dic_exec_icon['shutdown']+'>'+"\n")
        except:
            pass

    ##
    # @brief applications/*.desktop を検索して
    #    プログラム名 → アイコンファイル名の辞書を返す
    #    Fluxbox では、.xpm しか表示できない
    # @param env           環境変数クラス
    # @param dic_exec_icon .desktop より取得した編集前の exec → icon 辞書
    # @return exec → icon ファイル名フルパス の辞書

    def get_dic_exec_icon(self, env, dic_exec_icon):

########## box, update, reboot, shutdown のキーを辞書に追加しておく

        dic_exec_icon['fluxgui'] = 'fluxgui'
        dic_exec_icon['update'] = 'system-software-update'
        dic_exec_icon['reboot'] = 'system-reboot'
        dic_exec_icon['shutdown'] = 'system-shutdown'

        ## exe → icon 辞書の妥当性をチェック
        ## 妥当でなければ変更
        ## 有効な拡張子、ディレクトリ(どちらも優先順位順)

        effect_extend = [ '.xpm', '.png', '.svg' ]
        effect_directory = [ env.directory_xpm, env.directory_png, env.directory_icon_apps ]

        for key, value in dic_exec_icon.items():                                ## exec → icon 辞書作成
            if (os.path.exists(value)):                                         ## icon が存在する
                dirname, name, extend = env.mysplit(value)                      ## フルパスを分解

                if (extend == effect_extend[0]):                                ## 拡張子が .xpm である
                    continue                                                    ## continue

                ## 拡張子が .png や .svg の場合

                if ((extend == effect_extend[1]) or (extend == effect_extend[2])):
                    to_icon = self.icon_directory + '/' + name + effect_extend[0]
                    env.convert(value, to_icon)                                 ## 変換して
                    dic_exec_icon[key] = to_icon                                ## .xpm を設定
                    continue                                                    ## 成功しても失敗しても continue

            elif(not '.' in value):                                             ## icon が存在しない . を含まない
                for extend in effect_extend:                                    ## 拡張子として有効なものを検索

                    for directory in effect_directory:
                        icon = directory + '/' + value + extend                 ## icon ファイル名組み立て

                        if (os.path.exists(icon)):                              ## 存在する
                            if (extend != effect_extend[0]):                    ## .xpm ではない

                                ## .xpm へ変換

                                to_icon = self.icon_directory + '/' + value + effect_extend[0]

                                env.convert(icon, to_icon)
                                icon = to_icon

                            dic_exec_icon[key] = icon                           ## icon として設定する
                            break                                               ## break
                    else:
                        continue
                    break
            else:                                                               ## . を含む
                ## 苦し紛れの特殊処理(これは、あんまりだけれども)

                if (value == 'org.gnome.nautilus'):
                    value += '.svg'

                for directory in effect_directory:                              ## 有効なディレクトリ順に検索
                    icon = directory + "/" + value

                    if (os.path.exists(icon)):                                  ## フルパス/ファイル名 が存在する
                        dirname, name, extend = env.mysplit(icon)               ## フルパスを分解

                        for ef_extend in effect_extend:                         ## 拡張子として有効なものを検索
                            if (ef_extend == extend):                           ## 有効なもの

                                if (extend != effect_extend[0]):                ## 拡張子が .xpm でなければ

                                    ## .xpm へ変換

                                    to_icon = self.icon_directory + '/' + value + effect_extend[0]

                                    env.convert(icon, to_icon)
                                    icon = to_icon

                                dic_exec_icon[key] = icon                       ## icon として設定する
                                break                                           ##
                else:
                    continue
                break

        return dic_exec_icon;

    ##
    # @brief  icon をメニューに設定する
    # @param  line     メニューの対象行
    # @param  nextline 対象行の次の行(Fluxbox では使用しない)
    # @param  dic_exec_icon exec → icon 辞書
    # @return line 更新した行

    def set_menu_icon(self, line, nextline, dic_exec_icon):

        match = re.search(r"\{.*\}" , line)                                     ## {...} に挟まれた部分を取り出し

        if (' ' in match.group()):
            exename = match.group().split(' ')[0]
            exename = exename[1:]
        else:
            exename = match.group()[1:-1]

        if (exename in dic_exec_icon):                                          ## exec → icon 辞書に exe が存在するならば
            line = line.rstrip('\n')                                            ## 末尾を削除
            return line + " <" + dic_exec_icon[exename] + ">\n"                 ## icon 定義を追加して戻す

        return line                                                             ## 更新がない場合そのまま返す


3. 変更点

 「Python - MenuMaker 日本語化 - アイコン」との変更点を説明しておきます。

import sys
 「try ~ catch」を追加したので、「import」を追加。

import sys
from _ast import Try
 まるまる、終了メニューの追加。

    ##
    # メニューの LibreOffice 行にアイコンを追加して、個別の実行文にする
    # @param line         対象行
    # @param nextline     対象行の次の行(本クラスでは使用しない)
    # @param label        項目名
    # @param exe_sentence 実行文
    # @param icon         アイコンファイル(拡張子なし)

    def update_libreoffice(self, line, nextline, label, exe_sentence, icon):
        line = line.replace('[exec] ('+label+') {libreoffice}', '[exec] ('+label+') {'+exe_sentence+'} <'+icon+'>')
        return [line, nextline]

#####
    # 終了メニュー設定
    # @param env   環境変数クラス(本メソッドでは未使用)
    # @param  dic_exec_icon exec → icon 辞書
    # @param lines メニューファイル全行

    def set_end_menu(self, env, dic_exec_icon, lines):
        ## Fluxbox のアイコンをつける

        for i in range(0, len(lines)-1):                                        ## 全行検索
 「get_dic_exec_icon」メソッドで、「box」「update」「reboot」「shutdown」のアイコンを追加。

            lines.insert(-2, '        [exec] (シャットダウン) {sudo /sbin/poweroff} <'+dic_exec_icon['shutdown']+'>'+"\n")
        except:
            pass

    ##
    # @brief applications/*.desktop を検索して
 上記で追加したアイコンを終了メニューの設定時に追加できるように、クラス内のメンバ変数として定義。


                                    ## .xpm へ変換

                                    to_icon = self.icon_directory + '/' + value + effect_extend[0]

                                    env.convert(icon, to_icon)
                                    icon = to_icon

earthcar(アースカー)
ネットオークションの相場、統計、価格比較といえばオークファン
薬屋の独り言