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";