Jak to z lenistwa dodaję sobie roboty – cz.1

O, to nie pierwszy raz;) W sumie to bardzo ciekawy plus lenistwa, który skłania do rozwijania się. Dziś w programie “konwerter menu (Fluxbox) do menu.xml (Openbox)“.

Jeśli ktoś czyta ten blog, to wie, że używałem (bo już nie używam) Fluxboksa – porzuciłem go na rzecz Openbox. Tak się składa, że podczas ferii natknąłem się na wzmiankę o “najszybszym Ubuntu” (niestety nie ma wersji amd64), zainteresowało mnie tam lekkie środowisko Openbox, o którym wcześniej nie słyszałem.

Nie będę dzisiaj jednak recenzował Openboksa – choćby dlatego, że używam go dopiero kilka dni, w każdym razie ma wiele zalet Fluxboksa i jest pozbawione kilku jego wad – na razie mi to wystarczy.

Przejdę do meritum: w Openboksie używa się pliku XML (menu.xml) zamiast tekstowego menu. Wierzę głęboko, że ma to jakieś uzasadnienie, poza tym, żeby wstawiać XMLa wszędzie gdzie popadnie:), co nawet nie jest takim złym pomysłem, ale plik menu.xml trzeba było utworzyć…

Ponieważ miałem ładnie napisany plik “menu”, w którym już było to co mi było potrzebne, trzeba było go przerobić na XMLa. Ręcznie? Za dużo roboty – 111 linii to trochę za dużo… – o jakieś 110 linii. Z pomocą ruszył mi Python.

Udało mi się na szybko sklecić taki oto skrypt:

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import re
import os

home = os.path.expanduser("~") 

# Pliki
#
fbfile = open(home + '/.fluxbox/menu', 'r')
obfile = open(home + '/.config/openbox/menu.xml','w')

tab_level = 0

def writeTabs():
        return '\t' * tab_level

def writeToMenu(str):
        obfile.write( writeTabs() + str + '\n' )

# Zmienna zakończenia działania skryptu
#
EndBool = True

# Wzory na rozpoznawanie wpisów.
#
pat_sm = re.compile('.*\[(begin|submenu)\].* \((?P.*)\).*')
pat_ex = re.compile('.*\[(?P(exec|exit))\].*\((?P.*)\).*{(?P.*)}.*')
pat_sp = re.compile('.*\[(?P(exit|restart|reconfig))\].*\((?P.*)\).*')
pat_in = re.compile('.*\[include\].*\((?P.*)\).*')

# Zaczynamy:
#
writeToMenu('\n')
tab_level += 1

# Funkcja zapisuje pojedyńczy element ;
#
def node(label, execute, name='Execute'):
        writeToMenu('')
        writeToMenu('\t')
        if name == 'Execute':
                execute = execute.replace('&','&')
                writeToMenu('\t\t' + execute + '')
        writeToMenu('\t')
        writeToMenu('')

# Główna pętla:
#
while (EndBool):
        line = fbfile.readline()

        if (line == ''):
                EndBool = False

        tmp = pat_ex.search(line)
        if tmp:
                node(tmp.group('name'), tmp.group('kod')) 
                continue
        else:
                tmp = pat_sm.search(line)
                if tmp:
                        writeToMenu('')
                        if (tab_level != 1):
                                menu_id = tmp.group('name')
                        else:
                                menu_id = 'root-menu'

                        writeToMenu('')
                        tab_level += 1
                        continue
                else:
                        tmp = pat_sp.search(line)
                        if tmp:
                                node(tmp.group('name'), '', tmp.group('kind'))  
                                continue

        tokens = line.split()
        if len(tokens) > 0:
                tmp = tokens[0][1:-1]

                if tmp == 'separator':
                        writeToMenu('')

                if tmp == 'end':
                        tab_level -= 1
                        writeToMenu('')


# Wieńczymy dzieło:
#
obfile.write('\n')
obfile.close()
fbfile.close()
print "Done"

Kilka uwag:

  • skrypt można swobodnie używać, modyfikować itp… jak tam kto chce, w zamian było by mi miło, gdyby umieścić skromną wzmiankę o mnie:) + link na tę stronę
  • nie gwarantuje, że skrypt będzie działa bez awaryjnie
  • nie gwarantuje, że skrypt w ogóle będzie działa
  • musicie uważać! bez ostrzeżenia nadpisuje on plik menu.xml!
  • nie biorę odpowiedzialności, co skrypt zrobi – zapewniam jednak, że był pisany tylko i wyłącznie w opisanym celu
  • zweryfikować utworzony plik menu.xml można narzędziem obmenu, gdyby były problemy, to może oznaczać, że w pliku menu występują symbole w XMLu nie dopuszczalne (np.: u mnie to było “&”, dlatego dodałem odpowiednią linijkę)
  • skrypt pisany był na szybko, więc nie śmiać się;P
  • wybaczcie mało komentarzy w kodzie
  • pozdrawiam

6 thoughts on “Jak to z lenistwa dodaję sobie roboty – cz.1

Comments are closed.