Fix formatting of lib/view/wttr.py

pull/1062/head
Igor Chubin 1 month ago
parent 87d798f9b8
commit 64eb93b35f

@ -13,15 +13,22 @@ from gevent.subprocess import Popen, PIPE
sys.path.insert(0, "..") sys.path.insert(0, "..")
from translations import get_message, SUPPORTED_LANGS from translations import get_message, SUPPORTED_LANGS
from globals import WEGO, TRANSLATION_TABLE, NOT_FOUND_LOCATION, \ from globals import (
DEFAULT_LOCATION, ANSI2HTML, error, remove_ansi WEGO,
TRANSLATION_TABLE,
NOT_FOUND_LOCATION,
DEFAULT_LOCATION,
ANSI2HTML,
error,
remove_ansi,
)
def get_wetter(parsed_query): def get_wetter(parsed_query):
location = parsed_query['location'] location = parsed_query["location"]
html = parsed_query['html_output'] html = parsed_query["html_output"]
lang = parsed_query['lang'] lang = parsed_query["lang"]
location_not_found = False location_not_found = False
if location == NOT_FOUND_LOCATION: if location == NOT_FOUND_LOCATION:
@ -33,10 +40,14 @@ def get_wetter(parsed_query):
stdout, stderr, returncode = _wego_wrapper(location, parsed_query) stdout, stderr, returncode = _wego_wrapper(location, parsed_query)
first_line, stdout = _wego_postprocessing(location, parsed_query, stdout) first_line, stdout = _wego_postprocessing(location, parsed_query, stdout)
if location_not_found or \ if location_not_found or (
(returncode != 0 \ returncode != 0
and ('Unable to find any matching weather' and (
' location to the parsed_query submitted') in stderr): "Unable to find any matching weather"
" location to the parsed_query submitted"
)
in stderr
):
stdout, stderr, returncode = _wego_wrapper(DEFAULT_LOCATION, parsed_query) stdout, stderr, returncode = _wego_wrapper(DEFAULT_LOCATION, parsed_query)
location_not_found = True location_not_found = True
@ -49,14 +60,25 @@ def get_wetter(parsed_query):
>>> >>>
>>> 404 %s: %s >>> 404 %s: %s
>>> >>>
""" % (get_message("UNKNOWN_LOCATION", lang).upper(), parsed_query['override_location_name']) """ % (
get_message("UNKNOWN_LOCATION", lang).upper(),
not_found_header = "\n".join("\033[48;5;91m" + x + " \033[0m" parsed_query["override_location_name"],
for x in not_found_header.splitlines()[1:]) )
not_found_footer = get_message('NOT_FOUND_MESSAGE', lang) not_found_header = "\n".join(
not_found_footer = "\n".join("\033[48;5;91m " + x + " \033[0m" "\033[48;5;91m" + x + " \033[0m"
for x in not_found_footer.splitlines() if x) + "\n" for x in not_found_header.splitlines()[1:]
)
not_found_footer = get_message("NOT_FOUND_MESSAGE", lang)
not_found_footer = (
"\n".join(
"\033[48;5;91m " + x + " \033[0m"
for x in not_found_footer.splitlines()
if x
)
+ "\n"
)
first_line, stdout = _wego_postprocessing(location, parsed_query, stdout) first_line, stdout = _wego_postprocessing(location, parsed_query, stdout)
stdout = not_found_header + "\n----\n" + stdout + not_found_footer stdout = not_found_header + "\n----\n" + stdout + not_found_footer
@ -65,33 +87,34 @@ def get_wetter(parsed_query):
return _htmlize(stdout, first_line, parsed_query) return _htmlize(stdout, first_line, parsed_query)
return stdout return stdout
def _wego_wrapper(location, parsed_query): def _wego_wrapper(location, parsed_query):
lang = parsed_query['lang'] lang = parsed_query["lang"]
if location == DEFAULT_LOCATION: if location == DEFAULT_LOCATION:
location_name = DEFAULT_LOCATION.capitalize() location_name = DEFAULT_LOCATION.capitalize()
else: else:
location_name = parsed_query['override_location_name'] location_name = parsed_query["override_location_name"]
cmd = [WEGO, '--city=%s' % location] cmd = [WEGO, "--city=%s" % location]
if parsed_query.get('inverted_colors'): if parsed_query.get("inverted_colors"):
cmd += ['-inverse'] cmd += ["-inverse"]
if parsed_query.get('use_ms_for_wind'): if parsed_query.get("use_ms_for_wind"):
cmd += ['-wind_in_ms'] cmd += ["-wind_in_ms"]
if parsed_query.get('narrow'): if parsed_query.get("narrow"):
cmd += ['-narrow'] cmd += ["-narrow"]
if lang and lang in SUPPORTED_LANGS: if lang and lang in SUPPORTED_LANGS:
cmd += ['-lang=%s'%lang] cmd += ["-lang=%s" % lang]
if parsed_query.get('use_imperial', False): if parsed_query.get("use_imperial", False):
cmd += ['-imperial'] cmd += ["-imperial"]
if location_name: if location_name:
cmd += ['-location_name', location_name] cmd += ["-location_name", location_name]
proc = Popen(cmd, stdout=PIPE, stderr=PIPE) proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
stdout, stderr = proc.communicate() stdout, stderr = proc.communicate()
@ -100,61 +123,63 @@ def _wego_wrapper(location, parsed_query):
return stdout, stderr, proc.returncode return stdout, stderr, proc.returncode
def _wego_postprocessing(location, parsed_query, stdout): def _wego_postprocessing(location, parsed_query, stdout):
full_address = parsed_query['full_address'] full_address = parsed_query["full_address"]
lang = parsed_query['lang'] lang = parsed_query["lang"]
if 'days' in parsed_query: if "days" in parsed_query:
if parsed_query['days'] == '0': if parsed_query["days"] == "0":
stdout = "\n".join(stdout.splitlines()[:7]) + "\n" stdout = "\n".join(stdout.splitlines()[:7]) + "\n"
if parsed_query['days'] == '1': if parsed_query["days"] == "1":
stdout = "\n".join(stdout.splitlines()[:17]) + "\n" stdout = "\n".join(stdout.splitlines()[:17]) + "\n"
if parsed_query['days'] == '2': if parsed_query["days"] == "2":
stdout = "\n".join(stdout.splitlines()[:27]) + "\n" stdout = "\n".join(stdout.splitlines()[:27]) + "\n"
first = stdout.splitlines()[0] first = stdout.splitlines()[0]
rest = stdout.splitlines()[1:] rest = stdout.splitlines()[1:]
if parsed_query.get('no-caption', False): if parsed_query.get("no-caption", False):
if ':' in first: if ":" in first:
first = first.split(":", 1)[1] first = first.split(":", 1)[1]
stdout = "\n".join([first.strip()] + rest) + "\n" stdout = "\n".join([first.strip()] + rest) + "\n"
if parsed_query.get('no-terminal', False): if parsed_query.get("no-terminal", False):
stdout = remove_ansi(stdout) stdout = remove_ansi(stdout)
if parsed_query.get('no-city', False): if parsed_query.get("no-city", False):
stdout = "\n".join(stdout.splitlines()[2:]) + "\n" stdout = "\n".join(stdout.splitlines()[2:]) + "\n"
if parsed_query.get('dumb', False): if parsed_query.get("dumb", False):
stdout = stdout.translate(TRANSLATION_TABLE) stdout = stdout.translate(TRANSLATION_TABLE)
if full_address \ if (
and parsed_query.get('format', 'txt') != 'png' \ full_address
and (not parsed_query.get('no-city') and parsed_query.get("format", "txt") != "png"
and not parsed_query.get('no-caption') and (
and not parsed_query.get('days') == '0'): not parsed_query.get("no-city")
line = "%s: %s [%s]\n" % ( and not parsed_query.get("no-caption")
get_message('LOCATION', lang), and not parsed_query.get("days") == "0"
full_address, )
location) ):
line = "%s: %s [%s]\n" % (get_message("LOCATION", lang), full_address, location)
stdout += line stdout += line
if parsed_query.get('padding', False): if parsed_query.get("padding", False):
lines = [x.rstrip() for x in stdout.splitlines()] lines = [x.rstrip() for x in stdout.splitlines()]
max_l = max(len(remove_ansi(x)) for x in lines) max_l = max(len(remove_ansi(x)) for x in lines)
last_line = " "*max_l + " .\n" last_line = " " * max_l + " .\n"
stdout = " \n" + "\n".join(" %s " %x for x in lines) + "\n" + last_line stdout = " \n" + "\n".join(" %s " % x for x in lines) + "\n" + last_line
return first, stdout return first, stdout
def _htmlize(ansi_output, title, parsed_query): def _htmlize(ansi_output, title, parsed_query):
"""Return HTML representation of `ansi_output`. """Return HTML representation of `ansi_output`.
Use `title` as the title of the page. Use `title` as the title of the page.
Format page according to query parameters from `parsed_query`.""" Format page according to query parameters from `parsed_query`."""
cmd = ["bash", ANSI2HTML, "--palette=solarized"] cmd = ["bash", ANSI2HTML, "--palette=solarized"]
if not parsed_query.get('inverted_colors'): if not parsed_query.get("inverted_colors"):
cmd += ["--bg=dark"] cmd += ["--bg=dark"]
proc = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE) proc = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)
@ -164,20 +189,22 @@ def _htmlize(ansi_output, title, parsed_query):
if proc.returncode != 0: if proc.returncode != 0:
error(stdout + stderr) error(stdout + stderr)
if parsed_query.get('inverted_colors'): if parsed_query.get("inverted_colors"):
stdout = stdout.replace( stdout = stdout.replace(
'<body class="">', '<body class="" style="background:white;color:#777777">') '<body class="">', '<body class="" style="background:white;color:#777777">'
)
title = "<title>%s</title>" % title title = "<title>%s</title>" % title
opengraph = _get_opengraph(parsed_query) opengraph = _get_opengraph(parsed_query)
stdout = re.sub("<head>", "<head>" + title + opengraph, stdout) stdout = re.sub("<head>", "<head>" + title + opengraph, stdout)
return stdout return stdout
def _get_opengraph(parsed_query): def _get_opengraph(parsed_query):
"""Return OpenGraph data for `parsed_query`""" """Return OpenGraph data for `parsed_query`"""
url = parsed_query['request_url'] or "" url = parsed_query["request_url"] or ""
pic_url = url.replace('?', '_') pic_url = url.replace("?", "_")
return ( return (
'<meta property="og:image" content="%(pic_url)s_0pq.png" />' '<meta property="og:image" content="%(pic_url)s_0pq.png" />'
@ -185,6 +212,6 @@ def _get_opengraph(parsed_query):
'<meta property="og:type" content="profile" />' '<meta property="og:type" content="profile" />'
'<meta property="og:url" content="%(url)s" />' '<meta property="og:url" content="%(url)s" />'
) % { ) % {
'pic_url': pic_url, "pic_url": pic_url,
'url': url, "url": url,
} }

Loading…
Cancel
Save