Compare commits

3 Commits
Author SHA1 Message Date
Sweetbread d7bdbc821e fixup! Put personal pages into subdomains
Docker Build and Push / build-and-push (push) Successful in 37s
2026-01-17 22:34:01 +03:00
Sweetbread 4d92bc2adb Move locale things into module
Docker Build and Push / build-and-push (push) Failing after 36s
2026-01-17 21:51:33 +03:00
Sweetbread b64271c9d4 Put personal pages into subdomains 2026-01-17 21:51:33 +03:00
37 changed files with 157 additions and 85 deletions

No files matched your search

+2 -2
View File
@@ -5,5 +5,5 @@ __pycache__/
*$py.class *$py.class
.python-version .python-version
static/style/*.css *.css
static/style/*.css.map *.css.map
+3 -3
View File
@@ -2,8 +2,8 @@ FROM node:18-alpine as sass
RUN NODE_OPTIONS=--dns-result-order=ipv4first npm install -g sass RUN NODE_OPTIONS=--dns-result-order=ipv4first npm install -g sass
WORKDIR /build WORKDIR /build
COPY ./static/style ./style COPY ./blueprints ./blueprints
RUN sass ./style:./style \ RUN sass ./blueprints:./blueprints \
--no-source-map \ --no-source-map \
--style=compressed --style=compressed
@@ -13,7 +13,7 @@ FROM python:3.11-slim
WORKDIR /app WORKDIR /app
COPY . . COPY . .
COPY --from=sass /build/style/ ./static/style/ COPY --from=sass /build/blueprints/ ./blueprints/
RUN pip install --no-cache-dir -r requirements.txt RUN pip install --no-cache-dir -r requirements.txt
+19 -71
View File
@@ -1,79 +1,27 @@
from os import system as console from modules import locale
from configparser import ConfigParser
from htmlmin import minify from blueprints.root import bp as root_bp
from flask import ( from blueprints.risdeveau import bp as rdv_bp
Flask,
g, import blueprints.root.modules.style
request, import blueprints.risdeveau.modules.style
render_template,
) from flask import Flask
translations_cache = {} app = Flask(__name__, static_folder=None, subdomain_matching=True)
def load_translations(lang): app.before_request(locale.before_request)
if lang not in translations_cache: app.context_processor(locale.inject_translations)
translations_cache[lang] = {}
try: app.register_blueprint(root_bp)
config = ConfigParser() app.register_blueprint(rdv_bp)
config.read(f'locale/{lang}.ini')
for section in config.sections():
translations_cache[lang][section] = dict(config.items(section))
except:
pass
return translations_cache[lang]
def get_locale():
return request.accept_languages.best_match(('en', 'ru', 'de', 'fr', 'ja'), 'en')
app = Flask(__name__)
@app.before_request
def before_request():
g.locale = get_locale()
g.translations = load_translations(g.locale)
@app.context_processor
def inject_translations():
def translate(text, **kwargs):
if ":" in text:
section, key = text.split(":", 1)
else:
section, key = "common", text
template = g.translations \
.get(section, {}) \
.get(key, f"${section}: {key}$")
try:
return template.format(**kwargs)
except:
return template
return {'_': translate}
if app.debug: if app.debug:
console("sass static/style/main.scss static/style/main.css") blueprints.root.modules.style.compile_styles()
console("sass static/style/risdeveau.scss static/style/risdeveau.css") blueprints.risdeveau.modules.style.compile_styles()
@app.route("/") app.config['SERVER_NAME'] = "localhost:5000"
def index(): else:
return minify(render_template('index.html'), remove_empty_space=True) app.config['SERVER_NAME'] = "lair.moe"
@app.route("/host")
def host():
return minify(render_template('host.html'), remove_empty_space=True)
@app.route("/us")
def us():
return minify(render_template('us.html'), remove_empty_space=True)
@app.route("/risdeveau")
def risdeveau():
return minify(render_template('personal/risdeveau.html'), remove_empty_space=True)
+31
View File
@@ -0,0 +1,31 @@
import os
from pathlib import Path
from htmlmin import minify
from flask import Blueprint, render_template, send_from_directory, send_file, abort
bp = Blueprint(
"risdeveau",
__name__,
subdomain="risdeveau",
template_folder="..",
static_folder=None
)
def render_tmpl(filename: str) -> str:
template_path = os.path.join("risdeveau/templates", filename)
return minify(
render_template(template_path),
remove_empty_space=True
)
@bp.route("/static/<path:filename>")
def static(filename: str):
static_folders = ("static", "../root/static")
for dir in static_folders:
if os.path.exists(path := os.path.join("blueprints/risdeveau", dir, filename)):
return send_file(path)
return abort(404)
@bp.route("/")
def index():
return render_tmpl('index.html')
+9
View File
@@ -0,0 +1,9 @@
from os import system as console
from os.path import join
def compile_styles():
dir = "blueprints/risdeveau/static/style"
files = ("risdeveau",)
for file in files:
console(f"sass {join(dir, file+'.scss')} {join(dir, file+'.css')}")
File renamed without changes.
@@ -15,7 +15,7 @@
</head> </head>
<body> <body>
<header> <header>
<a href="{{ url_for('index') }}">Lair</a> <a href="{{ url_for('root.index') }}">Lair</a>
</header> </header>
<main> <main>
@@ -70,17 +70,17 @@
<div class="blocks qr"> <div class="blocks qr">
<div class="block qr"> <div class="block qr">
<p>POL, BNB</p> <p>POL, BNB</p>
<img src="/static/img/risdeveau/wallets/evm.webp"> <img src="/static/img/wallets/evm.webp">
</div> </div>
<div class="block qr"> <div class="block qr">
<p>TON</p> <p>TON</p>
<img src="/static/img/risdeveau/wallets/ton.webp"> <img src="/static/img/wallets/ton.webp">
</div> </div>
<div class="block qr"> <div class="block qr">
<p>XMR</p> <p>XMR</p>
<img src="/static/img/risdeveau/wallets/xmr.webp"> <img src="/static/img/wallets/xmr.webp">
</div> </div>
</div> </div>
</main> </main>
+28
View File
@@ -0,0 +1,28 @@
from htmlmin import minify
from flask import Blueprint, render_template, request, jsonify
bp = Blueprint(
"root",
__name__,
template_folder="templates",
static_folder="static"
)
def render_tmpl(filename: str) -> str:
return minify(
render_template(filename),
remove_empty_space=True
)
@bp.route("/")
def index():
return render_tmpl('index.html')
@bp.route("/host")
def host():
return render_tmpl('host.html')
@bp.route("/us")
def us():
return render_tmpl('us.html')
+9
View File
@@ -0,0 +1,9 @@
from os import system as console
from os.path import join
def compile_styles():
dir = "blueprints/root/static/style"
files = ("main",)
for file in files:
console(f"sass {join(dir, file+'.scss')} {join(dir, file+'.css')}")
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -1,14 +1,14 @@
<header> <header>
{%- if request.path != url_for('index') %} {%- if request.path != url_for('.index') %}
<a href="{{ url_for('index') }}">Lair</a> <a href="{{ url_for('.index') }}">Lair</a>
{%- else %} {%- else %}
<div></div> <div></div>
{%- endif %} {%- endif %}
<div class="header-links"> <div class="header-links">
{%- for (l, t) in ( {%- for (l, t) in (
('us', _('about us')), ('.us', _('about us')),
('host', _('about host')) ('.host', _('about host'))
) %} ) %}
{%- if url_for(l) == request.path %} {%- if url_for(l) == request.path %}
<strong>{{ t }}</strong> <strong>{{ t }}</strong>
File renamed without changes.
File renamed without changes.
@@ -3,7 +3,7 @@
{% block title %}О нас{% endblock %} {% block title %}О нас{% endblock %}
{% block content %} {% block content %}
<a href="{{ url_for('risdeveau') }}" class="block green"> <a href="{{ url_for('risdeveau.index') }}" class="block green">
<div class="header"> <div class="header">
<img src="/static/icon/us/risdeveau.webp" class="icon"/> <img src="/static/icon/us/risdeveau.webp" class="icon"/>
Sweetbread Sweetbread
+47
View File
@@ -0,0 +1,47 @@
from configparser import ConfigParser
from flask import g, request
translations_cache = {}
def load_translations(lang):
if lang not in translations_cache:
translations_cache[lang] = {}
try:
config = ConfigParser()
config.read(f'locale/{lang}.ini')
for section in config.sections():
translations_cache[lang][section] = dict(config.items(section))
except:
pass
return translations_cache[lang]
def get_locale():
return request.accept_languages.best_match(
('en', 'ru', 'de', 'fr', 'ja'),
) or 'en'
def before_request():
g.locale = get_locale()
g.translations = load_translations(g.locale)
def inject_translations():
def translate(text, **kwargs):
if ":" in text:
section, key = text.split(":", 1)
else:
section, key = "common", text
template = g.translations \
.get(section, {}) \
.get(key, f"${section}: {key}$")
try:
return template.format(**kwargs)
except:
return template
return {'_': translate}