design of static website almost now more or less fixed, polishing
This commit is contained in:
parent
7c79a9bde0
commit
7e2569b9e2
@ -7,6 +7,15 @@ https://github.com/MrFrenik/gunslinger
|
||||
https://github.com/rockbite/talos
|
||||
https://github.com/Ogmo-Editor-3/OgmoEditor3-CE
|
||||
https://github.com/eduard-permyakov/permafrost-engine
|
||||
https://github.com/codenamecpp/carnage3d
|
||||
https://github.com/WohlSoft/PGE-Project
|
||||
https://github.com/wesnoth/haldric
|
||||
https://github.com/mgerhardy/engine
|
||||
https://github.com/GDQuest/godot-visual-effects
|
||||
https://sourceforge.net/projects/freetrain/
|
||||
https://github.com/ttencate/jfxr
|
||||
https://github.com/godotengine/escoria
|
||||
https://github.com/awkwardpolygons/cartographer
|
||||
http://circularstudios.com/
|
||||
http://cyxdown.free.fr/bs/
|
||||
http://cyxdown.free.fr/f2b/
|
||||
|
@ -47,6 +47,7 @@ Listing:
|
||||
# TODO replace or remove @notices in entries (maybe different entries format)
|
||||
# TODO icons: for the main categories (devs, games, statistics, home, ...)
|
||||
# TODO SEO optimizations, google search ...
|
||||
# TODO <a> rel attribute https://www.w3schools.com/TAGS/att_a_rel.asp
|
||||
|
||||
import os
|
||||
import shutil
|
||||
@ -60,6 +61,7 @@ import html5lib
|
||||
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
extra = '0'
|
||||
extended_alphabet = alphabet + extra
|
||||
extended_alphabet_names = {k: k for k in extended_alphabet}
|
||||
|
||||
games_path = ['games']
|
||||
frameworks_path = ['frameworks']
|
||||
@ -67,6 +69,8 @@ inspirations_path = ['inspirations']
|
||||
developers_path = ['developers']
|
||||
|
||||
games_by_language_path = games_path + ['languages.html']
|
||||
games_by_genres_path = games_path + ['genres.html']
|
||||
games_by_platform_path = games_path + ['platforms.html']
|
||||
|
||||
platform_color = {
|
||||
'Windows': 'is-danger',
|
||||
@ -79,9 +83,12 @@ platform_color = {
|
||||
|
||||
platform_icon_map = {
|
||||
'Windows': 'windows',
|
||||
'Linux': 'linux',
|
||||
'Linux': 'tux',
|
||||
'macOS': 'appleinc',
|
||||
'Android': 'android',
|
||||
'iOS': 'ios',
|
||||
'Web': 'sphere'
|
||||
'Web': 'earth',
|
||||
'Unspecified': 'device_unknown'
|
||||
}
|
||||
|
||||
plurals = {k: k+'s' for k in ('Assets license', 'Contact', 'Code language', 'Code license', 'Developer', 'Download', 'Inspiration', 'Game', 'Keyword', 'Home', 'Organization', 'Platform')}
|
||||
@ -92,6 +99,7 @@ for k in ('Code repository', 'Code dependency'):
|
||||
|
||||
code_language_references = {l: games_by_language_path[:-1] + ['{}#{}'.format(games_by_language_path[-1], osg.canonical_name(l))] for l in c.known_languages}
|
||||
|
||||
|
||||
def get_plural_or_singular(name, amount):
|
||||
if not name in plurals.keys():
|
||||
raise RuntimeError('"{}" not a known singular!'.format(name))
|
||||
@ -100,12 +108,21 @@ def get_plural_or_singular(name, amount):
|
||||
return plurals[name]
|
||||
|
||||
|
||||
framework_names = {
|
||||
'tool': 'Tools',
|
||||
'framework': 'Frameworks',
|
||||
'library': 'Libraries'
|
||||
}
|
||||
|
||||
|
||||
html5parser = html5lib.HTMLParser(strict=True)
|
||||
|
||||
|
||||
def raise_helper(msg):
|
||||
raise Exception(msg)
|
||||
|
||||
def is_list(obj):
|
||||
return isinstance(obj, list)
|
||||
|
||||
def write(text, file):
|
||||
"""
|
||||
@ -260,7 +277,7 @@ def developer_index(developer):
|
||||
e['tags'] = make_text('({})'.format(n), 'is-light is-size-7')
|
||||
return e
|
||||
|
||||
def shortcut_url(url):
|
||||
def shortcut_url(url, name):
|
||||
|
||||
# remove slash at the end
|
||||
if url.endswith('/'):
|
||||
@ -269,16 +286,17 @@ def shortcut_url(url):
|
||||
# gitlab
|
||||
gl_prefix = 'https://gitlab.com/'
|
||||
if url.startswith(gl_prefix):
|
||||
return 'GL: ' + url[len(gl_prefix):]
|
||||
return [make_text(url[len(gl_prefix):]), make_icon('gitlab')]
|
||||
|
||||
# github
|
||||
gh_prefix = 'https://github.com/'
|
||||
if url.startswith(gh_prefix):
|
||||
return 'GH: ' + url[len(gh_prefix):]
|
||||
return [make_text(url[len(gh_prefix):]), make_icon('github')]
|
||||
|
||||
# sourceforge
|
||||
sf_prefix = 'https://sourceforge.net/projects/'
|
||||
if url.startswith(sf_prefix):
|
||||
return 'SF: ' + url[len(sf_prefix):]
|
||||
return [make_text(url[len(sf_prefix):]), make_icon('sourceforge')]
|
||||
|
||||
# archive link
|
||||
ia_prefix = 'https://web.archive.org/web/'
|
||||
@ -288,7 +306,8 @@ def shortcut_url(url):
|
||||
# Wikipedia link
|
||||
wp_prefix = 'https://en.wikipedia.org/wiki/'
|
||||
if url.startswith(wp_prefix):
|
||||
return 'WP: ' + url[len(wp_prefix):]
|
||||
# return 'WP: ' + url[len(wp_prefix):]
|
||||
return [make_text(name), make_icon('wikipedia')]
|
||||
|
||||
# cutoff common prefixes
|
||||
for prefix in ('http://', 'https://'):
|
||||
@ -298,26 +317,7 @@ def shortcut_url(url):
|
||||
return url
|
||||
|
||||
|
||||
def convert_inspirations(inspirations, entries):
|
||||
entries_references = {entry['Title']:entry['href'] for entry in entries}
|
||||
for inspiration in inspirations:
|
||||
fields = []
|
||||
# media
|
||||
if 'Media' in inspiration:
|
||||
entries = inspiration['Media']
|
||||
entries = [make_url(url, shortcut_url(url)) for url in entries]
|
||||
field = make_enumeration(make_text('Media'), entries)
|
||||
fields.append(field)
|
||||
# inspired entries (with links to them)
|
||||
inspired_entries = inspiration['Inspired entries']
|
||||
entries = [make_url(entries_references[entry], make_text(entry, 'has-text-weight-semibold')) for entry in inspired_entries]
|
||||
name = make_text('Inspired {}'.format(get_plural_or_singular('Game', len(entries)).lower()), 'has-text-weight-semibold')
|
||||
field = make_enumeration(name, entries)
|
||||
fields.append(field)
|
||||
inspiration['fields'] = fields
|
||||
inspiration['name'] = inspiration['Name']
|
||||
|
||||
def make_url(href, content, title=None):
|
||||
def make_url(href, content, title=None, css_class=None):
|
||||
if isinstance(content, str):
|
||||
content = make_text(content)
|
||||
url = {
|
||||
@ -327,12 +327,14 @@ def make_url(href, content, title=None):
|
||||
}
|
||||
if title:
|
||||
url['title'] = title
|
||||
if css_class:
|
||||
url['class'] = css_class
|
||||
return url
|
||||
|
||||
def make_icon(css_class):
|
||||
return {
|
||||
'type': 'icon',
|
||||
'class': css_class
|
||||
'class': css_class,
|
||||
}
|
||||
|
||||
|
||||
@ -345,68 +347,125 @@ def make_text(content, css_class=None):
|
||||
text['class'] = css_class
|
||||
return text
|
||||
|
||||
def make_linebreak():
|
||||
def make_nothing():
|
||||
return {
|
||||
'type': 'linebreak'
|
||||
'type': 'nothing'
|
||||
}
|
||||
|
||||
def make_enumeration(name, entries, divider=', '):
|
||||
def make_enumeration(entries, divider=', '):
|
||||
enumeration = {
|
||||
'type': 'enumeration',
|
||||
'name': name,
|
||||
'entries': entries,
|
||||
'divider': divider
|
||||
}
|
||||
return enumeration
|
||||
|
||||
def make_tags(entries):
|
||||
return {
|
||||
'type': 'tags',
|
||||
'enumeration': make_enumeration(entries, divider='')
|
||||
}
|
||||
|
||||
|
||||
def developer_profile_link(link):
|
||||
if link.endswith('@SF'):
|
||||
return 'https://sourceforge.net/u/{}/profile/'.format(link[:-3])
|
||||
return make_url('https://sourceforge.net/u/{}/profile/'.format(link[:-3]), make_icon('sourceforge'), 'Profile on Sourceforge')
|
||||
if link.endswith('@GH'):
|
||||
return 'https://github.com/{}'.format(link[:-3])
|
||||
return make_url('https://github.com/{}'.format(link[:-3]), make_icon('github'), 'Profile on Github')
|
||||
if link.endswith('@GL'):
|
||||
return 'https://gitlab.com/{}'.format(link[:-3])
|
||||
return make_url('https://gitlab.com/{}'.format(link[:-3]), make_icon('gitlab'), 'Profile on Gitlab')
|
||||
raise RuntimeError('Unknown profile link {}'.format(link))
|
||||
|
||||
|
||||
def convert_inspirations(inspirations, entries):
|
||||
entries_references = {entry['Title']:entry['href'] for entry in entries}
|
||||
for inspiration in inspirations:
|
||||
name = inspiration['Name']
|
||||
inspiration['name'] = name
|
||||
|
||||
# media
|
||||
if 'Media' in inspiration:
|
||||
entries = inspiration['Media']
|
||||
entries = [make_url(url, shortcut_url(url, name)) for url in entries]
|
||||
inspiration['media'] = [make_text('Media: '), make_enumeration(entries)]
|
||||
|
||||
# inspired entries (with links to them)
|
||||
inspired_entries = inspiration['Inspired entries']
|
||||
entries = [make_url(entries_references[entry], make_text(entry, 'has-text-weight-semibold')) for entry in inspired_entries]
|
||||
name = make_text('Inspired {}: '.format(get_plural_or_singular('Game', len(entries)).lower()), 'has-text-weight-semibold')
|
||||
inspiration['inspired'] = [name, make_enumeration(entries)]
|
||||
|
||||
|
||||
def convert_developers(developers, entries):
|
||||
entries_references = {entry['Title']:entry['href'] for entry in entries}
|
||||
for developer in developers:
|
||||
fields = []
|
||||
# games field
|
||||
name = developer['Name']
|
||||
developer['name'] = name
|
||||
|
||||
# games
|
||||
developed_entries = developer['Games']
|
||||
entries = [make_url(entries_references[entry], make_text(entry, 'has-text-weight-semibold')) for entry in developed_entries]
|
||||
name = make_text('Developed {}'.format(get_plural_or_singular('Game', len(entries)).lower()), 'has-text-weight-semibold')
|
||||
field = make_enumeration(name, entries)
|
||||
fields.append(field)
|
||||
for field in c.optional_developer_fields:
|
||||
name = make_text('Developed {}:'.format(get_plural_or_singular('Game', len(entries)).lower()), 'has-text-weight-semibold')
|
||||
developer['games'] = [name, make_enumeration(entries)]
|
||||
|
||||
# contacts
|
||||
contacts = developer.get('Contact', [])
|
||||
entries = [developer_profile_link(entry) for entry in contacts]
|
||||
developer['contact'] = entries
|
||||
|
||||
# other fields
|
||||
for field in ('Organization',):
|
||||
if field in developer:
|
||||
entries = developer[field]
|
||||
if field == 'Contact':
|
||||
# need to replace the shortcuts
|
||||
entries = [make_url(developer_profile_link(entry), entry) for entry in entries]
|
||||
elif field in c.url_developer_fields:
|
||||
entries = [make_url(entry, shortcut_url(entry)) for entry in entries]
|
||||
if field in c.url_developer_fields:
|
||||
entries = [make_url(entry, shortcut_url(entry, name)) for entry in entries]
|
||||
else:
|
||||
entries = [make_text(entry) for entry in entries]
|
||||
field = make_enumeration(make_text(get_plural_or_singular(field, len(entries))), entries)
|
||||
fields.append(field)
|
||||
if len(fields) > 1: # if there is Game(s) and more, insert an additional break after games
|
||||
fields.insert(1, make_linebreak())
|
||||
developer['fields'] = fields
|
||||
developer['name'] = developer['Name']
|
||||
developer[field.lower()] = [make_text(get_plural_or_singular(field, len(entries))+': '), make_enumeration(entries)]
|
||||
|
||||
|
||||
def create_keyword_tag(keyword):
|
||||
if keyword in c.recommended_keywords:
|
||||
return make_url(games_by_genres_path, make_text(keyword), '{} games'.format(keyword), 'tag is-info')
|
||||
else:
|
||||
return make_text(keyword, 'tag is-light')
|
||||
|
||||
|
||||
def create_state_texts(states):
|
||||
texts = []
|
||||
if 'mature' in states:
|
||||
texts.append(make_text('mature', 'is-size-7 has-text-weight-bold has-text-info'))
|
||||
else:
|
||||
texts.append(make_text('beta', 'is-size-7 has-text-gray-light'))
|
||||
inactive = [x for x in states if x.startswith('inactive since')]
|
||||
if inactive:
|
||||
texts.append([make_text(inactive[0], 'is-size-7 has-text-gray-light'), make_icon('bedtime')])
|
||||
else:
|
||||
texts.append(make_text('active', 'is-size-7 has-text-weight-bold has-text-info'))
|
||||
return texts
|
||||
|
||||
|
||||
def convert_entries(entries, inspirations, developers):
|
||||
inspirations_references = {inspiration['Name']: inspiration['href'] for inspiration in inspirations}
|
||||
developer_references = {developer['Name']: developer['href'] for developer in developers}
|
||||
for entry in entries:
|
||||
fields = []
|
||||
# name
|
||||
name = entry['Title']
|
||||
entry['name'] = name
|
||||
|
||||
# state
|
||||
entry['state'] = create_state_texts(entry['State'])
|
||||
|
||||
# note
|
||||
if 'Note' in entry:
|
||||
fields.append(make_text(entry['Note'], 'is-italic'))
|
||||
fields.append(make_linebreak())
|
||||
for field in ('Home', 'Inspiration', 'State', 'Media', 'Download', 'Play', 'Developer', 'Keyword'):
|
||||
entry['note'] = make_text(entry['Note'], 'is-italic')
|
||||
|
||||
# keywords as tags
|
||||
e = [create_keyword_tag(x) for x in entry['Keyword']]
|
||||
entry['keyword'] = make_tags(e)
|
||||
|
||||
# other normal fields (not technical info)
|
||||
for field in ('Home', 'Inspiration', 'Media', 'Download', 'Play', 'Developer'):
|
||||
if field in entry:
|
||||
e = entry[field]
|
||||
divider = ', '
|
||||
@ -416,19 +475,23 @@ def convert_entries(entries, inspirations, developers):
|
||||
e = [make_url(inspirations_references[x], make_text(x, 'has-text-weight-semibold')) for x in e]
|
||||
elif field == 'Developer':
|
||||
e = [make_url(developer_references[x], make_text(x, 'has-text-weight-semibold')) for x in e]
|
||||
elif field == 'Keyword':
|
||||
e = [make_text(x, 'tag ' + ('is-info' if x in c.recommended_keywords else 'is-light')) for x in e]
|
||||
divider = ' '
|
||||
elif field in c.url_fields:
|
||||
e = [make_url(x, shortcut_url(x)) for x in e]
|
||||
e = [make_url(x, shortcut_url(x, name)) for x in e]
|
||||
else:
|
||||
e = [make_text(x) for x in e]
|
||||
name = make_text(get_plural_or_singular(field, len(e)), 'has-text-weight-semibold')
|
||||
field = make_enumeration(name, e, divider)
|
||||
fields.append(field)
|
||||
fields.append(make_linebreak())
|
||||
fields.append(make_text('Technical info', 'has-text-weight-semibold'))
|
||||
for field in ('Platform', 'Code language', 'Code license', 'Code repository', 'Code dependency', 'Assets license'):
|
||||
namex = make_text('{}: '.format(get_plural_or_singular(field, len(e))), 'has-text-weight-semibold')
|
||||
entry[field.lower()] = [namex, make_enumeration(e, divider)]
|
||||
|
||||
# platforms
|
||||
if 'Platform' in entry:
|
||||
e = entry['Platform']
|
||||
if isinstance(e[0], osg.osg_parse.ValueWithComment):
|
||||
e = [x.value for x in e]
|
||||
e = [make_url('', make_icon(platform_icon_map[x]), 'Windows') if x in platform_icon_map else make_text(x, 'is-size-7') for x in e]
|
||||
entry['platform'] = e
|
||||
|
||||
# technical info fields
|
||||
for field in ('Code language', 'Code license', 'Code repository', 'Code dependency', 'Assets license'):
|
||||
if field in entry:
|
||||
e = entry[field]
|
||||
divider = ', '
|
||||
@ -436,21 +499,29 @@ def convert_entries(entries, inspirations, developers):
|
||||
continue
|
||||
if isinstance(e[0], osg.osg_parse.ValueWithComment):
|
||||
e = [x.value for x in e]
|
||||
if field == 'Platform':
|
||||
# e = [make_text(x, 'is-size-7 tag {}'.format(platform_color[x])) for x in e]
|
||||
e = [make_url('', make_icon(platform_icon_map[x]), 'Windows') if x in platform_icon_map else make_text(x, 'is-size-7') for x in e]
|
||||
divider = ' '
|
||||
elif field == 'Code language':
|
||||
if field == 'Code language':
|
||||
e = [make_url(code_language_references[x], make_text(x, 'is-size-7')) for x in e]
|
||||
elif field == 'Code license' or field == 'Assets license':
|
||||
e = [make_url(c.license_urls[x], x, css_class='is-size-7') if x in c.license_urls else make_text(x, 'is-size-7') for x in e]
|
||||
elif field in c.url_fields:
|
||||
e = [make_url(x, make_text(shortcut_url(x), 'is-size-7')) for x in e]
|
||||
e = [make_url(x, shortcut_url(x, name), css_class='is-size-7') for x in e]
|
||||
else:
|
||||
e = [make_text(x, 'is-size-7') for x in e]
|
||||
name = make_text(get_plural_or_singular(field, len(entries)), 'is-size-7')
|
||||
field = make_enumeration(name, e, divider)
|
||||
fields.append(field)
|
||||
entry['fields'] = fields
|
||||
entry['name'] = entry['Title']
|
||||
namex = make_text('{}: '.format(get_plural_or_singular(field, len(entries))), 'is-size-7')
|
||||
entry[field.lower()] = [namex, make_enumeration(e, divider)]
|
||||
|
||||
# build system
|
||||
field = 'Build system'
|
||||
if field in entry['Building']:
|
||||
e = entry['Building'][field]
|
||||
divider = ', '
|
||||
if isinstance(e[0], osg.osg_parse.ValueWithComment):
|
||||
e = [x.value for x in e]
|
||||
e = [make_text(x, 'is-size-7') for x in e]
|
||||
namex = make_text('{}: '.format(field), 'is-size-7')
|
||||
entry[field.lower()] = [namex, make_enumeration(e, divider)]
|
||||
|
||||
entry['raw-path'] = 'https://raw.githubusercontent.com/Trilarion/opensourcegames/master/entries/' + entry['File']
|
||||
|
||||
|
||||
def add_license_links_to_entries(entries):
|
||||
@ -476,6 +547,10 @@ def generate(entries, inspirations, developers):
|
||||
# preprocess
|
||||
preprocess(games, 'Title', games_path)
|
||||
preprocess(frameworks, 'Title', frameworks_path)
|
||||
# TODO preprocess doesn't set the urls for frameworks correctly fix here, do better later
|
||||
for framework in frameworks:
|
||||
keyword = [keyword for keyword in c.framework_keywords if keyword in framework['Keyword']][0]
|
||||
framework['href'] = frameworks_path + ['{}.html#{}'.format(keyword, framework['anchor-id'])]
|
||||
entries = games + frameworks
|
||||
preprocess(inspirations, 'Name', inspirations_path)
|
||||
preprocess(developers, 'Name', developers_path)
|
||||
@ -492,14 +567,14 @@ def generate(entries, inspirations, developers):
|
||||
# sort into categories
|
||||
sorter = lambda item, category: category == item['letter']
|
||||
games_by_alphabet = sort_into_categories(games, extended_alphabet, sorter)
|
||||
frameworks_by_alphabet = sort_into_categories(frameworks, extended_alphabet, sorter)
|
||||
inspirations_by_alphabet = sort_into_categories(inspirations, extended_alphabet, sorter)
|
||||
developers_by_alphabet = sort_into_categories(developers, extended_alphabet, sorter)
|
||||
|
||||
genres = [keyword.capitalize() for keyword in c.recommended_keywords]
|
||||
genres = [keyword.capitalize() for keyword in c.recommended_keywords if keyword not in c.framework_keywords]
|
||||
genres.sort()
|
||||
games_by_genre = sort_into_categories(games, genres, lambda item, category: category.lower() in item['Keyword'])
|
||||
games_by_platform = sort_into_categories(games, c.valid_platforms, lambda item, category: category in item.get('Platform', []), 'Unspecified')
|
||||
games_by_language = sort_into_categories(games, c.known_languages, lambda item, category: category in item['Code language'])
|
||||
games_by_platform = sort_into_categories(entries, c.valid_platforms, lambda item, category: category in item.get('Platform', []), 'Unspecified')
|
||||
games_by_language = sort_into_categories(entries, c.known_languages, lambda item, category: category in item['Code language'])
|
||||
frameworks_by_type = sort_into_categories(frameworks, c.framework_keywords, lambda item, category: category in item['Keyword'])
|
||||
|
||||
# base dictionary
|
||||
@ -517,10 +592,11 @@ def generate(entries, inspirations, developers):
|
||||
environment = Environment(loader=FileSystemLoader(c.web_template_path), autoescape=True)
|
||||
environment.globals['base'] = base
|
||||
environment.globals['raise'] = raise_helper
|
||||
environment.globals['is_list'] = is_list
|
||||
|
||||
# multiple times used templates
|
||||
template_categorical_index = environment.get_template('categorical_index.jinja')
|
||||
template_listing = environment.get_template('listing.jinja')
|
||||
template_listing_entries = environment.get_template('listing_entries.jinja')
|
||||
|
||||
# top level folder
|
||||
base['url_to'] = partial(url_to, [])
|
||||
@ -571,17 +647,20 @@ def generate(entries, inspirations, developers):
|
||||
|
||||
# frameworks by type
|
||||
index = divide_in_columns(frameworks_by_type, game_index)
|
||||
index['title'] = 'Open source frameworks/tools'
|
||||
index['title'] = make_text('Open source frameworks/tools')
|
||||
index['subtitle'] = make_text('Alphabetical index of {} frameworks/tools'.format(len(frameworks)))
|
||||
index['categories'] = c.framework_keywords
|
||||
index['category-names'] = framework_names
|
||||
index['number_entries_per_category_threshold'] = 0
|
||||
write(template_categorical_index.render(index=index), frameworks_path + ['index.html'])
|
||||
|
||||
# generate games pages
|
||||
for letter in extended_alphabet:
|
||||
# generate frameworks pages
|
||||
for keyword in c.framework_keywords:
|
||||
listing = {
|
||||
'title': 'Frameworks/tools starting with {}'.format(letter.capitalize()),
|
||||
'items': frameworks_by_alphabet[letter]
|
||||
'title': keyword.capitalize(),
|
||||
'items': frameworks_by_type[keyword]
|
||||
}
|
||||
write(template_listing.render(listing=listing), frameworks_path +['{}.html'.format(letter.capitalize())])
|
||||
write(template_listing_entries.render(listing=listing), frameworks_path +['{}.html'.format(keyword)])
|
||||
|
||||
# games folder
|
||||
base['url_to'] = partial(url_to, games_path)
|
||||
@ -593,71 +672,91 @@ def generate(entries, inspirations, developers):
|
||||
'title': 'Games starting with {}'.format(letter.capitalize()),
|
||||
'items': games_by_alphabet[letter]
|
||||
}
|
||||
write(template_listing.render(listing=listing), games_path + ['{}.html'.format(letter.capitalize())])
|
||||
write(template_listing_entries.render(listing=listing), games_path + ['{}.html'.format(letter.capitalize())])
|
||||
|
||||
# generate games index
|
||||
index = divide_in_columns(games_by_alphabet, game_index)
|
||||
index['title'] = 'Open source games - Alphabetical index'
|
||||
index['title'] = make_text('Open source games')
|
||||
index['subtitle'] = make_text('Alphabetical index of {} games'.format(len(games)))
|
||||
index['categories'] = extended_alphabet
|
||||
index['category-names'] = extended_alphabet_names
|
||||
index['number_entries_per_category_threshold'] = 0
|
||||
write(template_categorical_index.render(index=index), games_path + ['index.html'])
|
||||
|
||||
# genres
|
||||
base['active_nav'] = 'filter genres'
|
||||
base['active_nav'] = ['filter', 'genres']
|
||||
index = divide_in_columns(games_by_genre, game_index)
|
||||
index['title'] = 'Open source games - Genre index'
|
||||
index['title'] = make_text('Open source games')
|
||||
index['subtitle'] = make_text('Index by game genre')
|
||||
index['categories'] = genres
|
||||
write(template_categorical_index.render(index=index), games_path + ['genres.html'])
|
||||
index['category-names'] = {k:k for k in index['categories']}
|
||||
index['number_entries_per_category_threshold'] = 15
|
||||
write(template_categorical_index.render(index=index), games_by_genres_path)
|
||||
|
||||
# games by language
|
||||
base['active_nav'] = 'filter code language'
|
||||
base['active_nav'] = ['filter', 'code language']
|
||||
index = divide_in_columns(games_by_language, game_index)
|
||||
index['title'] = 'Open source games - Programming language index'
|
||||
index['title'] = 'Open source games and frameworks'
|
||||
index['subtitle'] = make_text('Index by programming language')
|
||||
index['categories'] = c.known_languages
|
||||
index['category-names'] = {k:k for k in index['categories']}
|
||||
index['number_entries_per_category_threshold'] = 15
|
||||
write(template_categorical_index.render(index=index), games_by_language_path)
|
||||
|
||||
# games by platform
|
||||
base['active_nav'] = 'filter platforms'
|
||||
base['active_nav'] = ['filter', 'platforms']
|
||||
index = divide_in_columns(games_by_platform, game_index)
|
||||
index['title'] = 'Open source games - Supported platforms index'
|
||||
index['title'] = 'Open source games and frameworks'
|
||||
index['subtitle'] = make_text('Index by supported platform')
|
||||
index['categories'] = c.valid_platforms + ('Unspecified',)
|
||||
write(template_categorical_index.render(index=index), games_path + ['platforms.html'])
|
||||
index['category-names'] = {k:[make_icon(platform_icon_map[k]), make_text(k)] for k in index['categories']}
|
||||
index['number_entries_per_category_threshold'] = 15
|
||||
write(template_categorical_index.render(index=index), games_by_platform_path)
|
||||
|
||||
# inspirations folder
|
||||
base['url_to'] = partial(url_to, inspirations_path)
|
||||
base['active_nav'] = 'filter inspirations'
|
||||
base['active_nav'] = 'inspirations'
|
||||
|
||||
# inspirations
|
||||
|
||||
# inspirations index
|
||||
index = divide_in_columns(inspirations_by_alphabet, inspiration_index)
|
||||
index['title'] = 'Inspirations - Alphabetical index'
|
||||
index['title'] = 'Inspirations'
|
||||
index['subtitle'] = make_text('Alphabetical index of {} games used as inspirations'.format(len(inspirations)))
|
||||
index['categories'] = extended_alphabet
|
||||
index['category-names'] = extended_alphabet_names
|
||||
index['number_entries_per_category_threshold'] = 0
|
||||
write(template_categorical_index.render(index=index), inspirations_path + ['index.html'])
|
||||
|
||||
# inspirations single pages
|
||||
template_listing_inspirations = environment.get_template('listing_inspirations.jinja')
|
||||
for letter in extended_alphabet:
|
||||
listing = {
|
||||
'title': 'Inspirations ({})'.format(letter.capitalize()),
|
||||
'items': inspirations_by_alphabet[letter]
|
||||
}
|
||||
write(template_listing.render(listing=listing), inspirations_path + ['{}.html'.format(letter.capitalize())])
|
||||
write(template_listing_inspirations.render(listing=listing), inspirations_path + ['{}.html'.format(letter.capitalize())])
|
||||
|
||||
# developers folder
|
||||
base['url_to'] = partial(url_to, developers_path)
|
||||
base['active_nav'] = 'developers'
|
||||
|
||||
# developers single pages
|
||||
template_listing_developers = environment.get_template('listing_developers.jinja')
|
||||
for letter in extended_alphabet:
|
||||
listing = {
|
||||
'title': 'Open source game developers ({})'.format(letter.capitalize()),
|
||||
'items': developers_by_alphabet[letter]
|
||||
}
|
||||
write(template_listing.render(listing=listing), developers_path + ['{}.html'.format(letter.capitalize())])
|
||||
write(template_listing_developers.render(listing=listing), developers_path + ['{}.html'.format(letter.capitalize())])
|
||||
|
||||
# developers index
|
||||
index = divide_in_columns(developers_by_alphabet, developer_index)
|
||||
index['title'] = 'Open source game developers - Alphabetical index'
|
||||
index['title'] = 'Open source game developers'
|
||||
index['subtitle'] = make_text('Alphabetical index of {} developers'.format(len(developers)))
|
||||
index['categories'] = extended_alphabet
|
||||
index['category-names'] = extended_alphabet_names
|
||||
index['number_entries_per_category_threshold'] = 0
|
||||
write(template_categorical_index.render(index=index), developers_path + ['index.html'])
|
||||
|
||||
|
||||
|
@ -13,21 +13,21 @@
|
||||
<nav class="navbar container is-light" aria-label="main navigation">
|
||||
<div class="navbar-menu">
|
||||
<div class="navbar-start">
|
||||
<a class="navbar-item{% if 'index' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['index.html']) }}">Home</a>
|
||||
<a class="navbar-item{% if 'games' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['games', 'index.html']) }}">Games</a>
|
||||
<a class="navbar-item{% if 'frameworks' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['frameworks', 'index.html']) }}">Frameworks/Tools</a>
|
||||
<a class="navbar-item{% if 'developers' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['developers', 'index.html']) }}">Developers</a>
|
||||
<a class="navbar-item{% if 'index' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['index.html']) }}">{{ macros.render_icon('home') }}<span>Home</span></a>
|
||||
<a class="navbar-item{% if 'games' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['games', 'index.html']) }}">{{ macros.render_icon('dice') }}<span>Games</span></a>
|
||||
<a class="navbar-item{% if 'frameworks' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['frameworks', 'index.html']) }}">{{ macros.render_icon('wrench') }}<span>Frameworks/Tools</span></a>
|
||||
<a class="navbar-item{% if 'developers' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['developers', 'index.html']) }}">{{ macros.render_icon('users') }}<span>Developers</span></a>
|
||||
<a class="navbar-item{% if 'inspirations' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['inspirations', 'index.html']) }}">{{ macros.render_icon('bulb') }}<span>Inspirations</span></a>
|
||||
<div class="navbar-item has-dropdown is-hoverable">
|
||||
<a class="navbar-link{% if 'filter' in base['active_nav'] %} is-active{% endif %}">Filter</a>
|
||||
<a class="navbar-link{% if 'filter' in base['active_nav'] %} is-active{% endif %}">{{ macros.render_icon('filter') }}<span>Filter</span></a>
|
||||
<div class="navbar-dropdown">
|
||||
<a class="navbar-item{% if 'inspirations' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['inspirations', 'index.html']) }}">By inspiration</a>
|
||||
<a class="navbar-item{% if 'genres' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['games', 'genres.html']) }}">By category</a>
|
||||
<a class="navbar-item{% if 'code language' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['games', 'languages.html']) }}">By code language</a>
|
||||
<a class="navbar-item{% if 'platforms' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['games', 'platforms.html']) }}">By OS support</a>
|
||||
<a class="navbar-item{% if 'genres' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['games', 'genres.html']) }}">{{ macros.render_icon('price-tag') }}<span>By category</span></a>
|
||||
<a class="navbar-item{% if 'code language' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['games', 'languages.html']) }}">{{ macros.render_icon('language') }}<span>By code language</span></a>
|
||||
<a class="navbar-item{% if 'platforms' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['games', 'platforms.html']) }}">{{ macros.render_icon('laptop') }}<span>By OS support</span></a>
|
||||
</div>
|
||||
</div>
|
||||
<a class="navbar-item{% if 'statistics' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['statistics.html']) }}"><span class="icon"><i class="icon-stats-dots"></i></span><span>Statistics</span></a>
|
||||
<a class="navbar-item{% if 'contribute' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['contribute.html']) }}"><span class="icon"><i class="icon-pencil"></i></span><span>Contribute</span></a>
|
||||
<a class="navbar-item{% if 'statistics' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['statistics.html']) }}">{{ macros.render_icon('stats-dots') }}<span>Statistics</span></a>
|
||||
<a class="navbar-item{% if 'contribute' in base['active_nav'] %} is-active{% endif %}" href="{{ base['url_to'](['contribute.html']) }}">{{ macros.render_icon('pencil') }}<span>Contribute</span></a>
|
||||
<a class="navbar-item" href="https://github.com/Trilarion/opensourcegames">{{ macros.render_icon('github') }}<span>On GitHub</span></a>
|
||||
</div>
|
||||
</div>
|
||||
@ -37,9 +37,14 @@
|
||||
{# footer -#}
|
||||
<footer class="footer">
|
||||
<div class="container is-size-7">
|
||||
<a href="https://trilarion.blogspot.com/search/label/osgames">Blog</a><br>
|
||||
Last updated on {{ base['creation-date'] }}<br>
|
||||
Disclaimer / License
|
||||
<div class="block">
|
||||
Follow the <a href="https://trilarion.blogspot.com/search/label/osgames">Blog</a><br>
|
||||
</div>
|
||||
<div class="block">
|
||||
Disclaimer: The content on this site is the result of voluntary work and may be outdated or incorrect.
|
||||
The content is licensed <a href="https://github.com/Trilarion/opensourcegames/blob/master/LICENSE">CC-0</a>. Icons and ... <br>
|
||||
Last updated on {{ base['creation-date'] }}
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
|
@ -1,34 +1,39 @@
|
||||
{% extends "base.jinja" %}
|
||||
|
||||
{% block content %}
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
<div class="box">
|
||||
<div class="block"><h1 class="title is-size-4">{{ index['title'] }}</h1></div>
|
||||
{% set comma = joiner(", ") %}
|
||||
<div class="is-size-5">
|
||||
{% for category in index['categories'] -%}
|
||||
{{ comma() }} <a href="#{{ category }}" class="has-text-weight-semibold">{{ category }}</a> ({{ index['number_entries'][category] }})
|
||||
{%- endfor %}
|
||||
</div>
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
<div class="box">
|
||||
<div class="block">
|
||||
<h1 class="title">{{ macros.render_element(index['title']) }}</h1>
|
||||
{%- if 'subtitle' in index -%}
|
||||
<h2 class="subtitle">{{ macros.render_element(index['subtitle']) }}</h2>
|
||||
{%- endif -%}
|
||||
</div>
|
||||
<div class="tags">
|
||||
{% for category in index['categories'] -%}
|
||||
<span class="tag is-white {% if index['number_entries'][category] > index['number_entries_per_category_threshold'] %}is-size-5{% else %}is-size-6{% endif %}">
|
||||
<a href="#{{ category.lower() }}" class="has-text-weight-semibold mr-1">{{ macros.render_element(index['category-names'][category]) }}</a> <span class="has-text-grey">({{ index['number_entries'][category] }})</span>
|
||||
</span>
|
||||
{%- endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% for category in index['categories'] %}
|
||||
<div class="box">
|
||||
<div class="block"><h2 id="{{ category }}" class="is-size-4 has-text-weight-semibold">{{ category }}</h2></div>
|
||||
<div class="columns">
|
||||
{% for entries_column in index['entries'][category] %}
|
||||
<div class="column">
|
||||
<ul>
|
||||
{% for entry in entries_column %}
|
||||
<li>{{ macros.render_url(entry['url']) }} {% if 'tags' in entry %}{{ macros.render_text(entry['tags']) }}{% endif %}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<div class="block"><h2 id="{{ category.lower() }}" class="is-size-3 has-text-weight-semibold">{{ macros.render_element(index['category-names'][category]) }}</h2></div>
|
||||
<div class="columns">
|
||||
{%- for entries_column in index['entries'][category] -%}
|
||||
<div class="column">
|
||||
<ul>
|
||||
{%- for entry in entries_column -%}
|
||||
<li>{{ macros.render_element(entry['url']) }}{%- if 'tags' in entry -%}{{ macros.render_element(entry['tags']) }}{%- endif -%}</li>
|
||||
{%- endfor -%}
|
||||
</ul>
|
||||
</div>
|
||||
<a class="is-light is-size-7" href="#">Back to top</a>
|
||||
{%- endfor -%}
|
||||
</div>
|
||||
<a class="is-light is-size-7" href="#">Back to top</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
@ -1,3 +1,25 @@
|
||||
{% extends "base.jinja" %}
|
||||
{% block content %}
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
<div class="box">
|
||||
<h1 class="title is-size-4">Contribution guide</h1>
|
||||
</div>
|
||||
<div class="box">
|
||||
<div class="block">
|
||||
<h2 id="games">Improving games/frameworks/tools information</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box">
|
||||
<div class="block">
|
||||
<h2 id="developers">Improving developers information</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box">
|
||||
<div class="block">
|
||||
<h2 id="inspirations">Improving inspirations information</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
@ -15,10 +15,36 @@
|
||||
<glyph unicode="" glyph-name="bitbucket" d="M33.195 908.331c-18.091 0.256-32.939-14.251-33.195-32.341 0-1.92 0.085-3.84 0.427-5.717l139.221-845.269c3.584-21.291 21.973-36.992 43.605-37.205h667.947c16.299-0.171 30.208 11.563 32.853 27.563l139.52 854.613c2.901 17.835-9.216 34.688-27.093 37.589-1.92 0.341-3.797 0.469-5.675 0.427zM619.52 297.472h-213.248l-57.685 301.397h322.603z" />
|
||||
<glyph unicode="" glyph-name="gitlab" d="M206.677 921.429c-18.898-0.028-34.933-12.253-40.658-29.222l-0.089-0.303-107.947-332.075c0-0.299-0.213-0.512-0.299-0.853l-54.699-167.936c-1.906-5.662-3.005-12.183-3.005-18.96 0-20.319 9.884-38.329 25.105-49.485l0.172-0.12 472.405-343.253c3.925-2.874 8.85-4.599 14.177-4.599 5.429 0 10.439 1.791 14.472 4.815l-0.063-0.045 472.491 343.040c15.417 11.266 25.319 29.283 25.319 49.613 0 6.822-1.115 13.383-3.172 19.512l0.126-0.432-53.76 164.992c-0.33 1.689-0.787 3.176-1.38 4.591l0.057-0.154-107.776 331.733c-5.878 17.109-21.831 29.185-40.603 29.185-0.080 0-0.161 0-0.241-0.001h0.012c-0.098 0.001-0.214 0.001-0.33 0.001-18.733 0-34.609-12.231-40.077-29.143l-0.083-0.298-102.656-316.075h-324.181l-102.827 316.075c-5.552 17.209-21.428 29.44-40.16 29.44-0.026 0-0.052 0-0.079 0h0.004zM206.421 860.843l92.757-284.928h-185.088zM817.749 860.843l92.501-284.928h-185.259zM365.739 527.616h292.779l-91.733-282.368-54.784-168.149zM130.432 527.403h184.405l131.669-405.333zM709.333 527.403h184.576l-316.245-405.419 126.251 388.608zM89.6 500.821l297.728-381.739-333.568 242.432c-3.291 2.392-5.406 6.228-5.406 10.558 0 1.426 0.229 2.799 0.653 4.083l-0.026-0.092zM934.4 500.821l40.619-124.672c0.408-1.207 0.643-2.597 0.643-4.041 0-4.3-2.086-8.113-5.301-10.483l-0.036-0.025v-0.085l-333.653-242.347 1.067 1.493z" />
|
||||
<glyph unicode="" glyph-name="pencil" d="M864 960c88.364 0 160-71.634 160-160 0-36.020-11.91-69.258-32-96l-64-64-224 224 64 64c26.742 20.090 59.978 32 96 32zM64 224l-64-288 288 64 592 592-224 224-592-592zM715.578 596.422l-448-448-55.156 55.156 448 448 55.156-55.156z" />
|
||||
<glyph unicode="" glyph-name="help" d="M721.408 858.47c-58.368 42.086-131.686 63.13-219.955 63.13-67.123 0-123.802-14.797-169.83-44.442-73.062-46.387-111.872-125.184-116.582-236.288h169.318c0 32.41 9.472 63.488 28.314 93.594 18.893 30.003 50.944 45.005 96.154 45.005 45.978 0 77.67-12.186 94.925-36.506 17.357-24.422 26.010-51.405 26.010-80.998 0-25.805-12.902-49.408-28.518-70.81-8.55-12.493-19.814-24.013-33.843-34.509 0 0-91.802-58.88-132.096-106.189-23.347-27.392-25.446-68.506-27.546-127.386-0.102-4.198 1.485-12.902 16.128-12.902 14.694 0 118.579 0 131.635 0 13.107 0 15.821 9.677 15.974 14.029 0.922 21.402 3.277 32.41 7.219 44.8 7.373 23.398 27.546 43.776 50.125 61.389l46.592 32.102c42.086 32.819 75.622 59.699 90.47 80.794 25.293 34.611 43.11 77.312 43.11 128-0.051 82.688-29.235 144.998-87.603 187.187zM498.739 208.691c-58.317 1.792-106.445-38.605-108.288-101.888-1.792-63.181 43.93-105.011 102.298-106.701 60.877-1.792 107.725 37.222 109.619 100.506 1.741 63.283-42.701 106.291-103.629 108.083z" />
|
||||
<glyph unicode="" glyph-name="bedtime" d="M526 852.667q-92 4-172-29t-140-92-94-137-34-168q0-88 33-165t92-136 136-92 165-33q80 0 150 27t126 75 94 112q-96 2-175 42t-135 106-83 148-19 170 56 172z" />
|
||||
<glyph unicode="" glyph-name="home" d="M1024 369.556l-512 397.426-512-397.428v162.038l512 397.426 512-397.428zM896 384v-384h-256v256h-256v-256h-256v384l384 288z" />
|
||||
<glyph unicode="" glyph-name="people_alt" d="M384 384.667q64 0 140-18t139-60 63-94v-128h-684v128q0 52 63 94t139 60 140 18zM640 426.667q-26 0-56 10 56 66 56 160 0 38-16 86t-40 76q30 10 56 10 70 0 120-51t50-121-50-120-120-50zM214 596.667q0 70 50 121t120 51 120-51 50-121-50-120-120-50-120 50-50 120zM712 378.667q106-16 188-59t82-107v-128h-172v128q0 98-98 166z" />
|
||||
<glyph unicode="" glyph-name="laptop" horiz-adv-x="1097" d="M237.714 219.428c-50.286 0-91.429 41.143-91.429 91.429v402.286c0 50.286 41.143 91.429 91.429 91.429h621.714c50.286 0 91.429-41.143 91.429-91.429v-402.286c0-50.286-41.143-91.429-91.429-91.429h-621.714zM219.429 713.143v-402.286c0-9.714 8.571-18.286 18.286-18.286h621.714c9.714 0 18.286 8.571 18.286 18.286v402.286c0 9.714-8.571 18.286-18.286 18.286h-621.714c-9.714 0-18.286-8.571-18.286-18.286zM1005.714 182.857h91.429v-54.857c0-30.286-41.143-54.857-91.429-54.857h-914.286c-50.286 0-91.429 24.571-91.429 54.857v54.857h1005.714zM594.286 128c5.143 0 9.143 4 9.143 9.143s-4 9.143-9.143 9.143h-91.429c-5.143 0-9.143-4-9.143-9.143s4-9.143 9.143-9.143h91.429z" />
|
||||
<glyph unicode="" glyph-name="language" horiz-adv-x="878" d="M373.714 334.857c-1.143-4-29.143 9.143-36.571 12-7.429 3.429-41.143 22.286-49.714 28s-41.143 32.571-45.143 34.286v0c-20.571-31.429-46.857-68.571-76.571-103.429-10.286-12-41.143-50.857-60-62.857-2.857-1.714-19.429-3.429-21.714-2.286 9.143 6.857 35.429 39.429 46.857 52.571 14.286 16.571 82.286 111.429 93.714 133.143 12 21.714 48 93.714 49.714 100.571-5.714 0.571-50.857-14.857-62.857-18.857-11.429-3.429-42.857-10.857-45.143-12.571-2.286-2.286-0.571-9.143-1.714-11.429s-11.429-7.429-17.714-8.571c-5.714-1.714-18.857-2.286-26.857 0-7.429 1.714-14.286 9.143-16 12 0 0-2.286 3.429-2.857 13.143 6.857 2.286 18.286 2.857 30.857 6.286s43.429 12.571 60 18.286 48.571 17.714 58.286 20c10.286 1.714 36 18.857 49.714 23.429s23.429 10.286 24 7.429 0-15.429-0.571-18.857c-0.571-2.857-28-56.571-32-65.143-2.286-4.571-18.286-34.857-44-74.857 9.143-4 28.571-12 36.571-16 9.714-4.571 77.714-33.143 81.143-34.286s9.714-27.429 8.571-32zM256.571 612.571c1.714-9.714-1.143-13.714-2.286-16-5.714-10.857-20-18.286-28.571-21.714s-22.857-6.857-34.286-6.857c-5.143 0.571-15.429 2.286-28 14.857-6.857 7.429-12 27.429-9.714 25.143s18.857-4.571 26.286-2.857 25.143 6.857 33.143 9.143c8.571 2.857 25.714 7.429 31.429 8 5.714 0 10.286-2.286 12-9.714zM655.429 538.857l36-129.714-79.429 24zM22.286 81.714l396.571 132.571v589.714l-396.571-133.143v-589.143zM731.429 262.857l58.286-17.714-103.429 375.429-57.143 17.714-123.429-306.286 58.286-17.714 25.714 62.857 120.571-37.143zM444 812.571l327.429-105.143v217.143zM621.714 56.571l90.286-7.429-30.857-91.429-22.857 37.714c-46.286-29.714-103.429-52.571-157.714-61.714-16.571-3.429-35.429-6.857-52-6.857h-48c-60.571 0-170.857 36-218.857 70.857-3.429 2.857-4.571 5.143-4.571 9.143 0 6.286 4.571 10.857 10.286 10.857 5.143 0 32-16.571 39.429-20 51.429-25.714 123.429-49.143 181.143-49.143 71.429 0 120 9.143 185.143 37.143 18.857 8.571 35.429 19.429 53.143 29.143zM877.714 673.143v-616.571c-441.714 140.571-442.286 140.571-442.286 140.571-9.143-4-418.857-142.286-424.571-142.286-4.571 0-8.571 2.857-10.286 7.429 0 0.571-0.571 1.143-0.571 1.714v616c0.571 1.714 1.143 4.571 2.286 5.714 3.429 4 8 5.143 11.429 6.286 1.714 0.571 36.571 12 85.143 28.571v219.429l318.857-113.143c4 1.143 359.429 124 364.571 124 6.286 0 11.429-4.571 11.429-12v-238.857z" />
|
||||
<glyph unicode="" glyph-name="bulb, lamp, idea" d="M512 960c-194.432 0-352-157.568-352-352 0-128.992 118.016-265.696 160.992-385.76 64.096-179.040 56.992-286.24 191.008-286.24 136 0 126.88 106.688 191.008 285.504 43.104 120.32 160.992 258.496 160.992 386.496 0 194.432-157.632 352-352 352zM594.944 90.368l-158.656-19.808c-5.664 16.384-11.744 35.552-19.136 60.576-0.096 0.32-0.224 0.672-0.288 0.992l198.016 24.736c-2.816-9.44-5.824-19.36-8.448-28.256-4.192-14.368-7.936-26.848-11.488-38.24zM407.552 162.944c-5.824 19.264-12.384 39.552-19.68 61.056h248.512c-3.936-11.488-7.872-23.008-11.264-33.888l-217.568-27.168zM512 0c-32.416 0-47.328 3.744-63.904 40l135.616 16.992c-19.648-52.928-33.952-56.992-71.712-56.992zM661.504 288h-298.656c-15.936 34.56-35.072 69.12-53.952 102.944-41.76 74.72-84.896 152-84.896 217.056 0 158.816 129.184 288 288 288s288-129.184 288-288c0-64.576-43.2-142.272-84.992-217.44-18.688-33.696-37.696-68.192-53.504-102.56zM512 800c8.8 0 16-7.168 16-16s-7.168-16-16-16c-88.224 0-160-71.776-160-160 0-8.832-7.168-16-16-16s-16 7.168-16 16c0 105.888 86.112 192 192 192z" />
|
||||
<glyph unicode="" glyph-name="question" horiz-adv-x="635" d="M402.286 233.143v-137.143c0-12.571-10.286-22.857-22.857-22.857h-137.143c-12.571 0-22.857 10.286-22.857 22.857v137.143c0 12.571 10.286 22.857 22.857 22.857h137.143c12.571 0 22.857-10.286 22.857-22.857zM582.857 576c0-108.571-73.714-150.286-128-180.571-33.714-19.429-54.857-58.857-54.857-75.429v0c0-12.571-9.714-27.429-22.857-27.429h-137.143c-12.571 0-20.571 19.429-20.571 32v25.714c0 69.143 68.571 128.571 118.857 151.429 44 20 62.286 38.857 62.286 75.429 0 32-41.714 60.571-88 60.571-25.714 0-49.143-8-61.714-16.571-13.714-9.714-27.429-23.429-61.143-65.714-4.571-5.714-11.429-9.143-17.714-9.143-5.143 0-9.714 1.714-14.286 4.571l-93.714 71.429c-9.714 7.429-12 20-5.714 30.286 61.714 102.286 148.571 152 265.143 152 122.286 0 259.429-97.714 259.429-228.571z" />
|
||||
<glyph unicode="" glyph-name="help_center1" d="M810 810.667h-596q-36 0-61-25t-25-61v-596q0-36 25-61t61-25h596q36 0 61 25t25 61v596q0 36-25 61t-61 25zM512 170.667q-22 0-38 16t-16 38 16 38 38 16q24 0 39-16t15-38-15-38-39-16zM640 486.667q-24-36-45-53t-33-39q-6-10-8-21t-2-41h-78v40t14 46q14 28 40 47t42 45q14 16 12 40t-19 42-51 18-52-21-24-43l-70 30q14 42 51 74t95 32q46 0 79-19t49-45q14-24 18-62t-18-70z" />
|
||||
<glyph unicode="" glyph-name="help1" d="M642 458.667q40 40 40 96 0 70-50 120t-120 50-120-50-50-120h84q0 34 26 60t60 26 60-26 26-60-26-60l-52-54q-50-54-50-120v-22h84q0 66 50 120zM554 128.667v84h-84v-84h84zM512 852.667q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125z" />
|
||||
<glyph unicode="" glyph-name="help_center" d="M810 810.667h-596q-36 0-61-25t-25-61v-596q0-36 25-61t61-25h596q36 0 61 25t25 61v596q0 36-25 61t-61 25zM512 170.667q-22 0-38 16t-16 38 16 38 38 16q24 0 39-16t15-38-15-38-39-16zM640 486.667q-24-36-45-53t-33-39q-6-10-8-21t-2-41h-78v40t14 46q14 28 40 47t42 45q14 16 12 40t-19 42-51 18-52-21-24-43l-70 30q14 42 51 74t95 32q46 0 79-19t49-45q14-24 18-62t-18-70z" />
|
||||
<glyph unicode="" glyph-name="device_unknown" d="M474 276.667h76v-76h-76v76zM512 652.667q64 0 107-43t43-105q0-50-56-100t-56-90h-76q0 42 17 71t39 42 39 33 17 44q0 30-22 52t-52 22-52-22-22-52h-76q0 62 43 105t107 43zM726 128.667v596h-428v-596h428zM726 896.667q34 0 59-26t25-60v-768q0-34-25-60t-59-26h-428q-34 0-59 26t-25 60v768q0 34 25 60t59 26h428z" />
|
||||
<glyph unicode="" glyph-name="dice" d="M864 768h-512c-88 0-160-72-160-160v-512c0-88 72-160 160-160h512c88 0 160 72 160 160v512c0 88-72 160-160 160zM416 64c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96zM416 448c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96zM608 256c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96zM800 64c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96zM800 448c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96zM828.76 832c-14.93 72.804-79.71 128-156.76 128h-512c-88 0-160-72-160-160v-512c0-77.046 55.196-141.83 128-156.76v636.76c0 35.2 28.8 64 64 64h636.76z" />
|
||||
<glyph unicode="" glyph-name="pacman" d="M964.73 781.196c-93.902 109.45-233.21 178.804-388.73 178.804-282.77 0-512-229.23-512-512s229.23-512 512-512c155.52 0 294.828 69.356 388.728 178.804l-324.728 333.196 324.73 333.196zM704 839.398c39.432 0 71.398-31.964 71.398-71.398 0-39.432-31.966-71.398-71.398-71.398s-71.398 31.966-71.398 71.398c0 39.432 31.966 71.398 71.398 71.398z" />
|
||||
<glyph unicode="" glyph-name="library" horiz-adv-x="1088" d="M1024 0v64h-64v384h64v64h-192v-64h64v-384h-192v384h64v64h-192v-64h64v-384h-192v384h64v64h-192v-64h64v-384h-192v384h64v64h-192v-64h64v-384h-64v-64h-64v-64h1088v64h-64zM512 960h64l512-320v-64h-1088v64l512 320z" />
|
||||
<glyph unicode="" glyph-name="price-tag" d="M976 960h-384c-26.4 0-63.274-15.274-81.942-33.942l-476.116-476.116c-18.668-18.668-18.668-49.214 0-67.882l412.118-412.118c18.668-18.668 49.214-18.668 67.882 0l476.118 476.118c18.666 18.666 33.94 55.54 33.94 81.94v384c0 26.4-21.6 48-48 48zM736 576c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96z" />
|
||||
<glyph unicode="" glyph-name="price-tags" horiz-adv-x="1280" d="M1232 960h-384c-26.4 0-63.274-15.274-81.942-33.942l-476.116-476.116c-18.668-18.668-18.668-49.214 0-67.882l412.118-412.118c18.668-18.668 49.214-18.668 67.882 0l476.118 476.118c18.666 18.666 33.94 55.54 33.94 81.94v384c0 26.4-21.6 48-48 48zM992 576c-53.020 0-96 42.98-96 96s42.98 96 96 96 96-42.98 96-96-42.98-96-96-96zM128 416l544 544h-80c-26.4 0-63.274-15.274-81.942-33.942l-476.116-476.116c-18.668-18.668-18.668-49.214 0-67.882l412.118-412.118c18.668-18.668 49.214-18.668 67.882 0l30.058 30.058-416 416z" />
|
||||
<glyph unicode="" glyph-name="users" horiz-adv-x="1152" d="M768 189.388v52.78c70.498 39.728 128 138.772 128 237.832 0 159.058 0 288-192 288s-192-128.942-192-288c0-99.060 57.502-198.104 128-237.832v-52.78c-217.102-17.748-384-124.42-384-253.388h896c0 128.968-166.898 235.64-384 253.388zM327.196 164.672c55.31 36.15 124.080 63.636 199.788 80.414-15.054 17.784-28.708 37.622-40.492 59.020-30.414 55.234-46.492 116.058-46.492 175.894 0 86.042 0 167.31 30.6 233.762 29.706 64.504 83.128 104.496 159.222 119.488-16.914 76.48-61.94 126.75-181.822 126.75-192 0-192-128.942-192-288 0-99.060 57.502-198.104 128-237.832v-52.78c-217.102-17.748-384-124.42-384-253.388h279.006c14.518 12.91 30.596 25.172 48.19 36.672z" />
|
||||
<glyph unicode="" glyph-name="wrench" d="M1002.934 142.124l-460.552 394.76c21.448 40.298 33.618 86.282 33.618 135.116 0 159.058-128.942 288-288 288-29.094 0-57.172-4.332-83.646-12.354l166.39-166.39c24.89-24.89 24.89-65.62 0-90.51l-101.49-101.49c-24.89-24.89-65.62-24.89-90.51 0l-166.39 166.39c-8.022-26.474-12.354-54.552-12.354-83.646 0-159.058 128.942-288 288-288 48.834 0 94.818 12.17 135.116 33.62l394.76-460.552c22.908-26.724 62.016-28.226 86.904-3.338l101.492 101.492c24.888 24.888 23.386 63.994-3.338 86.902z" />
|
||||
<glyph unicode="" glyph-name="stats-dots" d="M128 64h896v-128h-1024v1024h128zM288 128c-53.020 0-96 42.98-96 96s42.98 96 96 96c2.828 0 5.622-0.148 8.388-0.386l103.192 171.986c-9.84 15.070-15.58 33.062-15.58 52.402 0 53.020 42.98 96 96 96s96-42.98 96-96c0-19.342-5.74-37.332-15.58-52.402l103.192-171.986c2.766 0.238 5.56 0.386 8.388 0.386 2.136 0 4.248-0.094 6.35-0.23l170.356 298.122c-10.536 15.408-16.706 34.036-16.706 54.11 0 53.020 42.98 96 96 96s96-42.98 96-96c0-53.020-42.98-96-96-96-2.14 0-4.248 0.094-6.35 0.232l-170.356-298.124c10.536-15.406 16.706-34.036 16.706-54.11 0-53.020-42.98-96-96-96s-96 42.98-96 96c0 19.34 5.74 37.332 15.578 52.402l-103.19 171.984c-2.766-0.238-5.56-0.386-8.388-0.386s-5.622 0.146-8.388 0.386l-103.192-171.986c9.84-15.068 15.58-33.060 15.58-52.4 0-53.020-42.98-96-96-96z" />
|
||||
<glyph unicode="" glyph-name="sphere" d="M480 896c-265.096 0-480-214.904-480-480 0-265.098 214.904-480 480-480 265.098 0 480 214.902 480 480 0 265.096-214.902 480-480 480zM751.59 256c8.58 40.454 13.996 83.392 15.758 128h127.446c-3.336-44.196-13.624-87.114-30.68-128h-112.524zM208.41 576c-8.58-40.454-13.996-83.392-15.758-128h-127.444c3.336 44.194 13.622 87.114 30.678 128h112.524zM686.036 576c9.614-40.962 15.398-83.854 17.28-128h-191.316v128h174.036zM512 640v187.338c14.59-4.246 29.044-11.37 43.228-21.37 26.582-18.74 52.012-47.608 73.54-83.486 14.882-24.802 27.752-52.416 38.496-82.484h-155.264zM331.232 722.484c21.528 35.878 46.956 64.748 73.54 83.486 14.182 10 28.638 17.124 43.228 21.37v-187.34h-155.264c10.746 30.066 23.616 57.68 38.496 82.484zM448 576v-128h-191.314c1.88 44.146 7.666 87.038 17.278 128h174.036zM95.888 256c-17.056 40.886-27.342 83.804-30.678 128h127.444c1.762-44.608 7.178-87.546 15.758-128h-112.524zM256.686 384h191.314v-128h-174.036c-9.612 40.96-15.398 83.854-17.278 128zM448 192v-187.34c-14.588 4.246-29.044 11.372-43.228 21.37-26.584 18.74-52.014 47.61-73.54 83.486-14.882 24.804-27.75 52.418-38.498 82.484h155.266zM628.768 109.516c-21.528-35.876-46.958-64.746-73.54-83.486-14.184-9.998-28.638-17.124-43.228-21.37v187.34h155.266c-10.746-30.066-23.616-57.68-38.498-82.484zM512 256v128h191.314c-1.88-44.146-7.666-87.040-17.28-128h-174.034zM767.348 448c-1.762 44.608-7.178 87.546-15.758 128h112.524c17.056-40.886 27.344-83.806 30.68-128h-127.446zM830.658 640h-95.9c-18.638 58.762-44.376 110.294-75.316 151.428 42.536-20.34 81.058-47.616 114.714-81.272 21.48-21.478 40.362-44.938 56.502-70.156zM185.844 710.156c33.658 33.658 72.18 60.932 114.714 81.272-30.942-41.134-56.676-92.666-75.316-151.428h-95.898c16.138 25.218 35.022 48.678 56.5 70.156zM129.344 192h95.898c18.64-58.762 44.376-110.294 75.318-151.43-42.536 20.34-81.058 47.616-114.714 81.274-21.48 21.478-40.364 44.938-56.502 70.156zM774.156 121.844c-33.656-33.658-72.18-60.934-114.714-81.274 30.942 41.134 56.678 92.668 75.316 151.43h95.9c-16.14-25.218-35.022-48.678-56.502-70.156z" />
|
||||
<glyph unicode="" glyph-name="rocket" d="M704 896l-320-320h-192l-192-256c0 0 203.416 56.652 322.066 30.084l-322.066-414.084 421.902 328.144c58.838-134.654-37.902-328.144-37.902-328.144l256 192v192l320 320 64 320-320-64z" />
|
||||
<glyph unicode="" glyph-name="briefcase" d="M960 704h-256v64c0 35.2-28.8 64-64 64h-256c-35.204 0-64-28.8-64-64v-64h-256c-35.2 0-64-28.8-64-64v-576c0-35.202 28.796-64 64-64h896c35.2 0 64 28.798 64 64v576c0 35.2-28.8 64-64 64zM384 767.884c0.034 0.040 0.074 0.082 0.114 0.116h255.772c0.042-0.034 0.082-0.076 0.118-0.116v-63.884h-256.004v63.884zM960 448h-128v-96c0-17.602-14.4-32-32-32h-64c-17.604 0-32 14.398-32 32v96h-384v-96c0-17.602-14.4-32-32-32h-64c-17.602 0-32 14.398-32 32v96h-128v64h896v-64z" />
|
||||
<glyph unicode="" glyph-name="target" d="M1024 512h-100.924c-27.64 178.24-168.836 319.436-347.076 347.076v100.924h-128v-100.924c-178.24-27.64-319.436-168.836-347.076-347.076h-100.924v-128h100.924c27.64-178.24 168.836-319.436 347.076-347.076v-100.924h128v100.924c178.24 27.64 319.436 168.836 347.076 347.076h100.924v128zM792.822 512h-99.762c-19.284 54.55-62.51 97.778-117.060 117.060v99.762c107.514-24.49 192.332-109.31 216.822-216.822zM512 384c-35.346 0-64 28.654-64 64s28.654 64 64 64c35.346 0 64-28.654 64-64s-28.654-64-64-64zM448 728.822v-99.762c-54.55-19.282-97.778-62.51-117.060-117.060h-99.762c24.49 107.512 109.31 192.332 216.822 216.822zM231.178 384h99.762c19.282-54.55 62.51-97.778 117.060-117.060v-99.762c-107.512 24.49-192.332 109.308-216.822 216.822zM576 167.178v99.762c54.55 19.284 97.778 62.51 117.060 117.060h99.762c-24.49-107.514-109.308-192.332-216.822-216.822z" />
|
||||
<glyph unicode="" glyph-name="earth" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512-0.002c-62.958 0-122.872 13.012-177.23 36.452l233.148 262.29c5.206 5.858 8.082 13.422 8.082 21.26v96c0 17.674-14.326 32-32 32-112.99 0-232.204 117.462-233.374 118.626-6 6.002-14.14 9.374-22.626 9.374h-128c-17.672 0-32-14.328-32-32v-192c0-12.122 6.848-23.202 17.69-28.622l110.31-55.156v-187.886c-116.052 80.956-192 215.432-192 367.664 0 68.714 15.49 133.806 43.138 192h116.862c8.488 0 16.626 3.372 22.628 9.372l128 128c6 6.002 9.372 14.14 9.372 22.628v77.412c40.562 12.074 83.518 18.588 128 18.588 70.406 0 137.004-16.26 196.282-45.2-4.144-3.502-8.176-7.164-12.046-11.036-36.266-36.264-56.236-84.478-56.236-135.764s19.97-99.5 56.236-135.764c36.434-36.432 85.218-56.264 135.634-56.26 3.166 0 6.342 0.080 9.518 0.236 13.814-51.802 38.752-186.656-8.404-372.334-0.444-1.744-0.696-3.488-0.842-5.224-81.324-83.080-194.7-134.656-320.142-134.656z" />
|
||||
<glyph unicode="" glyph-name="filter" d="M512 960c-282.77 0-512-71.634-512-160v-96l384-384v-320c0-35.346 57.306-64 128-64 70.692 0 128 28.654 128 64v320l384 384v96c0 88.366-229.23 160-512 160zM94.384 821.176c23.944 13.658 57.582 26.62 97.278 37.488 87.944 24.076 201.708 37.336 320.338 37.336 118.628 0 232.394-13.26 320.338-37.336 39.696-10.868 73.334-23.83 97.28-37.488 15.792-9.006 24.324-16.624 28.296-21.176-3.972-4.552-12.506-12.168-28.296-21.176-23.946-13.658-57.584-26.62-97.28-37.488-87.942-24.076-201.708-37.336-320.338-37.336s-232.394 13.26-320.338 37.336c-39.696 10.868-73.334 23.83-97.278 37.488-15.792 9.008-24.324 16.624-28.298 21.176 3.974 4.552 12.506 12.168 28.298 21.176z" />
|
||||
<glyph unicode="" glyph-name="new-tab" d="M192 896v-768h768v768h-768zM896 192h-640v640h640v-640zM128 64v672l-64 64v-800h800l-64 64h-672zM352 704l160-160-192-192 96-96 192 192 160-160v416z" />
|
||||
<glyph unicode="" glyph-name="github" d="M512.008 947.358c-282.738 0-512.008-229.218-512.008-511.998 0-226.214 146.704-418.132 350.136-485.836 25.586-4.738 34.992 11.11 34.992 24.632 0 12.204-0.48 52.542-0.696 95.324-142.448-30.976-172.504 60.41-172.504 60.41-23.282 59.176-56.848 74.916-56.848 74.916-46.452 31.778 3.51 31.124 3.51 31.124 51.4-3.61 78.476-52.766 78.476-52.766 45.672-78.27 119.776-55.64 149.004-42.558 4.588 33.086 17.852 55.68 32.506 68.464-113.73 12.942-233.276 56.85-233.276 253.032 0 55.898 20.004 101.574 52.76 137.428-5.316 12.9-22.854 64.972 4.952 135.5 0 0 43.006 13.752 140.84-52.49 40.836 11.348 84.636 17.036 128.154 17.234 43.502-0.198 87.336-5.886 128.256-17.234 97.734 66.244 140.656 52.49 140.656 52.49 27.872-70.528 10.35-122.6 5.036-135.5 32.82-35.856 52.694-81.532 52.694-137.428 0-196.654-119.778-239.95-233.79-252.624 18.364-15.89 34.724-47.046 34.724-94.812 0-68.508-0.596-123.644-0.596-140.508 0-13.628 9.222-29.594 35.172-24.566 203.322 67.776 349.842 259.626 349.842 485.768 0 282.78-229.234 511.998-511.992 511.998z" />
|
||||
<glyph unicode="" glyph-name="tux" d="M567.656 223.084c-81.944-38.118-158.158-37.716-209.34-34.020-61.052 4.41-110.158 21.124-131.742 35.732-13.3 9.006-31.384 5.522-40.39-7.782-9.004-13.302-5.52-31.386 7.782-40.39 34.698-23.486 96.068-40.954 160.162-45.58 10.866-0.784 22.798-1.278 35.646-1.278 55.782 0 126.626 5.316 202.42 40.57 14.564 6.778 20.878 24.074 14.104 38.64-6.776 14.566-24.076 20.872-38.642 14.108zM890.948 266.184c2.786 252.688 28.762 730.206-454.97 691.612-477.6-38.442-350.964-542.968-358.082-711.95-6.308-89.386-35.978-198.648-77.896-309.846h129.1c13.266 47.122 23.024 93.72 27.232 138.15 7.782-5.428 16.108-10.674 24.994-15.7 14.458-8.518 26.884-19.844 40.040-31.834 30.744-28.018 65.59-59.774 133.712-63.752 4.572-0.262 9.174-0.394 13.676-0.394 68.896 0 116.014 30.154 153.878 54.382 18.14 11.612 33.818 21.64 48.564 26.452 41.91 13.12 78.532 34.296 105.904 61.252 4.276 4.208 8.242 8.538 11.962 12.948 15.246-55.878 36.118-118.758 59.288-181.504h275.65c-66.174 102.224-134.436 202.374-133.052 330.184zM124.11 403.648c0 0.016 0 0.030-0.002 0.046-4.746 82.462 34.71 151.832 88.126 154.936 53.412 3.106 100.56-61.228 105.304-143.692 0-0.014 0.004-0.030 0.004-0.044 0.256-4.446 0.368-8.846 0.37-13.206-16.924-4.256-32.192-10.436-45.872-17.63-0.052 0.612-0.092 1.216-0.152 1.83 0 0.008 0 0.018 0 0.026-4.57 46.81-29.572 82.16-55.852 78.958-26.28-3.204-43.88-43.75-39.312-90.558 0-0.010 0.004-0.018 0.004-0.026 1.992-20.408 7.868-38.636 16.042-52.444-2.034-1.604-7.784-5.812-14.406-10.656-4.97-3.634-11.020-8.058-18.314-13.43-19.882 26.094-33.506 63.58-35.94 105.89zM665.26 199.822c-1.9-43.586-58.908-84.592-111.582-101.044l-0.296-0.096c-21.9-7.102-41.428-19.6-62.104-32.83-34.732-22.224-70.646-45.208-122.522-45.208-3.404 0-6.894 0.104-10.326 0.296-47.516 2.778-69.742 23.032-97.88 48.676-14.842 13.526-30.19 27.514-49.976 39.124l-0.424 0.244c-42.706 24.104-69.212 54.082-70.908 80.194-0.842 12.98 4.938 24.218 17.182 33.4 26.636 19.972 44.478 33.022 56.284 41.658 13.11 9.588 17.068 12.48 20 15.264 2.096 1.986 4.364 4.188 6.804 6.562 24.446 23.774 65.36 63.562 128.15 63.562 38.404 0 80.898-14.8 126.17-43.902 21.324-13.878 39.882-20.286 63.38-28.4 16.156-5.578 34.468-11.902 58.992-22.404l0.396-0.164c22.88-9.404 49.896-26.564 48.66-54.932zM652.646 302.194c-4.4 2.214-8.974 4.32-13.744 6.286-22.106 9.456-39.832 15.874-54.534 20.998 8.116 15.894 13.16 35.72 13.624 57.242 0 0.010 0 0.022 0 0.030 1.126 52.374-25.288 94.896-58.996 94.976-33.71 0.078-61.95-42.314-63.076-94.686 0-0.010 0-0.018 0-0.028-0.038-1.714-0.042-3.416-0.020-5.11-20.762 9.552-41.18 16.49-61.166 20.76-0.092 1.968-0.204 3.932-0.244 5.92 0 0.016 0 0.036 0 0.050-1.938 95.412 56.602 174.39 130.754 176.402 74.15 2.014 135.828-73.7 137.772-169.11 0-0.018 0-0.038 0-0.052 0.874-43.146-10.66-82.866-30.37-113.678z" />
|
||||
<glyph unicode="" glyph-name="appleinc" d="M791.498 415.908c-1.294 129.682 105.758 191.876 110.542 194.966-60.152 88.020-153.85 100.078-187.242 101.472-79.742 8.074-155.596-46.948-196.066-46.948-40.368 0-102.818 45.754-168.952 44.552-86.916-1.292-167.058-50.538-211.812-128.38-90.304-156.698-23.126-388.84 64.89-515.926 43.008-62.204 94.292-132.076 161.626-129.58 64.842 2.588 89.362 41.958 167.756 41.958s100.428-41.958 169.050-40.67c69.774 1.296 113.982 63.398 156.692 125.796 49.39 72.168 69.726 142.038 70.924 145.626-1.548 0.706-136.060 52.236-137.408 207.134zM662.562 796.478c35.738 43.358 59.86 103.512 53.28 163.522-51.478-2.096-113.878-34.29-150.81-77.55-33.142-38.376-62.148-99.626-54.374-158.436 57.466-4.484 116.128 29.204 151.904 72.464z" />
|
||||
<glyph unicode="" glyph-name="finder" d="M569.226 181.744c-0.002 0.044-0.002 0.088-0.004 0.132 0.002-0.044 0.002-0.088 0.004-0.132zM570.596 145.462c-0.012 0.234-0.022 0.466-0.032 0.702 0.010-0.234 0.020-0.466 0.032-0.702zM569.814 163.688c-0.006 0.178-0.012 0.356-0.020 0.536 0.010-0.182 0.016-0.358 0.020-0.536zM960 960h-896c-35.2 0-64-28.8-64-64v-896c0-35.2 28.8-64 64-64h493.832c0.044 0 0.088-0.006 0.132-0.006 0.042 0 0.084 0.006 0.126 0.006h401.91c35.2 0 64 28.8 64 64v896c0 35.2-28.8 64-64 64zM192 736c0 17.672 14.328 32 32 32s32-14.328 32-32v-64c0-17.672-14.328-32-32-32s-32 14.328-32 32v64zM960 0h-375.058c-6.7 42.082-10.906 85.476-13.388 127.604 0.006-0.116 0.010-0.228 0.018-0.344-19.696-2.146-39.578-3.26-59.572-3.26-133.65 0-262.382 48.656-362.484 137.006-14.906 13.156-16.326 35.906-3.168 50.812 13.158 14.904 35.906 16.326 50.814 3.168 86.936-76.728 198.748-118.986 314.838-118.986 19.086 0 38.052 1.166 56.816 3.416-2.192 118.194 6.876 211.914 7.026 213.404 0.898 8.996-2.050 17.952-8.118 24.654-6.066 6.702-14.682 10.526-23.724 10.526h-95.174c1.384 34.614 5.082 93.814 14.958 160.188 18.864 126.76 51.994 225.77 96.152 287.812h400.064v-896zM800 640c-17.674 0-32 14.328-32 32v64c0 17.672 14.326 32 32 32s32-14.328 32-32v-64c0-17.672-14.326-32-32-32zM540.496 124.768c-3.646-0.192-7.298-0.336-10.956-0.454 3.658 0.116 7.31 0.264 10.956 0.454zM512 124c4.692 0 9.374 0.074 14.050 0.196-4.676-0.122-9.358-0.196-14.050-0.196zM539.074 196.798c0.784 0.044 1.568 0.084 2.352 0.132-0.782-0.048-1.568-0.088-2.352-0.132zM525.084 196.2c1.074 0.030 2.146 0.072 3.218 0.11-1.072-0.038-2.144-0.082-3.218-0.11zM877.65 311.818c-13.156 14.91-35.908 16.322-50.812 3.168-72.642-64.114-162.658-104.136-258.022-115.57 0.43-23.278 1.294-47.496 2.754-72.156 111.954 12.21 217.786 58.614 302.912 133.746 14.908 13.156 16.326 35.906 3.168 50.812zM571.498 127.252c-4.606-0.5-9.222-0.936-13.848-1.322 4.626 0.384 9.244 0.822 13.848 1.322zM555.488 125.758c-3.906-0.312-7.822-0.576-11.742-0.806 3.92 0.226 7.834 0.496 11.742 0.806z" />
|
||||
<glyph unicode="" glyph-name="android" d="M896 576c-35.2 0-64-28.8-64-64v-256c0-35.2 28.8-64 64-64s64 28.8 64 64v256c0 35.2-28.8 64-64 64zM128 576c-35.2 0-64-28.8-64-64v-256c0-35.2 28.8-64 64-64s64 28.8 64 64v256c0 35.2-28.802 64-64 64zM224 224c0-53.020 42.98-96 96-96v0-128c0-35.2 28.8-64 64-64s64 28.8 64 64v128h128v-128c0-35.2 28.8-64 64-64s64 28.8 64 64v128c53.020 0 96 42.98 96 96v352h-576v-352zM798.216 639.998c-9.716 87.884-59.004 163.792-129.62 209.646l32.024 64.046c7.904 15.806 1.496 35.028-14.31 42.932s-35.030 1.496-42.932-14.312l-32.142-64.286-8.35 3.316c-28.568 9.502-59.122 14.66-90.886 14.66-31.762 0-62.316-5.158-90.888-14.656l-8.348-3.316-32.142 64.282c-7.904 15.808-27.128 22.212-42.932 14.312-15.808-7.904-22.214-27.126-14.312-42.932l32.022-64.046c-70.616-45.852-119.904-121.762-129.622-209.644v-32h574.222v31.998h-1.784zM416 704c-17.674 0-32 14.328-32 32 0 17.648 14.288 31.958 31.93 31.996 0.032 0 0.062-0.002 0.094-0.002 0.018 0 0.036 0.002 0.052 0.002 17.638-0.042 31.924-14.35 31.924-31.996 0-17.672-14.326-32-32-32zM608 704c-17.674 0-32 14.328-32 32 0 17.646 14.286 31.954 31.924 31.996 0.016 0 0.034-0.002 0.050-0.002 0.032 0 0.064 0.002 0.096 0.002 17.64-0.038 31.93-14.348 31.93-31.996 0-17.672-14.326-32-32-32z" />
|
||||
<glyph unicode="" glyph-name="windows8" d="M0.35 448l-0.35 312.074 384 52.144v-364.218zM448 821.518l511.872 74.482v-448h-511.872zM959.998 384l-0.126-448-511.872 72.016v375.984zM384 16.164l-383.688 52.594-0.020 315.242h383.708z" />
|
||||
</font></defs></svg>
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 38 KiB |
Binary file not shown.
Binary file not shown.
153
code/html/css/osgl.min.css
vendored
153
code/html/css/osgl.min.css
vendored
@ -1 +1,152 @@
|
||||
@font-face{font-family:'osgl';src:url('fonts/osgl.ttf?iylqbe') format('truetype'), url('fonts/osgl.woff?iylqbe') format('woff'), url('fonts/osgl.svg?iylqbe#osgl') format('svg');font-weight:normal;font-style:normal;font-display:block}i{font-family:'osgl' !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-wikipedia:before{content:"\e900"}.icon-ios:before{content:"\e901"}.icon-linux:before{content:"\e902";color:#fcc624}.icon-windows:before{content:"\e903";color:#0078d6}.icon-sourceforge:before{content:"\e904";color:#535353}.icon-bitbucket:before{content:"\e905";color:#0052cc}.icon-gitlab:before{content:"\e906";color:#fca121}.icon-pencil:before{content:"\e907"}.icon-dice:before{content:"\e915"}.icon-stats-dots:before{content:"\e99b"}.icon-sphere:before{content:"\e9c9"}.icon-new-tab:before{content:"\ea7e"}.icon-github:before{content:"\eab0"}.icon-appleinc:before{content:"\eabe"}
|
||||
@font-face {
|
||||
font-family: 'osgl';
|
||||
src:
|
||||
url('fonts/osgl.ttf?twf6ln') format('truetype'),
|
||||
url('fonts/osgl.woff?twf6ln') format('woff'),
|
||||
url('fonts/osgl.svg?twf6ln#osgl') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
font-display: block;
|
||||
}
|
||||
|
||||
i {
|
||||
/* use !important to prevent issues with browser extensions that change fonts */
|
||||
font-family: 'osgl' !important;
|
||||
speak: never;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-variant: normal;
|
||||
text-transform: none;
|
||||
line-height: 1;
|
||||
|
||||
/* Better Font Rendering =========== */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-help:before {
|
||||
content: "\e908";
|
||||
}
|
||||
.icon-question:before {
|
||||
content: "\e90f";
|
||||
}
|
||||
.icon-laptop:before {
|
||||
content: "\e90c";
|
||||
}
|
||||
.icon-language:before {
|
||||
content: "\e90d";
|
||||
}
|
||||
.icon-bulb:before {
|
||||
content: "\e90e";
|
||||
}
|
||||
.icon-lamp:before {
|
||||
content: "\e90e";
|
||||
}
|
||||
.icon-idea:before {
|
||||
content: "\e90e";
|
||||
}
|
||||
.icon-device_unknown:before {
|
||||
content: "\e913";
|
||||
}
|
||||
.icon-help_center1:before {
|
||||
content: "\e910";
|
||||
}
|
||||
.icon-help1:before {
|
||||
content: "\e911";
|
||||
}
|
||||
.icon-help_center:before {
|
||||
content: "\e912";
|
||||
}
|
||||
.icon-people_alt:before {
|
||||
content: "\e90b";
|
||||
}
|
||||
.icon-bedtime:before {
|
||||
content: "\e909";
|
||||
}
|
||||
.icon-wikipedia:before {
|
||||
content: "\e900";
|
||||
}
|
||||
.icon-ios:before {
|
||||
content: "\e901";
|
||||
}
|
||||
.icon-linux:before {
|
||||
content: "\e902";
|
||||
}
|
||||
.icon-windows:before {
|
||||
content: "\e903";
|
||||
}
|
||||
.icon-sourceforge:before {
|
||||
content: "\e904";
|
||||
}
|
||||
.icon-bitbucket:before {
|
||||
content: "\e905";
|
||||
}
|
||||
.icon-gitlab:before {
|
||||
content: "\e906";
|
||||
}
|
||||
.icon-home:before {
|
||||
content: "\e90a";
|
||||
}
|
||||
.icon-pencil:before {
|
||||
content: "\e907";
|
||||
}
|
||||
.icon-dice:before {
|
||||
content: "\e915";
|
||||
}
|
||||
.icon-pacman:before {
|
||||
content: "\e916";
|
||||
}
|
||||
.icon-library:before {
|
||||
content: "\e921";
|
||||
}
|
||||
.icon-price-tag:before {
|
||||
content: "\e935";
|
||||
}
|
||||
.icon-price-tags:before {
|
||||
content: "\e936";
|
||||
}
|
||||
.icon-users:before {
|
||||
content: "\e972";
|
||||
}
|
||||
.icon-wrench:before {
|
||||
content: "\e991";
|
||||
}
|
||||
.icon-stats-dots:before {
|
||||
content: "\e99b";
|
||||
}
|
||||
.icon-rocket:before {
|
||||
content: "\e9a5";
|
||||
}
|
||||
.icon-briefcase:before {
|
||||
content: "\e9ae";
|
||||
}
|
||||
.icon-target:before {
|
||||
content: "\e9b3";
|
||||
}
|
||||
.icon-earth:before {
|
||||
content: "\e9ca";
|
||||
}
|
||||
.icon-filter:before {
|
||||
content: "\ea5b";
|
||||
}
|
||||
.icon-new-tab:before {
|
||||
content: "\ea7e";
|
||||
}
|
||||
.icon-github:before {
|
||||
content: "\eab0";
|
||||
}
|
||||
.icon-tux:before {
|
||||
content: "\eabd";
|
||||
}
|
||||
.icon-appleinc:before {
|
||||
content: "\eabe";
|
||||
}
|
||||
.icon-finder:before {
|
||||
content: "\eabf";
|
||||
}
|
||||
.icon-android:before {
|
||||
content: "\eac0";
|
||||
}
|
||||
.icon-windows8:before {
|
||||
content: "\eac2";
|
||||
}
|
||||
|
@ -1,35 +0,0 @@
|
||||
{% extends "base.jinja" %}
|
||||
{% block content %}
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
<h1 class="title">{{ listing['title'] }}</h1>
|
||||
{# iterate over items -#}
|
||||
{% for item in listing['items'] %}
|
||||
<div class="box">
|
||||
{# item header with anchor, name and link to contribute -#}
|
||||
<nav class="level is-mobile">
|
||||
<div class="level-left">
|
||||
<h2 id="{{ item['anchor-id'] }}" class="title is-4">{{ item['name'] }}</h2>
|
||||
</div>
|
||||
<div class="level-right is-size-7">
|
||||
<p class="level-item"><a href="{{ base['url_to'](['contribute.html']) }}">Improve</a></p>
|
||||
</div>
|
||||
</nav>
|
||||
{#- iterate over fields -#}
|
||||
{% for field in item['fields'] %}
|
||||
{% if field['type'] == 'text' %}
|
||||
{{ macros.render_text(field) }}
|
||||
{% elif field['type'] == 'enumeration' %}
|
||||
{{ macros.render_enumeration(field) }}
|
||||
{% elif field['type'] == 'linebreak' %}
|
||||
{% else %}
|
||||
{{ raise('Unknown field type.') }}
|
||||
{% endif %}
|
||||
<br>
|
||||
{% endfor %}
|
||||
</div>{#- of box -#}
|
||||
{% endfor %}
|
||||
<a class="is-light is-size-7" href="#">Back to top</a>
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
37
code/html/listing_developers.jinja
Normal file
37
code/html/listing_developers.jinja
Normal file
@ -0,0 +1,37 @@
|
||||
{% extends "base.jinja" %}
|
||||
{% block content %}
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
<h1 class="title">{{ listing['title'] }}</h1>
|
||||
{# iterate over items -#}
|
||||
{% for item in listing['items'] %}
|
||||
<div class="box">
|
||||
<div class="level">
|
||||
<div class="level-left">
|
||||
<div class="level-item">
|
||||
<h2 id="{{ item['anchor-id'] }}" class="title is-4">{{ item['name'] }}</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="level-right is-size-5">
|
||||
{%- for contact in item['contact'] -%}
|
||||
<div class="level-item">{{ macros.render_element(contact) }}</div>
|
||||
{%- endfor -%}
|
||||
</div>
|
||||
</div>
|
||||
<div class="block">{{ macros.render_element(item['games']) }}</div>
|
||||
<div class="block">
|
||||
{%- for field in ('organization',) -%}
|
||||
{%- if field in item -%}
|
||||
{{ macros.render_element(item[field]) }}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
</div>
|
||||
<div class="block">
|
||||
<a href="{{ base['url_to'](['contribute.html#developers']) }}" title="Contribution guide" class="is-size-7">Improve</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<a class="is-light is-size-7" href="#">Back to top</a>
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
54
code/html/listing_entries.jinja
Normal file
54
code/html/listing_entries.jinja
Normal file
@ -0,0 +1,54 @@
|
||||
{% extends "base.jinja" %}
|
||||
{% block content %}
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
<h1 class="title">{{ listing['title'] }}</h1>
|
||||
{# iterate over items -#}
|
||||
{% for item in listing['items'] %}
|
||||
<div class="box">
|
||||
<nav class="level">
|
||||
<div class="level-left">
|
||||
<div class="level-item">
|
||||
<h2 id="{{ item['anchor-id'] }}" class="title is-4">{{ item['name'] }}</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="level-right">
|
||||
{%- for state in item['state'] -%}
|
||||
<div class="level-item">{{ macros.render_element(state) }}</div>
|
||||
{%- endfor -%}
|
||||
</div>
|
||||
</nav>
|
||||
<div class="block">
|
||||
{%- if 'platform' in item -%}
|
||||
{%- for platform in item['platform'] -%}
|
||||
<span class="mr-2">{{ macros.render_element(platform) }}</span>
|
||||
{%- endfor -%}
|
||||
{%- endif -%}
|
||||
{{ macros.render_element(item['keyword']) }}
|
||||
{%- if 'note' in item %}{{ macros.render_element(item['note']) }}{% endif -%}
|
||||
</div>
|
||||
<div class="block">
|
||||
{%- if 'inspiration' in item %}{{ macros.render_element(item['inspiration']) }}<br>{% endif -%}
|
||||
{%- if 'developer' in item %}{{ macros.render_element(item['developer']) }}{% endif -%}
|
||||
</div>
|
||||
<div class="block">
|
||||
{%- for field in ('home', 'media', 'download', 'play') -%}
|
||||
{%- if field in item -%}{{ macros.render_element(item[field]) }}<br>{%- endif -%}
|
||||
{%- endfor -%}
|
||||
</div>
|
||||
<div class="block">
|
||||
<span class="has-text-weight-semibold">Technical info</span><br>
|
||||
{%- for field in ('code language', 'code license', 'code repository', 'code dependency', 'assets license', 'build system') -%}
|
||||
{%- if field in item -%}{{ macros.render_element(item[field]) }}<br>{%- endif -%}
|
||||
{%- endfor -%}
|
||||
</div>
|
||||
<div class="block">
|
||||
<a href="{{ base['url_to'](['contribute.html#games']) }}" title="Contribution guide" class="is-size-7 mr-2">Improve</a>
|
||||
<a href="{{ item['raw-path'] }}" title="Text based entry on Github" class="is-size-7">Raw entry</a>
|
||||
</div>
|
||||
</div>{#- of box -#}
|
||||
{% endfor %}
|
||||
<a class="is-light is-size-7" href="#">Back to top</a>
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
22
code/html/listing_inspirations.jinja
Normal file
22
code/html/listing_inspirations.jinja
Normal file
@ -0,0 +1,22 @@
|
||||
{% extends "base.jinja" %}
|
||||
{% block content %}
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
<h1 class="title">{{ listing['title'] }}</h1>
|
||||
{# iterate over items -#}
|
||||
{% for item in listing['items'] %}
|
||||
<div class="box">
|
||||
<div class="block">
|
||||
<h2 id="{{ item['anchor-id'] }}" class="title is-4">{{ item['name'] }}</h2>
|
||||
<div class="subtitle is-size-6">{{ macros.render_element(item['inspired']) }}</div>
|
||||
{%- if 'media' in item -%}{{ macros.render_element(item['media']) }}{%- endif -%}
|
||||
</div>
|
||||
<div class="block">
|
||||
<a href="{{ base['url_to'](['contribute.html#inspirations']) }}" title="Contribution guide" class="is-size-7">Improve</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<a class="is-light is-size-7" href="#">Back to top</a>
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
@ -9,24 +9,30 @@
|
||||
|
||||
{# #}
|
||||
{%- macro render_icon(icon) -%}
|
||||
<span class="icon"><i class="icon-{{ icon['class'] }}"></i></span>
|
||||
<span class="icon has-text-black"><i class="icon-{{ icon }}"></i></span>
|
||||
{%- endmacro -%}
|
||||
|
||||
{# Some text surrounded by a link tag #}
|
||||
{%- macro render_url(url) -%}
|
||||
<a href="{{ base['url_to'](url['href'], url) }}"{% if 'title' in url %} title="{{ url['title'] }}"{% endif %}>{{ render_element(url['content']) }}</a>
|
||||
<a href="{{ base['url_to'](url['href'], url) }}"{% if 'title' in url %} title="{{ url['title'] }}"{% endif %}{% if 'class' in url %} class="{{ url['class'] }}"{% endif %}>{{ render_element(url['content']) }}</a>
|
||||
{%- endmacro -%}
|
||||
|
||||
{# Renders either plain text or a link depending on the type #}
|
||||
{%- macro render_element(entry) -%}
|
||||
{%- if entry is string -%}
|
||||
<span>{{ entry }}</span>
|
||||
{{ render_text({'text': entry}) }}
|
||||
{%- elif is_list(entry) -%}
|
||||
{%- for e in entry -%}{{ render_element(e) }}{%- endfor -%}
|
||||
{%- elif entry['type'] == 'text' -%}
|
||||
{{ render_text(entry) }}
|
||||
{%- elif entry['type'] == 'icon' -%}
|
||||
{{ render_icon(entry) }}
|
||||
{{ render_icon(entry['class']) }}
|
||||
{%- elif entry['type'] == 'url' -%}
|
||||
{{ render_url(entry) }}
|
||||
{%- elif entry['type'] == 'enumeration' -%}
|
||||
{{ render_enumeration(entry) }}
|
||||
{%- elif entry['type'] == 'tags' -%}
|
||||
{{ render_tags(entry) }}
|
||||
{%- else -%}
|
||||
{{ raise('Unknown entry type: {}.'.format(entry)) }}
|
||||
{%- endif -%}
|
||||
@ -35,6 +41,9 @@
|
||||
{# Renders a list of enumeration entries (either links or text) #}
|
||||
{%- macro render_enumeration(enumeration) -%}
|
||||
{%- set divider = joiner(enumeration['divider']) -%}
|
||||
{{ render_text(enumeration['name']) }}: {% for entry in enumeration['entries'] -%}{{ divider() }}{{ render_element(entry) }}{%- endfor -%}
|
||||
{% for entry in enumeration['entries'] -%}{{ divider() }}{{ render_element(entry) }}{%- endfor -%}
|
||||
{%- endmacro -%}
|
||||
|
||||
{%- macro render_tags(tags) -%}
|
||||
<div class="tags has-addons">{{ render_enumeration(tags['enumeration']) }}</div>
|
||||
{%- endmacro -%}
|
52
code/osgameclones_download_images_create_collage.py
Normal file
52
code/osgameclones_download_images_create_collage.py
Normal file
@ -0,0 +1,52 @@
|
||||
"""
|
||||
Downloads images from games, stored in the osgameclones-database, then creates a collage of them.
|
||||
"""
|
||||
|
||||
import ruamel.yaml as yaml
|
||||
import os
|
||||
import requests
|
||||
from PIL import Image
|
||||
from io import BytesIO
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# paths
|
||||
root_path = os.path.realpath(os.path.join(os.path.dirname(__file__), os.path.pardir))
|
||||
download_path = os.path.join(root_path, 'code', 'html', 'images-download')
|
||||
output_file = os.path.join(root_path, 'code', 'html', 'collage_games.jpg')
|
||||
|
||||
# import the osgameclones data
|
||||
path = os.path.realpath(os.path.join(root_path, os.path.pardir, 'osgameclones.git', 'games'))
|
||||
files = os.listdir(path)
|
||||
|
||||
# iterate over all yaml files in osgameclones/data folder and load contents
|
||||
entries = []
|
||||
for file in files:
|
||||
# read yaml
|
||||
with open(os.path.join(path, file), 'r', encoding='utf-8') as stream:
|
||||
try:
|
||||
_ = yaml.safe_load(stream)
|
||||
except Exception as exc:
|
||||
print(file)
|
||||
raise exc
|
||||
|
||||
# add to entries
|
||||
entries.extend(_)
|
||||
|
||||
print('imported {} entries'.format(len(entries)))
|
||||
|
||||
# collect all image informations
|
||||
images = []
|
||||
for entry in entries:
|
||||
if 'images' in entry:
|
||||
images.extend(entry['images'])
|
||||
|
||||
print('contain {} image links'.format(len(images)))
|
||||
|
||||
# download them all
|
||||
for url in images:
|
||||
r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)'},
|
||||
timeout=20, allow_redirects=True)
|
||||
|
||||
if r.status_code == requests.codes.ok:
|
||||
im = Image.open(BytesIO(r.content))
|
@ -4,4 +4,6 @@ BeautifulSoup
|
||||
PyQt5
|
||||
wikipedia
|
||||
Jinja2
|
||||
html5lib
|
||||
html5lib
|
||||
ruamel.yaml
|
||||
requests
|
@ -66,7 +66,7 @@ recommended_keywords = (
|
||||
'action', 'arcade', 'adventure', 'visual novel', 'sports', 'platform', 'puzzle', 'role playing', 'simulation',
|
||||
'strategy', 'cards', 'board', 'music', 'educational', 'tool', 'game engine', 'framework', 'library', 'remake')
|
||||
|
||||
framework_keywords = ('tool', 'framework', 'library')
|
||||
framework_keywords = ('framework', 'library', 'tool')
|
||||
|
||||
# known programming languages, anything else will result in a warning during a maintenance operation
|
||||
# only these will be used when gathering statistics
|
||||
@ -78,6 +78,11 @@ known_languages = (
|
||||
"Ren'Py", 'Ruby', 'Rust', 'Scala', 'Scheme', 'Script', 'Shell', 'Swift', 'TorqueScript', 'TypeScript', 'Vala',
|
||||
'Visual Basic', 'XUL', 'ZenScript', 'ooc', '?')
|
||||
|
||||
language_urls = {
|
||||
'AGS Script': 'https://en.wikipedia.org/wiki/Adventure_Game_Studio',
|
||||
'Action Script': 'https://en.wikipedia.org/wiki/ActionScript'
|
||||
}
|
||||
|
||||
# known licenses, anything outside of this will result in a warning during a maintenance operation
|
||||
# only these will be used when gathering statistics
|
||||
known_licenses = (
|
||||
|
@ -1,5 +1,5 @@
|
||||
[comment]: # (partly autogenerated content, edit with care, read the manual before)
|
||||
# Developer [378]
|
||||
# Developer [379]
|
||||
|
||||
## Akira Higuchi [1]
|
||||
|
||||
@ -382,6 +382,11 @@
|
||||
|
||||
- Games: Card Stories
|
||||
|
||||
## fastrgv [7]
|
||||
|
||||
- Games: AdaGate
|
||||
- Contact: fastrgv@GH
|
||||
|
||||
## Federico Poloni [1]
|
||||
|
||||
- Games: Bastet
|
||||
@ -1424,6 +1429,8 @@
|
||||
## Stephen Carlyle-Smith [4]
|
||||
|
||||
- Games: Ares Dogfighter, Moonbase Assault, Sole Collector, SteveTech1
|
||||
- Home: http://meprogrammer.blogspot.com/
|
||||
- Contact: SteveSmith16384@GH
|
||||
|
||||
## Stephen Sweeney [2]
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
- Code language: Ada
|
||||
- Code license: GPL-3.0
|
||||
- Code dependency: OpenGL, SDL2
|
||||
- Developer: fastrgv
|
||||
|
||||
3D sokoban puzzle game within a Stargate / Portal fantasy setting.
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
# Advanced Strategic Command
|
||||
|
||||
- Home: http://www.asc-hq.org/, https://sourceforge.net/projects/asc-hq/
|
||||
- Media: https://en.wikipedia.org/wiki/Battle_Isle#Clones
|
||||
- Media: https://en.wikipedia.org/wiki/Battle_Isle#Clones_and_successors
|
||||
- Inspiration: Battle Isle series
|
||||
- State: mature
|
||||
- Keyword: strategy, clone, turn-based
|
||||
|
@ -1,6 +1,7 @@
|
||||
# Crimson Fields
|
||||
|
||||
- Home: http://crimson.seul.org/
|
||||
- Media: https://en.wikipedia.org/wiki/Battle_Isle#Clones_and_successors
|
||||
- Inspiration: Battle Isle series
|
||||
- State: mature, inactive since 2010
|
||||
- Download: http://crimson.seul.org/download.php
|
||||
@ -9,7 +10,7 @@
|
||||
- Code language: C++
|
||||
- Code license: GPL-2.0
|
||||
|
||||
Turn-based tactical war game.
|
||||
Tactical war game.
|
||||
|
||||
## Building
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
- Code repository: https://gitlab.com/osgames/freetrain.git (backup of svn), https://svn.code.sf.net/p/freetrain/code (svn)
|
||||
- Code language: C#
|
||||
- Code license: LGPL-2.1
|
||||
- Developer: Ari Mustonen
|
||||
|
||||
Rail & business simulation.
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user