Compare commits

..

14 Commits

Author SHA1 Message Date
bcdfe98c92 fix: inline svg icons to follow foreground color
All checks were successful
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2026-01-02 00:11:51 +01:00
bab803d538 update deno.lock
All checks were successful
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2025-12-03 14:37:52 +01:00
9df992aba3 nix: remove pandoc 2025-12-03 14:37:16 +01:00
df65ad1e10 use PL badges in CV 2025-12-03 14:36:49 +01:00
9f58fc3c32 migrate from markdown to djot
Also uses PL badges and icons added as djot
filters/renderers.
2025-12-03 14:35:24 +01:00
f8f105a766 display only select items in header bar 2025-12-03 14:34:53 +01:00
91aa5cc835 add forge icons 2025-12-03 14:34:27 +01:00
64bbaac403 add style for PL badges 2025-12-03 14:33:51 +01:00
7f94201212 css: cleanup 2025-12-03 14:31:44 +01:00
a085df81b4 use atkinson hyperlegible next font 2025-12-03 14:30:28 +01:00
6fdb515289 improve djot plugin 2025-12-03 14:27:00 +01:00
910038a5e3 add project page for lila and render djot pages 2025-11-14 01:09:43 +01:00
47473a53b5 typo: rename 'resumé' to 'résumé'
All checks were successful
buildbot/nix-eval Build done.
buildbot/nix-build Build done.
buildbot/nix-effects Build done.
2025-11-04 20:21:00 +01:00
9a30210864 add résumé readme 2025-11-04 20:19:01 +01:00
45 changed files with 432 additions and 142 deletions

View File

@@ -2,26 +2,57 @@ import lume from "lume/mod.ts";
import nav from "lume/plugins/nav.ts";
import codeHighlight from "lume/plugins/code_highlight.ts";
import googleFonts from "lume/plugins/google_fonts.ts";
import { djotRender } from "./_djot.ts";
import djotPlugin from "./_djot.ts";
import djot from "@djot/djot";
const site = lume();
site.filter("lowercasePL", (lang: string) => {
switch (lang) {
case "C++":
return "cpp";
case "C#":
return "csharp";
case "Python 3":
return "python3";
default:
return lang.toLowerCase();
}
});
site.use(nav());
site.use(codeHighlight());
site.use(djotPlugin({
renderOptions: {
overrides: {
symb: (symbol: djot.Symb, renderer: djot.HTMLRenderer) => {
if (symbol.alias.startsWith("si-")) {
const iconName = symbol.alias.substring(3);
const decoder = new TextDecoder("utf-8");
const svg = decoder.decode(
Deno.readFileSync(`./icons/${iconName}.svg`),
);
return svg;
}
return renderer.renderAstNodeDefault(symbol);
},
},
},
}));
site.use(googleFonts({
cssFile: "/styles/main.css",
placeholder: "/* import fonts */",
fonts: {
"Atkinson Hyperlegible": "https://fonts.google.com/share?selection.family=Atkinson+Hyperlegible:ital,wght@0,400;0,700;1,400;1,700",
"Atkinson Hyperlegible Next":
"https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible+Next:ital,wght@0,200..800;1,200..800",
"JetBrains Mono": "https://fonts.google.com/share?selection.family=JetBrains+Mono:ital,wght@0,100..800;1,100..800",
},
}));
site.copy("/styles");
site.copy("favicon.svg");
site.data("djot", djotRender);
site.filter("djot", djotRender);
site.copy("/icons")
export default site;

View File

@@ -1,4 +1,25 @@
import djot from "@djot/djot";
import Site from "lume/core/site.ts";
import { merge } from "lume/core/utils/object.ts";
// Djot does not export these types
type Filter = object;
type HTMLRenderOptions = object;
export interface Options {
/** The list of file extensions this plugin applies to */
extensions?: string[];
filters?: Filter[];
/** Options passed to djot library */
renderOptions?: HTMLRenderOptions;
}
// Default options
export const defaults: Options = {
extensions: [".dj", ".djot"],
};
function extractTitle(ast: djot.Doc): string {
const firstSection = ast.children.find((c) => c.tag == "section");
@@ -10,35 +31,80 @@ function extractTitle(ast: djot.Doc): string {
return title ?? "No title";
}
export function djotRender(content: string): string {
return djot.renderHTML(djot.parse(content));
export async function djotLoader(path: string | URL) {
const content = await Deno.readTextFile(path);
const ast = djot.parse(content);
const title = extractTitle(ast);
return {
title,
content,
};
}
export default async function djotLoader(path: string | URL) {
const content = await Deno.readTextFile(path);
const ast = djot.parse(content);
djot.applyFilter(ast, () => {
const stripMarkupSourceLinks: Filter = () => {
return {
link: (el) => {
link: (el: djot.Link) => {
if (el.destination) {
el.destination = el.destination.replace(
/(\.dj)(#[^.\s]+)?$/,
/(.(?:dj|md))(#[^.\s]+)?$/,
(_match: string, _ext: string, section: string) => {
return section ? section : "";
return section ?? "";
},
);
}
},
};
};
const defaultFilters = [
stripMarkupSourceLinks,
];
export class DjotEngine implements Lume.Engine {
filters: Filter[];
renderOptions?: HTMLRenderOptions;
constructor(filters: Filter[] = [], renderOptions?: HTMLRenderOptions) {
this.filters = [...defaultFilters, ...filters];
this.renderOptions = renderOptions;
}
render(
content: string | djot.Doc,
_data?: Record<string, unknown>,
_filename?: string,
): string {
if (typeof content === "string") {
content = djot.parse(content);
}
this.filters.forEach((filter, _index, _array) => {
djot.applyFilter(content, filter);
});
const title = extractTitle(ast);
const html = djot.renderHTML(ast);
return djot.renderHTML(
content,
this.renderOptions,
);
}
return {
title,
content: html,
addHelper() {}
deleteCache() {}
}
export default function (userOptions?: Options) {
const options = merge(defaults, userOptions);
return function (site: Site) {
const engine = new DjotEngine(options.filters, options.renderOptions);
site.loadPages(options.extensions, {
loader: djotLoader,
engine,
});
site.filter("djot", (content) => engine.render(content as string));
};
}

View File

@@ -15,11 +15,11 @@
<nav>
<a href="/" id="site-root" class="nav-menu-item">rpqt.fr</a>
<ul class="nav-menu">
{{ for item of nav.menu().children }}
{{ for item of ["now", "projects", "socials"] }}
<li>
<a href="{{ item.data.url }}" class="nav-menu-item"
{{ url.startsWith(item.data.url) ? 'id="header-nav-current"' : '' }}
>{{ item.slug }}</a>
<a href="/{{ item }}" class="nav-menu-item"
{{ url.startsWith("/" + item) ? 'id="header-nav-current"' : '' }}
>{{ item }}</a>
</li>
{{ /for }}
</ul>

119
deno.lock generated
View File

@@ -1,5 +1,5 @@
{
"version": "4",
"version": "5",
"specifiers": {
"jsr:@davidbonnet/astring@1.8.6": "1.8.6",
"jsr:@luca/esbuild-deno-loader@0.11.1": "0.11.1",
@@ -224,7 +224,8 @@
},
"npm": {
"@djot/djot@0.3.2": {
"integrity": "sha512-joMKR24B8rxueyFiJbpZAqEiypjvOyzTxzkhyr0q5mM/sUBaOD3unna/9IxtOotFugViyYlkIRaiXg3xM//zxg=="
"integrity": "sha512-joMKR24B8rxueyFiJbpZAqEiypjvOyzTxzkhyr0q5mM/sUBaOD3unna/9IxtOotFugViyYlkIRaiXg3xM//zxg==",
"bin": true
},
"@emnapi/runtime@1.3.1": {
"integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==",
@@ -234,87 +235,124 @@
},
"@img/sharp-darwin-arm64@0.33.5": {
"integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==",
"dependencies": [
"optionalDependencies": [
"@img/sharp-libvips-darwin-arm64"
]
],
"os": ["darwin"],
"cpu": ["arm64"]
},
"@img/sharp-darwin-x64@0.33.5": {
"integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==",
"dependencies": [
"optionalDependencies": [
"@img/sharp-libvips-darwin-x64"
]
],
"os": ["darwin"],
"cpu": ["x64"]
},
"@img/sharp-libvips-darwin-arm64@1.0.4": {
"integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="
"integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==",
"os": ["darwin"],
"cpu": ["arm64"]
},
"@img/sharp-libvips-darwin-x64@1.0.4": {
"integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="
"integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==",
"os": ["darwin"],
"cpu": ["x64"]
},
"@img/sharp-libvips-linux-arm64@1.0.4": {
"integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="
"integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==",
"os": ["linux"],
"cpu": ["arm64"]
},
"@img/sharp-libvips-linux-arm@1.0.5": {
"integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="
"integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==",
"os": ["linux"],
"cpu": ["arm"]
},
"@img/sharp-libvips-linux-s390x@1.0.4": {
"integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="
"integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==",
"os": ["linux"],
"cpu": ["s390x"]
},
"@img/sharp-libvips-linux-x64@1.0.4": {
"integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="
"integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==",
"os": ["linux"],
"cpu": ["x64"]
},
"@img/sharp-libvips-linuxmusl-arm64@1.0.4": {
"integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="
"integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==",
"os": ["linux"],
"cpu": ["arm64"]
},
"@img/sharp-libvips-linuxmusl-x64@1.0.4": {
"integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="
"integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==",
"os": ["linux"],
"cpu": ["x64"]
},
"@img/sharp-linux-arm64@0.33.5": {
"integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==",
"dependencies": [
"optionalDependencies": [
"@img/sharp-libvips-linux-arm64"
]
],
"os": ["linux"],
"cpu": ["arm64"]
},
"@img/sharp-linux-arm@0.33.5": {
"integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==",
"dependencies": [
"optionalDependencies": [
"@img/sharp-libvips-linux-arm"
]
],
"os": ["linux"],
"cpu": ["arm"]
},
"@img/sharp-linux-s390x@0.33.5": {
"integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==",
"dependencies": [
"optionalDependencies": [
"@img/sharp-libvips-linux-s390x"
]
],
"os": ["linux"],
"cpu": ["s390x"]
},
"@img/sharp-linux-x64@0.33.5": {
"integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==",
"dependencies": [
"optionalDependencies": [
"@img/sharp-libvips-linux-x64"
]
],
"os": ["linux"],
"cpu": ["x64"]
},
"@img/sharp-linuxmusl-arm64@0.33.5": {
"integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==",
"dependencies": [
"optionalDependencies": [
"@img/sharp-libvips-linuxmusl-arm64"
]
],
"os": ["linux"],
"cpu": ["arm64"]
},
"@img/sharp-linuxmusl-x64@0.33.5": {
"integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==",
"dependencies": [
"optionalDependencies": [
"@img/sharp-libvips-linuxmusl-x64"
]
],
"os": ["linux"],
"cpu": ["x64"]
},
"@img/sharp-wasm32@0.33.5": {
"integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==",
"dependencies": [
"@emnapi/runtime"
]
],
"cpu": ["wasm32"]
},
"@img/sharp-win32-ia32@0.33.5": {
"integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="
"integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==",
"os": ["win32"],
"cpu": ["ia32"]
},
"@img/sharp-win32-x64@0.33.5": {
"integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="
"integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==",
"os": ["win32"],
"cpu": ["x64"]
},
"@js-temporal/polyfill@0.4.4": {
"integrity": "sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==",
@@ -406,7 +444,8 @@
"mdurl",
"punycode.js",
"uc.micro"
]
],
"bin": true
},
"mdurl@2.0.0": {
"integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="
@@ -421,11 +460,17 @@
"integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="
},
"semver@7.7.1": {
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"bin": true
},
"sharp@0.33.5": {
"integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==",
"dependencies": [
"color",
"detect-libc",
"semver"
],
"optionalDependencies": [
"@img/sharp-darwin-arm64",
"@img/sharp-darwin-x64",
"@img/sharp-libvips-darwin-arm64",
@@ -444,11 +489,9 @@
"@img/sharp-linuxmusl-x64",
"@img/sharp-wasm32",
"@img/sharp-win32-ia32",
"@img/sharp-win32-x64",
"color",
"detect-libc",
"semver"
]
"@img/sharp-win32-x64"
],
"scripts": true
},
"simple-swizzle@0.2.2": {
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
@@ -733,6 +776,7 @@
"https://deno.land/x/lume@v3.0.1/core/searcher.ts": "19530e0149ca925334f98052863a52cdfbbeea9977342b209829999a34e816a6",
"https://deno.land/x/lume@v3.0.1/core/server.ts": "19cdd234f18c601d8386c7aa6d589616ce367fc571a96d4715f220a522e17ae8",
"https://deno.land/x/lume@v3.0.1/core/site.ts": "2fd2103559eeed80574947c5b357b05c0d55d90e6135d82ffd2e5facac4bfef0",
"https://deno.land/x/lume@v3.0.1/core/slugifier.ts": "3cb058f841f6eba1862f70f43e21de591af99cc6efacd9bb11dc0dbbab9eb703",
"https://deno.land/x/lume@v3.0.1/core/source.ts": "b766b3d45df0df97fefabbc57f745d1ad7be308df1949291946516c8648289f7",
"https://deno.land/x/lume@v3.0.1/core/utils/cli_options.ts": "ce8731a5e9c23b95217b6967dc4e5c434637a33d16806189acc6a87728b2e649",
"https://deno.land/x/lume@v3.0.1/core/utils/concurrent.ts": "cb0775b3d95f3faa356aa3a3e489dccef8807ed93cc4f84fcf5bc81e87c29504",
@@ -769,6 +813,7 @@
"https://deno.land/x/lume@v3.0.1/deps/hex.ts": "828718f24a780ff3ade8d0a8a5b57497cb31c257560ef12af99b6eb1a31e3bbd",
"https://deno.land/x/lume@v3.0.1/deps/highlight.ts": "e8f830a1137ff7e8246ce21518452b8cbf8089db409458c6d9c31040c11d8428",
"https://deno.land/x/lume@v3.0.1/deps/http.ts": "c9c148ce51d3dc64de768972907e02b2870f96bd3423219252a40b8f7bad4383",
"https://deno.land/x/lume@v3.0.1/deps/icons.ts": "73e24df578e30f0b290cf6c7147875facbdb4e21abc56edb2919b4640ab77140",
"https://deno.land/x/lume@v3.0.1/deps/init.ts": "05d45af66ebdfe63e43540618f51ece8f99d98dc49de890f10eeb43abe9ed0f3",
"https://deno.land/x/lume@v3.0.1/deps/jsonc.ts": "79f0eddc3c9e593310eb8e5918eb1506b1c7d7816e4ecb96894f634ecbe626ff",
"https://deno.land/x/lume@v3.0.1/deps/lightningcss.ts": "19f090ee781028aacd9817f204972b162c065e4c0ea99e24935eb489d2aadfd6",
@@ -787,12 +832,14 @@
"https://deno.land/x/lume@v3.0.1/mod.ts": "4ed2edf622df6109304095952f8a02844f5abc2992b6c9886af632b058f1a8f4",
"https://deno.land/x/lume@v3.0.1/plugins/code_highlight.ts": "ac6327e688e9e8fbd7798bdcc5f76b46d27db3e22ea3b74f545dc3296e8a1261",
"https://deno.land/x/lume@v3.0.1/plugins/google_fonts.ts": "7093462756c503499d8d3d14a6abfbf131bacd41f5d7602ecfc2775a8ee2b7b2",
"https://deno.land/x/lume@v3.0.1/plugins/icons.ts": "de11277acc85e2d882e21a88ab44c454bd9ea3dbf02cfe60efffef0cdd5a8996",
"https://deno.land/x/lume@v3.0.1/plugins/json.ts": "5c49499e56b919ec848d4118ec97dd4fe0a323a6cc4c648dc45ab55297614c12",
"https://deno.land/x/lume@v3.0.1/plugins/markdown.ts": "7e82d897c1e35bf119dcd18b6aec7a6ba5aa06848897b34ff9cd161ec7c8757e",
"https://deno.land/x/lume@v3.0.1/plugins/modules.ts": "4e177c0ffe972b9deef10db2bf0ae52b405418af4dbac03db9e7ffbd6a3ec6ae",
"https://deno.land/x/lume@v3.0.1/plugins/nav.ts": "505b2140d35c992e05b471f34e7b9f38ddd1cd13d588eb9fb3622ce59592ccac",
"https://deno.land/x/lume@v3.0.1/plugins/paginate.ts": "6a1a9a24d0fabed2f722a6a6f29d98559219c69475685034181816e82d367f2e",
"https://deno.land/x/lume@v3.0.1/plugins/search.ts": "5acb5be828bbbd012fb9226cb97ec3e370d43d05aa44d16e7e7d50bab368b442",
"https://deno.land/x/lume@v3.0.1/plugins/slugify_urls.ts": "ec2a78b13f094d99c90d1789149d98a60ea39297cbdc1d514fd267d8c8a42b85",
"https://deno.land/x/lume@v3.0.1/plugins/toml.ts": "e5bf35ed4915587acd453f002b00ae9b88c1782cadc25c703d7642a390af43ea",
"https://deno.land/x/lume@v3.0.1/plugins/url.ts": "15f2e80b6fcbf86f8795a3676b8d533bab003ac016ff127e58165a6ac3bffc1a",
"https://deno.land/x/lume@v3.0.1/plugins/vento.ts": "d74100c7168d49b3817559792c9a8fd1d380b3244051d92dfebc7531cb8b7665",

View File

@@ -27,7 +27,6 @@
pkgs.nil # Nix language server
pkgs.nixfmt-rfc-style
pkgs.typst
pkgs.pandoc
pkgs.tinymist
pkgs.vscode-css-languageserver
];

1
icons/codeberg.svg Normal file
View File

@@ -0,0 +1 @@
<svg class="text-icon" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Codeberg</title><path d="M11.999.747A11.974 11.974 0 0 0 0 12.75c0 2.254.635 4.465 1.833 6.376L11.837 6.19c.072-.092.251-.092.323 0l4.178 5.402h-2.992l.065.239h3.113l.882 1.138h-3.674l.103.374h3.86l.777 1.003h-4.358l.135.483h4.593l.695.894h-5.038l.165.589h5.326l.609.785h-5.717l.182.65h6.038l.562.727h-6.397l.183.65h6.717A12.003 12.003 0 0 0 24 12.75 11.977 11.977 0 0 0 11.999.747zm3.654 19.104.182.65h5.326c.173-.204.353-.433.513-.65zm.385 1.377.18.65h3.563c.233-.198.485-.428.712-.65zm.383 1.377.182.648h1.203c.356-.204.685-.412 1.042-.648zz"/></svg>

After

Width:  |  Height:  |  Size: 650 B

1
icons/gitea.svg Normal file
View File

@@ -0,0 +1 @@
<svg class="text-icon" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Gitea</title><path d="M4.209 4.603c-.247 0-.525.02-.84.088-.333.07-1.28.283-2.054 1.027C-.403 7.25.035 9.685.089 10.052c.065.446.263 1.687 1.21 2.768 1.749 2.141 5.513 2.092 5.513 2.092s.462 1.103 1.168 2.119c.955 1.263 1.936 2.248 2.89 2.367 2.406 0 7.212-.004 7.212-.004s.458.004 1.08-.394c.535-.324 1.013-.893 1.013-.893s.492-.527 1.18-1.73c.21-.37.385-.729.538-1.068 0 0 2.107-4.471 2.107-8.823-.042-1.318-.367-1.55-.443-1.627-.156-.156-.366-.153-.366-.153s-4.475.252-6.792.306c-.508.011-1.012.023-1.512.027v4.474l-.634-.301c0-1.39-.004-4.17-.004-4.17-1.107.016-3.405-.084-3.405-.084s-5.399-.27-5.987-.324c-.187-.011-.401-.032-.648-.032zm.354 1.832h.111s.271 2.269.6 3.597C5.549 11.147 6.22 13 6.22 13s-.996-.119-1.641-.348c-.99-.324-1.409-.714-1.409-.714s-.73-.511-1.096-1.52C1.444 8.73 2.021 7.7 2.021 7.7s.32-.859 1.47-1.145c.395-.106.863-.12 1.072-.12zm8.33 2.554c.26.003.509.127.509.127l.868.422-.529 1.075a.686.686 0 0 0-.614.359.685.685 0 0 0 .072.756l-.939 1.924a.69.69 0 0 0-.66.527.687.687 0 0 0 .347.763.686.686 0 0 0 .867-.206.688.688 0 0 0-.069-.882l.916-1.874a.667.667 0 0 0 .237-.02.657.657 0 0 0 .271-.137 8.826 8.826 0 0 1 1.016.512.761.761 0 0 1 .286.282c.073.21-.073.569-.073.569-.087.29-.702 1.55-.702 1.55a.692.692 0 0 0-.676.477.681.681 0 1 0 1.157-.252c.073-.141.141-.282.214-.431.19-.397.515-1.16.515-1.16.035-.066.218-.394.103-.814-.095-.435-.48-.638-.48-.638-.467-.301-1.116-.58-1.116-.58s0-.156-.042-.27a.688.688 0 0 0-.148-.241l.516-1.062 2.89 1.401s.48.218.583.619c.073.282-.019.534-.069.657-.24.587-2.1 4.317-2.1 4.317s-.232.554-.748.588a1.065 1.065 0 0 1-.393-.045l-.202-.08-4.31-2.1s-.417-.218-.49-.596c-.083-.31.104-.691.104-.691l2.073-4.272s.183-.37.466-.497a.855.855 0 0 1 .35-.077z"/></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

1
icons/github.svg Normal file
View File

@@ -0,0 +1 @@
<svg class="text-icon" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>

After

Width:  |  Height:  |  Size: 841 B

1
icons/gitlab.svg Normal file
View File

@@ -0,0 +1 @@
<svg class="text-icon" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitLab</title><path d="m23.6004 9.5927-.0337-.0862L20.3.9814a.851.851 0 0 0-.3362-.405.8748.8748 0 0 0-.9997.0539.8748.8748 0 0 0-.29.4399l-2.2055 6.748H7.5375l-2.2057-6.748a.8573.8573 0 0 0-.29-.4412.8748.8748 0 0 0-.9997-.0537.8585.8585 0 0 0-.3362.4049L.4332 9.5015l-.0325.0862a6.0657 6.0657 0 0 0 2.0119 7.0105l.0113.0087.03.0213 4.976 3.7264 2.462 1.8633 1.4995 1.1321a1.0085 1.0085 0 0 0 1.2197 0l1.4995-1.1321 2.4619-1.8633 5.006-3.7489.0125-.01a6.0682 6.0682 0 0 0 2.0094-7.003z"/></svg>

After

Width:  |  Height:  |  Size: 592 B

63
icons/radicle.svg Normal file
View File

@@ -0,0 +1,63 @@
<svg class="text-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 44 44" fill="none">
<g shape-rendering="crispEdges">
<rect x="8" y="0" width="4" height="4" fill="#5555FF"/>
<rect x="32" y="0" width="4" height="4" fill="#5555FF"/>
<rect x="12" y="4" width="4" height="4" fill="#5555FF"/>
<rect x="28" y="4" width="4" height="4" fill="#5555FF"/>
<rect x="12" y="8" width="4" height="4" fill="#5555FF"/>
<rect x="16" y="8" width="4" height="4" fill="#3333DD"/>
<rect x="20" y="8" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="8" width="4" height="4" fill="#3333DD"/>
<rect x="28" y="8" width="4" height="4" fill="#5555FF"/>
<rect x="8" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="12" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="16" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="20" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="28" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="32" y="12" width="4" height="4" fill="#5555FF"/>
<rect x="4" y="16" width="4" height="4" fill="#5555FF"/>
<rect x="8" y="16" width="4" height="4" fill="#5555FF"/>
<rect x="12" y="16" width="4" height="4" fill="#F4F4F4"/>
<rect x="16" y="16" width="4" height="4" fill="#F4F4F4"/>
<rect x="20" y="16" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="16" width="4" height="4" fill="#5555FF"/>
<rect x="28" y="16" width="4" height="4" fill="#F4F4F4"/>
<rect x="32" y="16" width="4" height="4" fill="#F4F4F4"/>
<rect x="36" y="16" width="4" height="4" fill="#5555FF"/>
<rect x="4" y="20" width="4" height="4" fill="#5555FF"/>
<rect x="8" y="20" width="4" height="4" fill="#5555FF"/>
<rect x="12" y="20" width="4" height="4" fill="#F4F4F4"/>
<rect x="16" y="20" width="4" height="4" fill="#FF55FF"/>
<rect x="20" y="20" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="20" width="4" height="4" fill="#5555FF"/>
<rect x="28" y="20" width="4" height="4" fill="#F4F4F4"/>
<rect x="32" y="20" width="4" height="4" fill="#FF55FF"/>
<rect x="36" y="20" width="4" height="4" fill="#5555FF"/>
<rect x="0" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="4" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="8" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="12" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="16" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="20" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="24" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="28" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="32" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="36" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="40" y="24" width="4" height="4" fill="#3333DD"/>
<rect x="8" y="28" width="4" height="4" fill="#3333DD"/>
<rect x="16" y="28" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="28" width="4" height="4" fill="#5555FF"/>
<rect x="32" y="28" width="4" height="4" fill="#3333DD"/>
<rect x="8" y="32" width="4" height="4" fill="#3333DD"/>
<rect x="16" y="32" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="32" width="4" height="4" fill="#5555FF"/>
<rect x="32" y="32" width="4" height="4" fill="#3333DD"/>
<rect x="16" y="36" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="36" width="4" height="4" fill="#5555FF"/>
<rect x="12" y="40" width="4" height="4" fill="#5555FF"/>
<rect x="16" y="40" width="4" height="4" fill="#5555FF"/>
<rect x="24" y="40" width="4" height="4" fill="#5555FF"/>
<rect x="28" y="40" width="4" height="4" fill="#5555FF"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

1
icons/sourcehut.svg Normal file
View File

@@ -0,0 +1 @@
<svg class="text-icon" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>SourceHut</title><path d="M12 0C5.371 0 0 5.371 0 12s5.371 12 12 12 12-5.371 12-12S18.629 0 12 0Zm0 21.677A9.675 9.675 0 0 1 2.323 12 9.675 9.675 0 0 1 12 2.323 9.675 9.675 0 0 1 21.677 12 9.675 9.675 0 0 1 12 21.677Z"/></svg>

After

Width:  |  Height:  |  Size: 323 B

16
index.dj Normal file
View File

@@ -0,0 +1,16 @@
# rpqt's web corner
Hi! I'm Romain, a computer science student at [Ensimag][] engineering school.
I'm interested in many aspects of IT so I try to play a little bit with
everything. I love Rust, Nix, Zig, TS and other cool tech.
## Temporary index
- [What I'm doing now](./now.dj)
- [Projects](./projects)
- [Socials](./socials.dj)
- [Stuff I use](./uses.dj)
- [Résumé/CV (public version)](./résumé/)
[Ensimag]: https://ensimag.grenoble-inp.fr

View File

@@ -1,13 +0,0 @@
---
layout: layouts/main.vto
title: rpqt's web corner
---
# rpqt's web corner
Hi! I'm Romain, a computer science student at [Ensimag] engineering school.
I'm interested in many aspects of IT so I try to play a little bit with
everything. I love Rust, Nix, Zig, TS and other cool tech.
[Ensimag]: https://ensimag.grenoble-inp.fr

5
now.dj Normal file
View File

@@ -0,0 +1,5 @@
# What I'm up to
- I am doing an exchange at [AGH][], in Kraków 🇵🇱, from October 2025 to February 2026.
[AGH]: https://www.agh.edu.pl/en/

5
now.md
View File

@@ -1,5 +0,0 @@
# What I'm up to
- I am doing an exchange at [AGH], in Kraków 🇵🇱, from October 2025 to February 2026.
[AGH]: https://www.agh.edu.pl/en/

View File

@@ -1,12 +0,0 @@
# Projects
## Lila
A simple programming language. It uses [Cranelift] as a compiler backend.
## Myrtle
A note-taking helper similar to [zk].
[Cranelift]: https://cranelift.dev
[zk]: https://zk-org.github.io/zk

17
projects/index.dj Normal file
View File

@@ -0,0 +1,17 @@
# Projects
## [Lila](./lila.dj)
A simple programming language. It uses [Cranelift][] as a compiler backend.
## Myrtle
A note-taking helper similar to [zk][].
## Statice
A static site generator supporting [Djot][].
[Cranelift]: https://cranelift.dev
[Djot]: https://djot.net
[zk]: https://zk-org.github.io/zk

42
projects/lila.dj Normal file
View File

@@ -0,0 +1,42 @@
# Lila
A simple programming language I make in my free time.
I'm trying to make it modular so I can easily try and compare different backends and tooling.
## Status
For now it can JIT-compile basic programs using [Cranelift][].
I'm still not decided on which language features I want to explore.
## Source mirrors
- :si-github: [GitHub](https://github.com/rpqt/lila)
- :si-gitea: [Gitea](https://git.turifer.dev/rpqt/lila)
- :si-sourcehut: [SourceHut](https://git.sr.ht/~rpqt/lila)
## Roadmap
### Parsing
- [x] Pest parser backend
- [ ] (wip) [Tree-sitter][] parser backend
- [ ] (wip) Tree-sitter grammar -- [git][tree-sitter-lila]
- [ ] (wip) Parser based on the tree-sitter grammar
### Static analysis
- [x] Basic type checking
### Codegen
- [x] (wip) Cranelift JIT compiler
- [x] Basic CLI
- [ ] Run the compiler on Wasm
- [ ] Wasm codegen
- [ ] REPL
[Cranelift]: https://cranelift.dev
[Tree-sitter]: https://tree-sitter.github.io/tree-sitter
[tree-sitter-lila]: https://git.sr.ht/~rpqt/tree-sitter-lila

2
résumé/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*.pdf
profile-circle.png

5
résumé/README.md Normal file
View File

@@ -0,0 +1,5 @@
# Résumé
To build the PDF versions, simply `make`. Before that, the profile picture
should be in this directory under the path `profile-circle.png`, since it is
not checked out for privacy.

View File

@@ -36,7 +36,7 @@
<center>
{{ for el of exp.stack }}
<span class="pl-badge">{{ el }}</span>
<span class="pl-badge pl-{{ el |> lowercasePL }}">{{ el }}</span>
{{ /for }}
</center>
</div>

15
socials.dj Normal file
View File

@@ -0,0 +1,15 @@
## Forges
### :si-gitea: [My Gitea instance](https://git.turifer.dev/rpqt)
### :si-radicle: [Radicle node](https://app.radicle.xyz/nodes/radicle.rpqt.fr)
### :si-sourcehut: [SourceHut](https://git.sr.ht/~rpqt)
### :si-github: [GitHub](https://github.com/rpqt)
### :si-codeberg: [Codeberg](https://codeberg.org/rpqt)
### :si-gitlab: [GitLab](https://gitlab.com/rpqt)
### :si-gitlab: [GRICAD GitLab instance](https://gricad-gitlab.univ-grenoble-alpes.fr/paquetr)

View File

@@ -1,9 +0,0 @@
## Forges
- [My Gitea instance](https://git.turifer.dev/rpqt)
- [Radicle node](https://app.radicle.xyz/nodes/radicle.rpqt.fr)
- [SourceHut](https://git.sr.ht/~rpqt)
- [GitHub](https://github.com/rpqt)
- [Codeberg](https://codeberg.org/rpqt)
- [GitLab](https://gitlab.com/rpqt)
- [GRICAD GitLab instance](https://gricad-gitlab.univ-grenoble-alpes.fr/paquetr)

View File

@@ -5,7 +5,7 @@
--color-foreground-dimmed: color-mix(in srgb, var(--color-foreground), transparent 40%);
/* --color-accent: #0692aa; */
--max-width: 900px;
--font-base-size: 20px;
--font-base-size: 1.25rem;
}
@media (prefers-color-scheme: dark) {
@@ -19,8 +19,7 @@
}
body {
/* font-family: "JetBrains Mono"; */
font-family: "Atkinson Hyperlegible";
font-family: "Atkinson Hyperlegible Next";
display: grid;
grid-template-rows: auto 1fr auto;
min-height: 100svh;
@@ -59,8 +58,6 @@ header>nav {
text-decoration: underline;
}
#site-root {}
#header-nav-current {
font-weight: bold;
}
@@ -76,17 +73,6 @@ h3 {
margin: 0.5em 0;
}
/*
h1::before { content: "#"; }
h2::before { content: "##"; }
h3::before { content: "###"; }
h1::before, h2::before, h3::before {
font-variant-ligatures: none;
margin-right: 0.3em;
}
*/
footer {
width: 100%;
text-align: center;
@@ -109,9 +95,39 @@ footer {
}
.pl-badge {
border: 1px solid;
--color: var(--color-foreground);
border-radius: 8px;
padding: 0.5em;
margin: 0.25em;
padding: 0em 0.5em;
margin: 0em;
display: inline-block;
font-size: 0.9em;
background: color-mix(in srgb, var(--color), transparent 60%);
color: var(--color);
}
.pl-python3 {
--color: goldenrod;
background: color-mix(in srgb, gold, transparent 60%);
}
.pl-cpp {
--color: blue;
}
.pl-csharp {
--color: purple;
}
.pl-rust {
--color: orangered;
}
/* An icon to be displayed within text, at the same size as the text */
.text-icon {
height: 1em;
width: 1em;
display: inline;
fill: var(--color-foreground);
position: relative;
top: .125em;
}

View File

@@ -6,22 +6,22 @@ There are [lots of pages](https://uses.tech) like this one showing developer set
### OS
I've used different Linux systems on my machines, mostly [Arch Linux] on my laptop.
I've used different Linux systems on my machines, mostly [Arch Linux][] on my laptop.
I recently joined the [_NixOS cult_ ❄️][NixOS], maybe you should too 👀.
My handphone runs on [GrapheneOS].
My handphone runs on [GrapheneOS][].
### Apps
- **Editor**: helix
- **Terminal**: alacritty, ghostty
- **Font**: JetBrains Mono
- **Shell**: zsh
- **Prompt**: starship
- **History**: atuin
- **Other utils**: zoxide, direnv, rg
- **Web browser**: Firefox, Vanadium
- **VPN**: Tailscale, Zerotier
- **DNS**: Self-hosted [Unbound]
- *Editor*: helix
- *Terminal*: alacritty, ghostty
- *Font*: JetBrains Mono
- *Shell*: zsh
- *Prompt*: starship
- *Shell history*: atuin
- *Other utils*: zoxide, direnv, rg
- *Web browser*: Firefox, Vanadium
- *VPN*: Tailscale, Zerotier
- *DNS*: Self-hosted [Unbound][]
## Hardware
@@ -33,7 +33,7 @@ My handphone is a Pixel 7a.
### Keyboard
I built a split mechanical keyboard, the (Ferris) [Sweep] LP, which I only use at home.
I built a split mechanical keyboard, the (Ferris) [Sweep][] LP, which I only use at home.
### Audio