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-compose.yml
Dockerfile
# Internal stuff
*.pdn
*.ai
*.private.*

9
.gitignore vendored
View File

@@ -8,12 +8,21 @@ __pycache__/
# NodeJS' BS
node_modules/
scripts/package-lock.json
# Internal stuff
*.pdn
*.ai
*.private.*
tests/
# Temp
static/resources/DecimalJs*
static/resources/SortableJS
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, \
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.domains import ALLOWED_DOMAINS
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.standalone import get_standalone_common_headers
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:
from rich import print
@@ -125,6 +125,8 @@ def inject_processors():
get_tools=get_tools,
get_sorted_projects_by_tags=get_sorted_projects_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
render_button=render_button,
@@ -162,11 +164,15 @@ def route_robots_txt():
@app.route('/sitemap.txt')
def route_sitemap():
# FIXME: Add the domain !!!
def route_sitemap_txt():
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('/en/', defaults={'lang': "en"})
@app.route('/fr/', defaults={'lang': "fr"})

View File

@@ -28,7 +28,7 @@ projects:
subtitle_key: "article.subtitle"
tags:
- "application"
- "tool"
- "cli"
- "windows"
languages:
- "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
has_new_until_utc: 0
-
- {}
#- title_key: text.articles
# abs_href: "/articles/"
@@ -56,13 +56,13 @@
active_id: ""
has_new_until_utc: 0
-
- {}
#- title_key: text.about
# abs_href: "/about"
# icon: fad fa-user
# active_id: about
# has_new_until_utc: 0
- title_key: text.about
abs_href: "/about"
icon: fad fa-user
active_id: about
has_new_until_utc: 0
- title_key: text.contact
abs_href: "/contact"

View File

@@ -1,17 +1,71 @@
# Sitemap definition
- "/"
- "/about/"
#- "/articles/"
- "/contact/"
- "/content/"
- "/content/circuitpython-ebyte-e32/"
- "/content/docker-mini-cctv-nvr/"
- "/content/lscom-cli-dotnet/"
- "/links/"
- "/privacy/"
- "/tools/"
- "/tools/iban-generator/"
- "/tools/excel-password-remover/"
- "/tools/uuid-generator/"
- "/tools/vat-calculator/"
# changefreq: "monthly" is implied unless specified
sitemap:
"/":
lastmod: "2025-03-30T00:00:00+01:00"
priority: "1"
"/about/":
lastmod: "2025-09-14T22:04:00+01:00"
priority: "0.2"
"/contact/":
lastmod: "2025-03-01T07:40:00+01:00"
priority: "0.5"
"/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
head.title: About - NibblePoker
head.description: 'TODO: description'
og.title: NibblePoker - About
og.description: 'TODO: description'
header.title: About
intro.title: Introduction
intro.text.01: My name is Herwin Bozet, I'm an experienced developer with extensive
experience in PureBasic, Python, Java, VBA; and intermediate knowledge in C, Win32
head:
title: About - NibblePoker
description: 'TODO: description'
og:
title: NibblePoker - About
description: 'TODO: description'
header:
title: About
intro:
title: Introduction
text:
p1:
l1: My name is Herwin Bozet, I'm an experienced developer with extensive
experience in PureBasic, Python, .NET, Java; and intermediate knowledge in C, Win32
APIs, embedded systems and general web development.
intro.text.02: I've been programming for about 10 years now, and for the last
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.text.10: NibblePoker is, in essence, a simple moniker and the front-end
for most of my public-focused work.
intro.text.11: It houses all my work made and tailored for usage by other people.
intro.text.20: This entire website, as well as all my work for it and other
# l2: I've been programming for about 10 years now, and for the last
# 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.
#p2:
# l1: NibblePoker is, in essence, a simple moniker and the front-end
# for most of my public-focused work.
# l2: It houses all my work made and tailored for usage by other people.
p3:
l1: This entire website, as well as all my work for it and other
personal projects, is completely open-source and available under permissive <abbr
title="Open Source Initiative">OSI</abbr> approved licenses.
intro.text.21: All of it is maintained, developed and expanded in my free time
l2: All of it is maintained, developed and expanded in my free time
with the occasional help from people in the open-source community.
tenets.title: Core tenets
tenets.text.01: ''
tenets.text.02: ''
future.title: Future plans
future.text.01: It is planned to turn NibblePoker into a <abbr title="Private
future:
title: Future plans
text:
p1:
l1: It is planned to turn NibblePoker into a <abbr title="Private
company with limited liability">SPRL</abbr> in a couple years if everything goes
as planned.
future.text.02: This would allow me to centralize many things and invest properly
in my targetted fields to achieve my goals.
future.text.10: The goal would be to create a small sustainable local business
l2: This would allow me to centralize many things and invest properly
in my targeted fields to achieve my goals.
p2:
l1: The goal would be to create a small sustainable local business
that offers a wide range of products and solutions covering <abbr title="Internet
of things">IoT</abbr> devices, programming, and technological independence ; All
while including the required software and hardware components often lacking in such
products and solutions.
future.text.20: Ultimately, all this work and research would be made available
p3:
l1: Ultimately, all this work and research would be made available
to the public under open-source licenses, enabling anyone who wishes to learn, reuse,
and resell open-source products, to do so in a similar way as companies like Adafruit
do.
_nibblepoker.title: The 'NibblePoker' name
_nibblepoker.text.01: TODO
_nibblepoker.text.10: TODO
_nibblepoker.text.11: TODO
_nibblepoker.text.20: TODO
financing.title: Financing
financing.text.01: This website, as well as the surrounding infrastructure,
financing:
title: Financing
text:
p1:
l1: This website, as well as the surrounding infrastructure,
was made to cost as little as possible while not being reliant on any censor-happy
companies.
financing.text.02: Following my core tenets, I also wanted to retain some sort
l2: Following my core tenets, I also wanted to retain some sort
of "technological sovereignty", and therefore refuse to support or use companies
that actively fight against legal free speech.
financing.text.10: The details of the operating costs are provided below to
p2:
l1: The details of the operating costs are provided below to
illustrate the low price of such independence.
financing.text.20: And for those of you who are more motivated, I hope to inspire
p3:
l1: And for those of you who are more motivated, I hope to inspire
you to at least try this kind of activity.
financing.text.21: It may seem daunting at first, but for a fraction of the
l2: It may seem daunting at first, but for a fraction of the
cost presented here, <b>and with a bit of motivation</b>, you can already accomplish
a lot of things and gain valuable knowledge for a world as interconnected as ours.
financing.text.isp: The main ISP bill isn't accounted for since this could run
isp: The main ISP bill isn't accounted for since this could run
off some random public Wi-Fi.
financing.part.service: Service
financing.part.cost: Cost
financing.part.cost.total: Total Cost
financing.part.equipment: Equipment
financing.part.cost.yearly: Yearly Cost
financing.part.cost.yearly.total: Yearly Cost
financing.part.domain.lu: "<i>.lu</i> domain"
financing.part.domain.com: "<i>.com</i> domain"
financing.part.proxy.europe: European reverse-proxy
financing.part.proxy.america: American reverse-proxy
financing.part.proxy.asia: Asian reverse-proxy
financing.part.emails: Emails
financing.part.electricity: Electricity
financing.part.nanopir4s: NanoPi R4S
financing.part.nanopir4s.desc: Handles all non public-facing tasks and services.
financing.part.storage: Local storage
aziascreations.title: The 'AziasCreations' name
_aziascreations.text.01: TODO
_aziascreations.text.10: TODO
part:
service: Service
equipment: Equipment
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
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.responsive: "CPU<span class=\"mobile-hide\"> Architecture</span>"
cpu.any: "Any architecture"
@@ -34,6 +46,87 @@ cpu.arm64: "ARM64"
#cpu.arm64: "<p>ARM64<br>ARMv8<br>AArch64</p>"
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
python: Python
@@ -92,47 +185,48 @@ format.yaml: "YAML"
action.generate: "Generate"
country.afghanistan: "Afghanistan"
country.albania: "Albania"
country.algeria: "Algeria"
country.andorra: "Andorra"
country.angola: "Angola"
country.anguilla: "Anguilla"
country.argentina: "Argentina"
country.australia: "Australia"
country.austria: "Austria"
country.azerbaijan: "Azerbaijan"
country.azores: "Azores"
country.bahamas: "Bahamas"
country.belgium: "Belgium"
country.bulgaria: "Bulgaria"
country.corsica: "Corsica"
country.croatia: "Croatia"
country.cyprus: "Cyprus"
country.czechia: "Czechia"
country.denmark: "Denmark"
country.estonia: "Estonia"
country.finland: "Finland"
country.france: "France"
country.france.corsica: "France - Corsica"
country.germany: "Germany"
country.greece: "Greece"
country.hungary: "Hungary"
country.ireland: "Ireland"
country.italy: "Italy"
country.latvia: "Latvia"
country.lithuania: "lithuania"
country.luxembourg: "Luxembourg"
country.madeira: "Madeira"
country.malta: "Malta"
country.monaco: "Monaco"
country.netherlands: "Netherlands"
country.poland: "Poland"
country.portugal: "Portugal"
country.portugal.azores: "Portugal - Azores"
country.portugal.madeira: "Portugal - Madeira"
country.romania: "Romania"
country.slovenia: "Slovenia"
country.slovakia: "Slovakia"
country.spain: "Spain"
country.sweden: "Sweden"
country:
afghanistan: "Afghanistan"
albania: "Albania"
algeria: "Algeria"
andorra: "Andorra"
angola: "Angola"
anguilla: "Anguilla"
argentina: "Argentina"
australia: "Australia"
austria: "Austria"
azerbaijan: "Azerbaijan"
azores: "Azores"
bahamas: "Bahamas"
belgium: "Belgium"
bulgaria: "Bulgaria"
corsica: "Corsica"
croatia: "Croatia"
cyprus: "Cyprus"
czechia: "Czechia"
denmark: "Denmark"
estonia: "Estonia"
finland: "Finland"
france: "France"
france.corsica: "France - Corsica"
germany: "Germany"
greece: "Greece"
hungary: "Hungary"
ireland: "Ireland"
italy: "Italy"
latvia: "Latvia"
lithuania: "lithuania"
luxembourg: "Luxembourg"
madeira: "Madeira"
malta: "Malta"
monaco: "Monaco"
netherlands: "Netherlands"
poland: "Poland"
portugal: "Portugal"
portugal.azores: "Portugal - Azores"
portugal.madeira: "Portugal - Madeira"
romania: "Romania"
slovenia: "Slovenia"
slovakia: "Slovakia"
spain: "Spain"
sweden: "Sweden"

View File

@@ -83,5 +83,7 @@
"content.commons.lang.luxembourgish": "Luxembourgish",
"content.commons.lang.english.639-3": "English (eng)",
"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
meta.title: Excel Password Remover
meta.description: >-
meta:
title: Excel Password Remover
description: >-
Small web application from which you can easily remove a password from an Excel
worksheet. It works by leaving the task of editing the XML files on an Excel
document to your browser instead to keep everything local.
meta.description.light: >-
description.light: >-
Small web application from which you can easily remove a password from an Excel
worksheet directly in your browser.
#article.subtitle: >-
# <a
# href="https://github.com/aziascreations/Excel-Worksheet-Password-Remover"><i
# 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>
eula:
1: "This tool should only be used with files you have the express permission to unlock."
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."
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.selection.1: "Drop your excel file(s) here or click on the buttons."
file:
selection:
title: "File Selection"
1: "Drop your excel file(s) here or click on the buttons."
details.title : "Result(s)"
details.empty.1 : "Your Excel files with their password removed will end up here."
details:
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.warning.extension: "The file doesn't appear to be an Excel Worksheet !"
result.warning.password: "The Excel Worksheet didn't contain any password !"
result.error.jszip: "JSZip was unable to open the file !"
result:
success:
count: "Removed <span id=\"tmpl-success-password-count\">???</span> password(s)"
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
head.title: NibblePoker
head.description: Collection of free and open-source handmade utilities and libraries
head:
title: NibblePoker
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.description: Collection of free and open-source handmade utilities and libraries
og:
title: NibblePoker
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.text.1: This website contains a collection of my personal work through
intro:
title: Welcome to %0
text:
1: This website contains a collection of my personal work through
blog posts, software releases and other forms of media, all of which is accessible
for free and under open-source friendly licenses.
intro.text.2: If you wish to contact me, you can do so through the contact form
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.text.privacy: Updated our privacy policy.
updates.5.date: March 30 2025
updates.5.text.1: Complete redesign of the site to use a standardized style.
updates.5.text.2: Changed some of our VPS providers to <a href="https://hosteam.pl/">HosTeam</a>.
updates.4.date: November 30 2023
updates.4.text.1: Centralized DNS servers & implemented GeoDNS.
updates.4.text.2: Added US CDN hosted by <a href="https://www.chicagovps.net/">ChicagoVPS</a>.
updates.4.text.3: All other regions use the EU CDN hosted by IONOS.
updates.3.date: November 12 2023
updates.3.text.1: Other services are back online.
updates.3.text.2: Changed our host to IONOS.
updates.3.text.3: Finished all side pages.
updates.2.date: August 15 2023
updates.2.text.1: The website is back online.
updates.2.text.2: New and much lighter design.
updates.2.text.3: Changed our host to HostBrr.
updates.2.text.4: Added a section for web-based tools.
updates.1.date: September 9 2022
updates.1.text.1: Changed our host to v6Node.
updates:
title: Updates
text:
privacy: Updated our privacy policy.
5:
date: March 30 2025
text:
1: Complete redesign of the site to use a standardized style.
2: Changed some of our VPS providers to <a href="https://hosteam.pl/">HosTeam</a>.
4:
date: November 30 2023
text:
1: Centralized DNS servers & implemented GeoDNS.
2: Added US CDN hosted by <a href="https://www.chicagovps.net/">ChicagoVPS</a>.
3: All other regions use the EU CDN hosted by IONOS.
3:
date: November 12 2023
text:
1: Other services are back online.
2: Changed our host to IONOS.
3: Finished all side pages.
2:
date: August 15 2023
text:
1: The website is back online.
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.4by4: "Use 4 character-wide spacing"
license.1: "The code for this project is released in the public domain."
license.2: "The original source code can be found on <a href=\"https://github.com/aziascreations/Web-NibblePoker\">GitHub</a>."
license.3: "Data from Swift's
license.1: "The code for this project is released in the <a href=\"https://github.com/aziascreations/Web-NibblePoker\">public domain</a>."
license.2: "Data from Swift's
<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."

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.json: "JSON"
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
head.title: À-propos - NibblePoker
head.description: 'TODO: description'
og.title: NibblePoker - À-propos
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é
head:
title: À-propos - NibblePoker
description: 'TODO: description'
og:
title: NibblePoker - À-propos
description: 'TODO: description'
header:
title: À-propos
intro:
title: Introduction
text:
p1:
l1: 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
# l2: 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.
#p2:
# l1: 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.
# l2: Il abrite l'ensemble de mon travail créé et adapté pour être
# utilisé par d'autres personnes.
p3:
l1: 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
l2: 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.
'
future.text.02: Cela aura pour but de me permettre de centraliser plein de choses
future:
title: Projet d'avenir
text:
p1:
l1: '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.'
l2: Cela aura pour but de me permettre de centraliser plein de choses
et d'investir correctement dans mes domaines de prédilection.
future.text.10: La finalité serait de pouvoir créer un petit projet local d'entreprise
p2:
l1: 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
les domaines de l'électronique connectée et intelligente, la programmation et lindépendance
technologique tout en incluant les composantes logicielles et physiques souvent
manquantes dans de tels produits et solutions.
future.text.20: Finalement tout ce travail et recherches seraient mis à disposition
p3:
l1: Finalement tout ce travail et recherches seraient mis à disposition
du public sous des licences open-source afin de permettre permettant à quiconque
le souhaite dapprendre, réutiliser et revendre des produits ouverts tels que le
font des compagnies comme Adafruit.
_nibblepoker.title: Le nom 'NibblePoker'
_nibblepoker.text.01: Le surnom '<i>NibblePoker</i>' est un mot composé de plusieurs
termes [techniques] plus anciens.
_nibblepoker.text.10: "●&nbsp;&nbsp;'<i>Nibble</i>' est un terme technique anglais
historiquement utilisé pour décrire décrit un demi-octet, ou 4 bits d'information."
_nibblepoker.text.11: "●&nbsp;&nbsp;'<i>Poker</i>' viens du verbe anglais '<i>to
poke</i>' qui, dans le domaine rétro-informatique, décrit le fait d'écrire des données
dans la mémoire d'un ordinateur."
_nibblepoker.text.20: Finalement, lors de la création de ce surnom, je travaillais
depuis quelques temps sur d'anciennes machines telle la Commodore64, Acorn Electron
et [???]ironique.
financing.title: Financement
financing.text.01: Ce site web, ainsi que son infrastructure environnante, ont
financing:
title: Financement
text:
p1:
l1: Ce site web, ainsi que son infrastructure environnante, ont
été conçus pour coûter le moins possible tout en étant indépendants d'entreprises
qui se prennent pour des censeurs.
financing.text.02: Et en suivant mes principes fondamentaux, je souhaitais également
l2: Et en suivant mes principes fondamentaux, je souhaitais également
conserver une "souveraineté technologique", et, par conséquent, refuse de soutenir
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
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.
financing.text.20: Et pour les plus motivés d'entre-vous, j'espère pouvoir vous
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.
financing.text.21: C'est un domaine qui peut paraître intimidant de prime abord,
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.
financing.text.isp: Le coût de la connexion internet n'est pas compté car elle
isp: Le coût de la connexion internet n'est pas compté car elle
pourrait être remplacée par un Wi-Fi public lambda.
financing.part.service: Service
financing.part.cost: Coût
financing.part.cost.total: Coût Total
financing.part.equipment: Matériel
financing.part.cost.yearly: Coût Annuel
financing.part.cost.yearly.total: Coût Annuel
financing.part.domain.lu: Domaine en <i>.lu</i>
financing.part.domain.com: Domaine en <i>.com</i>
financing.part.proxy.europe: Reverse-proxy en Europe
financing.part.proxy.america: Reverse-proxy en Amérique
financing.part.proxy.asia: Reverse-proxy en Asie
financing.part.emails: Adresses email
financing.part.electricity: Électricité
financing.part.nanopir4s: NanoPi R4S
financing.part.nanopir4s.desc: Gère tous les services et programmes internes.
financing.part.storage: Stockage local
aziascreations.title: Le nom 'AziasCreations'
aziascreations.text.01: L'ancien surnom 'AziasCreations' était utilisé entre
2013 et 2020 et est à présent abandonné au profit de <i>NibblePoker</i>.
aziascreations.text.10: Cependant, il reste utilisé sur GitHub et Gitea à cause
de certaines limitations concernant les changements de pseudonyme qui m'ont empèché
de faire un changement complet.
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
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.responsive: "<span class=\"mobile-hide\">Architecture de </span>CPU"
cpu.any: "Indépendante"
@@ -34,6 +46,87 @@ cpu.arm64: "ARM64"
#cpu.arm64: "<p>ARM64<br>ARMv8<br>AArch64</p>"
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"
python: Python
@@ -92,47 +185,48 @@ format.yaml: "YAML"
action.generate: "Générer"
country.afghanistan: "Afghanistan"
country.albania: "Albanie"
country.algeria: "Algérie"
country.andorra: "Andorre"
country.angola: "Angola"
country.anguilla: "Anguilla"
country.argentina: "Argentine"
country.australia: "Australie"
country.austria: "Autriche"
country.azerbaijan: "Azerbaïdjan"
country.azores: "Açores"
country.bahamas: "Bahamas"
country.belgium: "Belgique"
country.bulgaria: "Bulgarie"
country.corsica: "Corse"
country.croatia: "Croatie"
country.cyprus: "Chypre"
country.czechia: "Tchéquie"
country.denmark: "Danemark"
country.estonia: "Estonie"
country.finland: "Finlande"
country.france: "France"
country.france.corsica: "France - Corse"
country.germany: "Allemagne"
country.greece: "Grèce"
country.hungary: "Hongrie"
country.ireland: "Irlande"
country.italy: "Italie"
country.latvia: "Lettonie"
country.lithuania: "Lituanie"
country.luxembourg: "Luxembourg"
country.madeira: "Madère"
country.malta: "Malte"
country.monaco: "Monaco"
country.netherlands: "Pays-Bas"
country.poland: "Pologne"
country.portugal: "Portugal"
country.portugal.azores: "Portugal - Açores"
country.portugal.madeira: "Portugal - Madère"
country.romania: "Roumanie"
country.slovenia: "Slovénie"
country.slovakia: "Slovaquie"
country.spain: "Espagne"
country.sweden: "Suède"
country:
afghanistan: "Afghanistan"
albania: "Albanie"
algeria: "Algérie"
andorra: "Andorre"
angola: "Angola"
anguilla: "Anguilla"
argentina: "Argentine"
australia: "Australie"
austria: "Autriche"
azerbaijan: "Azerbaïdjan"
azores: "Açores"
bahamas: "Bahamas"
belgium: "Belgique"
bulgaria: "Bulgarie"
corsica: "Corse"
croatia: "Croatie"
cyprus: "Chypre"
czechia: "Tchéquie"
denmark: "Danemark"
estonia: "Estonie"
finland: "Finlande"
france: "France"
france.corsica: "France - Corse"
germany: "Allemagne"
greece: "Grèce"
hungary: "Hongrie"
ireland: "Irlande"
italy: "Italie"
latvia: "Lettonie"
lithuania: "Lituanie"
luxembourg: "Luxembourg"
madeira: "Madère"
malta: "Malte"
monaco: "Monaco"
netherlands: "Pays-Bas"
poland: "Pologne"
portugal: "Portugal"
portugal.azores: "Portugal - Açores"
portugal.madeira: "Portugal - Madère"
romania: "Roumanie"
slovenia: "Slovénie"
slovakia: "Slovaquie"
spain: "Espagne"
sweden: "Suède"

View File

@@ -76,5 +76,7 @@
"content.commons.lang.luxembourgish": "Luxembourgeois",
"content.commons.lang.english.639-3": "Anglais (eng)",
"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
meta.title: Excel Password Remover
meta.description: >-
meta:
title: Excel Password Remover
description: >-
Petite application web qui permet de facilement retirer le mot de passe d'une
feuille de calcul Excel depuis votre navigateur web sans avoir à uploader le
fichier sur internet. Cette application laisse votre navigateur modifier les
fichiers XML du fichier Excel afin de tout garder en local.
meta.description.light: >-
description.light: >-
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: >-
# <a
# href="https://github.com/aziascreations/Excel-Worksheet-Password-Remover"><i
# 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>
eula:
1: "Cet outil ne doit être utilisé qu'avec des fichiers pour lesquels vous avez l'autorisation de les déverrouiller."
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é."
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.selection.1 : "Déposez vos fichiers Excel ici ou cliquez sur les boutons."
file:
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.empty.1 : "Vos fichiers Excel sans leurs mots de passe finiront ici."
details:
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.warning.extension: "Le fichier ne semble pas être une feuille de calcul Excel !"
result.warning.password: "La feuille de calcul Excel ne contenait aucun mot de passe !"
result.error.jszip: "JSZip n'a pas pu ouvrir le fichier !"
result:
success:
count: "Mot de passe(s) supprimé(s) : <span id=\"tmpl-success-password-count\">???</span>"
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.text.privacy: Mise-à-jour de notre politique de confidentialité.
updates.5.date: 30 mars 2025
updates.5.text.1: Refonte complète du site pour utiliser un style standardisé.
updates.5.text.2: Changements de certains providers de VPS pour <a href="https://hosteam.pl/">HosTeam</a>.
updates.4.date: 30 novembre 2023
updates.4.text.1: Centralisation des serveurs DNS & implémentation de GeoDNS.
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>.
updates.4.text.3: Les autres régions utilisent le CDN Européen hébergé par IONOS.
updates.3.date: 12 novembre 2023
updates.3.text.1: Les services annexes sont disponibles.
updates.3.text.2: Changement d'hébergeur vers IONOS.
updates.3.text.3: Finition des pages annexes.
updates.2.date: 15 août 2023
updates.2.text.1: Le site internet est à nouveau disponible.
updates.2.text.2: Mise en place d'un nouveau design plus léger.
updates.2.text.3: Changement d'hébergeur vers HostBrr.
updates.2.text.4: Ajout d'une nouvelle section pour les outils.
updates.1.date: 9 septembre 2022
updates.1.text.1: Changement d'hébergeur vers v6Node.
updates:
5:
date: 30 mars 2025
text:
1: Refonte complète du site pour utiliser un style standardisé.
2: Changements de certains providers de VPS pour <a href="https://hosteam.pl/">HosTeam</a>.
4:
date: 30 novembre 2023
text:
1: Centralisation des serveurs DNS & implémentation de GeoDNS.
2: Ajout d'un CDN pour l'Amérique du Nord hébergé par <a href="https://www.chicagovps.net/">ChicagoVPS</a>.
3: Les autres régions utilisent le CDN Européen hébergé par IONOS.
3:
date: 12 novembre 2023
text:
1: Les services annexes sont disponibles.
2: Changement d'hébergeur vers IONOS.
3: Finition des pages annexes.
2:
date: 15 août 2023
text:
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.4by4: "Formater en segments de 4 caractères"
license.1: "Le code de ce projet est publié dans le domaine public."
license.2: "Le code source original peut être trouvé sur <a href=\"https://github.com/aziascreations/Web-NibblePoker\">GitHub</a>."
license.3: "Les données du
license.1: "Le code de ce projet est publié dans le <a href=\"https://github.com/aziascreations/Web-NibblePoker\">domaine public</a>."
license.2: "Les données du
<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."

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.json: "JSON"
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"
subtitle_key: "article.subtitle"
tags:
- "undefined"
- "graphics"

View File

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

View File

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

View File

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

View File

@@ -1,13 +1,23 @@
# 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
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
TODO
* [aziascreations/Excel-Worksheet-Password-Remover](https://github.com/aziascreations/Excel-Worksheet-Password-Remover)
## 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 */
.np-file-input-drop-container {
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;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
input[type=file].np-file-input-drop {
width: 100%;
height: 100%;
top: 0;
left: 0;
opacity: 0;
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 */
.t-v-center {
vertical-align: middle;
}
/* Copy of the m*-xs classes */
/* Accommodates the paragraph renderer that has a hard-coded .mt-xs */
.content-spacer {
@@ -29,3 +49,15 @@ input[type=file].np-file-input-drop {
margin-top: 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);
// FIXME: Fix this shit !
// FIXME: Fix the modals, this is hindering many things !
//[eContentModal, document.getElementById("modal-content-cross"), eContentModalInner].forEach(value => {
// value.onclick = function() {
// fadeOut(eContentModal, 175).then(r => {
@@ -47,8 +47,7 @@ export function initCore() {
});*/
// Setting up the file drop inputs
document.querySelectorAll(".np-file-input-root-container").forEach(eRootContainer => {
//console.log(eRootContainer);
document.querySelectorAll(".np-file-input-drop-container").forEach(eRootContainer => {
/** @type {HTMLInputElement} */
const eFileDropInput = eRootContainer.querySelector("input[type=file]");
@@ -58,7 +57,6 @@ export function initCore() {
/** @type {string} */
const inputId = eFileDropInput.getAttribute("id");
//console.log(inputId);
/** @type {HTMLElement} */
const eFileDropTextEmpty = eRootContainer.querySelector(`#${inputId}-text-drop`);
@@ -78,14 +76,7 @@ export function initCore() {
/** @type {NodeListOf<HTMLElement>} */
const eFileDropSelectionCounts = eRootContainer.querySelectorAll(`.np-file-drop-count`);
if(eFileDropAddButton !== null) {
eFileDropAddButton.addEventListener("click", function() {
eFileDropInput.click();
});
}
if(eFileDropClearButton !== null) {
eFileDropClearButton.addEventListener("click", function() {
function handleFileDropClear() {
eFileDropInput.value = '';
if(eFileDropTextSingle !== null) {
eFileDropTextSingle.hidden = true;
@@ -96,6 +87,18 @@ export function initCore() {
if(eFileDropTextEmpty !== null) {
eFileDropTextEmpty.hidden = false;
}
}
if(eFileDropAddButton !== null) {
eFileDropAddButton.addEventListener("click", function() {
handleFileDropClear();
eFileDropInput.click();
});
}
if(eFileDropClearButton !== null) {
eFileDropClearButton.addEventListener("click", function() {
handleFileDropClear();
});
}

View File

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

View File

@@ -1,26 +1,40 @@
<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)) }}
<div class="content-spacer">
{{ 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 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_paragraph(l10n("file.selection.1", applet_data.id, user_lang)) }}
{{ render_file_input(applet_data.id + "-input-file", true, ".xlsx, .xlsm", true, true, user_lang) }}
<div class="content-spacer mt-s">
{{ render_file_input(
applet_data.id + "-input-file", true, ".xlsx, .xlsm", true, false, user_lang,
l10n("file.selection.1", applet_data.id, user_lang)) }}
</div>
</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)) }}
<div class="content-spacer mt-s">
<div id="{{ applet_data.id }}-details-empty">
{{ render_paragraph(l10n("details.empty.1", applet_data.id, user_lang)) }}
</div>
<div id="{{ applet_data.id }}-details-populated" hidden>
{% if is_standalone %}
{{ render_button(
l10n("download.action.all", "commons", user_lang),
false, applet_data.id + "-files-download-all", "bkgd-green") }}
{{ render_button(
l10n("clear.all.files", "commons", user_lang),
false, applet_data.id + "-files-clear", "bkgd-orange") }}
{% else %}
{{ render_button(
"<i class=\"fa-duotone fa-solid fa-floppy-disks mr-xs\"></i>" +
l10n("download.action.all", "commons", user_lang),
@@ -29,23 +43,33 @@
"<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>
<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">
<tr>
<td rowspan="2" class="br bkgd-green bkgd-grid30 rl-l">
{% if is_standalone %}
<span class="mx-xxs">✅</span>
{% else %}
<i class="fa-duotone fa-solid fa-circle-check mx-s"></i>
{% endif %}
</td>
<td class="w-full t-bold">
<span id="tmpl-success-filename">PlaceholderSuccessName.xlsx</span>
</td>
<td rowspan="2" class="bl bkgd-blue bkgd-grid30 rr-l">
{% if is_standalone %}
<span class="mx-xxs">💾</span>
{% else %}
<i class="fa-duotone fa-download mx-s"></i>
{% endif %}
</td>
</tr>
<tr class="t-italic">
@@ -56,11 +80,15 @@
</template>
<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">
<tr>
<td rowspan="2" class="br bkgd-orange bkgd-grid30 rl-l">
{% if is_standalone %}
<span class="mx-xxs">⚠️</span>
{% else %}
<i class="fa-duotone fa-solid fa-triangle-exclamation mx-s"></i>
{% endif %}
</td>
<td class="w-full t-bold">
<span id="tmpl-warning-filename">PlaceholderWarningName.xlsx</span>
@@ -81,11 +109,15 @@
</template>
<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">
<tr>
<td rowspan="2" class="br bkgd-red bkgd-grid30 rl-l">
{% if is_standalone %}
<span class="mx-xxs">❌</span>
{% else %}
<i class="fa-duotone fa-solid fa-hexagon-exclamation mx-s"></i>
{% endif %}
</td>
<td class="w-full t-bold">
<span id="tmpl-error-filename">PlaceholderErrorName.xlsx</span>
@@ -103,8 +135,13 @@
</template>
{% if is_standalone %}
<section id="{{ applet_data.id }}-licenses">
{{ render_h2(l10n("licenses.title", applet_data.id, user_lang)) }}
<p>123</p>
<section id="{{ applet_data.id }}-licenses" class="mt-l mt-0-if-first">
{{ render_h2(l10n("license.title", applet_data.id, user_lang)) }}
<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>
{% endif %}

View File

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

View File

@@ -27,13 +27,21 @@
<hr class="subtle">
<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>
{% if not is_standalone %}
<button class="p-xs r-s border b-light primary rr-0 br-0">
<i class="fa-duotone fa-solid fa-download"></i>
</button>
<button id="uuid-generator-download-raw" class="p-xs r-s border b-light primary ml-0 r-0 br-0">
{% 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) }}
</button>
<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>
<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">
<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="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 }}/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="{{ url_for("static", filename="resources/NibblePoker/css/extra.css") }}">

View File

@@ -1,8 +1,32 @@
<div class="np-file-input-root-container">
<!-- FIXME: Use the common renderer ! -->
<div class="np-file-input-drop-container border r-m">
<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-xl"
{% if file_multiple %}multiple{% endif %}>
{% if file_upload_button or file_clear_button %}
<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">
<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 %}
@@ -12,52 +36,26 @@
{% 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 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 %}
{% if file_upload_button or file_clear_button %}
<br>
{% 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">
</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 %}
</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) }}
{{ text_override }}
{% endif %}
</p>
{% 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>

View File

@@ -8,7 +8,7 @@
{% elif heading_level == 4 %}
mt-m
{% endif %}
{{ heading_background_class }}">
{{ heading_background_class }} mt-0-if-first">
<h{{ heading_level }} class="t-w-500
{% if heading_level == 2 %}
@@ -28,7 +28,7 @@
{{ heading_inner_html }}
{% 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 %}
</h{{ heading_level }}>

View File

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

View File

@@ -9,32 +9,39 @@
{% block main_content %}
<section class="mt-l mt-0-if-first">
{{ render_h1(l10n("intro.title", "about", user_lang)) }}
<div class="content-spacer">
<img src="/resources/NibblePoker/images/about/profile-pic.jpg"
alt="" class="r-r img-profile f-right m-xs ml-xxs"
draggable="false">
{{ render_paragraph(l10n("intro.text.01", "about", user_lang) + l10n("intro.text.02", "about", user_lang)) }}
{{ render_paragraph(l10n("intro.text.10", "about", user_lang) + l10n("intro.text.11", "about", user_lang)) }}
{{ render_paragraph(l10n("intro.text.20", "about", user_lang) + l10n("intro.text.21", "about", user_lang)) }}
<!--{{ render_h1(l10n("tenets.title", "about", user_lang)) }}
<p class="mt-xs ml-s t-bold">
TODO
</p>-->
{{ 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>
<section class="mt-l mt-0-if-first">
{{ render_h1(l10n("future.title", "about", user_lang)) }}
{{ render_paragraph(l10n("future.text.01", "about", user_lang) + l10n("future.text.02", "about", user_lang)) }}
{{ render_paragraph(l10n("future.text.10", "about", user_lang)) }}
{{ render_paragraph(l10n("future.text.20", "about", user_lang)) }}
<div class="content-spacer">
{{ 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>
<section class="mt-l mt-0-if-first">
{{ render_h1(l10n("financing.title", "about", user_lang)) }}
{{ render_paragraph(l10n("financing.text.01", "about", user_lang) + l10n("financing.text.02", "about", user_lang)) }}
{{ render_paragraph(l10n("financing.text.10", "about", user_lang)) }}
{{ render_paragraph(l10n("financing.text.20", "about", user_lang) + l10n("financing.text.21", "about", user_lang)) }}
<div class="content-spacer">
{{ 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>
<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">
<section class="mt-l mt-0-if-first">
<div class="grid grid-col-2 grid-col-medium-1 grid-gap-m">
<div>
<table class="table-stylish table-p-xs border r-l w-full">
<thead>
<tr>
<th>{{ l10n("financing.part.service", "about", user_lang) }}</th>
@@ -44,15 +51,15 @@
<tbody>
<tr>
<td>{{ l10n("financing.part.domain.lu", "about", user_lang) }}</td>
<td>17,00 €</td>
<td>19,99 €</td>
</tr>
<tr>
<td>{{ l10n("financing.part.domain.com", "about", user_lang) }}</td>
<td>14,50 €</td>
<td>13,49 €</td>
</tr>
<tr>
<td>{{ l10n("financing.part.proxy.europe", "about", user_lang) }}</td>
<td>14,50 €</td>
<td>348 PLN / &pm;81,84 €</td>
</tr>
<tr>
<td>{{ l10n("financing.part.proxy.america", "about", user_lang) }}</td>
@@ -64,11 +71,13 @@
</tr>
<tr>
<td><b class="f-right">{{ l10n("financing.part.cost.yearly.total", "about", user_lang) }}:</b></td>
<td>&pm;89,00 €</td>
<td>&pm;160,32 €</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">
</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>
@@ -92,10 +101,13 @@
</tbody>
</table>
</div>
</div>
<p class="mt-xs ml-s t-super-muted t-center">
{{ l10n("financing.text.isp", "about", user_lang) }}
</p>
</section>
{% endblock %}
{% block extra_scripts %}

View File

@@ -8,24 +8,23 @@
{% endblock %}
{% 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">
{{ render_h1(l10n("email.title", "contact", user_lang), "fad fa-mail-bulk", "herwin.bozet@nibblepoker.lu") }}
<p class="m-s">
<a href="mailto:Herwin Bozet<herwin.bozet@nibblepoker.lu>?subject=Contact%20via%20NibblePoker.lu" class="a-hidden button-link">
<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>
</p>
<!--<p class="m-s">
<a href="mailto:Herwin Bozet<herwin.bozet@gmail.com>?subject=Contact%20via%20NibblePoker.lu" class="a-hidden button-link">
<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>-->
</section>
{{ render_h1(l10n("twitter.title", "contact", user_lang), "fab fa-twitter", "@NibblePoker") }}
<section class="mt-l mt-0-if-first">
{{ render_h1(l10n("twitter.title", "contact", user_lang), "fab fa-x-twitter", "@NibblePoker") }}
<p class="m-s">
<a href="https://twitter.com/messages/compose?recipient_id=937370791334895616" class="a-hidden button-link">
<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>
</p>
</section>
{% endblock %}

View File

@@ -12,6 +12,7 @@
{% endblock %}
{% block main_content %}
<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">
@@ -31,8 +32,10 @@
<a href="https://github.com/NibblePoker">{{ l10n("github_pro.title", "links", user_lang ) }}</a>
</p>
<p class="mt-xxs ml-l">{{ l10n("github_pro.text.1", "links", user_lang ) }}</p>
</section>
<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">
@@ -40,8 +43,10 @@
<a href="https://www.linkedin.com/in/herwin-bozet/">{{ l10n("linkedin.title", "links", user_lang ) }}</a>
</p>
<p class="mt-xxs ml-l">{{ l10n("linkedin.text.1", "links", user_lang ) }}</p>
</section>
<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">
@@ -61,6 +66,7 @@
<a href="https://git.nibblepoker.lu/">{{ l10n("gitea.title", "links", user_lang ) }}</a>
</p>
<p class="mt-xxs ml-l">{{ l10n("gitea.text.1", "links", user_lang ) }}</p>
</section>
{% endblock %}
{% block extra_scripts %}

View File

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

View File

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

View File

@@ -9,13 +9,34 @@
{% endblock %}
{% 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 %}
{% block content_listing %}
{% 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-xs r-m">

View File

@@ -45,7 +45,7 @@
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 %}
</div>

View File

@@ -1,14 +1,14 @@
{% extends "projects/_project.jinja" %}
{% block project_content %}
<section>
<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.p1", project_id, user_lang)) }}
</div>
</section>
<section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("features.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_list_ul([
@@ -28,7 +28,7 @@
</div>
</section>
<section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("limitations.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_list_ul([
@@ -50,14 +50,14 @@
</div>
</section>
<section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("doc.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_paragraph(l10n("doc.p1", project_id, user_lang)) }}
</div>
</section>
<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.p1", project_id, user_lang)) }}
@@ -99,7 +99,7 @@
</div>
</section>
<section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("demo.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_paragraph(l10n("demo.p1", project_id, user_lang)) }}
@@ -114,7 +114,7 @@
</div>
</section>
<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">
@@ -207,7 +207,7 @@
</div>
</section>
<section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("license.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_paragraph(
@@ -218,7 +218,7 @@
</div>
</section>
<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([

View File

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

View File

@@ -1,7 +1,7 @@
{% extends "projects/_project.jinja" %}
{% block project_content %}
<section>
<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.p1", project_id, user_lang)) }}
@@ -10,7 +10,7 @@
</div>
</section>
<section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("requirements.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_list_ul([
@@ -26,7 +26,7 @@
</div>
</section>
<section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("improvements.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_list_ul([
@@ -39,7 +39,7 @@
</div>
</section>
<section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("screenshots.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_splide([
@@ -50,7 +50,7 @@
</div>
</section>
<section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("usage.title", project_id, user_lang)) }}
<div class="content-spacer">
{{
@@ -78,7 +78,7 @@
</div>
</section>
<section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("formatting.title", project_id, user_lang)) }}
<div class="content-spacer">
{{
@@ -105,7 +105,7 @@
</div>
</section>
<section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("packages.title", project_id, user_lang)) }}
<div class="content-spacer">
{{ render_paragraph(l10n("packages.single.title", project_id, user_lang)) }}
@@ -117,10 +117,10 @@
</div>
</section>
<section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("version.current", "commons", user_lang)) }}
<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>
<tr>
<th>{{ l10n("cpu.architecture", "commons", user_lang) }}</th>
@@ -132,53 +132,134 @@
<tr>
<td>{{ l10n("cpu.any", "commons", 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_AnyCPU.zip" class="a-hidden">
{{ render_button(
"<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>",
False, None)
}}
</a>
</td>
</tr>
<tr>
<td rowspan="2">{{ l10n("cpu.x64", "commons", 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">
{{ render_button(
"<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>",
False, None)
}}
</a>
</td>
</tr>
<tr>
<td>{{ l10n("none.fs", "commons", user_lang) }}</td>
<td>...</td>
<td>
<a href="https://files.nibblepoker.lu/downloads/DotNet-ListComPort/3.0.0/ListComPort_v3.0.0_x64_SelfContained.zip" class="a-hidden mr-s">
{{ render_button(
"<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>",
False, None)
}}
</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>...</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>...</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>...</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>...</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>
<!--<tr>
<td rowspan="2">{{ l10n("cpu.arm32", "commons", 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>
<td>{{ l10n("none.fs", "commons", user_lang) }}</td>
<td>...</td>
</tr>
<td>
<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>
</table>
</div>
</section>
<section>
<section class="mt-l mt-0-if-first">
{{ render_h2(l10n("source.code", "commons", user_lang)) }}
<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>
<tr>
<th>{{ l10n("version", "commons", user_lang) }}</th>
@@ -188,14 +269,27 @@
<tbody>
<tr>
<td>v3.0.0</td>
<td>...</td>
<td>
<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>
</table>
</div>
</section>
<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([

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: *
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
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]:
if tags is None:
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)
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]:
tags: list[str] = input_tags.split(";")
for tag in tags:

View File

@@ -1,72 +1,10 @@
import copy
from typing import Optional
from locked_dict.locked_dict import LockedDict
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 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
def flatten_dict(d, parent_key='', separator='.'):
items = []
for key, value in d.items():
new_key = f"{parent_key}{separator}{key}" if parent_key else str(key)
if isinstance(value, dict):
items.extend(flatten_dict(value, new_key, separator).items())
else:
items.append((new_key, value))
return dict(items)

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
from . import Localizer
from .localizer import Localizer
DEFAULT_LANG = "en"
ALLOWED_LANGS = ["en", "fr"]
@@ -123,46 +123,3 @@ def l10n_url_switch(url: str, new_lang: Optional[str] = None) -> str:
url = "/" + new_lang + url
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,
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(
"elements/file-input.jinja",
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_clear_button=clear_button,
user_lang=user_lang,
text_override=text_override,
)

View File

@@ -1,28 +1,65 @@
from dataclasses import dataclass
from .l10n.utils import ALLOWED_LANGS
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:
global __SITEMAP_ENTRIES
__SITEMAP_ENTRIES = list()
__SITEMAP_ENTRIES = dict()
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 sitemap_entry in raw_sitemap_entries:
__SITEMAP_ENTRIES.append(
("/" + str(allowed_lang) + "/" + str(sitemap_entry))
for sitemap_entry_path in raw_sitemap_entries:
entry = SitemapEntry(**raw_sitemap_entries[sitemap_entry_path])
if not(allowed_lang == ""):
entry.priority = "0.0"
__SITEMAP_ENTRIES[
("/" + str(allowed_lang) + "/" + str(sitemap_entry_path))
.replace("//", "/")
.replace("//", "/")
)
# __SITEMAP_ENTRIES.append(sitemap_entry)
# for allowed_lang in ALLOWED_LANGS:
] = entry
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