Compare commits

...

4 Commits

Author SHA1 Message Date
fanyx 79bec88cfd Add navigation tags to sections 2023-01-13 00:48:36 +01:00
fanyx 1f2c44c82d big tabs vs spaces adjust 2023-01-13 00:27:41 +01:00
fanyx b83bfe5687 Switch to dynamic length padding for index numbers 2023-01-13 00:20:38 +01:00
fanyx bdd6f37118 Make list titles configurable 2023-01-13 00:20:02 +01:00
2 changed files with 182 additions and 167 deletions

281
build.py
View File

@ -3,8 +3,11 @@
import yaml import yaml
from os.path import dirname from os.path import dirname
# BASE = dirname('/home/hendrik/git/list-of-game/src/build.py')
BASE = dirname(__file__) + '/src' BASE = dirname(__file__) + '/src'
TITLE_LEFT = "List of Shame"
TITLE_RIGHT = "List of Pride"
MAX_WIDTH = 64 MAX_WIDTH = 64
MAX_WIDTH_TITLE = 40 MAX_WIDTH_TITLE = 40
MAX_WIDTH_PLATFORM = 4 MAX_WIDTH_PLATFORM = 4
@ -15,190 +18,202 @@ DELIMITER = "| :|"
# split strings longer than length into a list # split strings longer than length into a list
# strings are split at last index of delim # strings are split at last index of delim
def split_to_list(str, length, delim=' '): def split_to_list(str, length, delim=' '):
l = [] l = []
while len(str) > length: while len(str) > length:
sep = str.rfind(delim, 0, length) sep = str.rfind(delim, 0, length)
l.append(str[0:sep]) l.append(str[0:sep])
str = str[sep+1:] str = str[sep+1:]
l.append(str) l.append(str)
return l return l
# build_header using section title # build_header using section title
def build_header(l_title): def build_header(l_title, add_index=False, index_string=None):
header = [] header = []
len_title = len(l_title[0]) len_title = len(l_title[0])
pad, pad_left = divmod(MAX_WIDTH - (len_title + (TITLE_PADDING * 2)) - 2, 2) pad, pad_left = divmod(MAX_WIDTH - (len_title + (TITLE_PADDING * 2)) - 2, 2)
len_border = len_title + ((TITLE_PADDING * 2) - 2) len_border = len_title + ((TITLE_PADDING * 2) - 2)
# upper part # upper part
header.append(' ' * (pad + pad_left + 2) + '_' * len_border + ' ' * (pad + 2)) header.append(' ' * (pad + pad_left + 2) + '_' * len_border + ' ' * (pad + 2))
header.append('_' * (pad + pad_left) + '//' + ' ' * len_border + '\\\\' + '_' * pad) header.append('_' * (pad + pad_left) + '//' + ' ' * len_border + '\\\\' + '_' * pad)
# ' ' padded Title # ' ' padded Title
count = 1 count = 1
for title in l_title: for title in l_title:
c_pad = '_' if count == len(l_title) else ' ' c_pad = '_' if count == len(l_title) else ' '
pad_right = len_title - len(title) pad_right = len_title - len(title)
header.append(c_pad * (pad + pad_left) + '|' + ' ' * TITLE_PADDING + title + ' ' * (TITLE_PADDING + pad_right) + '|' + c_pad * pad) header.append(c_pad * (pad + pad_left) + '|' + ' ' * TITLE_PADDING + title + ' ' * (TITLE_PADDING + pad_right) + '|' + c_pad * pad)
count += 1 count += 1
# lower part # lower part
header.append(' ' * (pad + pad_left) + '\\\\' + '_' * len_border + '//' + ' ' * pad) # optional navigation tag
header.append(' ' * MAX_WIDTH) if add_index == True and index_string != None:
header.append(' ' * (pad + pad_left) + '\\\\' + '_' * len_border + '//' + ' ' * (pad - 7) + f'[{index_string}] ')
else:
header.append(' ' * (pad + pad_left) + '\\\\' + '_' * len_border + '//' + ' ' * pad)
return header header.append(' ' * MAX_WIDTH)
return header
def index_string(prefix, index):
return f'{prefix}{index:>03d}'
def build_index(yaml, prefix): def build_index(yaml, prefix):
l_title = [] l_title = []
for item in yaml: for item in yaml:
l_title += [item['title']] l_title += [item['title']]
l_index = [] l_index = []
for i, item in enumerate(l_title): for i, item in enumerate(l_title):
l_index += [' - ' + item.ljust(MAX_WIDTH - 10) + f'[{prefix}{i+1}00] '] l_index += [' - ' + item.ljust(MAX_WIDTH - 10) + f'[{index_string(prefix, i+1)}] ']
l_index += [' ' * MAX_WIDTH] l_index += [' ' * MAX_WIDTH]
return l_index return l_index
def build_game(name, platform): def build_game(name, platform):
s_platform = platform.ljust(MAX_WIDTH_PLATFORM) s_platform = platform.ljust(MAX_WIDTH_PLATFORM)
s_name = name.ljust(MAX_WIDTH_NAME) s_name = name.ljust(MAX_WIDTH_NAME)
return f' {s_platform} | {s_name} ' return f' {s_platform} | {s_name} '
# #
# main # main
# #
def main(): def main():
print('go') print('go')
with open(f'{BASE}/todo.yaml', 'r') as file: with open(f'{BASE}/todo.yaml', 'r') as file:
todo_yaml = yaml.safe_load(file) todo_yaml = yaml.safe_load(file)
with open(f'{BASE}/finished.yaml', 'r') as file: with open(f'{BASE}/finished.yaml', 'r') as file:
finished_yaml = yaml.safe_load(file) finished_yaml = yaml.safe_load(file)
# #
# Section: TO-DO # Section: TO-DO
# #
todo_result = [] todo_result = []
todo_result += build_header(['List of Shame']) todo_result += build_header([TITLE_LEFT])
todo_result += build_index(todo_yaml, 'S') todo_result += build_index(todo_yaml, 'S')
for section in todo_yaml: item_count = 0
s_title = section['title'] for section in todo_yaml:
l_title = [] s_title = section['title']
l_title = []
if len(s_title) > MAX_WIDTH_TITLE: if len(s_title) > MAX_WIDTH_TITLE:
l_title = split_to_list(s_title, MAX_WIDTH_TITLE) l_title = split_to_list(s_title, MAX_WIDTH_TITLE)
else: else:
l_title = [s_title] l_title = [s_title]
# Create section header # Create section header
todo_result += build_header(l_title) item_count += 1
todo_result += build_header(l_title, add_index=True, index_string=index_string('S', item_count))
# Create table header # Create table header
todo_result += [' ______ ________________________________________________________', todo_result += [' ______ ________________________________________________________',
'|======|========================================================'] '|======|========================================================']
# Add games one by one # Add games one by one
# Prefix : | # Prefix : |
for game in section['games']: for game in section['games']:
s_name = game['name'] s_name = game['name']
s_platform = game['platform'] s_platform = game['platform']
if len(s_platform) > MAX_WIDTH_PLATFORM: if len(s_platform) > MAX_WIDTH_PLATFORM:
raise Exception(f"Platform shortcode for {s_name} is longer than 4 characters. Cannot parse...") raise Exception(f"Platform shortcode for {s_name} is longer than 4 characters. Cannot parse...")
if len(s_name) > MAX_WIDTH_NAME: if len(s_name) > MAX_WIDTH_NAME:
l_name = split_to_list(s_name, MAX_WIDTH_NAME) l_name = split_to_list(s_name, MAX_WIDTH_NAME)
for i,i_name in enumerate(l_name): for i,i_name in enumerate(l_name):
todo_result += ['|' + build_game(i_name, s_platform if i == 0 else '')] todo_result += ['|' + build_game(i_name, s_platform if i == 0 else '')]
else: else:
todo_result += ['|' + build_game(s_name, s_platform)] todo_result += ['|' + build_game(s_name, s_platform)]
# Close table header # Close table header
todo_result += ['|______|________________________________________________________', todo_result += ['|______|________________________________________________________',
' ' * MAX_WIDTH] ' ' * MAX_WIDTH]
# #
# Section: Finished # Section: Finished
# #
finished_result = [] finished_result = []
finished_result += build_header(['List of Pride']) finished_result += build_header([TITLE_RIGHT])
finished_result += build_index(finished_yaml, 'P') finished_result += build_index(finished_yaml, 'P')
for section in finished_yaml: item_count = 0
s_title = section['title'] for section in finished_yaml:
l_title = [] s_title = section['title']
l_title = []
if len(s_title) > MAX_WIDTH_TITLE: if len(s_title) > MAX_WIDTH_TITLE:
l_title = split_to_list(s_title, MAX_WIDTH_TITLE) l_title = split_to_list(s_title, MAX_WIDTH_TITLE)
else: else:
l_title = [s_title] l_title = [s_title]
# Create section header # Create section header
finished_result += build_header(l_title) item_count += 1
finished_result += build_header(l_title, add_index=True, index_string=index_string('P', item_count))
# Create table header # Create table header
finished_result += ['______ ________________________________________________________ ', finished_result += ['______ ________________________________________________________ ',
'======|========================================================|'] '======|========================================================|']
# Add games one by one # Add games one by one
# Suffix : | # Suffix : |
for game in section['games']: for game in section['games']:
s_name = game['name'] s_name = game['name']
s_platform = game['platform'] s_platform = game['platform']
if len(s_platform) > MAX_WIDTH_PLATFORM: if len(s_platform) > MAX_WIDTH_PLATFORM:
raise Exception(f"Platform shortcode for {s_name} is longer than 4 characters. Cannot parse...") raise Exception(f"Platform shortcode for {s_name} is longer than 4 characters. Cannot parse...")
if len(s_name) > MAX_WIDTH_NAME: if len(s_name) > MAX_WIDTH_NAME:
l_name = split_to_list(s_name, MAX_WIDTH_NAME) l_name = split_to_list(s_name, MAX_WIDTH_NAME)
for i,i_name in enumerate(l_name): for i,i_name in enumerate(l_name):
finished_result += [build_game(i_name, platform if i == 0 else '') + '|'] finished_result += [build_game(i_name, platform if i == 0 else '') + '|']
else: else:
finished_result += [build_game(s_name, s_platform) + '|'] finished_result += [build_game(s_name, s_platform) + '|']
# Close table header # Close table header
finished_result += ['______|________________________________________________________|', finished_result += ['______|________________________________________________________|',
' ' * MAX_WIDTH] ' ' * MAX_WIDTH]
# adjust length of both sides # adjust length of both sides
len_difference = len(todo_result) - len(finished_result) len_difference = len(todo_result) - len(finished_result)
# todo > finished # todo > finished
if len_difference > 0: if len_difference > 0:
finished_result += [' ' * MAX_WIDTH] * len_difference finished_result += [' ' * MAX_WIDTH] * len_difference
# todo < finished # todo < finished
elif len_difference < 0: elif len_difference < 0:
len_difference *= -1 len_difference *= -1
todo_result += [' ' * MAX_WIDTH] * len_difference todo_result += [' ' * MAX_WIDTH] * len_difference
if len(todo_result) != len(finished_result): if len(todo_result) != len(finished_result):
raise Exception("Results are not of equal size. Something went wrong...") raise Exception("Results are not of equal size. Something went wrong...")
result = [] result = []
i = 0 i = 0
while len(todo_result) > i: while len(todo_result) > i:
result += [todo_result[i] + DELIMITER + finished_result[i]] result += [todo_result[i] + DELIMITER + finished_result[i]]
i += 1 i += 1
with open('list-of-game.txt', 'w') as file: with open('list-of-game.txt', 'w') as file:
for i in result: for i in result:
file.write(f"{i}\n") file.write(f"{i}\n")
print('done') print('done')
return return
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@ -3,18 +3,18 @@ __________________// \\_________________| :|__________
__________________| List of Shame |_________________| :|__________________| List of Pride |_________________ __________________| List of Shame |_________________| :|__________________| List of Pride |_________________
\\_________________________// | :| \\_________________________// \\_________________________// | :| \\_________________________//
| :| | :|
- Currently Playing [S100] | :| - Early Days [P100] - Currently Playing [S001] | :| - Early Days [P001]
- Upcoming [S200] | :| - First PC [P200] - Upcoming [S002] | :| - First PC [P002]
- Soon(TM) 2022 [S300] | :| - The Multiplayer Phase [P300] - Soon(TM) 2022 [S003] | :| - The Multiplayer Phase [P003]
- Unknown Future [S400] | :| - 2020 [P400] - Unknown Future [S004] | :| - 2020 [P004]
- Haunts my Dreams [S500] | :| - 2021 [P500] - Haunts my Dreams [S005] | :| - 2021 [P005]
- Not Yet Owned (Wishlist) [S600] | :| - 2022 [P600] - Not Yet Owned (Wishlist) [S006] | :| - 2022 [P006]
| :| - 2023 [P700] | :| - 2023 [P007]
_____________________________ | :| _____________________________ | :|
________________// \\_______________| :| ______________________ ________________// \\_______________| :| ______________________
________________| Currently Playing |_______________| :|___________________// \\___________________ ________________| Currently Playing |_______________| :|___________________// \\___________________
\\_____________________________// | :|___________________| Early Days |___________________ \\_____________________________// [S001] | :|___________________| Early Days |___________________
| :| \\______________________// | :| \\______________________// [P001]
______ ________________________________________________________| :| ______ ________________________________________________________| :|
|======|========================================================| :|______ ________________________________________________________ |======|========================================================| :|______ ________________________________________________________
| PC | Kingdom Two Crowns | :|======|========================================================| | PC | Kingdom Two Crowns | :|======|========================================================|
@ -23,7 +23,7 @@ ________________| Currently Playing |_______________| :|__________
____________________ | :| GBA | Pokemon Sapphire | ____________________ | :| GBA | Pokemon Sapphire |
____________________// \\____________________| :| GBC | Pokemon Trading Card Game | ____________________// \\____________________| :| GBC | Pokemon Trading Card Game |
____________________| Upcoming |____________________| :| GBC | Pokemon Crystal | ____________________| Upcoming |____________________| :| GBC | Pokemon Crystal |
\\____________________// | :| PC | Colin McRae Rally 2.0 | \\____________________// [S002] | :| PC | Colin McRae Rally 2.0 |
| :| PC | Anno 1602 | | :| PC | Anno 1602 |
______ ________________________________________________________| :| GBA | Pokemon Emerald | ______ ________________________________________________________| :| GBA | Pokemon Emerald |
|======|========================================================| :| PC | Need for Speed: Underground | |======|========================================================| :| PC | Need for Speed: Underground |
@ -38,7 +38,7 @@ ____________________| Upcoming |____________________| :| GBC | Po
_________________________ | :| NDS | Final Fantasy III | _________________________ | :| NDS | Final Fantasy III |
__________________// \\_________________| :| GBA | Final Fantasy I & II: Dawn of Souls | __________________// \\_________________| :| GBA | Final Fantasy I & II: Dawn of Souls |
__________________| Soon(TM) 2022 |_________________| :| NDS | Final Fantasy IV | __________________| Soon(TM) 2022 |_________________| :| NDS | Final Fantasy IV |
\\_________________________// | :| GBA | Final Fantasy V Advance | \\_________________________// [S003] | :| GBA | Final Fantasy V Advance |
| :| GBA | Final Fantasy VI Advance | | :| GBA | Final Fantasy VI Advance |
______ ________________________________________________________| :| PSP | Lego Star Wars | ______ ________________________________________________________| :| PSP | Lego Star Wars |
|======|========================================================| :| PSP | Lego Star Wars II | |======|========================================================| :| PSP | Lego Star Wars II |
@ -54,7 +54,7 @@ __________________| Soon(TM) 2022 |_________________| :| NDS | Fi
__________________________ | :| GBA | The Legend of Zelda: Minish Cap | __________________________ | :| GBA | The Legend of Zelda: Minish Cap |
_________________// \\_________________| :| PC | Moorhuhn 3: ...Es Gibt Huhn! | _________________// \\_________________| :| PC | Moorhuhn 3: ...Es Gibt Huhn! |
_________________| Unknown Future |_________________| :| GBA | Pokemon Pinball: Ruby & Sapphire | _________________| Unknown Future |_________________| :| GBA | Pokemon Pinball: Ruby & Sapphire |
\\__________________________// | :| NDS | Mario Kart DS | \\__________________________// [S004] | :| NDS | Mario Kart DS |
| :| GBA | Pokemon Leaf Green | | :| GBA | Pokemon Leaf Green |
______ ________________________________________________________| :| GBA | Pokemon Mystery Dungeon: Red Rescue Team | ______ ________________________________________________________| :| GBA | Pokemon Mystery Dungeon: Red Rescue Team |
|======|========================================================| :| PC | Shrek 2 | |======|========================================================| :| PC | Shrek 2 |
@ -87,7 +87,7 @@ _________________| Unknown Future |_________________| :| GBA | Po
____________________________ | :| NDS | Professor Layton and the Curious Village | ____________________________ | :| NDS | Professor Layton and the Curious Village |
________________// \\________________| :| NDS | Professor Layton and the Diabolical Box | ________________// \\________________| :| NDS | Professor Layton and the Diabolical Box |
________________| Haunts my Dreams |________________| :| PC | Tachyon: The Fringe | ________________| Haunts my Dreams |________________| :| PC | Tachyon: The Fringe |
\\____________________________// | :| NDS | The Simpsons | \\____________________________// [S005] | :| NDS | The Simpsons |
| :| NDS | Spectrobes | | :| NDS | Spectrobes |
______ ________________________________________________________| :| PC | Trackmania Original | ______ ________________________________________________________| :| PC | Trackmania Original |
|======|========================================================| :| GBA | Wario Ware | |======|========================================================| :| GBA | Wario Ware |
@ -99,7 +99,7 @@ ________________| Haunts my Dreams |________________| :| PC | Ta
| PC | The Secret of Monkey Island | :| ____________________ | PC | The Secret of Monkey Island | :| ____________________
| PC | Monkey Island 2 | :|____________________// \\____________________ | PC | Monkey Island 2 | :|____________________// \\____________________
| GBA | Fire Emblem | :|____________________| First PC |____________________ | GBA | Fire Emblem | :|____________________| First PC |____________________
| PC | Deus Ex: Game of the Year | :| \\____________________// | PC | Deus Ex: Game of the Year | :| \\____________________// [P002]
| PS2 | Metal Gear Solid 2: Sons of Liberty | :| | PS2 | Metal Gear Solid 2: Sons of Liberty | :|
| PC | Bravery Network Online | :|______ ________________________________________________________ | PC | Bravery Network Online | :|______ ________________________________________________________
| NES | Ninja Gaiden | :|======|========================================================| | NES | Ninja Gaiden | :|======|========================================================|
@ -126,7 +126,7 @@ ________________| Haunts my Dreams |________________| :| PC | Ta
| PC | Final Fantasy IX | :| _________________________________ | PC | Final Fantasy IX | :| _________________________________
| PC | Final Fantasy X | :|______________// \\_____________ | PC | Final Fantasy X | :|______________// \\_____________
| PC | Final Fantasy XII | :|______________| The Multiplayer Phase |_____________ | PC | Final Fantasy XII | :|______________| The Multiplayer Phase |_____________
| PS3 | Final Fantasy XIII | :| \\_________________________________// | PS3 | Final Fantasy XIII | :| \\_________________________________// [P003]
| PC | Lightning Returns: Final Fantasy XIII | :| | PC | Lightning Returns: Final Fantasy XIII | :|
| PC | Bastion | :|______ ________________________________________________________ | PC | Bastion | :|______ ________________________________________________________
| PC | Crashlands | :|======|========================================================| | PC | Crashlands | :|======|========================================================|
@ -141,7 +141,7 @@ ________________| Haunts my Dreams |________________| :| PC | Ta
____________________________________ | :| PC | The Beginner's Guide | ____________________________________ | :| PC | The Beginner's Guide |
____________// \\____________| :| PC | Stanley's Parable | ____________// \\____________| :| PC | Stanley's Parable |
____________| Not Yet Owned (Wishlist) |____________| :| PC | What Remains of Edith Finch | ____________| Not Yet Owned (Wishlist) |____________| :| PC | What Remains of Edith Finch |
\\____________________________________// | :| PC | Ori and the Blind Forest | \\____________________________________// [S006] | :| PC | Ori and the Blind Forest |
| :| PC | Realm of the Mad God | | :| PC | Realm of the Mad God |
______ ________________________________________________________| :| PC | Raft | ______ ________________________________________________________| :| PC | Raft |
|======|========================================================| :| NX | The Legend of Zelda: Breath of the Wild | |======|========================================================| :| NX | The Legend of Zelda: Breath of the Wild |
@ -153,7 +153,7 @@ ____________| Not Yet Owned (Wishlist) |____________| :| PC | Wh
| PC | Beacon Pines | :| ________________ | PC | Beacon Pines | :| ________________
| PC | Switchcars | :|______________________// \\______________________ | PC | Switchcars | :|______________________// \\______________________
| PC | Into the Breach | :|______________________| 2020 |______________________ | PC | Into the Breach | :|______________________| 2020 |______________________
| PS1 | Parasite Eve | :| \\________________// | PS1 | Parasite Eve | :| \\________________// [P004]
| PC | Sifu | :| | PC | Sifu | :|
| PS4 | Dark Souls 2 | :|______ ________________________________________________________ | PS4 | Dark Souls 2 | :|______ ________________________________________________________
| PS4 | Dark Souls 3 | :|======|========================================================| | PS4 | Dark Souls 3 | :|======|========================================================|
@ -173,7 +173,7 @@ ____________| Not Yet Owned (Wishlist) |____________| :| PC | Wh
| PC | Hellblade: Senua's Sacrifice | :| ________________ | PC | Hellblade: Senua's Sacrifice | :| ________________
| PC | Factorio | :|______________________// \\______________________ | PC | Factorio | :|______________________// \\______________________
| PC | VA-11 Hall-A: Cyberpunk Bartender Action | :|______________________| 2021 |______________________ | PC | VA-11 Hall-A: Cyberpunk Bartender Action | :|______________________| 2021 |______________________
| PC | Katana Zero | :| \\________________// | PC | Katana Zero | :| \\________________// [P005]
| PC | art of rally | :| | PC | art of rally | :|
| PC | Ooblets | :|______ ________________________________________________________ | PC | Ooblets | :|______ ________________________________________________________
| PC | Don't Escape: 4 Days to Survive | :|======|========================================================| | PC | Don't Escape: 4 Days to Survive | :|======|========================================================|
@ -198,7 +198,7 @@ ____________| Not Yet Owned (Wishlist) |____________| :| PC | Wh
| PC | Hyper Light Breaker | :| ________________ | PC | Hyper Light Breaker | :| ________________
| PC | Crypt of the Necrodancer | :|______________________// \\______________________ | PC | Crypt of the Necrodancer | :|______________________// \\______________________
| PC | Just Shapes & Beats | :|______________________| 2022 |______________________ | PC | Just Shapes & Beats | :|______________________| 2022 |______________________
| PC | Minit | :| \\________________// | PC | Minit | :| \\________________// [P006]
| PC | A Short Hike | :| | PC | A Short Hike | :|
| PC | Dysmantle | :|______ ________________________________________________________ | PC | Dysmantle | :|______ ________________________________________________________
| PC | Omori | :|======|========================================================| | PC | Omori | :|======|========================================================|
@ -239,7 +239,7 @@ ____________| Not Yet Owned (Wishlist) |____________| :| PC | Wh
| :| ________________ | :| ________________
| :|______________________// \\______________________ | :|______________________// \\______________________
| :|______________________| 2023 |______________________ | :|______________________| 2023 |______________________
| :| \\________________// | :| \\________________// [P007]
| :| | :|
| :|______ ________________________________________________________ | :|______ ________________________________________________________
| :|======|========================================================| | :|======|========================================================|