Bugfix: Ebenen werden jetzt richtig sortiert

Dokumentation: Bilder aufgenommen
This commit is contained in:
martin_r 2009-01-30 11:59:37 +00:00
parent e76b64fe77
commit 40f52335f4
2 changed files with 42 additions and 33 deletions

View File

@ -49,7 +49,8 @@ options = OptionParser(usage = 'example: %prog -ti -astest', description = 'YAML
make_option('-W', '--key-level-delimiter-width', type = 'int', metavar = 'int', default = 1, help = 'default = %default'),
make_option('-f', '--key-level-delimiter-filler', metavar = 'char',default = " ", help = 'default = %default'),
make_option('-D', '--key-level-delimiter', metavar = 'char'),
make_option('-l', '--key-levels-per-line', type = 'int', metavar = 'int', default = 3, help = 'default = %default')
make_option('-l', '--key-levels-per-line', type = 'int', metavar = 'int', default = 3, help = 'default = %default'),
make_option('-L', '--no-level-disorder',dest = 'level_disorder', action = 'store_false', default = True, help = 'Level 4 and 5 are not swapped')
]).parse_args()[0]
if options.destination_file == None:
options.destination_file = options.source_file.rsplit(file_name_standard_extension)[0]
@ -79,39 +80,46 @@ def parse_key_panel(key_panel, key_width = 5):
'''
return_model = []; return_view = []; key_row = []; key_row_index = 0 # initialization
for row in [row[:key_panel.index(box_drawings[3])] for row in key_panel.splitlines()[1:]]: # omit beginning and ending box drawings
if row[0] in (box_drawings[12], box_drawings[14]): # if row begins with ├ or │,
return_model.append([]); return_view.append([]) # create key row list
key_lines = []
for row in [row[:key_panel.index(box_drawings[3])] for row in key_panel.splitlines()[1:]]: # omit the first line and from closing box drawings
if row[0] not in (box_drawings[12], box_drawings[14]): # if row begins not with “├” or “└”:
key_lines = []; key_row.append(row) # push line (sic)
else:
return_model.append([]); return_view.append([]) # create key row lists
for key_line_index, key_line in enumerate(key_row[:: - 1]): # reverse lines
for key_index, key in enumerate(key_line[1:].split(box_drawings[10])): # split key line into keys
for key_index, key in enumerate(key_line[1:].split(box_drawings[10])): # omit beginning key delimiter and split key line into key lines:
if key_line_index == 0: # if bottom line,
return_model[key_row_index].append([]); key_lines.append([]); return_view[key_row_index].append([]) # create key list
if len(key) == key_width: # if default key, parse line levels:
if options.key_level_width == 1 and key_width == 7: # if Neo 2 keypad key:
if key[1] == key[5] == options.key_level_delimiter:
key_lines[key_index].extend([key[0], key[2:5], key[6]])
elif key[::2] == options.key_level_delimiter * 4:
key_lines[key_index].extend(key[1::2])
if key_width == 5 or key_width == 7:
key_lines.append([])
return_model[key_row_index].append([]); return_view[key_row_index].append([]) # create key lists
if len(key) == key_width: # if standard key, parse line levels:
if key_width == options.key_level_width * options.key_levels_per_line + (options.key_levels_per_line - 1) * options.key_level_delimiter_width and key[1::options.key_level_width + options.key_level_delimiter_width] == options.key_level_delimiter * (options.key_levels_per_line - 1): # else if standard key:
key_lines[key_index].append([key[key_level_start:key_level_start + options.key_level_width] for key_level_start in range(0, len(key), options.key_level_width + options.key_level_delimiter_width)])
elif key_width == options.key_level_width: # else if standard miniature key:
return_model[key_row_index][key_index].append(key)
elif options.key_level_width == 1 and key_width == 7: # if Neo 2 keypad key:
if key[1] == key[5] == options.key_level_delimiter: # if long middle line level:
key_lines[key_index].append([key[0], key[2:5], key[6]])
elif key[::2] == options.key_level_delimiter * 4: # else if spaced levels:
key_lines[key_index].append(list(key[1::2]))
else:
return_view[key_row_index][key_index].append(key)
elif key_width == options.key_level_width * options.key_levels_per_line + (options.key_levels_per_line - 1) * options.key_level_delimiter_width:
key_lines[key_index].extend([key[:options.key_level_width] for key in key[:key_width:options.key_level_width + options.key_level_delimiter_width]])
elif key_width == options.key_level_width:
key_lines[key_index].append(key)
else:
else: # else non-standard key:
if options.key_level_width == 1 and key_width == 7 and len(key) == 15: # if Neo 2 keypad key:
key_lines[key_index].extend([key[2], key[6:9], key[12]])
else:
key_lines[key_index].append([key[2], key[6:9], key[12]])
else: # else special key:
return_view[key_row_index][key_index].append(key)
if key_lines != []:
for key_level_index, level in enumerate(key_lines[0]):
for key_line_index, line_index in enumerate(key_lines):
return_model[key_row_index][key_index].append(key_lines[key_line_index][key_level_index])
if key_lines != []:
for key_index, key in enumerate(key_lines): #sort key levels:
if key_lines[key_index] != []:
for key_level_index, level in enumerate(key_lines[key_index][0]):
for key_line_index, line_index in enumerate(key_lines[key_index]):
if len(key_lines[key_index]) != 0:
return_model[key_row_index][key_index].append(key_lines[key_index][key_line_index][key_level_index])
if options.level_disorder and len(return_model[key_row_index][key_index]) == 6:
return_model[key_row_index][key_index].insert(3, return_model[key_row_index][key_index].pop(4))
key_row_index += 1; key_row = []
else:
key_row.append(row)
return return_model, return_view
def compare_model(model, miniature_model):
'''
@ -140,7 +148,7 @@ if options.without_legend == False:
model = [parse_key_panel(key_panels[9]), parse_key_panel(key_panels[20], 7)]
miniature_models = []
for miniature_models_index in range(6):
miniature_models.append([parse_key_panel(key_panels[10 + miniature_models_index], 1), parse_key_panel(key_panels[21 + miniature_models_index], 7)])
miniature_models.append([parse_key_panel(key_panels[10 + miniature_models_index], 1), parse_key_panel(key_panels[21 + miniature_models_index], 3)])
view = compare_model(model, miniature_models) # complete views via comparing key widths
model = [model[0] for model in model] # strip views

View File

@ -38,15 +38,16 @@ Zur Zeit entwickele ich einen Parser für die Referenz. Danach möchte ich ein
Skript für die Erstellung der neo20.txt aus der maschinenlesbaren Referenz
schreiben. Dann soll ein Skript zur Umwandlung des Models in xkbmap, xmodmap,
ahk und kbdneo folgen, unter berücksichtigung der verwendeten Tastatur (Qwertz,
Qwerty, Plum, Kbdneo).
Qwerty, Plum, Kbdneo). Danach nehme ich die Erzeugung der svgs und odss in
Angriff.
Abriss:
neo_import.py
neo_parse.py
neo_edit.py
neo_make.py
ahk_make.py
ahk_parse.py
parse_neo.py
edit_neo.py
make_neo.py
make_ahk.py
parse_ahk.py
hex_parse.py
kbd_parse.py
kbd_make.py