Compare commits

..

10 Commits

Author SHA1 Message Date
1f352de8c6 Updated license text in IBAN and UUID generators to be in line with new ones
Update .gitignore, iban-generator.yml, uuid-generator.yml, and 4 more files
2025-09-21 23:06:17 +02:00
fbd844523c Updated about page and its strings, Updated readme, Updated sitemap
Update app.py - BS4.run.xml, sidebar.yml, and 6 more files...
2025-09-14 22:05:05 +02:00
9add4e5171 Updated robot files for XML sitemap
Update robots.txt and robots.jinja
2025-09-14 21:01:17 +02:00
8c51b2b8b3 Added licenses to Excel Password Remover, Filed file input on standalone, Added auto-clear to file input
Update excel-password-remover.yml, excel-password-remover.yml, and 3 more files...
2025-09-14 02:12:04 +02:00
1f249206e7 Added PEArch page, Added strings, Updated readme
Update .dockerignore, .gitignore, and 11 more files...
2025-09-14 00:00:22 +02:00
1612416d9d Revamped XML sitemap, Added run configs, Added release script, Removed commented HTML
Update .gitignore, app.py - Minify.run.xml, and 11 more files...
2025-09-13 18:13:24 +02:00
abd7046fe2 Fixed broken upload buttons by changing ID in JS
Update nibblepoker-core.mjs and file-input.jinja
2025-09-13 16:24:29 +02:00
2eb9d5c7a5 Updated file input, Updated heading spacing globally, Fixed lscom downloads, Updated contact info
Update .gitignore, home.yml, and 13 more files...
2025-09-13 16:19:20 +02:00
ed2e56cf96 Added L10N YAML flattening, Removed trash
Update .gitignore, sidebar.yml, and 6 more files...
2025-09-12 23:58:52 +02:00
54786b6599 Added basic tag filters, removed tag filter section temporarily
Update app.py, content.json, and 9 more files...
2025-09-09 00:09:42 +02:00
68 changed files with 2047 additions and 1758 deletions

View File

@@ -11,3 +11,8 @@ scripts/
# Docker # Docker
docker-compose.yml docker-compose.yml
Dockerfile Dockerfile
# Internal stuff
*.pdn
*.ai
*.private.*

9
.gitignore vendored
View File

@@ -8,12 +8,21 @@ __pycache__/
# NodeJS' BS # NodeJS' BS
node_modules/ node_modules/
scripts/package-lock.json
# Internal stuff # Internal stuff
*.pdn *.pdn
*.ai *.ai
*.private.*
tests/
# Temp # Temp
static/resources/DecimalJs* static/resources/DecimalJs*
static/resources/SortableJS static/resources/SortableJS
static/resources/Standalone static/resources/Standalone
# Golang revamp
src/
bin/
app/
*.tmpl

26
.run/app.py - BS4.run.xml Normal file
View File

@@ -0,0 +1,26 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="app.py - BS4" type="PythonConfigurationType" factoryName="Python">
<module name="Web-NibblePoker" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
<env name="NP_HTML_POST_PROCESS" value="BS4" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/app.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
</component>

View File

@@ -0,0 +1,26 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="app.py - Minify" type="PythonConfigurationType" factoryName="Python">
<module name="Web-NibblePoker" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
<env name="NP_HTML_POST_PROCESS" value="MINIFY" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/app.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
</component>

View File

@@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="compile-js-site" type="BatchConfigurationType" factoryName="Batch">
<module name="Web-NibblePoker" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="WORKING_DIRECTORY" value="./scripts" />
<option name="PARENT_ENVS" value="true" />
<option name="SCRIPT_NAME" value="compile-js-site.cmd" />
<option name="PARAMETERS" value="" />
<method v="2" />
</configuration>
</component>

View File

@@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="delete-minified-js" type="BatchConfigurationType" factoryName="Batch">
<module name="Web-NibblePoker" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="WORKING_DIRECTORY" value="./scripts" />
<option name="PARENT_ENVS" value="true" />
<option name="SCRIPT_NAME" value="delete-minified-js.cmd" />
<option name="PARAMETERS" value="" />
<method v="2" />
</configuration>
</component>

View File

@@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="delete-pycache" type="BatchConfigurationType" factoryName="Batch">
<module name="Web-NibblePoker" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="WORKING_DIRECTORY" value="./scripts" />
<option name="PARENT_ENVS" value="true" />
<option name="SCRIPT_NAME" value="delete-pycache.cmd" />
<option name="PARAMETERS" value="" />
<method v="2" />
</configuration>
</component>

View File

@@ -0,0 +1,13 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="go build np_web_main" type="GoApplicationRunConfiguration" factoryName="Go Application" nameIsGenerated="true">
<module name="Web-NibblePoker" />
<working_directory value="$PROJECT_DIR$" />
<go_parameters value="-ldflags=&quot;-s -w -extldflags '-static'&quot;" />
<kind value="PACKAGE" />
<package value="np_web_main" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$/app/main.go" />
<output_directory value="$PROJECT_DIR$/bin" />
<method v="2" />
</configuration>
</component>

11
.run/nodejs-setup.run.xml Normal file
View File

@@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="nodejs-setup" type="BatchConfigurationType" factoryName="Batch">
<module name="Web-NibblePoker" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="WORKING_DIRECTORY" value="./scripts" />
<option name="PARENT_ENVS" value="true" />
<option name="SCRIPT_NAME" value="nodejs-setup.cmd" />
<option name="PARAMETERS" value="" />
<method v="2" />
</configuration>
</component>

View File

@@ -0,0 +1,11 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="package-for-release" type="BatchConfigurationType" factoryName="Batch">
<module name="Web-NibblePoker" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="WORKING_DIRECTORY" value="./scripts" />
<option name="PARENT_ENVS" value="true" />
<option name="SCRIPT_NAME" value="package-for-release.cmd" />
<option name="PARAMETERS" value="" />
<method v="2" />
</configuration>
</component>

14
app.py
View File

@@ -10,7 +10,7 @@ from werkzeug.exceptions import HTTPException
from website.content import get_projects, get_tools, sanitize_input_tags, load_content_items, get_content, \ from website.content import get_projects, get_tools, sanitize_input_tags, load_content_items, get_content, \
get_applets, get_projects_languages, get_projects_by_languages, get_sorted_tools_by_tags, \ get_applets, get_projects_languages, get_projects_by_languages, get_sorted_tools_by_tags, \
get_sorted_projects_by_tags get_sorted_projects_by_tags, get_tools_linked_tags, get_tools_unlinked_tags
from website.contributors import reload_contributors_data from website.contributors import reload_contributors_data
from website.domains import ALLOWED_DOMAINS from website.domains import ALLOWED_DOMAINS
from website.l10n.utils import get_user_lang, localize, reload_strings, l10n_url_abs, l10n_url_switch, DEFAULT_LANG from website.l10n.utils import get_user_lang, localize, reload_strings, l10n_url_abs, l10n_url_switch, DEFAULT_LANG
@@ -24,7 +24,7 @@ from website.renderers.lists import render_list_ul
from website.renderers.splide import render_splide from website.renderers.splide import render_splide
from website.renderers.standalone import get_standalone_common_headers from website.renderers.standalone import get_standalone_common_headers
from website.sidebar import reload_sidebar_entries, get_sidebar_entries from website.sidebar import reload_sidebar_entries, get_sidebar_entries
from website.sitemap import reload_sitemap_entries, get_sitemap_entries from website.sitemap import reload_sitemap_entries, get_sitemap_entries, get_sitemap_xml
try: try:
from rich import print from rich import print
@@ -125,6 +125,8 @@ def inject_processors():
get_tools=get_tools, get_tools=get_tools,
get_sorted_projects_by_tags=get_sorted_projects_by_tags, get_sorted_projects_by_tags=get_sorted_projects_by_tags,
get_sorted_tools_by_tags=get_sorted_tools_by_tags, get_sorted_tools_by_tags=get_sorted_tools_by_tags,
get_tools_unlinked_tags=get_tools_unlinked_tags,
get_tools_linked_tags=get_tools_linked_tags,
# Renderers # Renderers
render_button=render_button, render_button=render_button,
@@ -162,11 +164,15 @@ def route_robots_txt():
@app.route('/sitemap.txt') @app.route('/sitemap.txt')
def route_sitemap(): def route_sitemap_txt():
# FIXME: Add the domain !!!
return Response("\n".join(get_sitemap_entries()), mimetype="") return Response("\n".join(get_sitemap_entries()), mimetype="")
@app.route('/sitemap.xml')
def route_sitemap_xml():
return Response(get_sitemap_xml(request.headers['Host']), mimetype="application/xml")
@app.route('/', defaults={'lang': None}) @app.route('/', defaults={'lang': None})
@app.route('/en/', defaults={'lang': "en"}) @app.route('/en/', defaults={'lang': "en"})
@app.route('/fr/', defaults={'lang': "fr"}) @app.route('/fr/', defaults={'lang': "fr"})

View File

@@ -28,7 +28,7 @@ projects:
subtitle_key: "article.subtitle" subtitle_key: "article.subtitle"
tags: tags:
- "application" - "application"
- "tool" - "cli"
- "windows" - "windows"
languages: languages:
- "dotnet" - "dotnet"

36
data/projects/pearch.yml Normal file
View File

@@ -0,0 +1,36 @@
projects:
- id: "pearch"
metadata:
head:
title_key: "meta.title"
description_key: "meta.description"
opengraph:
title_key: "meta.title"
description_key: "meta.description"
type: null
url: null
image_url: "/resources/NibblePoker/images/content/pearch/main.png"
image_type: null
twitter:
title_key: "meta.title"
description_key: "meta.description"
index:
priority: 2000
enable: true
title_key: "meta.title"
preamble_key: "meta.description"
image_url: "/resources/NibblePoker/images/content/pearch/main.png"
image_alt_key: ""
general:
icon: "fad fa-terminal"
title_key: "meta.title"
subtitle_key: "article.subtitle"
tags:
- "application"
- "cli"
- "windows"
- "windows-pe"
- "cpu-arch"
languages:
- "purebasic"

View File

@@ -4,7 +4,7 @@
active_id: home active_id: home
has_new_until_utc: 0 has_new_until_utc: 0
- - {}
#- title_key: text.articles #- title_key: text.articles
# abs_href: "/articles/" # abs_href: "/articles/"
@@ -56,13 +56,13 @@
active_id: "" active_id: ""
has_new_until_utc: 0 has_new_until_utc: 0
- - {}
#- title_key: text.about - title_key: text.about
# abs_href: "/about" abs_href: "/about"
# icon: fad fa-user icon: fad fa-user
# active_id: about active_id: about
# has_new_until_utc: 0 has_new_until_utc: 0
- title_key: text.contact - title_key: text.contact
abs_href: "/contact" abs_href: "/contact"

View File

@@ -1,17 +1,71 @@
# Sitemap definition # Sitemap definition
- "/" # changefreq: "monthly" is implied unless specified
- "/about/"
#- "/articles/" sitemap:
- "/contact/" "/":
- "/content/" lastmod: "2025-03-30T00:00:00+01:00"
- "/content/circuitpython-ebyte-e32/" priority: "1"
- "/content/docker-mini-cctv-nvr/"
- "/content/lscom-cli-dotnet/" "/about/":
- "/links/" lastmod: "2025-09-14T22:04:00+01:00"
- "/privacy/" priority: "0.2"
- "/tools/"
- "/tools/iban-generator/" "/contact/":
- "/tools/excel-password-remover/" lastmod: "2025-03-01T07:40:00+01:00"
- "/tools/uuid-generator/" priority: "0.5"
- "/tools/vat-calculator/"
"/content/":
lastmod: "2025-09-13T16:19:00+02:00"
priority: "0.2"
"/content/circuitpython-ebyte-e32/":
lastmod: "2025-03-30T14:52:00+02:00"
priority: "0.5"
"/content/docker-mini-cctv-nvr/":
lastmod: "2025-03-30T14:52:00+02:00"
priority: "0.3"
"/content/lscom-cli-dotnet/":
lastmod: "2025-09-13T16:19:00+02:00"
priority: "0.6"
"/content/pearch/":
lastmod: "2025-09-14T00:15:00+02:00"
priority: "0.6"
"/links/":
lastmod: "2025-03-01T07:40:00+01:00"
priority: "0.6"
"/privacy/":
lastmod: "2025-03-30T00:00:00+01:00"
priority: "0.4"
"/tools/":
lastmod: "2025-09-13T16:19:00+02:00"
priority: "0.2"
"/tools/iban-generator/":
lastmod: "2025-08-28T21:23:00+02:00"
priority: "0.6"
"/tools/excel-password-remover/":
lastmod: "2025-09-13T16:19:00+02:00"
priority: "0.9"
"/tools/uuid-generator/":
lastmod: "2025-08-28T21:23:00+02:00"
priority: "0.3"
"/tools/vat-calculator/":
lastmod: "2025-09-18T00:15:00+02:00"
priority: "0.6"
#"/about/":
# lastmod: ""
# priority: ""
#"/articles/":
# lastmod: ""
# priority: ""

View File

@@ -1,80 +1,93 @@
# EN - About # EN - About
head.title: About - NibblePoker head:
head.description: 'TODO: description' title: About - NibblePoker
og.title: NibblePoker - About description: 'TODO: description'
og.description: 'TODO: description'
header.title: About og:
intro.title: Introduction title: NibblePoker - About
intro.text.01: My name is Herwin Bozet, I'm an experienced developer with extensive description: 'TODO: description'
experience in PureBasic, Python, Java, VBA; and intermediate knowledge in C, Win32
APIs, embedded systems and general web development. header:
intro.text.02: I've been programming for about 10 years now, and for the last title: About
5 years I've been actively working on applying that experience to a variety of projects
with the aim of helping programmers and people in their day-to-day life. intro:
intro.text.10: NibblePoker is, in essence, a simple moniker and the front-end title: Introduction
for most of my public-focused work. text:
intro.text.11: It houses all my work made and tailored for usage by other people. p1:
intro.text.20: This entire website, as well as all my work for it and other l1: My name is Herwin Bozet, I'm an experienced developer with extensive
personal projects, is completely open-source and available under permissive <abbr experience in PureBasic, Python, .NET, Java; and intermediate knowledge in C, Win32
title="Open Source Initiative">OSI</abbr> approved licenses. APIs, embedded systems and general web development.
intro.text.21: All of it is maintained, developed and expanded in my free time # l2: I've been programming for about 10 years now, and for the last
with the occasional help from people in the open-source community. # 5 years I've been actively working on applying that experience to a variety of projects
tenets.title: Core tenets # with the aim of helping programmers and people in their day-to-day life.
tenets.text.01: '' #p2:
tenets.text.02: '' # l1: NibblePoker is, in essence, a simple moniker and the front-end
future.title: Future plans # for most of my public-focused work.
future.text.01: It is planned to turn NibblePoker into a <abbr title="Private # l2: It houses all my work made and tailored for usage by other people.
company with limited liability">SPRL</abbr> in a couple years if everything goes p3:
as planned. l1: This entire website, as well as all my work for it and other
future.text.02: This would allow me to centralize many things and invest properly personal projects, is completely open-source and available under permissive <abbr
in my targetted fields to achieve my goals. title="Open Source Initiative">OSI</abbr> approved licenses.
future.text.10: The goal would be to create a small sustainable local business l2: All of it is maintained, developed and expanded in my free time
that offers a wide range of products and solutions covering <abbr title="Internet with the occasional help from people in the open-source community.
of things">IoT</abbr> devices, programming, and technological independence ; All
while including the required software and hardware components often lacking in such future:
products and solutions. title: Future plans
future.text.20: Ultimately, all this work and research would be made available text:
to the public under open-source licenses, enabling anyone who wishes to learn, reuse, p1:
and resell open-source products, to do so in a similar way as companies like Adafruit l1: It is planned to turn NibblePoker into a <abbr title="Private
do. company with limited liability">SPRL</abbr> in a couple years if everything goes
_nibblepoker.title: The 'NibblePoker' name as planned.
_nibblepoker.text.01: TODO l2: This would allow me to centralize many things and invest properly
_nibblepoker.text.10: TODO in my targeted fields to achieve my goals.
_nibblepoker.text.11: TODO p2:
_nibblepoker.text.20: TODO l1: The goal would be to create a small sustainable local business
financing.title: Financing that offers a wide range of products and solutions covering <abbr title="Internet
financing.text.01: This website, as well as the surrounding infrastructure, of things">IoT</abbr> devices, programming, and technological independence ; All
was made to cost as little as possible while not being reliant on any censor-happy while including the required software and hardware components often lacking in such
companies. products and solutions.
financing.text.02: Following my core tenets, I also wanted to retain some sort p3:
of "technological sovereignty", and therefore refuse to support or use companies l1: Ultimately, all this work and research would be made available
that actively fight against legal free speech. to the public under open-source licenses, enabling anyone who wishes to learn, reuse,
financing.text.10: The details of the operating costs are provided below to and resell open-source products, to do so in a similar way as companies like Adafruit
illustrate the low price of such independence. do.
financing.text.20: And for those of you who are more motivated, I hope to inspire
you to at least try this kind of activity. financing:
financing.text.21: It may seem daunting at first, but for a fraction of the title: Financing
cost presented here, <b>and with a bit of motivation</b>, you can already accomplish text:
a lot of things and gain valuable knowledge for a world as interconnected as ours. p1:
financing.text.isp: The main ISP bill isn't accounted for since this could run l1: This website, as well as the surrounding infrastructure,
off some random public Wi-Fi. was made to cost as little as possible while not being reliant on any censor-happy
financing.part.service: Service companies.
financing.part.cost: Cost l2: Following my core tenets, I also wanted to retain some sort
financing.part.cost.total: Total Cost of "technological sovereignty", and therefore refuse to support or use companies
financing.part.equipment: Equipment that actively fight against legal free speech.
financing.part.cost.yearly: Yearly Cost p2:
financing.part.cost.yearly.total: Yearly Cost l1: The details of the operating costs are provided below to
financing.part.domain.lu: "<i>.lu</i> domain" illustrate the low price of such independence.
financing.part.domain.com: "<i>.com</i> domain" p3:
financing.part.proxy.europe: European reverse-proxy l1: And for those of you who are more motivated, I hope to inspire
financing.part.proxy.america: American reverse-proxy you to at least try this kind of activity.
financing.part.proxy.asia: Asian reverse-proxy l2: It may seem daunting at first, but for a fraction of the
financing.part.emails: Emails cost presented here, <b>and with a bit of motivation</b>, you can already accomplish
financing.part.electricity: Electricity a lot of things and gain valuable knowledge for a world as interconnected as ours.
financing.part.nanopir4s: NanoPi R4S isp: The main ISP bill isn't accounted for since this could run
financing.part.nanopir4s.desc: Handles all non public-facing tasks and services. off some random public Wi-Fi.
financing.part.storage: Local storage part:
aziascreations.title: The 'AziasCreations' name service: Service
_aziascreations.text.01: TODO equipment: Equipment
_aziascreations.text.10: TODO cost: Cost
cost.total: Total Cost
cost.yearly: Yearly Cost
cost.yearly.total: Yearly Cost
domain.lu: "<i>.lu</i> domain"
domain.com: "<i>.com</i> domain"
proxy.europe: European reverse-proxy
proxy.america: American reverse-proxy
proxy.asia: Asian reverse-proxy
emails: Emails
electricity: Electricity
nanopir4s: NanoPi R4S
nanopir4s.desc: Handles all non public-facing tasks and services.
storage: Local storage

View File

@@ -22,6 +22,18 @@ user-agent: User-Agent
server: Server server: Server
windows:
95: "Windows 95"
98: "Windows 98"
2000: "Windows 2000"
xp: "Windows XP"
vista: "Windows Vista"
7: "Windows 7"
8: "Windows 8"
81: "Windows 8.1"
10: "Windows 10"
11: "Windows 11"
cpu.architecture: CPU Architecture cpu.architecture: CPU Architecture
cpu.responsive: "CPU<span class=\"mobile-hide\"> Architecture</span>" cpu.responsive: "CPU<span class=\"mobile-hide\"> Architecture</span>"
cpu.any: "Any architecture" cpu.any: "Any architecture"
@@ -34,6 +46,87 @@ cpu.arm64: "ARM64"
#cpu.arm64: "<p>ARM64<br>ARMv8<br>AArch64</p>" #cpu.arm64: "<p>ARM64<br>ARMv8<br>AArch64</p>"
cpu.risc-v: "RISC-V" cpu.risc-v: "RISC-V"
cpu:
human:
unknown: The content of this field is assumed to be applicable to any machine type
alpha: Alpha AXP, 32-bit address space
alpha64: Alpha 64, 64-bit address space
am33: Matsushita AM33
amd64: x64
any: Any architecture
arm: ARM little endian
arm64: ARM64 little endian
arm64ec: ABI that enables interoperability between native ARM64 and emulated x64 code.
arm64x: Binary format that allows both native ARM64 and ARM64EC code to coexist in the same file.
armnt: ARM Thumb-2 little endian
axp64: AXP 64 (Same as Alpha 64)
ebc: EFI byte code
i386: Intel 386 or later processors and compatible processors
ia64: Intel Itanium processor family
loongarch32: LoongArch 32-bit processor family
loongarch64: LoongArch 64-bit processor family
m32r: Mitsubishi M32R little endian
mips16: MIPS16
mipsfpu: MIPS with FPU
mipsfpu16: MIPS16 with FPU
powerpc: Power PC little endian
powerpcfp: Power PC with floating point support
r3000be: MIPS I compatible 32-bit big endian
r3000: MIPS I compatible 32-bit little endian
r4000: MIPS III compatible 64-bit little endian
r10000: MIPS IV compatible 64-bit little endian
riscv32: RISC-V 32-bit address space
riscv64: RISC-V 64-bit address space
riscv128: RISC-V 128-bit address space
sh3: Hitachi SH3
sh3dsp: Hitachi SH3 DSP
sh4: Hitachi SH4
sh5: Hitachi SH5
thumb: Thumb
wcemipsv2: MIPS little-endian WCE v2v2
code:
unknown: UNKNOWN
alpha: ALPHA
alpha64: ALPHA64
am33: AM33
amd64: AMD64
any: ANY
arm: ARM
arm32: "ARM32"
arm64: ARM64
arm64ec: ARM64EC
arm64x: ARM64X
armnt: ARMNT
axp64: AXP64
ebc: EBC
i386: I386
ia64: IA64
loongarch32: LOONGARCH32
loongarch64: LOONGARCH64
m32r: M32R
mips16: MIPS16
mipsfpu: MIPSFPU
mipsfpu16: MIPSFPU16
powerpc: POWERPC
powerpcfp: POWERPCFP
r3000be: R3000BE
r3000: R3000
r4000: R4000
r10000: R10000
riscv: RISC-V
riscv32: RISCV32
riscv64: RISCV64
riscv128: RISCV128
sh3: SH3
sh3dsp: SH3DSP
sh4: SH4
sh5: SH5
thumb: THUMB
wcemipsv2: WCEMIPSV2
x64: "x64"
x86: "x86"
requirements: Requirements requirements: Requirements
python: Python python: Python
@@ -92,47 +185,48 @@ format.yaml: "YAML"
action.generate: "Generate" action.generate: "Generate"
country.afghanistan: "Afghanistan" country:
country.albania: "Albania" afghanistan: "Afghanistan"
country.algeria: "Algeria" albania: "Albania"
country.andorra: "Andorra" algeria: "Algeria"
country.angola: "Angola" andorra: "Andorra"
country.anguilla: "Anguilla" angola: "Angola"
country.argentina: "Argentina" anguilla: "Anguilla"
country.australia: "Australia" argentina: "Argentina"
country.austria: "Austria" australia: "Australia"
country.azerbaijan: "Azerbaijan" austria: "Austria"
country.azores: "Azores" azerbaijan: "Azerbaijan"
country.bahamas: "Bahamas" azores: "Azores"
country.belgium: "Belgium" bahamas: "Bahamas"
country.bulgaria: "Bulgaria" belgium: "Belgium"
country.corsica: "Corsica" bulgaria: "Bulgaria"
country.croatia: "Croatia" corsica: "Corsica"
country.cyprus: "Cyprus" croatia: "Croatia"
country.czechia: "Czechia" cyprus: "Cyprus"
country.denmark: "Denmark" czechia: "Czechia"
country.estonia: "Estonia" denmark: "Denmark"
country.finland: "Finland" estonia: "Estonia"
country.france: "France" finland: "Finland"
country.france.corsica: "France - Corsica" france: "France"
country.germany: "Germany" france.corsica: "France - Corsica"
country.greece: "Greece" germany: "Germany"
country.hungary: "Hungary" greece: "Greece"
country.ireland: "Ireland" hungary: "Hungary"
country.italy: "Italy" ireland: "Ireland"
country.latvia: "Latvia" italy: "Italy"
country.lithuania: "lithuania" latvia: "Latvia"
country.luxembourg: "Luxembourg" lithuania: "lithuania"
country.madeira: "Madeira" luxembourg: "Luxembourg"
country.malta: "Malta" madeira: "Madeira"
country.monaco: "Monaco" malta: "Malta"
country.netherlands: "Netherlands" monaco: "Monaco"
country.poland: "Poland" netherlands: "Netherlands"
country.portugal: "Portugal" poland: "Poland"
country.portugal.azores: "Portugal - Azores" portugal: "Portugal"
country.portugal.madeira: "Portugal - Madeira" portugal.azores: "Portugal - Azores"
country.romania: "Romania" portugal.madeira: "Portugal - Madeira"
country.slovenia: "Slovenia" romania: "Romania"
country.slovakia: "Slovakia" slovenia: "Slovenia"
country.spain: "Spain" slovakia: "Slovakia"
country.sweden: "Sweden" spain: "Spain"
sweden: "Sweden"

View File

@@ -83,5 +83,7 @@
"content.commons.lang.luxembourgish": "Luxembourgish", "content.commons.lang.luxembourgish": "Luxembourgish",
"content.commons.lang.english.639-3": "English (eng)", "content.commons.lang.english.639-3": "English (eng)",
"content.commons.lang.french.639-3": "French (fra)", "content.commons.lang.french.639-3": "French (fra)",
"content.commons.lang.luxembourgish.639-3": "Luxembourgish (ltz)" "content.commons.lang.luxembourgish.639-3": "Luxembourgish (ltz)",
"filters.summary": "Click to show/hide tag filters"
} }

View File

@@ -1,58 +1,43 @@
# EN - Excel Password Remover # EN - Excel Password Remover
meta.title: Excel Password Remover meta:
meta.description: >- title: Excel Password Remover
Small web application from which you can easily remove a password from an Excel description: >-
worksheet. It works by leaving the task of editing the XML files on an Excel Small web application from which you can easily remove a password from an Excel
document to your browser instead to keep everything local. worksheet. It works by leaving the task of editing the XML files on an Excel
meta.description.light: >- document to your browser instead to keep everything local.
Small web application from which you can easily remove a password from an Excel description.light: >-
worksheet directly in your browser. Small web application from which you can easily remove a password from an Excel
worksheet directly in your browser.
#article.subtitle: >- eula:
# <a 1: "This tool should only be used with files you have the express permission to unlock."
# href="https://github.com/aziascreations/Excel-Worksheet-Password-Remover"><i 2: "All password removal is done locally in your browser, and <span class='t-bold'>no data is sent online</span>.<br>
# class="fab fa-github"></i> View on GitHub</a>
#intro.title: Introduction
#intro.p1: >-
# This project aims to simplify the removal of passwords on Excel's Worksheet by
# leaving the task of editing the XML files on an Excel document to your
# browser.
#working.title: Security & Internal workings
#working.p1: >-
# In terms of security, your browser handles all the data without sending any of
# it to a central server like many web apps do.<br>This makes it, and your data,
# as safe as your browser can be since it is the only potential point of failure
# here.
#working.p2: >-
# As for the internal workings, the only thing this tool does is extract the
# content of the <code>.xlsx</code> file you gave it and removes the passwords
# on any worksheets and makes a new file with all the changes.<br>Once all of
# that is done, the file is downloaded via a <a
# href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs">data
# URL</a>.
#usage.title: Usage
#usage.p1: >-
# To use this tool you can either visit "<a
# href="https://aziascreations.github.io/Excel-Worksheet-Password-Remover">aziascreations.github.io/Excel-Worksheet-Password-Remover</a>"
# or download the repository and host the web page yourself.
#demo.title: Demonstration video
#links.title: Links
#content.link.demo: Demo hosted on GitHub
eula.1: "This tool should only be used with files you have the express permission to unlock."
eula.2: "All password removal is done locally in your browser, and <span class='t-bold'>no data is sent online</span>.<br>
The original password cannot be revealed as its secure by design and not stored in plain text; it simply gets removed." The original password cannot be revealed as its secure by design and not stored in plain text; it simply gets removed."
eula.3: "By using this tool, you accept full responsibility, and that it is provided “as is” without any warranty." 3: "By using this tool, you accept full responsibility, and that it is provided “as is” without any warranty."
file.selection.title: "File Selection" file:
file.selection.1: "Drop your excel file(s) here or click on the buttons." selection:
title: "File Selection"
1: "Drop your excel file(s) here or click on the buttons."
details.title : "Result(s)" details:
details.empty.1 : "Your Excel files with their password removed will end up here." title : "Result(s)"
empty:
1 : "Your Excel files with their password removed will end up here."
result.success.count: "Removed <span id=\"tmpl-success-password-count\">???</span> password(s)" result:
result.warning.extension: "The file doesn't appear to be an Excel Worksheet !" success:
result.warning.password: "The Excel Worksheet didn't contain any password !" count: "Removed <span id=\"tmpl-success-password-count\">???</span> password(s)"
result.error.jszip: "JSZip was unable to open the file !" warning:
extension: "The file doesn't appear to be an Excel Worksheet !"
password: "The Excel Worksheet didn't contain any password !"
error:
jszip: "JSZip was unable to open the file !"
license:
title: "Licenses"
text:
1: "This tool uses the <a href=\"https://stuk.github.io/jszip/\">JSZip</a>
library, which is licensed under the <a href=\"https://github.com/Stuk/jszip/blob/main/LICENSE.markdown\">MIT license</a>."
2: "The rest of this tool's code is released in the <a href=\"https://github.com/aziascreations/Web-NibblePoker\">public domain</a>."

View File

@@ -1,47 +1,59 @@
# EN - Home # EN - Home
head.title: NibblePoker head:
head.description: Collection of free and open-source handmade utilities and libraries title: NibblePoker
ranging from a simple COM port lister to password remover and autonomous video archivers. description: Collection of free and open-source handmade utilities and libraries
ranging from a simple COM port lister to password remover and autonomous video archivers.
og.title: NibblePoker og:
og.description: Collection of free and open-source handmade utilities and libraries title: NibblePoker
ranging from a simple COM port lister to password remover and autonomous video archivers. description: Collection of free and open-source handmade utilities and libraries
ranging from a simple COM port lister to password remover and autonomous video archivers.
header.title: Homepage header:
title: Homepage
intro.title: Welcome to %0 intro:
intro.text.1: This website contains a collection of my personal work through title: Welcome to %0
blog posts, software releases and other forms of media, all of which is accessible text:
for free and under open-source friendly licenses. 1: This website contains a collection of my personal work through
intro.text.2: If you wish to contact me, you can do so through the contact form blog posts, software releases and other forms of media, all of which is accessible
linked in the sidebar or via the email address present on that page. for free and under open-source friendly licenses.
2: If you wish to contact me, you can do so through the contact form
linked in the sidebar or via the email address present on that page.
showcase.title: Showcase showcase:
title: Showcase
updates.title: Updates updates:
title: Updates
updates.text.privacy: Updated our privacy policy. text:
privacy: Updated our privacy policy.
updates.5.date: March 30 2025 5:
updates.5.text.1: Complete redesign of the site to use a standardized style. date: March 30 2025
updates.5.text.2: Changed some of our VPS providers to <a href="https://hosteam.pl/">HosTeam</a>. text:
1: Complete redesign of the site to use a standardized style.
updates.4.date: November 30 2023 2: Changed some of our VPS providers to <a href="https://hosteam.pl/">HosTeam</a>.
updates.4.text.1: Centralized DNS servers & implemented GeoDNS. 4:
updates.4.text.2: Added US CDN hosted by <a href="https://www.chicagovps.net/">ChicagoVPS</a>. date: November 30 2023
updates.4.text.3: All other regions use the EU CDN hosted by IONOS. text:
1: Centralized DNS servers & implemented GeoDNS.
updates.3.date: November 12 2023 2: Added US CDN hosted by <a href="https://www.chicagovps.net/">ChicagoVPS</a>.
updates.3.text.1: Other services are back online. 3: All other regions use the EU CDN hosted by IONOS.
updates.3.text.2: Changed our host to IONOS. 3:
updates.3.text.3: Finished all side pages. date: November 12 2023
text:
updates.2.date: August 15 2023 1: Other services are back online.
updates.2.text.1: The website is back online. 2: Changed our host to IONOS.
updates.2.text.2: New and much lighter design. 3: Finished all side pages.
updates.2.text.3: Changed our host to HostBrr. 2:
updates.2.text.4: Added a section for web-based tools. date: August 15 2023
text:
updates.1.date: September 9 2022 1: The website is back online.
updates.1.text.1: Changed our host to v6Node. 2: New and much lighter design.
3: Changed our host to HostBrr.
4: Added a section for web-based tools.
1:
date: September 9 2022
text:
1: Changed our host to v6Node.

View File

@@ -21,8 +21,7 @@ option.human.format.none: "No formatting"
option.human.format.standard: "Use recommended spacing" option.human.format.standard: "Use recommended spacing"
option.human.format.4by4: "Use 4 character-wide spacing" option.human.format.4by4: "Use 4 character-wide spacing"
license.1: "The code for this project is released in the public domain." license.1: "The code for this project is released in the <a href=\"https://github.com/aziascreations/Web-NibblePoker\">public domain</a>."
license.2: "The original source code can be found on <a href=\"https://github.com/aziascreations/Web-NibblePoker\">GitHub</a>." license.2: "Data from Swift's
license.3: "Data from Swift's
<a href=\"https://www.swift.com/standards/data-standards/iban-international-bank-account-number\">IBAN Registry</a> <a href=\"https://www.swift.com/standards/data-standards/iban-international-bank-account-number\">IBAN Registry</a>
was also used and may be licensed under different terms." was also used and may be licensed under different terms."

View File

@@ -0,0 +1,48 @@
# PEArch - EN
meta:
title: "PEArch"
description: "CLI tool that tells you which CPU architecture a given Windows PE is made for."
intro:
title: "Introduction"
text:
p1:
l1: A small tool that tells you which
<a href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#machine-types">CPU architecture</a>
a given <a href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format">Windows PE</a> is made for.
p2:
l1: A total of 35 architectures are supported by this tool.
usage:
title: "Usage"
text:
p1:
l1: "This tool can either be used in a command prompt with the options below."
l2: "Or, you can simply drop a file onto the <span class=\"code\">.exe</span> or a shortcut to get the same result."
details:
#disclaimer: The architecture codes, as well as their descriptions, are taken from Microsoft's
# <a href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#machine-types">MSDN</a>.
title: "Click here to show/hide the architecture and return codes"
thead:
code: "<span class=\"t-monospace\">STDOUT</span>"
hex: "<span class=\"t-monospace\">STDOUT</span> with <span class=\"t-monospace\">/AsHex</span>"
dec: "<span class=\"t-monospace\">STDERR</span> with <span class=\"t-monospace\">/AsError</span>"
description: "Description <i>(Source: <a href=\"https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#machine-types\">MSDN</a>)</i>"
output:
title: "Output examples"
default:
title: "Without options:"
options:
title: "With <span class=\"code\">/AsHex</span> and <span class=\"code\">/AsError</span>:"
downloads:
title: "Downloads"
license:
title: "License"
text: "This software and its source code is released in the Public Domain (CC0 1.0 Universal)."
links:
title: "Links"

View File

@@ -17,3 +17,5 @@ generate: "Generate"
download.raw: "Raw" download.raw: "Raw"
download.json: "JSON" download.json: "JSON"
download.yaml: "YAML" download.yaml: "YAML"
license.1: "This tool and its code are released in the <a href=\"https://github.com/aziascreations/Web-NibblePoker\">public domain</a>."

View File

@@ -1,94 +1,96 @@
# FR - About # FR - About
head.title: À-propos - NibblePoker head:
head.description: 'TODO: description' title: À-propos - NibblePoker
og.title: NibblePoker - À-propos description: 'TODO: description'
og.description: 'TODO: description'
header.title: À-propos
intro.title: Introduction
intro.text.01: Je m'appelle Herwin Bozet, et je suis un développeur expérimenté
en PureBasic, Python, Java, VBA ; et de manière plus modérée en C, API Win32, systèmes
embarqués et le développement web général.
intro.text.02: Je programme depuis environ 10 ans, et au cours des 5 dernières
années, j'ai activement travaillé à l'application de cette expérience à divers projets
dans le but d'aider les programmeurs et les gens dans leur vie quotidienne.
intro.text.10: NibblePoker est, en essence, un simple pseudonyme et une ombrelle
sous laquelle la majeure partie de mon travail axé sur le public sera présente.
intro.text.11: Il abrite l'ensemble de mon travail créé et adapté pour être
utilisé par d'autres personnes.
intro.text.20: L'ensemble de ce site web, ainsi que l'ensemble de mon travail
et autres projets personnels réalisés pour lui, sont entièrement open-source et
disponibles sous des licences permissives approuvées par l'<abbr title="Open Source
Initiative">OSI</abbr>.
intro.text.21: Tout cela est maintenu, développé et étendu pendant mon temps
libre, avec l'aide occasionnelle de personnes de la communauté open source.
tenets.title: Principes fondamentaux
tenets.text.01: ''
tenets.text.02: ''
future.title: Projet d'avenir
future.text.01: 'Il est prévu que je décline NibblePoker en une petite <abbr
title="Societé privée à responsibilité limitée">SPRL</abbr> d''ici quelques années
si tout se déroule comme prévu.
' og:
future.text.02: Cela aura pour but de me permettre de centraliser plein de choses title: NibblePoker - À-propos
et d'investir correctement dans mes domaines de prédilection. description: 'TODO: description'
future.text.10: La finalité serait de pouvoir créer un petit projet local d'entreprise
durable, ainsi que de proposer une large gamme de produits et solutions couvrant header:
les domaines de l'électronique connectée et intelligente, la programmation et lindépendance title: À-propos
technologique tout en incluant les composantes logicielles et physiques souvent
manquantes dans de tels produits et solutions. intro:
future.text.20: Finalement tout ce travail et recherches seraient mis à disposition title: Introduction
du public sous des licences open-source afin de permettre permettant à quiconque text:
le souhaite dapprendre, réutiliser et revendre des produits ouverts tels que le p1:
font des compagnies comme Adafruit. l1: Je m'appelle Herwin Bozet, et je suis un développeur expérimenté
_nibblepoker.title: Le nom 'NibblePoker' en PureBasic, Python, Java, VBA ; et de manière plus modérée en C, API Win32, systèmes
_nibblepoker.text.01: Le surnom '<i>NibblePoker</i>' est un mot composé de plusieurs embarqués et le développement web général.
termes [techniques] plus anciens. # l2: Je programme depuis environ 10 ans, et au cours des 5 dernières
_nibblepoker.text.10: "●&nbsp;&nbsp;'<i>Nibble</i>' est un terme technique anglais # années, j'ai activement travaillé à l'application de cette expérience à divers projets
historiquement utilisé pour décrire décrit un demi-octet, ou 4 bits d'information." # dans le but d'aider les programmeurs et les gens dans leur vie quotidienne.
_nibblepoker.text.11: "●&nbsp;&nbsp;'<i>Poker</i>' viens du verbe anglais '<i>to #p2:
poke</i>' qui, dans le domaine rétro-informatique, décrit le fait d'écrire des données # l1: NibblePoker est, en essence, un simple pseudonyme et une ombrelle
dans la mémoire d'un ordinateur." # sous laquelle la majeure partie de mon travail axé sur le public sera présente.
_nibblepoker.text.20: Finalement, lors de la création de ce surnom, je travaillais # l2: Il abrite l'ensemble de mon travail créé et adapté pour être
depuis quelques temps sur d'anciennes machines telle la Commodore64, Acorn Electron # utilisé par d'autres personnes.
et [???]ironique. p3:
financing.title: Financement l1: L'ensemble de ce site web, ainsi que l'ensemble de mon travail
financing.text.01: Ce site web, ainsi que son infrastructure environnante, ont et autres projets personnels réalisés pour lui, sont entièrement open-source et
été conçus pour coûter le moins possible tout en étant indépendants d'entreprises disponibles sous des licences permissives approuvées par l'<abbr title="Open Source
qui se prennent pour des censeurs. Initiative">OSI</abbr>.
financing.text.02: Et en suivant mes principes fondamentaux, je souhaitais également l2: Tout cela est maintenu, développé et étendu pendant mon temps
conserver une "souveraineté technologique", et, par conséquent, refuse de soutenir libre, avec l'aide occasionnelle de personnes de la communauté open source.
ou d'utiliser des entreprises qui luttent activement contre la liberté d'expression.
financing.text.10: Le détail des coûts opérationnels sont présents ci-dessous future:
afin d'illustrer le faible prix d'une telle indépendance. title: Projet d'avenir
financing.text.20: Et pour les plus motivés d'entre-vous, j'espère pouvoir vous text:
motiver à au moins tester ce genre d'activités. p1:
financing.text.21: C'est un domaine qui peut paraître intimidant de prime abord, l1: 'Il est prévu que je décline NibblePoker en une petite <abbr
mais pour une fraction du coût présenté ici, <b>et avec un rien de motivation</b>, title="Societé privée à responsibilité limitée">SPRL</abbr> d''ici quelques années
vous pouvez déjà accomplir énormément de choses et acquérir des connaissances essentielles si tout se déroule comme prévu.'
dans un monde aussi connecté que le nôtre. l2: Cela aura pour but de me permettre de centraliser plein de choses
financing.text.isp: Le coût de la connexion internet n'est pas compté car elle et d'investir correctement dans mes domaines de prédilection.
pourrait être remplacée par un Wi-Fi public lambda. p2:
financing.part.service: Service l1: La finalité serait de pouvoir créer un petit projet local d'entreprise
financing.part.cost: Coût durable, ainsi que de proposer une large gamme de produits et solutions couvrant
financing.part.cost.total: Coût Total les domaines de l'électronique connectée et intelligente, la programmation et lindépendance
financing.part.equipment: Matériel technologique tout en incluant les composantes logicielles et physiques souvent
financing.part.cost.yearly: Coût Annuel manquantes dans de tels produits et solutions.
financing.part.cost.yearly.total: Coût Annuel p3:
financing.part.domain.lu: Domaine en <i>.lu</i> l1: Finalement tout ce travail et recherches seraient mis à disposition
financing.part.domain.com: Domaine en <i>.com</i> du public sous des licences open-source afin de permettre permettant à quiconque
financing.part.proxy.europe: Reverse-proxy en Europe le souhaite dapprendre, réutiliser et revendre des produits ouverts tels que le
financing.part.proxy.america: Reverse-proxy en Amérique font des compagnies comme Adafruit.
financing.part.proxy.asia: Reverse-proxy en Asie
financing.part.emails: Adresses email financing:
financing.part.electricity: Électricité title: Financement
financing.part.nanopir4s: NanoPi R4S text:
financing.part.nanopir4s.desc: Gère tous les services et programmes internes. p1:
financing.part.storage: Stockage local l1: Ce site web, ainsi que son infrastructure environnante, ont
aziascreations.title: Le nom 'AziasCreations' été conçus pour coûter le moins possible tout en étant indépendants d'entreprises
aziascreations.text.01: L'ancien surnom 'AziasCreations' était utilisé entre qui se prennent pour des censeurs.
2013 et 2020 et est à présent abandonné au profit de <i>NibblePoker</i>. l2: Et en suivant mes principes fondamentaux, je souhaitais également
aziascreations.text.10: Cependant, il reste utilisé sur GitHub et Gitea à cause conserver une "souveraineté technologique", et, par conséquent, refuse de soutenir
de certaines limitations concernant les changements de pseudonyme qui m'ont empèché ou d'utiliser des entreprises qui luttent activement contre la liberté d'expression.
de faire un changement complet. p2:
l1: Le détail des coûts opérationnels sont présents ci-dessous
afin d'illustrer le faible prix d'une telle indépendance.
p3:
l1: Et pour les plus motivés d'entre-vous, j'espère pouvoir vous
motiver à au moins tester ce genre d'activités.
l2: C'est un domaine qui peut paraître intimidant de prime abord,
mais pour une fraction du coût présenté ici, <b>et avec un rien de motivation</b>,
vous pouvez déjà accomplir énormément de choses et acquérir des connaissances essentielles
dans un monde aussi connecté que le nôtre.
isp: Le coût de la connexion internet n'est pas compté car elle
pourrait être remplacée par un Wi-Fi public lambda.
part:
service: Service
equipment: Matériel
cost: Coût
cost.total: Coût Total
cost.yearly: Coût Annuel
cost.yearly.total: Coût Annuel
domain.lu: Domaine en <i>.lu</i>
domain.com: Domaine en <i>.com</i>
proxy.europe: Reverse-proxy en Europe
proxy.america: Reverse-proxy en Amérique
proxy.asia: Reverse-proxy en Asie
emails: Adresses email
electricity: Électricité
nanopir4s: NanoPi R4S
nanopir4s.desc: Gère tous les services et programmes internes.
storage: Stockage local

View File

@@ -22,6 +22,18 @@ user-agent: User-Agent
server: Serveur server: Serveur
windows:
95: "Windows 95"
98: "Windows 98"
2000: "Windows 2000"
xp: "Windows XP"
vista: "Windows Vista"
7: "Windows 7"
8: "Windows 8"
81: "Windows 8.1"
10: "Windows 10"
11: "Windows 11"
cpu.architecture: Architecture de CPU cpu.architecture: Architecture de CPU
cpu.responsive: "<span class=\"mobile-hide\">Architecture de </span>CPU" cpu.responsive: "<span class=\"mobile-hide\">Architecture de </span>CPU"
cpu.any: "Indépendante" cpu.any: "Indépendante"
@@ -34,6 +46,87 @@ cpu.arm64: "ARM64"
#cpu.arm64: "<p>ARM64<br>ARMv8<br>AArch64</p>" #cpu.arm64: "<p>ARM64<br>ARMv8<br>AArch64</p>"
cpu.risc-v: "RISC-V" cpu.risc-v: "RISC-V"
cpu:
human:
unknown: Le contenu de ce champ est supposé pouvoir sappliquer à nimporte quel type dordinateur
alpha: Alpha AXP, espace dadressage 32 bits
alpha64: Alpha 64, espace dadressage 64 bits
am33: Matsushita AM33
amd64: X64
any: Indépendante
arm: ARM little endian
arm64: ARM64 little endian
arm64ec: ABI permettant l'interopérabilité entre le code natif ARM64 et le code x64 émulé.
arm64x: Format binaire qui permet à la fois au code natif ARM64 et au code ARM64EC de coexister dans le même fichier.
armnt: ARM Pouce-2 petit endian
axp64: AXP 64 (identique à Alpha 64)
ebc: Code doctet EFI
i386: Processeurs Intel 386 ou ultérieurs et processeurs compatibles
ia64: Famille de processeurs Intel Itanium
loongarch32: Famille de processeurs LoongArch 32 bits
loongarch64: Famille de processeurs LoongArch 64 bits
m32r: Mitsubishi M32R petit endian
mips16: MIPS16
mipsfpu: MIPS avec FPU
mipsfpu16: MIPS16 avec FPU
powerpc: Power PC little endian
powerpcfp: Power PC avec prise en charge de la virgule flottante
r3000be: MIPS I compatible 32 bits big endian
r3000: MIPS I compatible 32 bits little endian
r4000: MIPS III compatible 64 bits petit endian
r10000: MIPS IV compatible 64 bits petit endian
riscv32: Espace dadressage RISC-V 32 bits
riscv64: Espace dadressage RISC-V 64 bits
riscv128: Espace dadressage RISC-V 128 bits
sh3: Hitachi SH3
sh3dsp: Hitachi SH3 DSP
sh4: Hitachi SH4
sh5: Hitachi SH5
thumb: Pouce
wcemipsv2: MIPS little-endian WCE v2
code:
unknown: UNKNOWN
alpha: ALPHA
alpha64: ALPHA64
am33: AM33
amd64: AMD64
any: ANY
arm: ARM
arm32: "ARM32"
arm64: ARM64
arm64ec: ARM64EC
arm64x: ARM64X
armnt: ARMNT
axp64: AXP64
ebc: EBC
i386: I386
ia64: IA64
loongarch32: LOONGARCH32
loongarch64: LOONGARCH64
m32r: M32R
mips16: MIPS16
mipsfpu: MIPSFPU
mipsfpu16: MIPSFPU16
powerpc: POWERPC
powerpcfp: POWERPCFP
r3000be: R3000BE
r3000: R3000
r4000: R4000
r10000: R10000
riscv: RISC-V
riscv32: RISCV32
riscv64: RISCV64
riscv128: RISCV128
sh3: SH3
sh3dsp: SH3DSP
sh4: SH4
sh5: SH5
thumb: THUMB
wcemipsv2: WCEMIPSV2
x64: "x64"
x86: "x86"
requirements: "Dépendances" requirements: "Dépendances"
python: Python python: Python
@@ -92,47 +185,48 @@ format.yaml: "YAML"
action.generate: "Générer" action.generate: "Générer"
country.afghanistan: "Afghanistan" country:
country.albania: "Albanie" afghanistan: "Afghanistan"
country.algeria: "Algérie" albania: "Albanie"
country.andorra: "Andorre" algeria: "Algérie"
country.angola: "Angola" andorra: "Andorre"
country.anguilla: "Anguilla" angola: "Angola"
country.argentina: "Argentine" anguilla: "Anguilla"
country.australia: "Australie" argentina: "Argentine"
country.austria: "Autriche" australia: "Australie"
country.azerbaijan: "Azerbaïdjan" austria: "Autriche"
country.azores: "Açores" azerbaijan: "Azerbaïdjan"
country.bahamas: "Bahamas" azores: "Açores"
country.belgium: "Belgique" bahamas: "Bahamas"
country.bulgaria: "Bulgarie" belgium: "Belgique"
country.corsica: "Corse" bulgaria: "Bulgarie"
country.croatia: "Croatie" corsica: "Corse"
country.cyprus: "Chypre" croatia: "Croatie"
country.czechia: "Tchéquie" cyprus: "Chypre"
country.denmark: "Danemark" czechia: "Tchéquie"
country.estonia: "Estonie" denmark: "Danemark"
country.finland: "Finlande" estonia: "Estonie"
country.france: "France" finland: "Finlande"
country.france.corsica: "France - Corse" france: "France"
country.germany: "Allemagne" france.corsica: "France - Corse"
country.greece: "Grèce" germany: "Allemagne"
country.hungary: "Hongrie" greece: "Grèce"
country.ireland: "Irlande" hungary: "Hongrie"
country.italy: "Italie" ireland: "Irlande"
country.latvia: "Lettonie" italy: "Italie"
country.lithuania: "Lituanie" latvia: "Lettonie"
country.luxembourg: "Luxembourg" lithuania: "Lituanie"
country.madeira: "Madère" luxembourg: "Luxembourg"
country.malta: "Malte" madeira: "Madère"
country.monaco: "Monaco" malta: "Malte"
country.netherlands: "Pays-Bas" monaco: "Monaco"
country.poland: "Pologne" netherlands: "Pays-Bas"
country.portugal: "Portugal" poland: "Pologne"
country.portugal.azores: "Portugal - Açores" portugal: "Portugal"
country.portugal.madeira: "Portugal - Madère" portugal.azores: "Portugal - Açores"
country.romania: "Roumanie" portugal.madeira: "Portugal - Madère"
country.slovenia: "Slovénie" romania: "Roumanie"
country.slovakia: "Slovaquie" slovenia: "Slovénie"
country.spain: "Espagne" slovakia: "Slovaquie"
country.sweden: "Suède" spain: "Espagne"
sweden: "Suède"

View File

@@ -76,5 +76,7 @@
"content.commons.lang.luxembourgish": "Luxembourgeois", "content.commons.lang.luxembourgish": "Luxembourgeois",
"content.commons.lang.english.639-3": "Anglais (eng)", "content.commons.lang.english.639-3": "Anglais (eng)",
"content.commons.lang.french.639-3": "Français (fra)", "content.commons.lang.french.639-3": "Français (fra)",
"content.commons.lang.luxembourgish.639-3": "Luxembourgeois (ltz)" "content.commons.lang.luxembourgish.639-3": "Luxembourgeois (ltz)",
"filters.summary": "Cliquez pour afficher/cacher les filtres"
} }

View File

@@ -1,53 +1,44 @@
# FR - Excel Password Remover # FR - Excel Password Remover
meta.title: Excel Password Remover meta:
meta.description: >- title: Excel Password Remover
Petite application web qui permet de facilement retirer le mot de passe d'une description: >-
feuille de calcul Excel depuis votre navigateur web sans avoir à uploader le Petite application web qui permet de facilement retirer le mot de passe d'une
fichier sur internet. Cette application laisse votre navigateur modifier les feuille de calcul Excel depuis votre navigateur web sans avoir à uploader le
fichiers XML du fichier Excel afin de tout garder en local. fichier sur internet. Cette application laisse votre navigateur modifier les
meta.description.light: >- fichiers XML du fichier Excel afin de tout garder en local.
Application web qui permet de facilement retirer le mot de passe d'un ficher Excel depuis description.light: >-
votre navigateur web sans avoir à uploader le fichier sur internet. Application web qui permet de facilement retirer le mot de passe d'un ficher Excel depuis
votre navigateur web sans avoir à uploader le fichier sur internet.
#article.subtitle: >- eula:
# <a 1: "Cet outil ne doit être utilisé qu'avec des fichiers pour lesquels vous avez l'autorisation de les déverrouiller."
# href="https://github.com/aziascreations/Excel-Worksheet-Password-Remover"><i 2: "Toute suppression de mot de passe se fait localement dans votre navigateur, et <span class='t-bold'>aucune donnée n'est envoyée via Internet</span>.<br>
# class="fab fa-github"></i> Voir sur GitHub</a>
#intro.title: Introduction
#intro.p1: >-
# Ce projet vise à simplifier le processus de suppression des mots de passes sur
# les "worksheet" d'Excel en laissant votre navigateur web s'en charger.
#working.title: Sécurité & Fonctionnement
#working.p1: >-
# Cet outil charge le ficher que vous lui donnez en mémoire et travaille
# directement dessus dans le navigateur web sans utiliser un serveur central,
# vos données restent donc entièrement sur votre machine.
#working.p2: >-
# Par sécurité, nous vous demandons quand même de n'utiliser cet outil qu'avec
# des fichiers pour lesquels vous avez été explicitement autorisés à enlever le
# mot de passe.
#usage.title: Utilisation
#usage.p1: >-
# Vous pouvez utiliser cet outil en allant sur "<a
# href="https://aziascreations.github.io/Excel-Worksheet-Password-Remover">aziascreations.github.io/Excel-Worksheet-Password-Remover</a>"
# ou en téléchargeant le dépôt et en hébergeant la page web vous-même.
#demo.title: Vidéo de démonstration
#links.title: Liens
#content.link.demo: Démo hébergée sur GitHub
eula.1 : "Cet outil ne doit être utilisé qu'avec des fichiers pour lesquels vous avez l'autorisation de les déverrouiller."
eula.2 : "Toute suppression de mot de passe se fait localement dans votre navigateur, et <span class='t-bold'>aucune donnée n'est envoyée via Internet</span>.<br>
Le mot de passe original ne peut pas être révélé car il est sécurisé par Excel et n'est pas stocké en texte clair ; il est simplement supprimé." Le mot de passe original ne peut pas être révélé car il est sécurisé par Excel et n'est pas stocké en texte clair ; il est simplement supprimé."
eula.3 : "En utilisant cet outil, vous acceptez l'entière responsabilité de vos action, et le fait qu'il est fourni “tel quel” sans aucune garantie." 3: "En utilisant cet outil, vous acceptez l'entière responsabilité de vos action, et le fait qu'il est fourni “tel quel” sans aucune garantie."
file.selection.title : "Sélection de fichier(s)" file:
file.selection.1 : "Déposez vos fichiers Excel ici ou cliquez sur les boutons." selection:
title: "Sélection de fichier(s)"
1: "Déposez vos fichiers Excel ici ou cliquez sur les boutons."
details.title: "Résultat(s)" details:
details.empty.1 : "Vos fichiers Excel sans leurs mots de passe finiront ici." title: "Résultat(s)"
empty:
1: "Vos fichiers Excel sans leurs mots de passe finiront ici."
result.success.count: "Mot de passe(s) supprimé(s) : <span id=\"tmpl-success-password-count\">???</span>" result:
result.warning.extension: "Le fichier ne semble pas être une feuille de calcul Excel !" success:
result.warning.password: "La feuille de calcul Excel ne contenait aucun mot de passe !" count: "Mot de passe(s) supprimé(s) : <span id=\"tmpl-success-password-count\">???</span>"
result.error.jszip: "JSZip n'a pas pu ouvrir le fichier !" warning:
extension: "Le fichier ne semble pas être une feuille de calcul Excel !"
password: "La feuille de calcul Excel ne contenait aucun mot de passe !"
error:
jszip: "JSZip n'a pas pu ouvrir le fichier !"
license:
title: "Licences"
text:
1: "Cet outil utilise la bibliothèque <a href=\"https://stuk.github.io/jszip/\">JSZip</a>,
qui est distribuée sous licence <a href=\"https://github.com/Stuk/jszip/blob/main/LICENSE.markdown\">MIT</a>."
2: "Le reste du code de cet outil est placé dans le <a href=\"https://github.com/aziascreations/Web-NibblePoker\">domaine public</a>."

View File

@@ -24,25 +24,32 @@ showcase.title: Vitrine
updates.title: Updates updates.title: Updates
updates.text.privacy: Mise-à-jour de notre politique de confidentialité. updates.text.privacy: Mise-à-jour de notre politique de confidentialité.
updates.5.date: 30 mars 2025 updates:
updates.5.text.1: Refonte complète du site pour utiliser un style standardisé. 5:
updates.5.text.2: Changements de certains providers de VPS pour <a href="https://hosteam.pl/">HosTeam</a>. date: 30 mars 2025
text:
updates.4.date: 30 novembre 2023 1: Refonte complète du site pour utiliser un style standardisé.
updates.4.text.1: Centralisation des serveurs DNS & implémentation de GeoDNS. 2: Changements de certains providers de VPS pour <a href="https://hosteam.pl/">HosTeam</a>.
updates.4.text.2: Ajout d'un CDN pour l'Amérique du Nord hébergé par <a href="https://www.chicagovps.net/">ChicagoVPS</a>. 4:
updates.4.text.3: Les autres régions utilisent le CDN Européen hébergé par IONOS. date: 30 novembre 2023
text:
updates.3.date: 12 novembre 2023 1: Centralisation des serveurs DNS & implémentation de GeoDNS.
updates.3.text.1: Les services annexes sont disponibles. 2: Ajout d'un CDN pour l'Amérique du Nord hébergé par <a href="https://www.chicagovps.net/">ChicagoVPS</a>.
updates.3.text.2: Changement d'hébergeur vers IONOS. 3: Les autres régions utilisent le CDN Européen hébergé par IONOS.
updates.3.text.3: Finition des pages annexes. 3:
date: 12 novembre 2023
updates.2.date: 15 août 2023 text:
updates.2.text.1: Le site internet est à nouveau disponible. 1: Les services annexes sont disponibles.
updates.2.text.2: Mise en place d'un nouveau design plus léger. 2: Changement d'hébergeur vers IONOS.
updates.2.text.3: Changement d'hébergeur vers HostBrr. 3: Finition des pages annexes.
updates.2.text.4: Ajout d'une nouvelle section pour les outils. 2:
date: 15 août 2023
updates.1.date: 9 septembre 2022 text:
updates.1.text.1: Changement d'hébergeur vers v6Node. 1: Le site internet est à nouveau disponible.
2: Mise en place d'un nouveau design plus léger.
3: Changement d'hébergeur vers HostBrr.
4: Ajout d'une nouvelle section pour les outils.
1:
date: 9 septembre 2022
text:
1: Changement d'hébergeur vers v6Node.

View File

@@ -21,8 +21,7 @@ option.human.format.none: "Aucun formatage"
option.human.format.standard: "Utiliser le format standard des pays" option.human.format.standard: "Utiliser le format standard des pays"
option.human.format.4by4: "Formater en segments de 4 caractères" option.human.format.4by4: "Formater en segments de 4 caractères"
license.1: "Le code de ce projet est publié dans le domaine public." license.1: "Le code de ce projet est publié dans le <a href=\"https://github.com/aziascreations/Web-NibblePoker\">domaine public</a>."
license.2: "Le code source original peut être trouvé sur <a href=\"https://github.com/aziascreations/Web-NibblePoker\">GitHub</a>." license.2: "Les données du
license.3: "Les données du
<a href=\"https://www.swift.com/standards/data-standards/iban-international-bank-account-number\">Registre IBAN</a> <a href=\"https://www.swift.com/standards/data-standards/iban-international-bank-account-number\">Registre IBAN</a>
de Swift ont également été utilisées et peuvent être soumises à des conditions de licence différentes." de Swift ont également été utilisées et peuvent être soumises à des conditions de licence différentes."

View File

@@ -0,0 +1,49 @@
# PEArch - FR
meta:
title: "PEArch"
description: "Outil pour invité de commande qui vous indique l'architecture de CPU pour laquelle un executable a été compilé."
intro:
title: "Introduction"
text:
p1:
l1: A small tool that tells you which
<a href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#machine-types">CPU architecture</a>
a given <a href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format">Windows PE</a> is made for.
p2:
l1: Un total de 35 architectures sont supportées par cet outil.
usage:
title: "Utilisation"
text:
p1:
l1: "Cet outil peut soit être utilisé dans un invité de commande avec les options ci-dessous."
l2: "Ou alors, vous pouvez simplement déposer un fichier sur le <span class=\"code\">.exe</span> ou un raccourci, et avoir le même résultat."
details:
#disclaimer: Les codes d'architecture, ainsi que leur descriptions, sont tirés de ceux de Microsoft sur
# <a href="https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#machine-types">MSDN</a>.
title: "Cliquez ici pour afficher/cacher les codes d'architecture et de retour"
thead:
code: "<span class=\"t-monospace\">STDOUT</span>"
hex: "<span class=\"t-monospace\">STDOUT</span> avec <span class=\"t-monospace\">/AsHex</span>"
dec: "<span class=\"t-monospace\">STDERR</span> avec <span class=\"t-monospace\">/AsError</span>"
description: "Description <i>(Source: <a href=\"https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#machine-types\">MSDN</a>)</i>"
output:
title: "Examples d'exécution"
default:
title: "Sans options:"
options:
title: "Avec <span class=\"code\">/AsHex</span> et <span class=\"code\">/AsError</span>:"
downloads:
title: "Téléchargements"
license:
title: "Licence"
text: "Ce programme, ainsi que son code-source sont dans le domaine public (CC0 1.0 Universal)."
links:
title: "Liens"

View File

@@ -17,3 +17,5 @@ generate: "Générer"
download.raw: "Brut" download.raw: "Brut"
download.json: "JSON" download.json: "JSON"
download.yaml: "YAML" download.yaml: "YAML"
license.1: "Cet outil et son code-source sont publié dans le <a href=\"https://github.com/aziascreations/Web-NibblePoker\">domaine public</a>."

View File

@@ -28,4 +28,4 @@ tools:
title_key: "meta.title" title_key: "meta.title"
subtitle_key: "article.subtitle" subtitle_key: "article.subtitle"
tags: tags:
- "undefined" - "graphics"

View File

@@ -24,7 +24,7 @@ metadata:
title_key: "meta.title" title_key: "meta.title"
subtitle_key: "article.subtitle" subtitle_key: "article.subtitle"
tags: tags:
- "undefined" - "graphics"
resources: resources:
scripts: scripts:
- "svg-to-png.mjs" - "svg-to-png.mjs"

View File

@@ -27,4 +27,5 @@ tools:
title_key: "meta.title" title_key: "meta.title"
subtitle_key: "article.subtitle" subtitle_key: "article.subtitle"
tags: tags:
- "undefined" - "graphics"
- "analyser"

View File

@@ -1,3 +1,5 @@
# This docker-compose file should only be used for development !
services: services:
www_nibblepoker_lu: www_nibblepoker_lu:
container_name: www-nibblepoker-python container_name: www-nibblepoker-python

View File

@@ -1,13 +1,23 @@
# Website - NibblePoker.lu # Website - NibblePoker.lu
Public repository containing the source code for the *nibblepoker.lu* & *nibblepoker.com* websites. Public repository containing the source code for [nibblepoker.lu](https://nibblepoker.lu/) &
[nibblepoker.com](https://nibblepoker.com/).
## Features ## Features
TODO * Projects
* [CircuitPython - Ebyte E32 Driver](https://nibblepoker.lu/content/circuitpython-ebyte-e32/)
* [DotNet-ListComPort](https://nibblepoker.lu/content/lscom-cli-dotnet/)
* [Mini Dockerized CCTV NVR](https://nibblepoker.lu/content/docker-mini-cctv-nvr/)
* [PEArch](https://nibblepoker.lu/content/pearch/)
* Web-based Tools
* [Excel Password Remover](https://nibblepoker.lu/tools/excel-password-remover/)
* [IBAN Generator](https://nibblepoker.lu/tools/iban-generator/)
* [UUID Generator](https://nibblepoker.lu/tools/uuid-generator/)
* [VAT Calculator](https://nibblepoker.lu/tools/vat-calculator/)
## Related Projects ## Related Projects
TODO * [aziascreations/Excel-Worksheet-Password-Remover](https://github.com/aziascreations/Excel-Worksheet-Password-Remover)
## Local Setup ## Local Setup

View File

@@ -1,771 +0,0 @@
{
"name": "scripts",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"devDependencies": {
"browserify": "^17.0.1",
"html-minifier-terser": "^7.2.0",
"minify": "^10.2.0",
"rollup": "^4.48.1",
"sass": "^1.63.6",
"terser": "^5.19.0",
"typescript": "^5.1.6"
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
"integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/set-array": "^1.2.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.24"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/set-array": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
"integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@putout/minify": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/@putout/minify/-/minify-2.11.0.tgz",
"integrity": "sha512-HNOICCQIwKqjz9MZxQimWI8c3PvoehY4qlg5N5/tCWT+JJfZQUiRWQgm6RQ9rP85ReoSO20HShH22naVMpbFog==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=16"
}
},
"node_modules/acorn": {
"version": "8.12.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
"integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
"dev": true,
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"license": "ISC",
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/braces": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"license": "MIT",
"dependencies": {
"fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true,
"license": "MIT"
},
"node_modules/camel-case": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
"integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
"dev": true,
"license": "MIT",
"dependencies": {
"pascal-case": "^3.1.2",
"tslib": "^2.0.3"
}
},
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/clean-css": {
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
"integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
"dev": true,
"license": "MIT",
"dependencies": {
"source-map": "~0.6.0"
},
"engines": {
"node": ">= 10.0"
}
},
"node_modules/commander": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14"
}
},
"node_modules/css-b64-images": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/css-b64-images/-/css-b64-images-0.2.5.tgz",
"integrity": "sha512-TgQBEdP07adhrDfXvI5o6bHGukKBNMzp2Ngckc/6d09zpjD2gc1Hl3Ca1CKgb8FXjHi88+Phv2Uegs2kTL4zjg==",
"dev": true,
"bin": {
"css-b64-images": "bin/css-b64-images"
},
"engines": {
"node": "*"
}
},
"node_modules/debug": {
"version": "4.3.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz",
"integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/dot-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
"integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
"dev": true,
"license": "MIT",
"dependencies": {
"no-case": "^3.0.4",
"tslib": "^2.0.3"
}
},
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/find-up": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
"integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
"dev": true,
"license": "MIT",
"dependencies": {
"locate-path": "^7.1.0",
"path-exists": "^5.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/html-minifier-terser": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
"integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==",
"dev": true,
"license": "MIT",
"dependencies": {
"camel-case": "^4.1.2",
"clean-css": "~5.3.2",
"commander": "^10.0.0",
"entities": "^4.4.0",
"param-case": "^3.0.4",
"relateurl": "^0.2.7",
"terser": "^5.15.1"
},
"bin": {
"html-minifier-terser": "cli.js"
},
"engines": {
"node": "^14.13.1 || >=16.0.0"
}
},
"node_modules/immutable": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz",
"integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==",
"dev": true,
"license": "MIT"
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"license": "MIT",
"dependencies": {
"binary-extensions": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/jju": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
"integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==",
"dev": true,
"license": "MIT"
},
"node_modules/locate-path": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
"integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
"dev": true,
"license": "MIT",
"dependencies": {
"p-locate": "^6.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/lower-case": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
"integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
"dev": true,
"license": "MIT",
"dependencies": {
"tslib": "^2.0.3"
}
},
"node_modules/minify": {
"version": "10.5.2",
"resolved": "https://registry.npmjs.org/minify/-/minify-10.5.2.tgz",
"integrity": "sha512-/7aNrZ7kMe43o0NQUftL/H9QBi15FYEUo7tnw0Nrcc+XsmNS6nP4cIL4iqrNzSzv1rUaHLBxpmYbETKT9dKZiQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@putout/minify": "^2.0.0",
"clean-css": "^5.0.1",
"css-b64-images": "~0.2.5",
"debug": "^4.1.0",
"find-up": "^6.1.0",
"html-minifier-terser": "^7.1.0",
"readjson": "^2.2.2",
"simport": "^1.2.0",
"try-catch": "^3.0.0",
"try-to-catch": "^3.0.0"
},
"bin": {
"minify": "bin/minify.js"
},
"engines": {
"node": ">=16"
}
},
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true,
"license": "MIT"
},
"node_modules/no-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
"integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
"dev": true,
"license": "MIT",
"dependencies": {
"lower-case": "^2.0.2",
"tslib": "^2.0.3"
}
},
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/p-limit": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
"integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"yocto-queue": "^1.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-locate": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
"integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
"dev": true,
"license": "MIT",
"dependencies": {
"p-limit": "^4.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/param-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
"integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
"dev": true,
"license": "MIT",
"dependencies": {
"dot-case": "^3.0.4",
"tslib": "^2.0.3"
}
},
"node_modules/pascal-case": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
"integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
"dev": true,
"license": "MIT",
"dependencies": {
"no-case": "^3.0.4",
"tslib": "^2.0.3"
}
},
"node_modules/path-exists": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
"integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/readjson": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/readjson/-/readjson-2.2.2.tgz",
"integrity": "sha512-PdeC9tsmLWBiL8vMhJvocq+OezQ3HhsH2HrN7YkhfYcTjQSa/iraB15A7Qvt7Xpr0Yd2rDNt6GbFwVQDg3HcAw==",
"dev": true,
"license": "MIT",
"dependencies": {
"jju": "^1.4.0",
"try-catch": "^3.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/relateurl": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
"integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.10"
}
},
"node_modules/rollup": {
"version": "3.29.4",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
"integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
"dev": true,
"license": "MIT",
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
"node": ">=14.18.0",
"npm": ">=8.0.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/sass": {
"version": "1.77.8",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz",
"integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"chokidar": ">=3.0.0 <4.0.0",
"immutable": "^4.0.0",
"source-map-js": ">=0.6.2 <2.0.0"
},
"bin": {
"sass": "sass.js"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/simport": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/simport/-/simport-1.2.0.tgz",
"integrity": "sha512-85Bm7pKsqiiQ8rmYCaPDdlXZjJvuW6/k/FY8MTtLFMgU7f8S00CgTHfRtWB6KwSb6ek4p9YyG2enG1+yJbl+CA==",
"dev": true,
"license": "MIT",
"dependencies": {
"readjson": "^2.2.0",
"try-to-catch": "^3.0.0"
},
"engines": {
"node": ">=12.2"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-js": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true,
"license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/terser": {
"version": "5.31.6",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz",
"integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.8.2",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
"bin": {
"terser": "bin/terser"
},
"engines": {
"node": ">=10"
}
},
"node_modules/terser/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true,
"license": "MIT"
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/try-catch": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/try-catch/-/try-catch-3.0.1.tgz",
"integrity": "sha512-91yfXw1rr/P6oLpHSyHDOHm0vloVvUoo9FVdw8YwY05QjJQG9OT0LUxe2VRAzmHG+0CUOmI3nhxDUMLxDN/NEQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/try-to-catch": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/try-to-catch/-/try-to-catch-3.0.1.tgz",
"integrity": "sha512-hOY83V84Hx/1sCzDSaJA+Xz2IIQOHRvjxzt+F0OjbQGPZ6yLPLArMA0gw/484MlfUkQbCpKYMLX3VDCAjWKfzQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/tslib": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
"integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
"dev": true,
"license": "0BSD"
},
"node_modules/typescript": {
"version": "5.5.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
"integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/yocto-queue": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz",
"integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12.20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
}
}
}

View File

@@ -1,23 +1,43 @@
/* File inputs with drop thingy */ /* File inputs with drop thingy */
.np-file-input-drop-container { .np-file-input-drop-container {
position: relative; position: relative;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
overflow: hidden;
} }
.np-file-drop-text { input.np-file-input-drop {
position: absolute; position: absolute;
top: 50%; width: 100%;
left: 50%; height: 100%;
transform: translate(-50%, -50%); top: 0;
} left: 0;
input[type=file].np-file-input-drop {
opacity: 0; opacity: 0;
cursor: pointer; cursor: pointer;
} }
.np-file-drop-text {
text-align: center;
pointer-events: none;
}
.np-file-drop-buttons {
display: flex;
gap: 10px;
z-index: 10;
}
/* Top margin trimmer for heading renderer */ /* Top margin trimmer for heading renderer */
.t-v-center {
vertical-align: middle;
}
/* Copy of the m*-xs classes */ /* Copy of the m*-xs classes */
/* Accommodates the paragraph renderer that has a hard-coded .mt-xs */ /* Accommodates the paragraph renderer that has a hard-coded .mt-xs */
.content-spacer { .content-spacer {
@@ -29,3 +49,15 @@ input[type=file].np-file-input-drop {
margin-top: calc(1rem* 0.5); margin-top: calc(1rem* 0.5);
margin-bottom: calc(1rem* 0.5); margin-bottom: calc(1rem* 0.5);
} }
.hide-if-last:last-child {
display: none;
}
.hide-if-first:first-child {
display: none;
}
.mt-0-if-first:first-child {
margin-top: 0;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -28,7 +28,7 @@ export function initCore() {
//showContentModal(eContentModal); //showContentModal(eContentModal);
// FIXME: Fix this shit ! // FIXME: Fix the modals, this is hindering many things !
//[eContentModal, document.getElementById("modal-content-cross"), eContentModalInner].forEach(value => { //[eContentModal, document.getElementById("modal-content-cross"), eContentModalInner].forEach(value => {
// value.onclick = function() { // value.onclick = function() {
// fadeOut(eContentModal, 175).then(r => { // fadeOut(eContentModal, 175).then(r => {
@@ -47,8 +47,7 @@ export function initCore() {
});*/ });*/
// Setting up the file drop inputs // Setting up the file drop inputs
document.querySelectorAll(".np-file-input-root-container").forEach(eRootContainer => { document.querySelectorAll(".np-file-input-drop-container").forEach(eRootContainer => {
//console.log(eRootContainer);
/** @type {HTMLInputElement} */ /** @type {HTMLInputElement} */
const eFileDropInput = eRootContainer.querySelector("input[type=file]"); const eFileDropInput = eRootContainer.querySelector("input[type=file]");
@@ -58,7 +57,6 @@ export function initCore() {
/** @type {string} */ /** @type {string} */
const inputId = eFileDropInput.getAttribute("id"); const inputId = eFileDropInput.getAttribute("id");
//console.log(inputId);
/** @type {HTMLElement} */ /** @type {HTMLElement} */
const eFileDropTextEmpty = eRootContainer.querySelector(`#${inputId}-text-drop`); const eFileDropTextEmpty = eRootContainer.querySelector(`#${inputId}-text-drop`);
@@ -78,24 +76,29 @@ export function initCore() {
/** @type {NodeListOf<HTMLElement>} */ /** @type {NodeListOf<HTMLElement>} */
const eFileDropSelectionCounts = eRootContainer.querySelectorAll(`.np-file-drop-count`); const eFileDropSelectionCounts = eRootContainer.querySelectorAll(`.np-file-drop-count`);
function handleFileDropClear() {
eFileDropInput.value = '';
if(eFileDropTextSingle !== null) {
eFileDropTextSingle.hidden = true;
}
if(eFileDropTextMultiple !== null) {
eFileDropTextMultiple.hidden = true;
}
if(eFileDropTextEmpty !== null) {
eFileDropTextEmpty.hidden = false;
}
}
if(eFileDropAddButton !== null) { if(eFileDropAddButton !== null) {
eFileDropAddButton.addEventListener("click", function() { eFileDropAddButton.addEventListener("click", function() {
handleFileDropClear();
eFileDropInput.click(); eFileDropInput.click();
}); });
} }
if(eFileDropClearButton !== null) { if(eFileDropClearButton !== null) {
eFileDropClearButton.addEventListener("click", function() { eFileDropClearButton.addEventListener("click", function() {
eFileDropInput.value = ''; handleFileDropClear();
if(eFileDropTextSingle !== null) {
eFileDropTextSingle.hidden = true;
}
if(eFileDropTextMultiple !== null) {
eFileDropTextMultiple.hidden = true;
}
if(eFileDropTextEmpty !== null) {
eFileDropTextEmpty.hidden = false;
}
}); });
} }

View File

@@ -1 +0,0 @@
User-agent: * Allow: / Sitemap: https://nibblepoker.com/sitemap.txt

View File

@@ -1,51 +1,75 @@
<section id="{{ applet_data.id }}-eula"> <section id="{{ applet_data.id }}-eula" class="mt-l mt-0-if-first">
{{ render_h2(l10n("disclaimer.warning", "commons", user_lang)) }} {{ render_h2(l10n("disclaimer.warning", "commons", user_lang)) }}
{{ render_paragraph(l10n("eula.1", applet_data.id, user_lang)) }}
{{ render_paragraph(l10n("eula.2", applet_data.id, user_lang)) }} <div class="content-spacer">
{{ render_paragraph(l10n("eula.3", applet_data.id, user_lang)) }} {{ render_paragraph(l10n("eula.1", applet_data.id, user_lang)) }}
{{ render_paragraph(l10n("eula.2", applet_data.id, user_lang)) }}
{{ render_paragraph(l10n("eula.3", applet_data.id, user_lang)) }}
</div>
</section> </section>
<section id="{{ applet_data.id }}-input"> <section id="{{ applet_data.id }}-input" class="mt-l mt-0-if-first">
{{ render_h2(l10n("file.selection.title", applet_data.id, user_lang)) }} {{ render_h2(l10n("file.selection.title", applet_data.id, user_lang)) }}
{{ render_paragraph(l10n("file.selection.1", applet_data.id, user_lang)) }} <div class="content-spacer mt-s">
{{ render_file_input(
{{ render_file_input(applet_data.id + "-input-file", true, ".xlsx, .xlsm", true, true, user_lang) }} applet_data.id + "-input-file", true, ".xlsx, .xlsm", true, false, user_lang,
l10n("file.selection.1", applet_data.id, user_lang)) }}
</div>
</section> </section>
<section id="{{ applet_data.id }}-details"> <section id="{{ applet_data.id }}-details" class="mt-l mt-0-if-first">
{{ render_h2(l10n("details.title", applet_data.id, user_lang)) }} {{ render_h2(l10n("details.title", applet_data.id, user_lang)) }}
<div id="{{ applet_data.id }}-details-empty"> <div class="content-spacer mt-s">
{{ render_paragraph(l10n("details.empty.1", applet_data.id, user_lang)) }} <div id="{{ applet_data.id }}-details-empty">
</div> {{ render_paragraph(l10n("details.empty.1", applet_data.id, user_lang)) }}
</div>
<div id="{{ applet_data.id }}-details-populated" hidden> <div id="{{ applet_data.id }}-details-populated" hidden>
{{ render_button( {% if is_standalone %}
"<i class=\"fa-duotone fa-solid fa-floppy-disks mr-xs\"></i>" + {{ render_button(
l10n("download.action.all", "commons", user_lang), l10n("download.action.all", "commons", user_lang),
false, applet_data.id + "-files-download-all", "bkgd-green") }} false, applet_data.id + "-files-download-all", "bkgd-green") }}
{{ render_button( {{ render_button(
"<i class=\"fa-duotone fa-solid fa-trash mr-xs\"></i>" + l10n("clear.all.files", "commons", user_lang),
l10n("clear.all.files", "commons", user_lang), false, applet_data.id + "-files-clear", "bkgd-orange") }}
false, applet_data.id + "-files-clear", "bkgd-orange") }} {% else %}
</div> {{ render_button(
"<i class=\"fa-duotone fa-solid fa-floppy-disks mr-xs\"></i>" +
l10n("download.action.all", "commons", user_lang),
false, applet_data.id + "-files-download-all", "bkgd-green") }}
{{ render_button(
"<i class=\"fa-duotone fa-solid fa-trash mr-xs\"></i>" +
l10n("clear.all.files", "commons", user_lang),
false, applet_data.id + "-files-clear", "bkgd-orange") }}
{% endif %}
</div>
<div id="{{ applet_data.id }}-result-container"></div> <div id="{{ applet_data.id }}-result-container" class="mt-s"></div>
</div>
</section> </section>
<template id="tmpl-success-root"> <template id="tmpl-success-root">
<div class="bkgd-grid10 w-full r-l border cursor-pointer epr-download-all-click"> <div class="bkgd-grid10 w-full r-l border cursor-pointer epr-download-all-click mt-xs">
<table class="table-p-xxs table-v-center"> <table class="table-p-xxs table-v-center">
<tr> <tr>
<td rowspan="2" class="br bkgd-green bkgd-grid30 rl-l"> <td rowspan="2" class="br bkgd-green bkgd-grid30 rl-l">
<i class="fa-duotone fa-solid fa-circle-check mx-s"></i> {% if is_standalone %}
<span class="mx-xxs">✅</span>
{% else %}
<i class="fa-duotone fa-solid fa-circle-check mx-s"></i>
{% endif %}
</td> </td>
<td class="w-full t-bold"> <td class="w-full t-bold">
<span id="tmpl-success-filename">PlaceholderSuccessName.xlsx</span> <span id="tmpl-success-filename">PlaceholderSuccessName.xlsx</span>
</td> </td>
<td rowspan="2" class="bl bkgd-blue bkgd-grid30 rr-l"> <td rowspan="2" class="bl bkgd-blue bkgd-grid30 rr-l">
<i class="fa-duotone fa-download mx-s"></i> {% if is_standalone %}
<span class="mx-xxs">💾</span>
{% else %}
<i class="fa-duotone fa-download mx-s"></i>
{% endif %}
</td> </td>
</tr> </tr>
<tr class="t-italic"> <tr class="t-italic">
@@ -56,11 +80,15 @@
</template> </template>
<template id="tmpl-warning-root"> <template id="tmpl-warning-root">
<div class="bkgd-grid10 w-full r-l border"> <div class="bkgd-grid10 w-full r-l border mt-xs">
<table class="table-p-xxs table-v-center"> <table class="table-p-xxs table-v-center">
<tr> <tr>
<td rowspan="2" class="br bkgd-orange bkgd-grid30 rl-l"> <td rowspan="2" class="br bkgd-orange bkgd-grid30 rl-l">
<i class="fa-duotone fa-solid fa-triangle-exclamation mx-s"></i> {% if is_standalone %}
<span class="mx-xxs">⚠️</span>
{% else %}
<i class="fa-duotone fa-solid fa-triangle-exclamation mx-s"></i>
{% endif %}
</td> </td>
<td class="w-full t-bold"> <td class="w-full t-bold">
<span id="tmpl-warning-filename">PlaceholderWarningName.xlsx</span> <span id="tmpl-warning-filename">PlaceholderWarningName.xlsx</span>
@@ -81,11 +109,15 @@
</template> </template>
<template id="tmpl-error-root"> <template id="tmpl-error-root">
<div class="bkgd-grid10 w-full r-l border"> <div class="bkgd-grid10 w-full r-l border mt-xs">
<table class="table-p-xxs table-v-center"> <table class="table-p-xxs table-v-center">
<tr> <tr>
<td rowspan="2" class="br bkgd-red bkgd-grid30 rl-l"> <td rowspan="2" class="br bkgd-red bkgd-grid30 rl-l">
<i class="fa-duotone fa-solid fa-hexagon-exclamation mx-s"></i> {% if is_standalone %}
<span class="mx-xxs">❌</span>
{% else %}
<i class="fa-duotone fa-solid fa-hexagon-exclamation mx-s"></i>
{% endif %}
</td> </td>
<td class="w-full t-bold"> <td class="w-full t-bold">
<span id="tmpl-error-filename">PlaceholderErrorName.xlsx</span> <span id="tmpl-error-filename">PlaceholderErrorName.xlsx</span>
@@ -103,8 +135,13 @@
</template> </template>
{% if is_standalone %} {% if is_standalone %}
<section id="{{ applet_data.id }}-licenses"> <section id="{{ applet_data.id }}-licenses" class="mt-l mt-0-if-first">
{{ render_h2(l10n("licenses.title", applet_data.id, user_lang)) }} {{ render_h2(l10n("license.title", applet_data.id, user_lang)) }}
<p>123</p>
<div class="content-spacer">
{{ render_paragraph(
l10n("license.text.1", applet_data.id, user_lang) + "<br>" + l10n("license.text.2", applet_data.id, user_lang)
) }}
</div>
</section> </section>
{% endif %} {% endif %}

View File

@@ -192,7 +192,4 @@
{{ l10n("license.1", "iban-generator", user_lang) }}<br> {{ l10n("license.1", "iban-generator", user_lang) }}<br>
{{ l10n("license.2", "iban-generator", user_lang) }} {{ l10n("license.2", "iban-generator", user_lang) }}
</p> </p>
<p class="mt-xs t-muted">
{{ l10n("license.3", "iban-generator", user_lang) }}
</p>
{% endif %} {% endif %}

View File

@@ -27,13 +27,21 @@
<hr class="subtle"> <hr class="subtle">
<button id="uuid-generator-generate" class="p-xs r-s border b-light success"> <button id="uuid-generator-generate" class="p-xs r-s border b-light success">
<i class="fa-duotone fa-solid fa-gears mr-xs"></i>{{ l10n("action.generate", "commons", user_lang) }} {% if not is_standalone %}
<i class="fa-duotone fa-solid fa-gears mr-xs"></i>
{% endif %}
{{ l10n("action.generate", "commons", user_lang) }}
</button> </button>
<button class="p-xs r-s border b-light primary rr-0 br-0"> {% if not is_standalone %}
<i class="fa-duotone fa-solid fa-download"></i> <button class="p-xs r-s border b-light primary rr-0 br-0">
</button> <i class="fa-duotone fa-solid fa-download"></i>
<button id="uuid-generator-download-raw" class="p-xs r-s border b-light primary ml-0 r-0 br-0"> </button>
{% else %}
<span class="t-w-500 ml-m mr-xxs">{{ l10n("format.download.as", "commons", user_lang) }} :</span>
{% endif %}
<button id="uuid-generator-download-raw" class="p-xs r-s border b-light primary ml-0
{% if not is_standalone %}r-0{% else %}rr-0{% endif %} br-0">
{{ l10n("format.raw", "commons", user_lang) }} {{ l10n("format.raw", "commons", user_lang) }}
</button> </button>
<button id="uuid-generator-download-json" class="p-xs r-s border b-light primary ml-0 r-0 br-0"> <button id="uuid-generator-download-json" class="p-xs r-s border b-light primary ml-0 r-0 br-0">
@@ -47,3 +55,12 @@
<label for="uuid-generator-preview" class="d-none">{{ l10n("preview.label", "uuid-generator", user_lang) }}:</label> <label for="uuid-generator-preview" class="d-none">{{ l10n("preview.label", "uuid-generator", user_lang) }}:</label>
<textarea name="uuid-generator-preview" id="uuid-generator-preview" rows="16" class="w-full border r-s ta-resize-v"></textarea> <textarea name="uuid-generator-preview" id="uuid-generator-preview" rows="16" class="w-full border r-s ta-resize-v"></textarea>
{% if is_standalone %}
<hr class="subtle">
<p class="t-muted">
{{ l10n("license.1", "uuid-generator", user_lang) }}
</p>
{% endif %}

View File

@@ -11,7 +11,8 @@
<link rel="alternate icon" href="/favicon.ico"> <link rel="alternate icon" href="/favicon.ico">
<meta name="theme-color" content="#6F2F65"> <meta name="theme-color" content="#6F2F65">
<!--<link rel="dns-prefetch" href="https://cdn.nibblepoker.lu/"/>--> <link rel="dns-prefetch" href="https://cdn.nibblepoker.lu/"/>
<link rel="dns-prefetch" href="https://files.nibblepoker.lu/"/>
<link rel="preconnect" href="https://cdn.nibblepoker.{{ domain_tld }}/"/> <link rel="preconnect" href="https://cdn.nibblepoker.{{ domain_tld }}/"/>
<link rel="prefetch" href="https://cdn.nibblepoker.{{ domain_tld }}/FontAwesomePro/6.7.2/webfonts/fa-brands-400.woff2" as="font" /> <link rel="prefetch" href="https://cdn.nibblepoker.{{ domain_tld }}/FontAwesomePro/6.7.2/webfonts/fa-brands-400.woff2" as="font" />
@@ -21,7 +22,6 @@
<link rel="stylesheet" href="https://cdn.nibblepoker.{{ domain_tld }}/FontAwesomePro/6.7.2/css/all.min.css"> <link rel="stylesheet" href="https://cdn.nibblepoker.{{ domain_tld }}/FontAwesomePro/6.7.2/css/all.min.css">
<link rel="stylesheet" href="https://cdn.nibblepoker.{{ domain_tld }}/NibblePoker/StandardCSS/nibblepoker.min.css"> <link rel="stylesheet" href="https://cdn.nibblepoker.{{ domain_tld }}/NibblePoker/StandardCSS/nibblepoker.min.css">
<!--<link rel="stylesheet" href="https://cdn.nibblepoker.{{ domain_tld }}/Quantum/Quantum.min.css">-->
<link rel="stylesheet" href="https://cdn.nibblepoker.{{ domain_tld }}/FamFamFam/FlagsExtended/famfamfam-flags.min.css"> <link rel="stylesheet" href="https://cdn.nibblepoker.{{ domain_tld }}/FamFamFam/FlagsExtended/famfamfam-flags.min.css">
<link rel="stylesheet" href="{{ url_for("static", filename="resources/NibblePoker/css/extra.css") }}"> <link rel="stylesheet" href="{{ url_for("static", filename="resources/NibblePoker/css/extra.css") }}">

View File

@@ -1,63 +1,61 @@
<div class="np-file-input-root-container"> <div class="np-file-input-drop-container border r-m">
<!-- FIXME: Use the common renderer ! --> <input type="file"
{% if file_upload_button %} id="{{ file_input_id }}"
<button id="{{ file_input_id }}-add" class="p-xs r-s border btn-primary"> name="{{ file_input_id }}"
<i class="fa-duotone fa-solid fa-cloud-arrow-up mr-xxs"></i> {% if file_accept is not none %}accept="{{ file_accept }}"{% endif %}
{% if file_multiple %} class="np-file-input-drop w-full p-xl"
{{ l10n("file.drop.upload.multiple", "commons", user_lang) }} {% if file_multiple %}multiple{% endif %}>
{% else %}
{{ l10n("file.drop.upload.single", "commons", user_lang) }}
{% endif %}
</button>
{% endif %}
{% if file_clear_button %}
<button id="{{ file_input_id }}-reset" class="p-xs r-s border btn-warning">
{{ "<i class=\"fa-duotone fa-solid fa-trash mr-xs\"></i>" + l10n("file.drop.clear", "commons", user_lang) }}
</button>
{% endif %}
{% if file_upload_button or file_clear_button %} {% if file_upload_button or file_clear_button %}
<br> <p id="{{ file_input_id }}-text-drop"
class="np-file-drop-text pt-s mb-s">
{% if text_override == "" %}
{% if file_multiple %}
{{ l10n("file.drop.select.multiple", "commons", user_lang) }}
{% else %}
{{ l10n("file.drop.select.single", "commons", user_lang) }}
{% endif %}
{% else %}
{{ text_override }}
{% endif %}
</p>
<div class="np-file-drop-buttons pb-s">
{% if file_upload_button %}
<button id="{{ file_input_id }}-add" class="p-xs r-s border btn-primary np-file-drop-button">
{% if not is_standalone %}
<i class="fa-duotone fa-solid fa-cloud-arrow-up mr-xxs"></i>
{% endif %}
{% if file_multiple %}
{{ l10n("file.drop.upload.multiple", "commons", user_lang) }}
{% else %}
{{ l10n("file.drop.upload.single", "commons", user_lang) }}
{% endif %}
</button>
{% endif %}
{% if file_clear_button %}
<button id="{{ file_input_id }}-reset" class="p-xs r-s border btn-warning np-file-drop-button">
{% if not is_standalone %}
<i class="fa-duotone fa-solid fa-trash mr-xs"></i>
{% endif %}
{{ l10n("file.drop.clear", "commons", user_lang) }}
</button>
{% endif %}
</div>
{% else %}
<p class="np-file-drop-text py-l">
{% if text_override == "" %}
{% if file_multiple %}
{{ l10n("file.drop.select.multiple", "commons", user_lang) }}
{% else %}
{{ l10n("file.drop.select.single", "commons", user_lang) }}
{% endif %}
{% else %}
{{ text_override }}
{% endif %}
</p>
{% endif %} {% endif %}
<div class="np-file-input-drop-container border r-s bkgd-blank">
<p class="np-file-drop-text"
id="{{ file_input_id }}-text-drop">
{% if file_multiple %}
{{ l10n("file.drop.select.multiple", "commons", user_lang) }}
{% else %}
{{ l10n("file.drop.select.single", "commons", user_lang) }}
{% endif %}
</p>
<p class="np-file-drop-text"
id="{{ file_input_id }}-text-file-single"
hidden>
{{ l10n("file.drop.selected.single", "commons", user_lang) }}
</p>
<p class="np-file-drop-text"
id="{{ file_input_id }}-text-file-multiple"
hidden>
{{ l10n("file.drop.selected.multiple", "commons", user_lang) }}
</p>
<label for="{{ file_input_id }}"
hidden>
{% if file_multiple %}
{{ l10n("file.drop.label.multiple", "commons", user_lang) }}
{% else %}
{{ l10n("file.drop.label.single", "commons", user_lang) }}
{% endif %}
</label>
<input type="file"
id="{{ file_input_id }}"
name="{{ file_input_id }}"
{% if file_accept is not none %}accept="{{ file_accept }}"{% endif %}
class="np-file-input-drop w-full p-l"
{% if file_multiple %}multiple{% endif %}
/>
</div>
</div> </div>

View File

@@ -8,7 +8,7 @@
{% elif heading_level == 4 %} {% elif heading_level == 4 %}
mt-m mt-m
{% endif %} {% endif %}
{{ heading_background_class }}"> {{ heading_background_class }} mt-0-if-first">
<h{{ heading_level }} class="t-w-500 <h{{ heading_level }} class="t-w-500
{% if heading_level == 2 %} {% if heading_level == 2 %}
@@ -28,7 +28,7 @@
{{ heading_inner_html }} {{ heading_inner_html }}
{% if heading_right_html is not none %} {% if heading_right_html is not none %}
<span class="ml-auto mobile-hide t-size-10 t-muted">{{ heading_right_html }}</span> <!--<span class="ml-auto mobile-hide t-size-10 t-muted">{{ heading_right_html }}</span>-->
{% endif %} {% endif %}
</h{{ heading_level }}> </h{{ heading_level }}>

View File

@@ -1,7 +1,6 @@
{% extends "base_www.jinja" %} {% extends "base_www.jinja" %}
{% block main_content %} {% block main_content %}
{% block content_filters %}{% endblock %} <!--{% block content_filters %}{% endblock %}-->
<!--<hr class="subtle">-->
{% block content_listing %}{% endblock %} {% block content_listing %}{% endblock %}
{% endblock %} {% endblock %}

View File

@@ -9,93 +9,105 @@
{% block main_content %} {% block main_content %}
{{ render_h1(l10n("intro.title", "about", user_lang)) }} <section class="mt-l mt-0-if-first">
<img src="/resources/NibblePoker/images/about/profile-pic.jpg" {{ render_h1(l10n("intro.title", "about", user_lang)) }}
alt="" class="r-r img-profile f-right m-xs ml-xxs" <div class="content-spacer">
draggable="false"> <img src="/resources/NibblePoker/images/about/profile-pic.jpg"
{{ render_paragraph(l10n("intro.text.01", "about", user_lang) + l10n("intro.text.02", "about", user_lang)) }} alt="" class="r-r img-profile f-right m-xs ml-xxs"
{{ render_paragraph(l10n("intro.text.10", "about", user_lang) + l10n("intro.text.11", "about", user_lang)) }} draggable="false">
{{ render_paragraph(l10n("intro.text.20", "about", user_lang) + l10n("intro.text.21", "about", user_lang)) }} {{ render_paragraph(l10n("intro.text.p1.l1", "about", user_lang)) }}
{{ render_paragraph(l10n("intro.text.p3.l1", "about", user_lang) + "<br>" + l10n("intro.text.p3.l2", "about", user_lang)) }}
</div>
</section>
<!--{{ render_h1(l10n("tenets.title", "about", user_lang)) }} <section class="mt-l mt-0-if-first">
<p class="mt-xs ml-s t-bold"> {{ render_h1(l10n("future.title", "about", user_lang)) }}
TODO <div class="content-spacer">
</p>--> {{ render_paragraph(l10n("future.text.p1.l1", "about", user_lang) + "<br>" + l10n("future.text.p1.l2", "about", user_lang)) }}
{{ render_paragraph(l10n("future.text.p2.l1", "about", user_lang)) }}
{{ render_paragraph(l10n("future.text.p3.l1", "about", user_lang)) }}
</div>
</section>
{{ render_h1(l10n("future.title", "about", user_lang)) }} <section class="mt-l mt-0-if-first">
{{ render_paragraph(l10n("future.text.01", "about", user_lang) + l10n("future.text.02", "about", user_lang)) }} {{ render_h1(l10n("financing.title", "about", user_lang)) }}
{{ render_paragraph(l10n("future.text.10", "about", user_lang)) }} <div class="content-spacer">
{{ render_paragraph(l10n("future.text.20", "about", user_lang)) }} {{ render_paragraph(l10n("financing.text.p1.l1", "about", user_lang) + "<br>" + l10n("financing.text.p1.l2", "about", user_lang)) }}
{{ render_paragraph(l10n("financing.text.p2.l1", "about", user_lang)) }}
{{ render_paragraph(l10n("financing.text.p3.l1", "about", user_lang) + "<br>" + l10n("financing.text.p3.l2", "about", user_lang)) }}
</div>
</section>
{{ render_h1(l10n("financing.title", "about", user_lang)) }} <section class="mt-l mt-0-if-first">
{{ render_paragraph(l10n("financing.text.01", "about", user_lang) + l10n("financing.text.02", "about", user_lang)) }} <div class="grid grid-col-2 grid-col-medium-1 grid-gap-m">
{{ render_paragraph(l10n("financing.text.10", "about", user_lang)) }} <div>
{{ render_paragraph(l10n("financing.text.20", "about", user_lang) + l10n("financing.text.21", "about", user_lang)) }} <table class="table-stylish table-p-xs border r-l w-full">
<thead>
<tr>
<th>{{ l10n("financing.part.service", "about", user_lang) }}</th>
<th>{{ l10n("financing.part.cost.yearly", "about", user_lang) }}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ l10n("financing.part.domain.lu", "about", user_lang) }}</td>
<td>19,99 €</td>
</tr>
<tr>
<td>{{ l10n("financing.part.domain.com", "about", user_lang) }}</td>
<td>13,49 €</td>
</tr>
<tr>
<td>{{ l10n("financing.part.proxy.europe", "about", user_lang) }}</td>
<td>348 PLN / &pm;81,84 €</td>
</tr>
<tr>
<td>{{ l10n("financing.part.proxy.america", "about", user_lang) }}</td>
<td>13,00 €</td>
</tr>
<tr>
<td>{{ l10n("financing.part.electricity", "about", user_lang) }}</td>
<td>&pm;32,00 €</td>
</tr>
<tr>
<td><b class="f-right">{{ l10n("financing.part.cost.yearly.total", "about", user_lang) }}:</b></td>
<td>&pm;160,32 €</td>
</tr>
</tbody>
</table>
</div>
<div>
<table class="table-stylish table-p-xs border r-l w-full">
<thead>
<tr>
<th>{{ l10n("financing.part.equipment", "about", user_lang) }}</th>
<th>{{ l10n("financing.part.cost", "about", user_lang) }}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ l10n("financing.part.nanopir4s", "about", user_lang) }}</td>
<td>&pm;80,00 €</td>
</tr>
<tr>
<td>{{ l10n("financing.part.storage", "about", user_lang) }}</td>
<td>&pm;10,00 €</td>
</tr>
<tr>
<td><b class="f-right">{{ l10n("financing.part.cost.total", "about", user_lang) }}:</b></td>
<td>&pm;90,00 €
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p class="mt-xs ml-s t-super-muted t-center">
{{ l10n("financing.text.isp", "about", user_lang) }}
</p>
</section>
<div class="grid col-2 col-medium-1">
<table class="stylish r-s border o-hidden table-p-xs table-h-p-s table-v-center mt-s mx-s">
<thead>
<tr>
<th>{{ l10n("financing.part.service", "about", user_lang) }}</th>
<th>{{ l10n("financing.part.cost.yearly", "about", user_lang) }}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ l10n("financing.part.domain.lu", "about", user_lang) }}</td>
<td>17,00 €</td>
</tr>
<tr>
<td>{{ l10n("financing.part.domain.com", "about", user_lang) }}</td>
<td>14,50 €</td>
</tr>
<tr>
<td>{{ l10n("financing.part.proxy.europe", "about", user_lang) }}</td>
<td>14,50 €</td>
</tr>
<tr>
<td>{{ l10n("financing.part.proxy.america", "about", user_lang) }}</td>
<td>13,00 €</td>
</tr>
<tr>
<td>{{ l10n("financing.part.electricity", "about", user_lang) }}</td>
<td>&pm;32,00 €</td>
</tr>
<tr>
<td><b class="f-right">{{ l10n("financing.part.cost.yearly.total", "about", user_lang) }}:</b></td>
<td>&pm;89,00 €</td>
</tr>
</tbody>
</table>
<table class="stylish r-s border o-hidden table-p-xs table-h-p-s table-v-center mt-s mx-s">
<thead>
<tr>
<th>{{ l10n("financing.part.equipment", "about", user_lang) }}</th>
<th>{{ l10n("financing.part.cost", "about", user_lang) }}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ l10n("financing.part.nanopir4s", "about", user_lang) }}</td>
<td>&pm;80,00 €</td>
</tr>
<tr>
<td>{{ l10n("financing.part.storage", "about", user_lang) }}</td>
<td>&pm;10,00 €</td>
</tr>
<tr>
<td><b class="f-right">{{ l10n("financing.part.cost.total", "about", user_lang) }}:</b></td>
<td>&pm;90,00 €
</td>
</tr>
</tbody>
</table>
</div>
<p class="mt-xs ml-s t-super-muted t-center">
{{ l10n("financing.text.isp", "about", user_lang) }}
</p>
{% endblock %} {% endblock %}
{% block extra_scripts %} {% block extra_scripts %}

View File

@@ -8,24 +8,23 @@
{% endblock %} {% endblock %}
{% block main_content %} {% block main_content %}
{{ render_h1(l10n("email.title", "contact", user_lang), "fad fa-mail-bulk", "herwin.bozet@gmail.com") }} <section class="mt-l mt-0-if-first">
<p class="m-s"> {{ render_h1(l10n("email.title", "contact", user_lang), "fad fa-mail-bulk", "herwin.bozet@nibblepoker.lu") }}
<a href="mailto:Herwin Bozet<herwin.bozet@nibblepoker.lu>?subject=Contact%20via%20NibblePoker.lu" class="a-hidden button-link"> <p class="m-s">
<button class="p-xs r-s border b-light success"><i class="fad fa-external-link-alt mr-xs"></i>{{ l10n("email.compose.nibblepoker", "contact", user_lang) }}</button> <a href="mailto:Herwin Bozet<herwin.bozet@nibblepoker.lu>?subject=Contact%20via%20NibblePoker.lu" class="a-hidden button-link">
</a> <button class="p-xs r-s border b-light success"><i class="fad fa-external-link-alt mr-xs"></i>{{ l10n("email.compose.nibblepoker", "contact", user_lang) }}</button>
</p> </a>
<!--<p class="m-s"> </p>
<a href="mailto:Herwin Bozet<herwin.bozet@gmail.com>?subject=Contact%20via%20NibblePoker.lu" class="a-hidden button-link"> </section>
<button class="p-xs r-s border b-light success"><i class="fad fa-external-link-alt mr-xs"></i>{{ l10n("email.compose", "contact", user_lang) }}</button>
</a>
</p>-->
{{ render_h1(l10n("twitter.title", "contact", user_lang), "fab fa-twitter", "@NibblePoker") }} <section class="mt-l mt-0-if-first">
<p class="m-s"> {{ render_h1(l10n("twitter.title", "contact", user_lang), "fab fa-x-twitter", "@NibblePoker") }}
<a href="https://twitter.com/messages/compose?recipient_id=937370791334895616" class="a-hidden button-link"> <p class="m-s">
<button class="p-xs r-s border b-light primary"><i class="fad fa-external-link-alt mr-xs"></i>{{ l10n("twitter.compose", "contact", user_lang) }}</button> <a href="https://twitter.com/messages/compose?recipient_id=937370791334895616" class="a-hidden button-link">
</a> <button class="p-xs r-s border b-light primary"><i class="fad fa-external-link-alt mr-xs"></i>{{ l10n("twitter.compose", "contact", user_lang) }}</button>
</p> </a>
</p>
</section>
{% endblock %} {% endblock %}

View File

@@ -12,55 +12,61 @@
{% endblock %} {% endblock %}
{% block main_content %} {% block main_content %}
{{ render_h1(l10n("social.title", "links", user_lang )) }} <section class="mt-l mt-0-if-first">
{{ render_h1(l10n("social.title", "links", user_lang )) }}
<p class="mt-s ml-s t-w-600 t-size-12"> <p class="mt-s ml-s t-w-600 t-size-12">
<i class="fab fa-twitter mr-xs"></i> <i class="fab fa-twitter mr-xs"></i>
<a href="https://twitter.com/NibblePoker">{{ l10n("twitter.title", "links", user_lang ) }}</a> <a href="https://twitter.com/NibblePoker">{{ l10n("twitter.title", "links", user_lang ) }}</a>
</p> </p>
<p class="mt-xxs ml-l">{{ l10n("twitter.text.1", "links", user_lang ) }}</p> <p class="mt-xxs ml-l">{{ l10n("twitter.text.1", "links", user_lang ) }}</p>
<p class="mt-s ml-s t-w-600 t-size-12"> <p class="mt-s ml-s t-w-600 t-size-12">
<i class="fab fa-github mr-xs"></i> <i class="fab fa-github mr-xs"></i>
<a href="https://github.com/aziascreations">{{ l10n("github.title", "links", user_lang ) }}</a> <a href="https://github.com/aziascreations">{{ l10n("github.title", "links", user_lang ) }}</a>
</p> </p>
<p class="mt-xxs ml-l">{{ l10n("github.text.1", "links", user_lang ) }}</p> <p class="mt-xxs ml-l">{{ l10n("github.text.1", "links", user_lang ) }}</p>
<p class="mt-s ml-s t-w-600 t-size-12"> <p class="mt-s ml-s t-w-600 t-size-12">
<i class="fab fa-github mr-xs"></i> <i class="fab fa-github mr-xs"></i>
<a href="https://github.com/NibblePoker">{{ l10n("github_pro.title", "links", user_lang ) }}</a> <a href="https://github.com/NibblePoker">{{ l10n("github_pro.title", "links", user_lang ) }}</a>
</p> </p>
<p class="mt-xxs ml-l">{{ l10n("github_pro.text.1", "links", user_lang ) }}</p> <p class="mt-xxs ml-l">{{ l10n("github_pro.text.1", "links", user_lang ) }}</p>
</section>
{{ render_h1(l10n("work.title", "links", user_lang )) }} <section class="mt-l mt-0-if-first">
{{ render_h1(l10n("work.title", "links", user_lang )) }}
<p class="mt-s ml-s t-w-600 t-size-12"> <p class="mt-s ml-s t-w-600 t-size-12">
<i class="fab fa-linkedin mr-xs"></i> <i class="fab fa-linkedin mr-xs"></i>
<a href="https://www.linkedin.com/in/herwin-bozet/">{{ l10n("linkedin.title", "links", user_lang ) }}</a> <a href="https://www.linkedin.com/in/herwin-bozet/">{{ l10n("linkedin.title", "links", user_lang ) }}</a>
</p> </p>
<p class="mt-xxs ml-l">{{ l10n("linkedin.text.1", "links", user_lang ) }}</p> <p class="mt-xxs ml-l">{{ l10n("linkedin.text.1", "links", user_lang ) }}</p>
</section>
{{ render_h1(l10n("misc.title", "links", user_lang )) }} <section class="mt-l mt-0-if-first">
{{ render_h1(l10n("misc.title", "links", user_lang )) }}
<p class="mt-s ml-s t-w-600 t-size-12"> <p class="mt-s ml-s t-w-600 t-size-12">
<i class="fad fa-download mr-xs"></i> <i class="fad fa-download mr-xs"></i>
<a href="https://files.nibblepoker.lu/">{{ l10n("files.title", "links", user_lang ) }}</a> <a href="https://files.nibblepoker.lu/">{{ l10n("files.title", "links", user_lang ) }}</a>
</p> </p>
<p class="mt-xxs ml-l">{{ l10n("files.text.1", "links", user_lang ) }}</p> <p class="mt-xxs ml-l">{{ l10n("files.text.1", "links", user_lang ) }}</p>
<p class="mt-s ml-s t-w-600 t-size-12"> <p class="mt-s ml-s t-w-600 t-size-12">
<i class="fad fa-archive mr-xs"></i> <i class="fad fa-archive mr-xs"></i>
<a href="https://archives.nibblepoker.lu/">{{ l10n("archives.title", "links", user_lang ) }}</a> <a href="https://archives.nibblepoker.lu/">{{ l10n("archives.title", "links", user_lang ) }}</a>
</p> </p>
<p class="mt-xxs ml-l">{{ l10n("archives.text.1", "links", user_lang ) }}</p> <p class="mt-xxs ml-l">{{ l10n("archives.text.1", "links", user_lang ) }}</p>
<p class="mt-s ml-s t-w-600 t-size-12"> <p class="mt-s ml-s t-w-600 t-size-12">
<i class="fa-duotone fa-code-branch mr-xs"></i> <i class="fa-duotone fa-code-branch mr-xs"></i>
<a href="https://git.nibblepoker.lu/">{{ l10n("gitea.title", "links", user_lang ) }}</a> <a href="https://git.nibblepoker.lu/">{{ l10n("gitea.title", "links", user_lang ) }}</a>
</p> </p>
<p class="mt-xxs ml-l">{{ l10n("gitea.text.1", "links", user_lang ) }}</p> <p class="mt-xxs ml-l">{{ l10n("gitea.text.1", "links", user_lang ) }}</p>
</section>
{% endblock %} {% endblock %}
{% block extra_scripts %} {% block extra_scripts %}

View File

@@ -13,7 +13,7 @@
{% block main_content %} {% block main_content %}
<section> <section class="mt-l mt-0-if-first">
{{ render_h1(l10n("introduction.title", "privacy", user_lang), "fad fa-info") }} {{ render_h1(l10n("introduction.title", "privacy", user_lang), "fad fa-info") }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("introduction.text.1", "privacy", user_lang)) }} {{ render_paragraph(l10n("introduction.text.1", "privacy", user_lang)) }}
@@ -26,7 +26,7 @@
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h1(l10n("v2.data.title", "privacy", user_lang), "fad fa-database") }} {{ render_h1(l10n("v2.data.title", "privacy", user_lang), "fad fa-database") }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("v2.data.intro.1", "privacy", user_lang) + {{ render_paragraph(l10n("v2.data.intro.1", "privacy", user_lang) +
@@ -51,7 +51,7 @@
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h1(l10n("v2.data_dns.title", "privacy", user_lang), "fad fa-database") }} {{ render_h1(l10n("v2.data_dns.title", "privacy", user_lang), "fad fa-database") }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("v2.data_dns.intro.1", "privacy", user_lang) + {{ render_paragraph(l10n("v2.data_dns.intro.1", "privacy", user_lang) +
@@ -73,7 +73,7 @@
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h1(l10n("v2.third.title", "privacy", user_lang), "fad fa-handshake") }} {{ render_h1(l10n("v2.third.title", "privacy", user_lang), "fad fa-handshake") }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("v3.third.intro.1", "privacy", user_lang)) }} {{ render_paragraph(l10n("v3.third.intro.1", "privacy", user_lang)) }}
@@ -81,7 +81,7 @@
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h1(l10n("v2.cookies.title", "privacy", user_lang), "fad fa-cookie-bite") }} {{ render_h1(l10n("v2.cookies.title", "privacy", user_lang), "fad fa-cookie-bite") }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("v2.cookies.intro.1", "privacy", user_lang)) }} {{ render_paragraph(l10n("v2.cookies.intro.1", "privacy", user_lang)) }}
@@ -89,7 +89,7 @@
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h1(l10n("v2.update.title", "privacy", user_lang), "fad fa-sync-alt") }} {{ render_h1(l10n("v2.update.title", "privacy", user_lang), "fad fa-sync-alt") }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("v2.update.intro.1", "privacy", user_lang)) }} {{ render_paragraph(l10n("v2.update.intro.1", "privacy", user_lang)) }}
@@ -161,7 +161,7 @@
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h1(l10n("contact.title", "privacy", user_lang), "fad fa-mailbox") }} {{ render_h1(l10n("contact.title", "privacy", user_lang), "fad fa-mailbox") }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("contact.text.1", "privacy", user_lang) + {{ render_paragraph(l10n("contact.text.1", "privacy", user_lang) +
@@ -170,7 +170,7 @@
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h1(l10n("complaint.title", "privacy", user_lang), "fad fa-gavel") }} {{ render_h1(l10n("complaint.title", "privacy", user_lang), "fad fa-gavel") }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("complaint.text.1", "privacy", user_lang)) }} {{ render_paragraph(l10n("complaint.text.1", "privacy", user_lang)) }}

View File

@@ -16,7 +16,7 @@
{% for project_data in get_sorted_projects_by_tags(requested_tags) %} {% for project_data in get_sorted_projects_by_tags(requested_tags) %}
<hr class="subtle"> <hr class="subtle hide-if-first">
<!--<div class="p-s border r-m">--> <!--<div class="p-s border r-m">-->
<div class="p-xs r-m"> <div class="p-xs r-m">

View File

@@ -12,7 +12,7 @@
{% endblock %} {% endblock %}
{% block main_content %} {% block main_content %}
<section> <section class="mt-l mt-0-if-first">
{{ render_h1(l10n("intro.title", "home", user_lang, ["NibblePoker." + domain_tld] )) }} {{ render_h1(l10n("intro.title", "home", user_lang, ["NibblePoker." + domain_tld] )) }}
<div class="content-spacer"> <div class="content-spacer">
@@ -21,7 +21,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("updates.title", "home", user_lang)) }} {{ render_h2(l10n("updates.title", "home", user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">

View File

@@ -9,13 +9,34 @@
{% endblock %} {% endblock %}
{% block content_filters %} {% block content_filters %}
[Tools filters here !] <details class="border bkgd-dark r-m mb-s">
<summary class="p-xs t-noselect">{{ l10n("filters.summary", "content", user_lang) }}</summary>
<div class="p-xs bt bkgd-grey rb-m">
{% for linked_tag in get_tools_linked_tags(requested_tags) %}
<span class="mr-s t-size-10">
<a href="{{ l10n_url_abs('/tools/?tags=' + linked_tag, raw_lang) }}">#{{ linked_tag }}</a>
(+)
</span>
{% endfor %}
<hr class="subtle hide-if-last hide-if-first">
{% for unlinked_tag in get_tools_unlinked_tags(requested_tags) %}
<span class="mr-s">
<a href="{{ l10n_url_abs('/tools/?tags=' + unlinked_tag, raw_lang) }}">#{{ unlinked_tag }}</a>
(+)
</span>
{% endfor %}
</div>
</details>
{% endblock %} {% endblock %}
{% block content_listing %} {% block content_listing %}
{% for tool_data in get_sorted_tools_by_tags(requested_tags) %} {% for tool_data in get_sorted_tools_by_tags(requested_tags) %}
<hr class="subtle"> <hr class="subtle hide-if-first">
<!--<div class="p-s border r-m">--> <!--<div class="p-s border r-m">-->
<div class="p-xs r-m"> <div class="p-xs r-m">

View File

@@ -45,7 +45,7 @@
l10n(project_data.metadata.general.title_key, project_id, user_lang) l10n(project_data.metadata.general.title_key, project_id, user_lang)
) }} ) }}
<div class="px-xxs"> <div class="px-xxs mt-m">
{% block project_content %}{% endblock %} {% block project_content %}{% endblock %}
</div> </div>

View File

@@ -1,14 +1,14 @@
{% extends "projects/_project.jinja" %} {% extends "projects/_project.jinja" %}
{% block project_content %} {% block project_content %}
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("intro.title", project_id, user_lang)) }} {{ render_h2(l10n("intro.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("intro.p1", project_id, user_lang)) }} {{ render_paragraph(l10n("intro.p1", project_id, user_lang)) }}
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("features.title", project_id, user_lang)) }} {{ render_h2(l10n("features.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_list_ul([ {{ render_list_ul([
@@ -28,7 +28,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("limitations.title", project_id, user_lang)) }} {{ render_h2(l10n("limitations.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_list_ul([ {{ render_list_ul([
@@ -50,14 +50,14 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("doc.title", project_id, user_lang)) }} {{ render_h2(l10n("doc.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("doc.p1", project_id, user_lang)) }} {{ render_paragraph(l10n("doc.p1", project_id, user_lang)) }}
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("usage.title", project_id, user_lang)) }} {{ render_h2(l10n("usage.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("usage.p1", project_id, user_lang)) }} {{ render_paragraph(l10n("usage.p1", project_id, user_lang)) }}
@@ -99,7 +99,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("demo.title", project_id, user_lang)) }} {{ render_h2(l10n("demo.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("demo.p1", project_id, user_lang)) }} {{ render_paragraph(l10n("demo.p1", project_id, user_lang)) }}
@@ -114,7 +114,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("downloads.title", project_id, user_lang)) }} {{ render_h2(l10n("downloads.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
<table class="table-stylish table-p-xs table-v-center border r-l"> <table class="table-stylish table-p-xs table-v-center border r-l">
@@ -207,7 +207,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("license.title", project_id, user_lang)) }} {{ render_h2(l10n("license.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph( {{ render_paragraph(
@@ -218,7 +218,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("links.title", project_id, user_lang)) }} {{ render_h2(l10n("links.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_list_ul([ {{ render_list_ul([

View File

@@ -1,7 +1,7 @@
{% extends "projects/_project.jinja" %} {% extends "projects/_project.jinja" %}
{% block project_content %} {% block project_content %}
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("intro.title", project_id, user_lang)) }} {{ render_h2(l10n("intro.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("intro.1", project_id, user_lang)) }} {{ render_paragraph(l10n("intro.1", project_id, user_lang)) }}
@@ -9,7 +9,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("preamble.title", project_id, user_lang)) }} {{ render_h2(l10n("preamble.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("preamble.1", project_id, user_lang)) }} {{ render_paragraph(l10n("preamble.1", project_id, user_lang)) }}
@@ -17,7 +17,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("setup.title", project_id, user_lang)) }} {{ render_h2(l10n("setup.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("setup.1", project_id, user_lang)) }} {{ render_paragraph(l10n("setup.1", project_id, user_lang)) }}
@@ -25,7 +25,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h3(l10n("setup.camera.title", project_id, user_lang)) }} {{ render_h3(l10n("setup.camera.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("setup.camera.1", project_id, user_lang)) }} {{ render_paragraph(l10n("setup.camera.1", project_id, user_lang)) }}
@@ -51,7 +51,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h3(l10n("setup.cleaner.title", project_id, user_lang)) }} {{ render_h3(l10n("setup.cleaner.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("setup.cleaner.1", project_id, user_lang)) }} {{ render_paragraph(l10n("setup.cleaner.1", project_id, user_lang)) }}
@@ -77,7 +77,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h3(l10n("setup.web.title", project_id, user_lang)) }} {{ render_h3(l10n("setup.web.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("setup.web.1", project_id, user_lang)) }} {{ render_paragraph(l10n("setup.web.1", project_id, user_lang)) }}
@@ -109,7 +109,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("startup.title", project_id, user_lang)) }} {{ render_h2(l10n("startup.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("startup.1", project_id, user_lang)) }} {{ render_paragraph(l10n("startup.1", project_id, user_lang)) }}
@@ -121,7 +121,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("screenshots.title", project_id, user_lang)) }} {{ render_h2(l10n("screenshots.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_splide([ {{ render_splide([
@@ -131,7 +131,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("statistics.title", project_id, user_lang)) }} {{ render_h2(l10n("statistics.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_list_ul([ {{ render_list_ul([
@@ -162,14 +162,14 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("license.title", project_id, user_lang)) }} {{ render_h2(l10n("license.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("license.1", project_id, user_lang)) }} {{ render_paragraph(l10n("license.1", project_id, user_lang)) }}
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("links.title", project_id, user_lang)) }} {{ render_h2(l10n("links.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_list_ul([ {{ render_list_ul([

View File

@@ -1,7 +1,7 @@
{% extends "projects/_project.jinja" %} {% extends "projects/_project.jinja" %}
{% block project_content %} {% block project_content %}
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("intro.title", project_id, user_lang)) }} {{ render_h2(l10n("intro.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("intro.p1", project_id, user_lang)) }} {{ render_paragraph(l10n("intro.p1", project_id, user_lang)) }}
@@ -10,7 +10,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("requirements.title", project_id, user_lang)) }} {{ render_h2(l10n("requirements.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_list_ul([ {{ render_list_ul([
@@ -26,7 +26,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("improvements.title", project_id, user_lang)) }} {{ render_h2(l10n("improvements.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_list_ul([ {{ render_list_ul([
@@ -39,7 +39,7 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("screenshots.title", project_id, user_lang)) }} {{ render_h2(l10n("screenshots.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_splide([ {{ render_splide([
@@ -50,62 +50,62 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("usage.title", project_id, user_lang)) }} {{ render_h2(l10n("usage.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ {{
render_code_block([ render_code_block([
"lscom.exe [-a|--show-all] [-d|--show-device] [-D <str>|--divider <str>] [-f|--show-friendly]", "lscom.exe [-a|--show-all] [-d|--show-device] [-D <str>|--divider <str>] [-f|--show-friendly]",
" [-h|--help] [-H|--short-help] [-n|--show-name-raw] [-P|--no-pretty] [-s|--sort]", " [-h|--help] [-H|--short-help] [-n|--show-name-raw] [-P|--no-pretty] [-s|--sort]",
" [-S|--sort-reverse] [-t|--tab-padding] [-v|--version] [-V|--version-only]", " [-S|--sort-reverse] [-t|--tab-padding] [-v|--version] [-V|--version-only]",
"", "",
"Launch arguments:", "Launch arguments:",
" -a, --show-all Display the complete port's name (Equal to '-dfn')", " -a, --show-all Display the complete port's name (Equal to '-dfn')",
" -d, --show-device Displays the port's device name", " -d, --show-device Displays the port's device name",
" -D <str>, --divider <str> Uses the given string or char as a separator (Can be empty string !)", " -D <str>, --divider <str> Uses the given string or char as a separator (Can be empty string !)",
" -f, --show-friendly Displays the port's friendly name", " -f, --show-friendly Displays the port's friendly name",
" -h, --help Display this help text", " -h, --help Display this help text",
" -H, --short-help Display the short help text", " -H, --short-help Display the short help text",
" -n, --show-name-raw Displays the port's raw name (See remarks section)", " -n, --show-name-raw Displays the port's raw name (See remarks section)",
" -P, --no-pretty Disables the pretty printing format (Equal to -D \" \")", " -P, --no-pretty Disables the pretty printing format (Equal to -D \" \")",
" -s, --sort Sorts the port based on their raw names in an ascending order", " -s, --sort Sorts the port based on their raw names in an ascending order",
" -S, --sort-reverse Sorts the port based on their raw names in a descending order", " -S, --sort-reverse Sorts the port based on their raw names in a descending order",
" -t, --tab-padding Use tabs for padding between the types of names (Overrides '-D')", " -t, --tab-padding Use tabs for padding between the types of names (Overrides '-D')",
" -v, --version Shows the utility's version number and other info", " -v, --version Shows the utility's version number and other info",
" -V, --version-only Shows the utility's version number only (Overrides '-v')" " -V, --version-only Shows the utility's version number only (Overrides '-v')"
], None) ], None)
}} }}
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("formatting.title", project_id, user_lang)) }} {{ render_h2(l10n("formatting.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ {{
render_code_block([ render_code_block([
" *┬> No launch arguments:", " *┬> No launch arguments:",
" └──> ${Raw name} => COM1", " └──> ${Raw name} => COM1",
" *┬> '-d' or '-f'", " *┬> '-d' or '-f'",
" ├──> ${Device name} => \\Device\\Serial1", " ├──> ${Device name} => \\Device\\Serial1",
" └──> ${Friendly name} => Communications Port", " └──> ${Friendly name} => Communications Port",
" *┬> '-d' and '-f'", " *┬> '-d' and '-f'",
" └──> ${Friendly name} [${Device name}] => Communications Port [\\Device\\Serial1]", " └──> ${Friendly name} [${Device name}] => Communications Port [\\Device\\Serial1]",
" *┬> '-n' and '-d'", " *┬> '-n' and '-d'",
" └──> ${Raw name} [$DeviceName] => COM1 [\\Device\\Serial1]", " └──> ${Raw name} [$DeviceName] => COM1 [\\Device\\Serial1]",
" *┬> '-n' and '-f'", " *┬> '-n' and '-f'",
" └──> ${Raw name} - ${Friendly name} => COM1 - Communications Port", " └──> ${Raw name} - ${Friendly name} => COM1 - Communications Port",
" *┬> '-ndf' or '-a'", " *┬> '-ndf' or '-a'",
" └──> ${Raw name} - ${Friendly name} [${Device name}] => COM1 - Communications Port [\\Device\\Serial1]", " └──> ${Raw name} - ${Friendly name} [${Device name}] => COM1 - Communications Port [\\Device\\Serial1]",
" *┬> '-ndfp' or '-ap'", " *┬> '-ndfp' or '-ap'",
" └──> ${Raw name} ${Friendly name} ${Device name} => COM1 Communications Port \\Device\\Serial1", " └──> ${Raw name} ${Friendly name} ${Device name} => COM1 Communications Port \\Device\\Serial1",
" *┬> '-ndfD \";\"' or '-aD \";\"'", " *┬> '-ndfD \";\"' or '-aD \";\"'",
" └──> ${Raw name};${Friendly name};${Device name} => COM1;Communications Port;\\Device\\Serial1" " └──> ${Raw name};${Friendly name};${Device name} => COM1;Communications Port;\\Device\\Serial1"
], None) ], None)
}} }}
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("packages.title", project_id, user_lang)) }} {{ render_h2(l10n("packages.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_paragraph(l10n("packages.single.title", project_id, user_lang)) }} {{ render_paragraph(l10n("packages.single.title", project_id, user_lang)) }}
@@ -117,85 +117,179 @@
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("version.current", "commons", user_lang)) }} {{ render_h2(l10n("version.current", "commons", user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
<table class="table-stylish table-p-s border r-l"> <table class="table-stylish table-p-xs table-v-center border r-l">
<thead> <thead>
<tr> <tr>
<th>{{ l10n("cpu.architecture", "commons", user_lang) }}</th> <th>{{ l10n("cpu.architecture", "commons", user_lang) }}</th>
<th>{{ l10n("requirements", "commons", user_lang) }}</th> <th>{{ l10n("requirements", "commons", user_lang) }}</th>
<th>{{ l10n("download.multiple", "commons", user_lang) }}</th> <th>{{ l10n("download.multiple", "commons", user_lang) }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>{{ l10n("cpu.any", "commons", user_lang) }}</td> <td>{{ l10n("cpu.any", "commons", user_lang) }}</td>
<td>{{ l10n("requirements.text.dotnet", project_id, user_lang) }}</td> <td>{{ l10n("requirements.text.dotnet", project_id, user_lang) }}</td>
<td>...</td> <td>
</tr> <a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/ListComPort_v3.0.0_AnyCPU.zip" class="a-hidden">
<tr> {{ render_button(
<td rowspan="2">{{ l10n("cpu.x64", "commons", user_lang) }}</td> "<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>ZIP - 120.36 KiB<i class=\"fas fa-download ml-xs\"></i>",
<td>{{ l10n("requirements.text.dotnet", project_id, user_lang) }}</td> False, None)
<td>...</td> }}
</tr> </a>
<tr> </td>
<td>{{ l10n("none.fs", "commons", user_lang) }}</td> </tr>
<td>...</td>
</tr> <tr>
<tr> <td rowspan="2">{{ l10n("cpu.x64", "commons", user_lang) }}</td>
<td rowspan="2">{{ l10n("cpu.x86", "commons", user_lang) }}</td> <td>{{ l10n("requirements.text.dotnet", project_id, user_lang) }}</td>
<td>{{ l10n("requirements.text.dotnet", project_id, user_lang) }}</td> <td>
<td>...</td> <a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/ListComPort_v3.0.0_x64_Single.zip" class="a-hidden">
</tr> {{ render_button(
<tr> "<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>ZIP - 138.9 KiB<i class=\"fas fa-download ml-xs\"></i>",
<td>{{ l10n("none.fs", "commons", user_lang) }}</td> False, None)
<td>...</td> }}
</tr> </a>
<tr> </td>
<td rowspan="2">{{ l10n("cpu.arm64", "commons", user_lang) }}</td> </tr>
<td>{{ l10n("requirements.text.dotnet", project_id, user_lang) }}</td> <tr>
<td>...</td> <td>{{ l10n("none.fs", "commons", user_lang) }}</td>
</tr> <td>
<tr> <a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/ListComPort_v3.0.0_x64_SelfContained.zip" class="a-hidden mr-s">
<td>{{ l10n("none.fs", "commons", user_lang) }}</td> {{ render_button(
<td>...</td> "<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>ZIP - 7.35 MiB<i class=\"fas fa-download ml-xs\"></i>",
</tr> False, None)
<tr> }}
</a>
<a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/ListComPort_v3.0.0_x64.msi" class="a-hidden">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>MSI - 10.51 MiB<i class=\"fas fa-download ml-xs\"></i>",
False, None, "btn-primary")
}}
</a>
</td>
</tr>
<tr>
<td rowspan="2">{{ l10n("cpu.x86", "commons", user_lang) }}</td>
<td>{{ l10n("requirements.text.dotnet", project_id, user_lang) }}</td>
<td>
<a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/ListComPort_v3.0.0_x86_Single.zip" class="a-hidden">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>ZIP - 123.56 KiB<i class=\"fas fa-download ml-xs\"></i>",
False, None)
}}
</a>
</td>
</tr>
<tr>
<td>{{ l10n("none.fs", "commons", user_lang) }}</td>
<td>
<a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/ListComPort_v3.0.0_x86_SelfContained.zip" class="a-hidden mr-s">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>ZIP - 6.64 MiB<i class=\"fas fa-download ml-xs\"></i>",
False, None)
}}
</a>
<a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/ListComPort_v3.0.0_x86.msi" class="a-hidden mr-s">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>MSI - 9.79 MiB<i class=\"fas fa-download ml-xs\"></i>",
False, None, "btn-primary")
}}
</a>
</td>
</tr>
<tr>
<td rowspan="2">{{ l10n("cpu.arm64", "commons", user_lang) }}</td>
<td>{{ l10n("requirements.text.dotnet", project_id, user_lang) }}</td>
<td>
<a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/ListComPort_v3.0.0_arm64_Single.zip" class="a-hidden">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>ZIP - 130.34 KiB<i class=\"fas fa-download ml-xs\"></i>",
False, None)
}}
</a>
</td>
</tr>
<tr>
<td>{{ l10n("none.fs", "commons", user_lang) }}</td>
<td>
<a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/ListComPort_v3.0.0_arm64_SelfContained.zip" class="a-hidden">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>ZIP - 7.04 MiB<i class=\"fas fa-download ml-xs\"></i>",
False, None)
}}
</a>
</td>
</tr>
<!--<tr>
<td rowspan="2">{{ l10n("cpu.arm32", "commons", user_lang) }}</td> <td rowspan="2">{{ l10n("cpu.arm32", "commons", user_lang) }}</td>
<td>{{ l10n("requirements.text.dotnet", project_id, user_lang) }}</td> <td>{{ l10n("requirements.text.dotnet", project_id, user_lang) }}</td>
<td>...</td> <td>
<a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/ListComPort_v3.0.0_arm_Single.zip" class="a-hidden">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>ZIP - 127.57 KiB<i class=\"fas fa-download ml-xs\"></i>",
False, None)
}}
</a>
</td>
</tr> </tr>
<tr> <tr>
<td>{{ l10n("none.fs", "commons", user_lang) }}</td> <td>{{ l10n("none.fs", "commons", user_lang) }}</td>
<td>...</td> <td>
</tr> <a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/ListComPort_v3.0.0_arm_SelfContained.zip" class="a-hidden">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>ZIP - 6.68 MiB<i class=\"fas fa-download ml-xs\"></i>",
False, None)
}}
</a>
</td>
</tr>-->
</tbody> </tbody>
</table> </table>
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("source.code", "commons", user_lang)) }} {{ render_h2(l10n("source.code", "commons", user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
<table class="table-stylish table-p-s border r-l"> <table class="table-stylish table-p-xs table-v-center border r-l">
<thead> <thead>
<tr> <tr>
<th>{{ l10n("version", "commons", user_lang) }}</th> <th>{{ l10n("version", "commons", user_lang) }}</th>
<th>{{ l10n("download.multiple", "commons", user_lang) }}</th> <th>{{ l10n("download.multiple", "commons", user_lang) }}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>v3.0.0</td> <td>v3.0.0</td>
<td>...</td> <td>
</tr> <a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/DotNet-ListComPort-3.0.0.tar.gz" class="a-hidden mr-s">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>TAR.GZ - 4.22 MiB<i class=\"fas fa-download ml-xs\"></i>",
False, None)
}}
</a>
<a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/DotNet-ListComPort-3.0.0.zip" class="a-hidden">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>ZIP - 4.23 MiB<i class=\"fas fa-download ml-xs\"></i>",
False, None)
}}
</a>
</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>
</section> </section>
<section> <section class="mt-l mt-0-if-first">
{{ render_h2(l10n("links.title", project_id, user_lang)) }} {{ render_h2(l10n("links.title", project_id, user_lang)) }}
<div class="content-spacer"> <div class="content-spacer">
{{ render_list_ul([ {{ render_list_ul([

View File

@@ -0,0 +1,214 @@
{% extends "projects/_project.jinja" %}
{% block project_content %}
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("intro.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_paragraph(l10n("intro.text.p1.l1", project_id, user_lang)) }}
{{ render_paragraph(l10n("intro.text.p2.l1", project_id, user_lang)) }}
</div>
</section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("usage.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_paragraph(
l10n("usage.text.p1.l1", project_id, user_lang) +
"<br>" +
l10n("usage.text.p1.l2", project_id, user_lang)
)}}
{{ render_code_block([
"PEArch.exe [/?] [/E|/AsError] [/H|/AsHex] [/F|/FullText] <File>",
"",
"Options:",
" /? Prints this help text, and some additional details.",
" /E, /AsError Gives out the result as an error code.",
" /H, /AsHex Prints the architecture as a hex number.",
" /F, /FullText Prints a longer description of the architecture.",
]) }}
<details class="border bkgd-dark r-m mt-s">
<summary class="p-xs">{{ l10n("usage.details.title", project_id, user_lang) }}</summary>
<div class="bt ox-auto">
<table class="table-stylish table-p-xs table-v-center table-no-wrap w-full rb-m">
<thead>
<tr>
<th class="t-left">{{ l10n("usage.details.thead.code", project_id, user_lang) }}</th>
<th class="t-left">{{ l10n("usage.details.thead.hex", project_id, user_lang) }}</th>
<th class="t-left">{{ l10n("usage.details.thead.dec", project_id, user_lang) }}</th>
<th class="t-left">{{ l10n("usage.details.thead.description", project_id, user_lang) }}</th>
</tr>
</thead>
<tbody>
<tr><td>{{ l10n("cpu.code.unknown", "commons", user_lang) }}</td><td><span class="code">0x0</span></td><td><span class="code">0</span></td><td>{{ l10n("cpu.human.unknown", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.alpha", "commons", user_lang) }}</td><td><span class="code">0x184</span></td><td><span class="code">388</span></td><td>{{ l10n("cpu.human.alpha", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.alpha64", "commons", user_lang) }}</td><td><span class="code">0x284</span></td><td><span class="code">644</span></td><td>{{ l10n("cpu.human.alpha64", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.am33", "commons", user_lang) }}</td><td><span class="code">0x1d3</span></td><td><span class="code">467</span></td><td>{{ l10n("cpu.human.am33", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.amd64", "commons", user_lang) }}</td><td><span class="code">0x8664</span></td><td><span class="code">34404</span></td><td>{{ l10n("cpu.human.amd64", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.arm", "commons", user_lang) }}</td><td><span class="code">0x1c0</span></td><td><span class="code">448</span></td><td>{{ l10n("cpu.human.arm", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.arm64", "commons", user_lang) }}</td><td><span class="code">0xaa64</span></td><td><span class="code">43620</span></td><td>{{ l10n("cpu.human.arm64", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.arm64ec", "commons", user_lang) }}</td><td><span class="code">0xA641</span></td><td><span class="code">42561</span></td><td>{{ l10n("cpu.human.arm64ec", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.arm64x", "commons", user_lang) }}</td><td><span class="code">0xA64E</span></td><td><span class="code">42574</span></td><td>{{ l10n("cpu.human.arm64x", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.armnt", "commons", user_lang) }}</td><td><span class="code">0x1c4</span></td><td><span class="code">452</span></td><td>{{ l10n("cpu.human.armnt", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.axp64", "commons", user_lang) }}</td><td><span class="code">0x284</span></td><td><span class="code">644</span></td><td>{{ l10n("cpu.human.axp64", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.ebc", "commons", user_lang) }}</td><td><span class="code">0xebc</span></td><td><span class="code">3772</span></td><td>{{ l10n("cpu.human.ebc", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.i386", "commons", user_lang) }}</td><td><span class="code">0x14c</span></td><td><span class="code">332</span></td><td>{{ l10n("cpu.human.i386", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.ia64", "commons", user_lang) }}</td><td><span class="code">0x200</span></td><td><span class="code">512</span></td><td>{{ l10n("cpu.human.ia64", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.loongarch32", "commons", user_lang) }}</td><td><span class="code">0x6232</span></td><td><span class="code">25138</span></td><td>{{ l10n("cpu.human.loongarch32", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.loongarch64", "commons", user_lang) }}</td><td><span class="code">0x6264</span></td><td><span class="code">25188</span></td><td>{{ l10n("cpu.human.loongarch64", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.m32r", "commons", user_lang) }}</td><td><span class="code">0x9041</span></td><td><span class="code">36929</span></td><td>{{ l10n("cpu.human.m32r", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.mips16", "commons", user_lang) }}</td><td><span class="code">0x266</span></td><td><span class="code">614</span></td><td>{{ l10n("cpu.human.mips16", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.mipsfpu", "commons", user_lang) }}</td><td><span class="code">0x366</span></td><td><span class="code">870</span></td><td>{{ l10n("cpu.human.mipsfpu", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.mipsfpu16", "commons", user_lang) }}</td><td><span class="code">0x466</span></td><td><span class="code">1126</span></td><td>{{ l10n("cpu.human.mipsfpu16", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.powerpc", "commons", user_lang) }}</td><td><span class="code">0x1f0</span></td><td><span class="code">496</span></td><td>{{ l10n("cpu.human.powerpc", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.powerpcfp", "commons", user_lang) }}</td><td><span class="code">0x1f1</span></td><td><span class="code">497</span></td><td>{{ l10n("cpu.human.powerpcfp", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.r3000be", "commons", user_lang) }}</td><td><span class="code">0x160</span></td><td><span class="code">352</span></td><td>{{ l10n("cpu.human.r3000be", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.r3000", "commons", user_lang) }}</td><td><span class="code">0x162</span></td><td><span class="code">354</span></td><td>{{ l10n("cpu.human.r3000", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.r4000", "commons", user_lang) }}</td><td><span class="code">0x166</span></td><td><span class="code">358</span></td><td>{{ l10n("cpu.human.r4000", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.r10000", "commons", user_lang) }}</td><td><span class="code">0x168</span></td><td><span class="code">360</span></td><td>{{ l10n("cpu.human.r10000", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.riscv32", "commons", user_lang) }}</td><td><span class="code">0x5032</span></td><td><span class="code">20530</span></td><td>{{ l10n("cpu.human.riscv32", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.riscv64", "commons", user_lang) }}</td><td><span class="code">0x5064</span></td><td><span class="code">20580</span></td><td>{{ l10n("cpu.human.riscv64", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.riscv128", "commons", user_lang) }}</td><td><span class="code">0x5128</span></td><td><span class="code">20776</span></td><td>{{ l10n("cpu.human.riscv128", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.sh3", "commons", user_lang) }}</td><td><span class="code">0x1a2</span></td><td><span class="code">418</span></td><td>{{ l10n("cpu.human.sh3", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.sh3dsp", "commons", user_lang) }}</td><td><span class="code">0x1a3</span></td><td><span class="code">419</span></td><td>{{ l10n("cpu.human.sh3dsp", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.sh4", "commons", user_lang) }}</td><td><span class="code">0x1a6</span></td><td><span class="code">422</span></td><td>{{ l10n("cpu.human.sh4", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.sh5", "commons", user_lang) }}</td><td><span class="code">0x1a8</span></td><td><span class="code">424</span></td><td>{{ l10n("cpu.human.sh5", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.thumb", "commons", user_lang) }}</td><td><span class="code">0x1c2</span></td><td><span class="code">450</span></td><td>{{ l10n("cpu.human.thumb", "commons", user_lang) }}</td></tr>
<tr><td>{{ l10n("cpu.code.wcemipsv2", "commons", user_lang) }}</td><td><span class="code">0x169</span></td><td><span class="code">361</span></td><td>{{ l10n("cpu.human.wcemipsv2", "commons", user_lang) }}</td></tr>
</tbody>
</table>
</div>
</details>
</div>
</section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("output.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_paragraph("<b>" + l10n("output.default.title", project_id, user_lang) + "</b>")}}
<div class="ml-s">
{{ render_code_block([
"Command: pearch \"C:\\Windows\\explorer.exe\"",
"> STDOUT: AMD64",
"> STDERR:",
"> ERRORLEVEL: 0",
], "bash") }}
{{ render_code_block([
"Command: pearch \"C:\\Windows\\non-existant-file.exe\"",
"> STDOUT:",
"> STDERR: Cannot open file !",
"> ERRORLEVEL: 12",
], "bash") }}
</div>
</div>
<div class="content-spacer">
{{ render_paragraph("<b>" + l10n("output.options.title", project_id, user_lang) + "</b>")}}
<div class="ml-s">
{{ render_code_block([
"Command: pearch /AsHex \"C:\\Windows\\explorer.exe\"",
"> STDOUT: 8664",
"> STDERR:",
"> ERRORLEVEL: 0",
], "bash") }}
{{ render_code_block([
"Command: pearch /AsError \"C:\\Windows\\explorer.exe\"",
"> STDOUT:",
"> STDERR:",
"> ERRORLEVEL: 34404",
], "bash") }}
{{ render_code_block([
"Command: pearch /AsError /AsHex \"C:\\Windows\\explorer.exe\"",
"> STDOUT: 8664",
"> STDERR:",
"> ERRORLEVEL: 34404",
], "bash") }}
{{ render_code_block([
"Command: pearch /AsError /AsHex \"C:\\Windows\\non-existant-file.exe\"",
"> STDOUT:",
"> STDERR: Cannot open file !",
"> ERRORLEVEL: 0",
], "bash") }}
</div>
</div>
</section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("downloads.title", project_id, user_lang)) }}
<div class="content-spacer">
<table class="table-stylish table-p-xs table-v-center border r-l">
<thead>
<tr>
<th>{{ l10n("cpu.architecture", "commons", user_lang) }}</th>
<th>{{ l10n("requirements", "commons", user_lang) }}</th>
<th>{{ l10n("download.multiple", "commons", user_lang) }}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ l10n("cpu.x64", "commons", user_lang) }}</td>
<td rowspan="2">{{ l10n("windows.7", "commons", user_lang) }}</td>
<td>
<a href="https://files.nibblepoker.lu/downloads/PEArch/1.1.0/x64-msvcrt/pearch-x64-msvcrt.7z" class="a-hidden mr-s">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>"+
"7Zip - 14.49 KiB<i class=\"fas fa-download ml-xs\"></i>",
False, None, "btn-primary")
}}
</a>
<a href="https://files.nibblepoker.lu/downloads/PEArch/1.1.0/x64-msvcrt/pearch.exe" class="a-hidden">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>"+
"Exe - 43.5 KiB<i class=\"fas fa-download ml-xs\"></i>",
False, None, "btn-primary")
}}
</a>
</td>
</tr>
<tr>
<td>{{ l10n("cpu.x86", "commons", user_lang) }}</td>
<td>
<a href="https://files.nibblepoker.lu/downloads/PEArch/1.1.0/x86-msvcrt/pearch-x86-msvcrt.7z" class="a-hidden mr-s">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>"+
"7Zip - 10.36 KiB<i class=\"fas fa-download ml-xs\"></i>",
False, None)
}}
</a>
<a href="https://files.nibblepoker.lu/downloads/PEArch/1.1.0/x86-msvcrt/pearch.exe" class="a-hidden">
{{ render_button(
"<span class=\"text-monospace\"><i class=\"fad fa-file-archive mr-xs\"></i>"+
"Exe - 31 KiB<i class=\"fas fa-download ml-xs\"></i>",
False, None)
}}
</a>
</td>
</tr>
</tbody>
</table>
</div>
</section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("license.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_paragraph(l10n("license.text", project_id, user_lang)) }}
</div>
</section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("links.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_list_ul([
"<a href=\"https://github.com/aziascreations/PEArch\">" +
l10n("github", "commons", user_lang) + "</a>",
]) }}
</div>
</section>
{% endblock %}

View File

@@ -1,3 +1,3 @@
User-agent: * User-agent: *
Allow: / Allow: /
Sitemap: https://nibblepoker.{{ domain_tld }}/sitemap.txt Sitemap: https://nibblepoker.{{ domain_tld }}/sitemap.xml

31
update.sh Normal file
View File

@@ -0,0 +1,31 @@
#!/bin/bash
cd "$(dirname "$0")"
EXCLUDE=("release.tar" "docker-compose.yml" "update.sh")
for item in * .*; do
# Skip current and parent directory entries
[[ "$item" == "." || "$item" == ".." ]] && continue
delete=true
for pattern in "${EXCLUDE[@]}"; do
if [[ "$item" == $pattern ]]; then
delete=false
break
fi
done
if [ "$delete" = true ]; then
echo "Deleting '$item'"
rm -rf "$item"
fi
done
tar -xvf release.tar
rm data/tools/ico-maker.yml
rm data/tools/png-analyser.yml
docker-compose up --build --force-recreate -d

View File

@@ -54,6 +54,22 @@ def get_tools() -> LockedDict[str, ContentTool]:
return __CONTENT.tools return __CONTENT.tools
def get_tools_tags() -> list[str]:
tool: ContentTool
return sorted(
set(
[tag for tool in __CONTENT.tools.values() for tag in tool.metadata.general.tags]
)
)
#returned_list: list[str] = list()
#for tool in __CONTENT.tools.values():
# tool: ContentTool
# returned_list = returned_list + tool.metadata.general.tags
#return list(set(returned_list))
def get_sorted_tools_by_tags(tags: Optional[list[str]]) -> list[ContentProject]: def get_sorted_tools_by_tags(tags: Optional[list[str]]) -> list[ContentProject]:
if tags is None: if tags is None:
return sorted(__CONTENT.tools.values(), key=lambda x: x.metadata.index.priority, reverse=True) return sorted(__CONTENT.tools.values(), key=lambda x: x.metadata.index.priority, reverse=True)
@@ -67,6 +83,37 @@ def get_sorted_tools_by_tags(tags: Optional[list[str]]) -> list[ContentProject]:
return sorted(returned_list, key=lambda x: x.metadata.index.priority, reverse=True) return sorted(returned_list, key=lambda x: x.metadata.index.priority, reverse=True)
def get_tools_unlinked_tags(tags: Optional[list[str]]) -> list[str]:
"""Returns a list of tags which are not used with any tools that has one or more of the given tags."""
# TODO: cache the result !!!
all_tags = get_tools_tags()
linked_tags = get_tools_linked_tags(tags)
if tags is None:
return [tag for tag in all_tags if tag not in linked_tags]
else:
return [tag for tag in all_tags if (tag not in linked_tags and tag not in tags)]
def get_tools_linked_tags(tags: Optional[list[str]]) -> list[str]:
"""Returns a list of tags which are used in any tools that has one or more of the given tags."""
# TODO: cache the result !!!
returned_list = list()
if tags is not None:
relevant_tools = get_sorted_tools_by_tags(tags)
for relevant_tool in relevant_tools:
returned_list = returned_list + relevant_tool.metadata.general.tags
returned_list = set(returned_list)
returned_list = [tag for tag in returned_list if tag not in tags]
return returned_list
def sanitize_input_tags(input_tags: str) -> list[str]: def sanitize_input_tags(input_tags: str) -> list[str]:
tags: list[str] = input_tags.split(";") tags: list[str] = input_tags.split(";")
for tag in tags: for tag in tags:

View File

@@ -1,72 +1,10 @@
import copy
from typing import Optional
from locked_dict.locked_dict import LockedDict def flatten_dict(d, parent_key='', separator='.'):
items = []
for key, value in d.items():
class Localizer: new_key = f"{parent_key}{separator}{key}" if parent_key else str(key)
_langs_data: LockedDict[LockedDict[str, str]] if isinstance(value, dict):
_default_lang: str items.extend(flatten_dict(value, new_key, separator).items())
_allowed_langs: list[str] else:
items.append((new_key, value))
def __init__(self, default_lang: str, allowed_langs: Optional[list[str]]): return dict(items)
self._langs_data = LockedDict()
self._default_lang = default_lang
self._allowed_langs = allowed_langs
if self._allowed_langs is None:
self._allowed_langs = list()
self._allowed_langs.append(self._default_lang)
def add_lang(self, lang: str):
if lang not in self._langs_data.keys():
self._langs_data[lang] = LockedDict()
def add_domain(self, lang: str, domain: str, domain_data: Optional[dict[str, str]], strip_prefix: bool = False):
if domain not in self._langs_data[lang].keys():
self._langs_data[lang][domain] = LockedDict()
if strip_prefix:
new_domain_data = dict()
for key, value in domain_data.items():
if key.startswith(f"{domain}."):
new_domain_data[key[len(f"{domain}."):]] = value
domain_data = new_domain_data
self._langs_data[lang][domain].update(domain_data)
def _localize_internal(self, lang: str, domain: str, key: str, args: list[str] = None) -> Optional[str]:
if lang not in self._allowed_langs:
return None
if lang not in self._langs_data.keys():
return None
lang_data = self._langs_data[lang]
if domain not in lang_data.keys():
return None
domain_data = lang_data[domain]
if key not in domain_data.keys():
return None
localized_text = domain_data[key]
if args is not None:
for arg_index, arg_value in enumerate(args):
localized_text = localized_text.replace(f"%{arg_index}", arg_value)
return localized_text
def localize(self, lang: str, domain: str, key: str, args: list[str] = None) -> str:
localized_string = None
if localized_string is None:
localized_string = self._localize_internal(lang, domain, key, args)
if localized_string is None and lang != self._default_lang:
localized_string = self._localize_internal(self._default_lang, domain, key, args)
if localized_string is None:
return domain + "." + key
return localized_string

76
website/l10n/localizer.py Normal file
View File

@@ -0,0 +1,76 @@
from typing import Optional
from locked_dict.locked_dict import LockedDict
from website.l10n import flatten_dict
class Localizer:
_langs_data: LockedDict[LockedDict[str, str]]
_default_lang: str
_allowed_langs: list[str]
def __init__(self, default_lang: str, allowed_langs: Optional[list[str]]):
self._langs_data = LockedDict()
self._default_lang = default_lang
self._allowed_langs = allowed_langs
if self._allowed_langs is None:
self._allowed_langs = list()
self._allowed_langs.append(self._default_lang)
def add_lang(self, lang: str):
if lang not in self._langs_data.keys():
self._langs_data[lang] = LockedDict()
def add_domain(self, lang: str, domain: str, domain_data: Optional[dict[str, str]], strip_prefix: bool = False):
if domain not in self._langs_data[lang].keys():
self._langs_data[lang][domain] = LockedDict()
if domain_data is not None:
domain_data = flatten_dict(domain_data)
if strip_prefix:
new_domain_data = dict()
for key, value in domain_data.items():
if key.startswith(f"{domain}."):
new_domain_data[key[len(f"{domain}."):]] = value
domain_data = new_domain_data
self._langs_data[lang][domain].update(domain_data)
def _localize_internal(self, lang: str, domain: str, key: str, args: list[str] = None) -> Optional[str]:
if lang not in self._allowed_langs:
return None
if lang not in self._langs_data.keys():
return None
lang_data = self._langs_data[lang]
if domain not in lang_data.keys():
return None
domain_data = lang_data[domain]
if key not in domain_data.keys():
return None
localized_text = domain_data[key]
if args is not None:
for arg_index, arg_value in enumerate(args):
localized_text = localized_text.replace(f"%{arg_index}", arg_value)
return localized_text
def localize(self, lang: str, domain: str, key: str, args: list[str] = None) -> str:
localized_string = None
if localized_string is None:
localized_string = self._localize_internal(lang, domain, key, args)
if localized_string is None and lang != self._default_lang:
localized_string = self._localize_internal(self._default_lang, domain, key, args)
if localized_string is None:
return domain + "." + key
return localized_string

View File

@@ -5,7 +5,7 @@ from typing import Optional
import yaml import yaml
from . import Localizer from .localizer import Localizer
DEFAULT_LANG = "en" DEFAULT_LANG = "en"
ALLOWED_LANGS = ["en", "fr"] ALLOWED_LANGS = ["en", "fr"]
@@ -123,46 +123,3 @@ def l10n_url_switch(url: str, new_lang: Optional[str] = None) -> str:
url = "/" + new_lang + url url = "/" + new_lang + url
return url.replace("//", "/") return url.replace("//", "/")
# STRINGS = dict()
# STRINGS[DEFAULT_LANG] = dict()
# STRINGS["_compile_date"] = "1970-01-01T00:00:00.000000+00:00Z"
#
#
# def reload_strings(strings_file: str) -> None:
# global STRINGS
# STRINGS = dict()
# STRINGS[DEFAULT_LANG] = dict()
# STRINGS["_compile_date"] = "1970-01-01T00:00:00.000000+00:00Z"
# STRINGS = json.loads(open(strings_file, "r").read())
#
#
# def localize_internal(string_key: str, language: str, lang_data: dict, fallback: Optional[str]) -> Optional[str]:
# if language not in ALLOWED_LANGS:
# return fallback
#
# if language not in lang_data.keys():
# language = DEFAULT_LANG
#
# localized_string = lang_data[language].get(string_key)
# if localized_string is None and language != DEFAULT_LANG:
# localized_string = lang_data[DEFAULT_LANG].get(string_key)
#
# if localized_string is None:
# return fallback
# return localized_string
#
#
# def localize(strings_key: str, language: str, extra_lang_data: Optional[dict] = None) -> str:
# localized_string = None
#
# if extra_lang_data is not None:
# localized_string = localize_internal(strings_key, language, extra_lang_data, None)
#
# if localized_string is None:
# localized_string = localize_internal(strings_key, language, STRINGS, None)
#
# if localized_string is None:
# return f"${strings_key}"
# return localized_string

View File

@@ -2,7 +2,8 @@ from flask import render_template
def render_file_input(input_id: str, multiple: bool, accept: str = None, def render_file_input(input_id: str, multiple: bool, accept: str = None,
upload_button: bool = False, clear_button: bool = False, user_lang: str = "") -> str: upload_button: bool = False, clear_button: bool = False,
user_lang: str = "", text_override: str = "") -> str:
return render_template( return render_template(
"elements/file-input.jinja", "elements/file-input.jinja",
file_input_id=input_id, file_input_id=input_id,
@@ -11,4 +12,5 @@ def render_file_input(input_id: str, multiple: bool, accept: str = None,
file_upload_button=upload_button, file_upload_button=upload_button,
file_clear_button=clear_button, file_clear_button=clear_button,
user_lang=user_lang, user_lang=user_lang,
text_override=text_override,
) )

View File

@@ -1,28 +1,65 @@
from dataclasses import dataclass
from .l10n.utils import ALLOWED_LANGS from .l10n.utils import ALLOWED_LANGS
import yaml import yaml
__SITEMAP_ENTRIES: list[str] = list()
@dataclass
class SitemapEntry:
lastmod: str
priority: str
changefreq: str = "monthly"
__SITEMAP_ENTRIES: dict[str, SitemapEntry] = dict()
__XML_SITEMAP_CACHE = None
def reload_sitemap_entries(definition_file: str) -> None: def reload_sitemap_entries(definition_file: str) -> None:
global __SITEMAP_ENTRIES global __SITEMAP_ENTRIES
__SITEMAP_ENTRIES = list() __SITEMAP_ENTRIES = dict()
with open(definition_file, 'r') as f: with open(definition_file, 'r') as f:
raw_sitemap_entries = yaml.safe_load(f) raw_sitemap_entries: dict = yaml.safe_load(f)["sitemap"]
for allowed_lang in [""] + ALLOWED_LANGS: for allowed_lang in [""] + ALLOWED_LANGS:
for sitemap_entry in raw_sitemap_entries: for sitemap_entry_path in raw_sitemap_entries:
__SITEMAP_ENTRIES.append(
("/" + str(allowed_lang) + "/" + str(sitemap_entry)) entry = SitemapEntry(**raw_sitemap_entries[sitemap_entry_path])
.replace("//", "/") if not(allowed_lang == ""):
.replace("//", "/") entry.priority = "0.0"
)
# __SITEMAP_ENTRIES.append(sitemap_entry) __SITEMAP_ENTRIES[
# for allowed_lang in ALLOWED_LANGS: ("/" + str(allowed_lang) + "/" + str(sitemap_entry_path))
.replace("//", "/")
.replace("//", "/")
] = entry
def get_sitemap_entries() -> list[str]: def get_sitemap_entries() -> list[str]:
return __SITEMAP_ENTRIES return list(__SITEMAP_ENTRIES.keys())
def get_sitemap_xml(domain) -> str:
global __XML_SITEMAP_CACHE
if __XML_SITEMAP_CACHE is None:
__XML_SITEMAP_CACHE = (
"""<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">""" +
"".join([
f"""
<url>
<loc>https://{domain}{k}</loc>
<lastmod>{v.lastmod}</lastmod>
<priority>{v.priority}</priority>
<changefreq>{v.changefreq}</changefreq>
</url>"""
for k, v in __SITEMAP_ENTRIES.items()
]) +
"\n</urlset>").replace(" <priority>0.0</priority>\n ", "")
return __XML_SITEMAP_CACHE