Add Minetest-optimised package endpoint

This commit is contained in:
rubenwardy
2024-04-01 17:32:12 +01:00
parent 0f5a97b539
commit 1be4155ab0
4 changed files with 118 additions and 11 deletions

View File

@@ -18,6 +18,10 @@ from html.parser import HTMLParser
import re
import sys
from flask_babel import gettext
from app.models import Package, PackageType
def normalize_whitespace(x):
return re.sub(r"\s+", " ", x)
@@ -188,7 +192,7 @@ class MinetestHTMLParser(HTMLParser):
self.current_line += f"&{name};"
def html_to_minetest(html, formspec_version=6, include_images=True):
def html_to_minetest(html, formspec_version=7, include_images=True):
parser = MinetestHTMLParser(include_images)
parser.feed(html)
parser.finish_line()
@@ -200,3 +204,70 @@ def html_to_minetest(html, formspec_version=6, include_images=True):
"images": parser.images,
"image_tooltips": parser.image_tooltips,
}
def package_info_as_hypertext(package: Package, formspec_version: int = 7):
body = ""
def add_value(label, value):
nonlocal body
body += f"{label}\n<b>{value}</b>\n\n"
def add_list(label, items):
nonlocal body
body += label + "\n<b>"
for i, item in enumerate(items):
if i != 0:
body += "</b>, <b>"
body += item
if len(items) == 0:
body += "-"
body += "</b>\n\n"
add_value(gettext("Type"), package.type.text)
add_list(gettext("Tags"), [tag.title for tag in package.tags])
if package.type != PackageType.GAME:
[supported, unsupported] = package.get_sorted_game_support_pair()
supports_all_games = package.supports_all_games or len(supported) == 0
if supports_all_games:
add_value(gettext("Supported Games"), gettext("No specific game required"))
else:
add_list(gettext("Supported Games"), [support.game.title for support in supported])
if unsupported and supports_all_games:
add_list(gettext("Unsupported Games"), [support.game.title for support in supported])
if package.type != PackageType.TXP:
add_list(gettext("Dependencies"), [x.meta_package.name for x in package.get_sorted_hard_dependencies()])
add_list(gettext("Optional dependencies"), [x.meta_package.name for x in package.get_sorted_optional_dependencies()])
languages = [trans.language.title for trans in package.translations]
languages.insert(0, "English")
add_list(gettext("Languages"), languages)
if package.license == package.media_license:
license = package.license.name
elif package.type == package.type.TXP:
license = package.media_license.name
else:
license = gettext("%(code_license)s for code,<br>%(media_license)s for media.",
code_license=package.license.name, media_license=package.media_license.name).replace("<br>", " ")
add_value(gettext("License"), license)
if package.dev_state:
add_value(gettext("Maintenance State"), package.dev_state.value)
add_value(gettext("Added"), package.created_at)
add_list(gettext("Maintainers"), [user.display_name for user in package.maintainers])
add_list(gettext("Provides"), [x.name for x in package.provides])
return {
"head": HEAD,
"body": body,
"links": {},
"images": {},
"image_tooltips": {},
}