diff --git a/gallery/easel/route/view/weather/filters.py b/gallery/easel/route/view/weather/filters.py index 81040c6..c42318b 100644 --- a/gallery/easel/route/view/weather/filters.py +++ b/gallery/easel/route/view/weather/filters.py @@ -1,48 +1,49 @@ -from gallery.sketch.weather.model import ( - Cloudness, - Precipitation, - Sky, - WindDirection, - WindDirectionDeg, -) +import datetime + +from gallery.sketch.weather.model import Cloudness, Precipitation, Sky, WindDirection, WindDirectionDeg def wind_direction_icon(wind_direction_deg: float) -> str: wind_direction = WindDirectionDeg(wind_direction_deg).direction - return { - WindDirection.N: "⬇️", - WindDirection.NE: "↙️", - WindDirection.E: "⬅️", - WindDirection.SE: "↖️", - WindDirection.S: "⬆️", - WindDirection.SW: "↗️", - WindDirection.W: "➡️", - WindDirection.NW: "↘️", - WindDirection.CALM: "", - }.get(wind_direction, wind_direction) + if wind_direction == WindDirection.CALM: + return "wind-calm" + else: + return f"wind-from-{wind_direction.name.lower()}" -def cloudness_icon(sky: Sky) -> list[str]: +def cloudness_icon(sky: Sky, date: datetime.datetime, period: str) -> list[str]: + day = (3 < date.hour < 22) if period == "day" else True + day_prefix = "day" if day else "night-alt" main_icon = "" if sky.thunder: - if sky.cloudness == Cloudness.CLEAR: - main_icon = "🌩️" - if sky.precipitation == Precipitation.NO: - main_icon = "⚡" - else: - main_icon = "⛈️" + main_icon = { + Precipitation.NO: "lightning", + Precipitation.SMALL_RAIN: "storm-showers", + Precipitation.RAIN: "thunderstorm", + Precipitation.HEAVY_RAIN: "thunderstorm", + Precipitation.SHOWER: "thunderstorm", + Precipitation.SNOW: "storm-showers", + Precipitation.HEAVY_SNOW: "storm-showers", + }[sky.precipitation] + if sky.cloudness == Cloudness.PARTLY_CLOUDY: + main_icon = f"{day_prefix}-{main_icon}" elif sky.precipitation == Precipitation.NO: main_icon = { - Cloudness.CLEAR: "☀️", - Cloudness.PARTLY_CLOUDY: "🌤️", - Cloudness.CLOUDY: "⛅", - Cloudness.MAINLY_CLOUDY: "☁️", + Cloudness.CLEAR: "day-sunny" if day else "night-clear", + Cloudness.PARTLY_CLOUDY: f"{day_prefix}-cloudy", + Cloudness.CLOUDY: "cloud", + Cloudness.MAINLY_CLOUDY: "cloudy", }[sky.cloudness] - elif sky.precipitation in [Precipitation.SNOW, Precipitation.HEAVY_SNOW]: - main_icon = "🌨️" else: - main_icon = "🌧️" + main_icon = { + Precipitation.SMALL_RAIN: "showers", + Precipitation.RAIN: "rain-mix", + Precipitation.HEAVY_RAIN: "rain", + Precipitation.SHOWER: "rain", + Precipitation.SNOW: "snow", + Precipitation.HEAVY_SNOW: "snow", + }[sky.precipitation] + if sky.cloudness == Cloudness.PARTLY_CLOUDY: + main_icon = f"{day_prefix}-{main_icon}" icons = [main_icon] - if sky.fog: - icons.append("🌫️") return icons diff --git a/gallery/easel/route/view/weather/templates/weather.html b/gallery/easel/route/view/weather/templates/weather.html index bc568d3..d8dc714 100644 --- a/gallery/easel/route/view/weather/templates/weather.html +++ b/gallery/easel/route/view/weather/templates/weather.html @@ -54,9 +54,12 @@ {% for value in response.values %} - - {% for icon in value.sky | cloudness_icon %} -
{{icon}}
+ + {% for icon in value.sky | cloudness_icon(value.date, response.period) %} +
{% endfor %} {% endfor %} @@ -89,8 +92,10 @@ {% for value in response.values %} - - {{value.wind_direction | wind_direction_icon}} + +
{% endfor %} diff --git a/gallery/painting/gismeteo/parser.py b/gallery/painting/gismeteo/parser.py index 0657e4b..0a6690d 100644 --- a/gallery/painting/gismeteo/parser.py +++ b/gallery/painting/gismeteo/parser.py @@ -70,7 +70,8 @@ class SkyParser(RowParser[Sky]): "без осадков": Precipitation.NO, "небольшой дождь": Precipitation.SMALL_RAIN, # TODO: remove it? "небольшой дождь": Precipitation.SMALL_RAIN, - "сильный дождь": Precipitation.HEAVY_RAIN, + "сильный дождь": Precipitation.HEAVY_RAIN, # TODO: remove it? + "сильный дождь": Precipitation.HEAVY_RAIN, "ливневый дождь": Precipitation.SHOWER, "дождь": Precipitation.RAIN, "ливень": Precipitation.SHOWER, diff --git a/gallery/sketch/weather/model.py b/gallery/sketch/weather/model.py index ee8e1bc..86c99da 100644 --- a/gallery/sketch/weather/model.py +++ b/gallery/sketch/weather/model.py @@ -67,7 +67,9 @@ class WindDirectionDeg(float): # pylint:disable=too-many-return-statements def to_direction(self) -> WindDirection: - if self > 337.5 or self <= 22.25: + if self == -1: + return WindDirection.CALM + elif self > 337.5 or self <= 22.25: return WindDirection.N elif self <= 67.5: return WindDirection.NE @@ -84,7 +86,7 @@ class WindDirectionDeg(float): elif self <= 337.5: return WindDirection.NW else: - return WindDirection.CALM + raise ValueError(self) @classmethod def from_direction(cls, direction: WindDirection) -> "WindDirectionDeg": diff --git a/static/src/lib/weather-icons/build.py b/static/src/lib/weather-icons/build.py new file mode 100644 index 0000000..6ed1a8c --- /dev/null +++ b/static/src/lib/weather-icons/build.py @@ -0,0 +1,22 @@ +from pathlib import Path +from string import Template + +LIST_ITEM = Template( + """.$name { + mask-image: url(./svg/$name.svg); +} +""" +) + + +def generate(): + work_dir = Path(__file__).parent + data = "" + for item in (work_dir / "svg").glob("*.svg"): + data += LIST_ITEM.substitute({"name": item.stem}) + target = work_dir / "classes-list.scss" + target.write_text(data) + + +if __name__ == "__main__": + generate() diff --git a/static/src/lib/weather-icons/classes-list.scss b/static/src/lib/weather-icons/classes-list.scss new file mode 100644 index 0000000..0ac7954 --- /dev/null +++ b/static/src/lib/weather-icons/classes-list.scss @@ -0,0 +1,84 @@ +.wi-day-snow { + mask-image: url(./svg/wi-day-snow.svg); +} +.wi-rain-mix { + mask-image: url(./svg/wi-rain-mix.svg); +} +.wi-thunderstorm { + mask-image: url(./svg/wi-thunderstorm.svg); +} +.wi-day-rain { + mask-image: url(./svg/wi-day-rain.svg); +} +.wi-cloudy { + mask-image: url(./svg/wi-cloudy.svg); +} +.wi-night-clear { + mask-image: url(./svg/wi-night-clear.svg); +} +.wi-day-cloudy { + mask-image: url(./svg/wi-day-cloudy.svg); +} +.wi-day-storm-showers { + mask-image: url(./svg/wi-day-storm-showers.svg); +} +.wi-lightning { + mask-image: url(./svg/wi-lightning.svg); +} +.wi-day-rain-mix { + mask-image: url(./svg/wi-day-rain-mix.svg); +} +.wi-day-showers { + mask-image: url(./svg/wi-day-showers.svg); +} +.wi-storm-showers { + mask-image: url(./svg/wi-storm-showers.svg); +} +.wi-snow { + mask-image: url(./svg/wi-snow.svg); +} +.wi-cloud { + mask-image: url(./svg/wi-cloud.svg); +} +.wi-night-alt-snow { + mask-image: url(./svg/wi-night-alt-snow.svg); +} +.wi-night-alt-lightning { + mask-image: url(./svg/wi-night-alt-lightning.svg); +} +.wi-day-sunny { + mask-image: url(./svg/wi-day-sunny.svg); +} +.wi-night-alt-cloudy { + mask-image: url(./svg/wi-night-alt-cloudy.svg); +} +.wi-night-alt-storm-showers { + mask-image: url(./svg/wi-night-alt-storm-showers.svg); +} +.wi-day-thunderstorm { + mask-image: url(./svg/wi-day-thunderstorm.svg); +} +.wi-wind-deg { + mask-image: url(./svg/wi-wind-deg.svg); +} +.wi-showers { + mask-image: url(./svg/wi-showers.svg); +} +.wi-night-alt-rain-mix { + mask-image: url(./svg/wi-night-alt-rain-mix.svg); +} +.wi-rain { + mask-image: url(./svg/wi-rain.svg); +} +.wi-night-alt-thunderstorm { + mask-image: url(./svg/wi-night-alt-thunderstorm.svg); +} +.wi-night-alt-showers { + mask-image: url(./svg/wi-night-alt-showers.svg); +} +.wi-day-lightning { + mask-image: url(./svg/wi-day-lightning.svg); +} +.wi-night-alt-rain { + mask-image: url(./svg/wi-night-alt-rain.svg); +} diff --git a/static/src/lib/weather-icons/classes-wind-aliases.scss b/static/src/lib/weather-icons/classes-wind-aliases.scss new file mode 100644 index 0000000..729d0a6 --- /dev/null +++ b/static/src/lib/weather-icons/classes-wind-aliases.scss @@ -0,0 +1,107 @@ +@mixin wind-rotate( $val: 0deg ) { + -webkit-transform: rotate($val); + -moz-transform: rotate($val); + -ms-transform: rotate($val); + -o-transform: rotate($val); + transform: rotate($val); +} + +.wi-wind-calm { + display: none !important; +} +.wi-wind-towards-n { + @include wind-rotate(0deg); +} +.wi-wind-towards-nne { + @include wind-rotate(23deg); +} +.wi-wind-towards-ne { + @include wind-rotate(45deg); +} +.wi-wind-towards-ene { + @include wind-rotate(68deg); +} +.wi-wind-towards-e { + @include wind-rotate(90deg); +} +.wi-wind-towards-ese { + @include wind-rotate(113deg); +} +.wi-wind-towards-se { + @include wind-rotate(135deg); +} +.wi-wind-towards-sse { + @include wind-rotate(158deg); +} +.wi-wind-towards-s { + @include wind-rotate(180deg); +} +.wi-wind-towards-ssw { + @include wind-rotate(203deg); +} +.wi-wind-towards-sw { + @include wind-rotate(225deg); +} +.wi-wind-towards-wsw { + @include wind-rotate(248deg); +} +.wi-wind-towards-w { + @include wind-rotate(270deg); +} +.wi-wind-towards-wnw { + @include wind-rotate(293deg); +} +.wi-wind-towards-nw { + @include wind-rotate(313deg); +} +.wi-wind-towards-nnw { + @include wind-rotate(336deg); +} +.wi-wind-from-n { + @include wind-rotate(180deg); +} +.wi-wind-from-nne { + @include wind-rotate(180+23deg); +} +.wi-wind-from-ne { + @include wind-rotate(180+45deg); +} +.wi-wind-from-ene { + @include wind-rotate(180+68deg); +} +.wi-wind-from-e { + @include wind-rotate(180+90deg); +} +.wi-wind-from-ese { + @include wind-rotate(180+113deg); +} +.wi-wind-from-se { + @include wind-rotate(180+135deg); +} +.wi-wind-from-sse { + @include wind-rotate(180+158deg); +} +.wi-wind-from-s { + @include wind-rotate(180+180deg); +} +.wi-wind-from-ssw { + @include wind-rotate(180+203deg); +} +.wi-wind-from-sw { + @include wind-rotate(180+225deg); +} +.wi-wind-from-wsw { + @include wind-rotate(180+248deg); +} +.wi-wind-from-w { + @include wind-rotate(180+270deg); +} +.wi-wind-from-wnw { + @include wind-rotate(180+293deg); +} +.wi-wind-from-nw { + @include wind-rotate(180+313deg); +} +.wi-wind-from-nnw { + @include wind-rotate(180+336deg); +} \ No newline at end of file diff --git a/static/src/lib/weather-icons/svg/wi-cloud.svg b/static/src/lib/weather-icons/svg/wi-cloud.svg new file mode 100644 index 0000000..fa77599 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-cloud.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-cloudy.svg b/static/src/lib/weather-icons/svg/wi-cloudy.svg new file mode 100644 index 0000000..c3eaf41 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-cloudy.svg @@ -0,0 +1,18 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-day-cloudy.svg b/static/src/lib/weather-icons/svg/wi-day-cloudy.svg new file mode 100644 index 0000000..cf63543 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-day-cloudy.svg @@ -0,0 +1,26 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-day-lightning.svg b/static/src/lib/weather-icons/svg/wi-day-lightning.svg new file mode 100644 index 0000000..18413ed --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-day-lightning.svg @@ -0,0 +1,29 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-day-rain-mix.svg b/static/src/lib/weather-icons/svg/wi-day-rain-mix.svg new file mode 100644 index 0000000..8a5582d --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-day-rain-mix.svg @@ -0,0 +1,49 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-day-rain.svg b/static/src/lib/weather-icons/svg/wi-day-rain.svg new file mode 100644 index 0000000..12b1219 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-day-rain.svg @@ -0,0 +1,35 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-day-showers.svg b/static/src/lib/weather-icons/svg/wi-day-showers.svg new file mode 100644 index 0000000..cd0cb0a --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-day-showers.svg @@ -0,0 +1,43 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-day-snow.svg b/static/src/lib/weather-icons/svg/wi-day-snow.svg new file mode 100644 index 0000000..c1f1c71 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-day-snow.svg @@ -0,0 +1,40 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-day-storm-showers.svg b/static/src/lib/weather-icons/svg/wi-day-storm-showers.svg new file mode 100644 index 0000000..0166299 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-day-storm-showers.svg @@ -0,0 +1,38 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-day-sunny.svg b/static/src/lib/weather-icons/svg/wi-day-sunny.svg new file mode 100644 index 0000000..eafcd77 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-day-sunny.svg @@ -0,0 +1,27 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-day-thunderstorm.svg b/static/src/lib/weather-icons/svg/wi-day-thunderstorm.svg new file mode 100644 index 0000000..006a8e5 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-day-thunderstorm.svg @@ -0,0 +1,34 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-lightning.svg b/static/src/lib/weather-icons/svg/wi-lightning.svg new file mode 100644 index 0000000..0709cf3 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-lightning.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-night-alt-cloudy.svg b/static/src/lib/weather-icons/svg/wi-night-alt-cloudy.svg new file mode 100644 index 0000000..fcd1496 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-night-alt-cloudy.svg @@ -0,0 +1,19 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-night-alt-lightning.svg b/static/src/lib/weather-icons/svg/wi-night-alt-lightning.svg new file mode 100644 index 0000000..f01d745 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-night-alt-lightning.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-night-alt-rain-mix.svg b/static/src/lib/weather-icons/svg/wi-night-alt-rain-mix.svg new file mode 100644 index 0000000..4ce81bc --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-night-alt-rain-mix.svg @@ -0,0 +1,42 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-night-alt-rain.svg b/static/src/lib/weather-icons/svg/wi-night-alt-rain.svg new file mode 100644 index 0000000..b4d8065 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-night-alt-rain.svg @@ -0,0 +1,27 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-night-alt-showers.svg b/static/src/lib/weather-icons/svg/wi-night-alt-showers.svg new file mode 100644 index 0000000..dd917e0 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-night-alt-showers.svg @@ -0,0 +1,34 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-night-alt-snow.svg b/static/src/lib/weather-icons/svg/wi-night-alt-snow.svg new file mode 100644 index 0000000..b314bdd --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-night-alt-snow.svg @@ -0,0 +1,32 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-night-alt-storm-showers.svg b/static/src/lib/weather-icons/svg/wi-night-alt-storm-showers.svg new file mode 100644 index 0000000..6747df2 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-night-alt-storm-showers.svg @@ -0,0 +1,31 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-night-alt-thunderstorm.svg b/static/src/lib/weather-icons/svg/wi-night-alt-thunderstorm.svg new file mode 100644 index 0000000..0af7a15 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-night-alt-thunderstorm.svg @@ -0,0 +1,25 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-night-clear.svg b/static/src/lib/weather-icons/svg/wi-night-clear.svg new file mode 100644 index 0000000..053b2de --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-night-clear.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-rain-mix.svg b/static/src/lib/weather-icons/svg/wi-rain-mix.svg new file mode 100644 index 0000000..51cf189 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-rain-mix.svg @@ -0,0 +1,37 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-rain.svg b/static/src/lib/weather-icons/svg/wi-rain.svg new file mode 100644 index 0000000..7ecef3f --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-rain.svg @@ -0,0 +1,23 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-showers.svg b/static/src/lib/weather-icons/svg/wi-showers.svg new file mode 100644 index 0000000..3cb7e31 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-showers.svg @@ -0,0 +1,31 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-snow.svg b/static/src/lib/weather-icons/svg/wi-snow.svg new file mode 100644 index 0000000..56afebf --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-snow.svg @@ -0,0 +1,27 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-storm-showers.svg b/static/src/lib/weather-icons/svg/wi-storm-showers.svg new file mode 100644 index 0000000..df3fe0f --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-storm-showers.svg @@ -0,0 +1,26 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-thunderstorm.svg b/static/src/lib/weather-icons/svg/wi-thunderstorm.svg new file mode 100644 index 0000000..52555ec --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-thunderstorm.svg @@ -0,0 +1,21 @@ + + + + + diff --git a/static/src/lib/weather-icons/svg/wi-wind-deg.svg b/static/src/lib/weather-icons/svg/wi-wind-deg.svg new file mode 100644 index 0000000..3007410 --- /dev/null +++ b/static/src/lib/weather-icons/svg/wi-wind-deg.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/static/src/lib/weather-icons/weather-icons.scss b/static/src/lib/weather-icons/weather-icons.scss new file mode 100644 index 0000000..1162750 --- /dev/null +++ b/static/src/lib/weather-icons/weather-icons.scss @@ -0,0 +1,16 @@ +@import "./classes-list"; +@import "./classes-wind-aliases"; + +.wi { + display: inline-block; + text-transform: none; + line-height: 1; + vertical-align: -0.125em; + width: 1em; + height: 1em; + + mask-size: contain; + mask-position: 50%; + mask-repeat: no-repeat; + background-color: currentColor; +} diff --git a/static/src/main.scss b/static/src/main.scss index 591f293..51d728e 100644 --- a/static/src/main.scss +++ b/static/src/main.scss @@ -1,6 +1,7 @@ @import "./lib/flag-icons"; @import "./lib/bootstrap"; @import "./lib/bootstrap-icons"; +@import "./lib/weather-icons/weather-icons"; @import "./widget.scss"; @import "./weather.scss";