init
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
[submodule "themes/duckquill"]
|
||||
path = themes/duckquill
|
||||
url = https://codeberg.org/daudix/duckquill.git
|
179
config.toml
Normal file
|
@ -0,0 +1,179 @@
|
|||
base_url = "https://jone.rs"
|
||||
title = "jone.rs"
|
||||
description = "Joners FOSS self-hosting space"
|
||||
theme = "duckquill"
|
||||
|
||||
compile_sass = true
|
||||
minify_html = true
|
||||
generate_feeds = true
|
||||
# Only the first file will be used in the navbar feed button,
|
||||
# other feeds will still be available in page's head.
|
||||
feed_filenames = ["rss.xml", "atom.xml"]
|
||||
build_search_index = true
|
||||
author = "Joners"
|
||||
|
||||
default_language = "de"
|
||||
|
||||
taxonomies = [{ name = "tags", feed = true }, { name = "service", feed = true }]
|
||||
|
||||
[markdown]
|
||||
highlight_code = true
|
||||
highlight_theme = "css"
|
||||
highlight_themes_css = [
|
||||
{ theme = "solarized-dark", filename = "syntax-theme-dark.css" },
|
||||
{ theme = "solarized-light", filename = "syntax-theme-light.css" }
|
||||
]
|
||||
smart_punctuation = true
|
||||
bottom_footnotes = true
|
||||
|
||||
[search]
|
||||
# index_format = "elasticlunr_json"
|
||||
index_format = "fuse_json"
|
||||
|
||||
[languages.en]
|
||||
title = "jone.rs"
|
||||
description = "Joners FOSS self-hosting space"
|
||||
generate_feeds = true
|
||||
|
||||
taxonomies = [{ name = "tags", feed = true }, { name = "service", feed = true }]
|
||||
|
||||
[extra]
|
||||
# Which theme should be used by default (light/dark).
|
||||
# default_theme = "dark"
|
||||
|
||||
# Sets theme and browser theme color.
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name/theme-color
|
||||
# accent_color = "#ff7800"
|
||||
|
||||
# Ditto but for the dark theme.
|
||||
# If not set regular variant will be used.
|
||||
# accent_color_dark = "#ffa348"
|
||||
|
||||
# Whether to fix low contrast in text selection, checkboxes, etc.
|
||||
# Use only if the default doesn't provide enough contrast, e.g. the accent color is set to yellow.
|
||||
#
|
||||
# fix_contrast = true
|
||||
|
||||
# Ditto but for the dark theme.
|
||||
# fix_contrast_dark = true
|
||||
|
||||
# Whether to use fonts bundled with Duckquill instead of system ones.
|
||||
# Keep in mind that it also changes the style of headings.
|
||||
bundled_fonts = true
|
||||
|
||||
# URL to website's issue tracker
|
||||
issues_url = "https://git.jone.rs/joners/jone.rs/issues"
|
||||
# URL to website's source code
|
||||
source_url = "https://git.jone.rs/joners/jone.rs"
|
||||
|
||||
# Whether to show "copy code" button on all code blocks
|
||||
# that have the language set.
|
||||
# See https://www.getzola.org/documentation/content/syntax-highlighting/
|
||||
show_copy_button = true
|
||||
|
||||
# Whether to show estimated read time in posts.
|
||||
show_reading_time = true
|
||||
|
||||
# Whether to show a share button in article's quick actions.
|
||||
# Uses https://shareopenly.org.
|
||||
show_share_button = true
|
||||
|
||||
# Whether to show the backlinks button for linked articles in the article's quick actions
|
||||
show_backlinks = true
|
||||
|
||||
# Whether to enable the KaTeX library for rendering LaTeX.
|
||||
# Note: This will make your page significantly heavier.
|
||||
# Instead, consider enabling it per page/section.
|
||||
# katex = false
|
||||
|
||||
# Whether to render table of contents on all pages.
|
||||
# Will not be rendered if page doesn't have any headings.
|
||||
# Can be set per page/section.
|
||||
# toc = true
|
||||
|
||||
# Whether to render inline table of contents at the top of all pages,
|
||||
# in addition to floating quick navigation buttons.
|
||||
# Can be set per page/section.
|
||||
# toc_inline = true
|
||||
|
||||
# Whether to use numbered (ordered) list for table of contents.
|
||||
# Can be set per page/section.
|
||||
# toc_ordered = true
|
||||
|
||||
# Custom separator used across the theme.
|
||||
# separator = "•"
|
||||
# Custom separator used in title tag and posts metadata.
|
||||
# title_separator = "-"
|
||||
|
||||
[extra.nav]
|
||||
# Whether to automatically hide nav when not hovered or focused
|
||||
# auto_hide = true
|
||||
# Whether to show the Atom/RSS feed button in the nav
|
||||
show_feed = true
|
||||
# Whether to show the manual theme switcher in the nav
|
||||
show_theme_switcher = true
|
||||
# Whether to show the link to the source repository in the nav
|
||||
show_repo = false
|
||||
# Links used in the nav.
|
||||
# For local files use same link format as in Markdown,
|
||||
# i.e. "@/blog/_index.md".
|
||||
# See https://www.getzola.org/documentation/content/linking/#internal-links
|
||||
links = [
|
||||
# { name = "Links", menu = [
|
||||
# { url = "@/blog/_index.md", name = "Blog" },
|
||||
# { url = "@/demo/index.md", name = "Demo" },
|
||||
# { url = "@/mods/index.md", name = "Mods" }
|
||||
# ] },
|
||||
{ url = "@/blog/_index.md", name = "Blog" },
|
||||
{ url = "@/services/_index.md", name = "Services" },
|
||||
{ url = "https://liberapay.com/Joners", name = "Spende" }
|
||||
]
|
||||
|
||||
[extra.footer]
|
||||
# Links used in the footer.
|
||||
# Same as the nav ones.
|
||||
links = [
|
||||
{ url = "@/imprint/index.md", name = "Imprint" },
|
||||
{ url = "@/services/_index.md", name = "Services" },
|
||||
{ url = "https://status.jone.rs/status/joners", name = "Status" }
|
||||
]
|
||||
# Social links in the footer.
|
||||
# Any URL-encoded SVG can be used as an icon.
|
||||
# https://simpleicons.org is the recommended source of SVG icons.
|
||||
# For URL encoding use https://yoksel.github.io/url-encoder/.
|
||||
# Make sure that "external quotes" are set to "double".
|
||||
socials = [
|
||||
{ url = "https://git.jone.rs/joners", name = "Forgejo", icon = "%3Csvg role='img' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle%3EForgejo%3C/title%3E%3Cpath d='M16.7773 0c1.6018 0 2.9004 1.2986 2.9004 2.9005s-1.2986 2.9004-2.9004 2.9004c-1.0854 0-2.0315-.596-2.5288-1.4787H12.91c-2.3322 0-4.2272 1.8718-4.2649 4.195l-.0007 2.1175a7.0759 7.0759 0 0 1 4.148-1.4205l.1176-.001 1.3385.0002c.4973-.8827 1.4434-1.4788 2.5288-1.4788 1.6018 0 2.9004 1.2986 2.9004 2.9005s-1.2986 2.9004-2.9004 2.9004c-1.0854 0-2.0315-.596-2.5288-1.4787H12.91c-2.3322 0-4.2272 1.8718-4.2649 4.195l-.0007 2.319c.8827.4973 1.4788 1.4434 1.4788 2.5287 0 1.602-1.2986 2.9005-2.9005 2.9005-1.6018 0-2.9004-1.2986-2.9004-2.9005 0-1.0853.596-2.0314 1.4788-2.5287l-.0002-9.9831c0-3.887 3.1195-7.0453 6.9915-7.108l.1176-.001h1.3385C14.7458.5962 15.692 0 16.7773 0ZM7.2227 19.9052c-.6596 0-1.1943.5347-1.1943 1.1943s.5347 1.1943 1.1943 1.1943 1.1944-.5347 1.1944-1.1943-.5348-1.1943-1.1944-1.1943Zm9.5546-10.4644c-.6596 0-1.1944.5347-1.1944 1.1943s.5348 1.1943 1.1944 1.1943c.6596 0 1.1943-.5347 1.1943-1.1943s-.5347-1.1943-1.1943-1.1943Zm0-7.7346c-.6596 0-1.1944.5347-1.1944 1.1943s.5348 1.1943 1.1944 1.1943c.6596 0 1.1943-.5347 1.1943-1.1943s-.5347-1.1943-1.1943-1.1943Z'/%3E%3C/svg%3E" },
|
||||
{ url = "https://social.jone.rs/@joners", name = "Mastodon", icon = "%3Csvg role='img' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle%3EMastodon%3C/title%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E" },
|
||||
{ url = "https://jone.rs/about#contact", name = "More", icon = "%3Csvg fill='%23000000' height='200px' width='200px' version='1.1' id='Capa_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 32.055 32.055' xml:space='preserve'%3E%3Cg id='SVGRepo_bgCarrier' stroke-width='0'%3E%3C/g%3E%3Cg id='SVGRepo_tracerCarrier' stroke-linecap='round' stroke-linejoin='round'%3E%3C/g%3E%3Cg id='SVGRepo_iconCarrier'%3E%3Cg%3E%3Cpath d='M3.968,12.061C1.775,12.061,0,13.835,0,16.027c0,2.192,1.773,3.967,3.968,3.967c2.189,0,3.966-1.772,3.966-3.967 C7.934,13.835,6.157,12.061,3.968,12.061z M16.233,12.061c-2.188,0-3.968,1.773-3.968,3.965c0,2.192,1.778,3.967,3.968,3.967 s3.97-1.772,3.97-3.967C20.201,13.835,18.423,12.061,16.233,12.061z M28.09,12.061c-2.192,0-3.969,1.774-3.969,3.967 c0,2.19,1.774,3.965,3.969,3.965c2.188,0,3.965-1.772,3.965-3.965S30.278,12.061,28.09,12.061z'%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E" },
|
||||
]
|
||||
# Whether to show "© Title, YEAR"
|
||||
show_copyright = true
|
||||
# Whether to show "Powered by Zola and Duckquill"
|
||||
show_powered_by = true
|
||||
# Whether to show link to website source
|
||||
show_source = true
|
||||
# Custom copyright text
|
||||
# copyright = "© *Aperture* **Science** ~~Innovators~~, `1972`"
|
||||
|
||||
# Based on https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/
|
||||
#
|
||||
# Mastodon-powered commenting.
|
||||
# Values can be overridden in the front-matter, e.g.
|
||||
# for multi-author blogs or guest posts.
|
||||
#
|
||||
# These variables are also used for Mastodon verification,
|
||||
# the needed rel="me" link is set in the head based on these.
|
||||
[extra.comments]
|
||||
# Your Mastodon API host; instance that you have an account on.
|
||||
host = "social.jone.rs"
|
||||
# Your Mastodon username; used to determine who the original poster is.
|
||||
user = "joners"
|
||||
# Whether to show the QR code to Mastodon post
|
||||
show_qr = true
|
||||
|
||||
[extra.debug]
|
||||
# Display outlines around all elements for debugging purposes
|
||||
layout = false
|
||||
# Don't load any styles for debugging purposes
|
||||
no_styles = false
|
21
content/_index.en.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
+++
|
||||
title = "Home"
|
||||
+++
|
||||
|
||||
{% crt() %}
|
||||
```
|
||||
_ _ _ _ _
|
||||
>(')____, >(')____, >(')____, >(')____, >(') ___,
|
||||
(` =~~/ (` =~~/ (` =~~/ (` =~~/ (` =~~/
|
||||
jgs~^~^`---'~^~^~^`---'~^~^~^`---'~^~^~^`---'~^~^~^`---'~^~^~
|
||||
```
|
||||
{% end %}
|
||||
|
||||
# Hey, It's Joners
|
||||
|
||||
I am, well what am I actually. This question has been on my mind for quite a while and I won't have an answer to it any time soon. Nevertheless, I would like to present some of my projects and websites to you.
|
||||
|
||||
## Projects
|
||||
- You can find my blog posts [here](@/blog/_index.md)
|
||||
- My self-hosted services are listed [here](@/services/_index.md)
|
||||
- You can find out more about me [here](@/about/index.md)
|
21
content/_index.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
+++
|
||||
title = "Home"
|
||||
+++
|
||||
|
||||
{% crt() %}
|
||||
```
|
||||
_ _ _ _ _
|
||||
>(')____, >(')____, >(')____, >(')____, >(') ___,
|
||||
(` =~~/ (` =~~/ (` =~~/ (` =~~/ (` =~~/
|
||||
jgs~^~^`---'~^~^~^`---'~^~^~^`---'~^~^~^`---'~^~^~^`---'~^~^~
|
||||
```
|
||||
{% end %}
|
||||
|
||||
# Hey, hier ist Joners
|
||||
|
||||
Ich bin, ja was bin ich eigentlich. Diese Frage beschäftigt mich schon eine ganze Weile und darauf wird sich in Kürze auch noch keine Antwort finden. Nichtsdestotrotz möchte ich dir einige meiner Projekte und Webseiten präsentieren.
|
||||
|
||||
## Projekte
|
||||
- Meine Blogbeiträge findest du [hier](@/blog/_index.md)
|
||||
- Meine selbstgehosteten Dienste sind [hier](@/services/_index.md) aufgelistet
|
||||
- Mehr über mich kannst du [hier](@/about/index.md) erfahren
|
2
content/about/index.en.md
Normal file
|
@ -0,0 +1,2 @@
|
|||
+++
|
||||
+++
|
2
content/about/index.md
Normal file
|
@ -0,0 +1,2 @@
|
|||
+++
|
||||
+++
|
7
content/blog/_index.en.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
+++
|
||||
title = "Blog"
|
||||
sort_by = "date"
|
||||
template = "article_list.html"
|
||||
page_template = "article.html"
|
||||
paginate_by = 2
|
||||
+++
|
7
content/blog/_index.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
+++
|
||||
title = "Blog"
|
||||
sort_by = "date"
|
||||
template = "article_list.html"
|
||||
page_template = "article.html"
|
||||
paginate_by = 2
|
||||
+++
|
42
content/blog/first-post/index.en.md
Normal file
|
@ -0,0 +1,42 @@
|
|||
+++
|
||||
authors = ["Joners"]
|
||||
title = "My first post"
|
||||
description = "Es gibt für alles ein erstes Mal."
|
||||
date = 2025-02-01
|
||||
|
||||
[extra.comments]
|
||||
# Long thread with image
|
||||
#
|
||||
# host = "mastodon.social"
|
||||
# user = "brownpau"
|
||||
# id = "104529877688537579"
|
||||
#
|
||||
# Thread with multiple images per post
|
||||
#
|
||||
# host = "mastodon.blaede.family"
|
||||
# user = "cassidy"
|
||||
# id = "112774854109302186"
|
||||
#
|
||||
# Thread with preview cards
|
||||
# host = "mastodon.blaede.family"
|
||||
# user = "cassidy"
|
||||
# id = "110669429936617026"
|
||||
#
|
||||
# Post on GoToSocial
|
||||
#
|
||||
# host = "alpha.polymaths.social"
|
||||
# user = "orbitalmartian"
|
||||
# id = "01J7ETKJ19FGBDQGS1ZWZ3KEPP"
|
||||
#
|
||||
# Post on Sharkey
|
||||
#
|
||||
# host = "is-a.wyvern.rip"
|
||||
# user = "volpeon"
|
||||
# id = "9qy755nsnu2c0hbc"
|
||||
sharkey = true
|
||||
host = "social.jone.rs"
|
||||
user = "joners"
|
||||
id = "a3mqysjjb21e0070"
|
||||
+++
|
||||
|
||||
Heyho dear people. I will use this site mainly to link my service and other cool projects from other people. It's mainly a collection point. So it's hard to say if and how regularly blog posts will appear here. But if I want to get something off my chest and a social media post is not enough, then it will be posted here. Until then, feel free to look around here.
|
45
content/blog/first-post/index.md
Normal file
|
@ -0,0 +1,45 @@
|
|||
+++
|
||||
authors = ["Joners"]
|
||||
title = "Mein erster Post"
|
||||
description = "Es gibt für alles ein erstes Mal."
|
||||
date = 2025-02-01
|
||||
|
||||
[taxonomies]
|
||||
tags = ["Demo", "Test"]
|
||||
|
||||
[extra.comments]
|
||||
# Long thread with image
|
||||
#
|
||||
# host = "mastodon.social"
|
||||
# user = "brownpau"
|
||||
# id = "104529877688537579"
|
||||
#
|
||||
# Thread with multiple images per post
|
||||
#
|
||||
# host = "mastodon.blaede.family"
|
||||
# user = "cassidy"
|
||||
# id = "112774854109302186"
|
||||
#
|
||||
# Thread with preview cards
|
||||
# host = "mastodon.blaede.family"
|
||||
# user = "cassidy"
|
||||
# id = "110669429936617026"
|
||||
#
|
||||
# Post on GoToSocial
|
||||
#
|
||||
# host = "alpha.polymaths.social"
|
||||
# user = "orbitalmartian"
|
||||
# id = "01J7ETKJ19FGBDQGS1ZWZ3KEPP"
|
||||
#
|
||||
# Post on Sharkey
|
||||
#
|
||||
# host = "is-a.wyvern.rip"
|
||||
# user = "volpeon"
|
||||
# id = "9qy755nsnu2c0hbc"
|
||||
sharkey = true
|
||||
host = "social.jone.rs"
|
||||
user = "joners"
|
||||
id = "a3mqysjjb21e0070"
|
||||
+++
|
||||
|
||||
Heyho liebe Menschen. Ich werde diese Seite hauptsächlich dafür nutzen meine Service zu verlinken und andere coole Projekte von anderen Menschen. Es ist hauptsächlich ein Sammelbecken. Schwierig daher zu sagen, ob und wie regelmäßig Blog Posts hier erscheinen werden. Wenn ich aber was loswerden will und dafür ein Scoial Media Post nicht genügt, dann wird es hier gepostet. Bis dahin schaut euch gerne hier um.
|
2
content/donate/index.en.md
Normal file
|
@ -0,0 +1,2 @@
|
|||
+++
|
||||
+++
|
116
content/donate/index.md
Normal file
|
@ -0,0 +1,116 @@
|
|||
+++
|
||||
title = "Mods"
|
||||
[extra]
|
||||
toc = true
|
||||
toc_inline = true
|
||||
toc_ordered = true
|
||||
+++
|
||||
|
||||
Mods enhance/change some Duckquill visuals. They are updated alongside Duckquill to ensure that you don't need to manually update them every release.
|
||||
|
||||
|
||||
```toml
|
||||
[extra]
|
||||
styles = ["mods.css"]
|
||||
```
|
||||
|
||||
## Background Image
|
||||
|
||||
Want to set some nice image as a background? We got you covered:
|
||||
|
||||

|
||||
|
||||
```scss
|
||||
body {
|
||||
background-image: var(--bg-overlay), url("https://images.unsplash.com/photo-1523712999610-f77fbcfc3843");
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
background-attachment: fixed;
|
||||
}
|
||||
```
|
||||
|
||||
Most of the time contrast should be okay, but what if it's not? Simply adjust the opacity of `--bg-overlay` based on your needs:
|
||||
|
||||
```scss
|
||||
@import "../themes/duckquill/sass/_variables.scss";
|
||||
|
||||
@include theme-variables using ($theme) {
|
||||
@if $theme == "dark" {
|
||||
--bg-overlay: linear-gradient(rgb(0 0 0 / 0.9), rgb(0 0 0 / 0.9));
|
||||
}
|
||||
|
||||
@else {
|
||||
--bg-overlay: linear-gradient(rgb(255 255 255 / 0.8), rgb(255 255 255 / 0.8));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Classic Article List
|
||||
|
||||
Prefer the less fancy look of the article list used in Duckquill some time ago (to some extent)? It can be done with the `classic-article-list` mod:
|
||||
|
||||

|
||||
|
||||
```scss
|
||||
@use "../themes/duckquill/sass/mods/classic-article-list";
|
||||
```
|
||||
|
||||
## Classic Navbar
|
||||
|
||||
You can make navbar have more traditional look by using the `classic-nav` mod:
|
||||
|
||||

|
||||
|
||||
```scss
|
||||
@use "../themes/duckquill/sass/mods/classic-nav";
|
||||
```
|
||||
|
||||
Or you can make it sticked to top but not full-width with the `sticked-nav` mod:
|
||||
|
||||
{% alert(note=true) %}
|
||||
Not compatible with the `classic-nav` mod.
|
||||
{% end %}
|
||||
|
||||

|
||||
|
||||
```scss
|
||||
@use "../themes/duckquill/sass/mods/sticked-nav";
|
||||
```
|
||||
|
||||
## Classic Strikethrough
|
||||
|
||||
The default strikethrough style is too much? It can be fixed using the `classic-del` mod:
|
||||
|
||||

|
||||
|
||||
```scss
|
||||
@use "../themes/duckquill/sass/mods/classic-del";
|
||||
```
|
||||
|
||||
## Modern Headings
|
||||
|
||||
Default headings might not fit your taste, that's understandable. They can be ~~made boring~~ fixed with the `modern-headings` mod:
|
||||
|
||||

|
||||
|
||||
```scss
|
||||
@use "../themes/duckquill/sass/mods/modern-headings";
|
||||
```
|
||||
|
||||
## Modern Horizontal Rule
|
||||
|
||||
Don't like that fancy horizontal rule? Make it more modern with the `modern-hr` mod:
|
||||
|
||||

|
||||
|
||||
```scss
|
||||
@use "../themes/duckquill/sass/mods/modern-hr";
|
||||
```
|
||||
|
||||
## No Edge Highlight
|
||||
|
||||
Hate the skeuomorphic edge highlight on all semi-transparent elements? Let's get rid of it using the `no-edge-highlight` mod:
|
||||
|
||||
```scss
|
||||
@use "../themes/duckquill/sass/mods/no-edge-highlight";
|
||||
```
|
1
content/imprint/index.en.md
Symbolic link
|
@ -0,0 +1 @@
|
|||
index.md
|
15
content/imprint/index.md
Normal file
|
@ -0,0 +1,15 @@
|
|||
+++
|
||||
title = "Impressum"
|
||||
+++
|
||||
## Betrieben von:
|
||||
Joners
|
||||
|
||||
c/o IP-Management #4197
|
||||
|
||||
Ludwig-Erhard-Str. 18
|
||||
|
||||
20459 Hamburg
|
||||
|
||||
## Kontakt
|
||||
joners(at)jone.rs
|
||||
|
21
content/rules/index.en.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
+++
|
||||
+++
|
||||
{% alert(note=true) %}
|
||||
[Regeln auf Deutsch](@/rules/index.md)
|
||||
{% end %}
|
||||
|
||||
# Rules
|
||||
|
||||
## 🌈 This is not a place for conspiracy myths and/or intolerance
|
||||
We do not tolerate public spaces that spread misinformation. For example: Corona is a lie, vaccinations contain chips, chemtrails, the earth is round - er - flat, the flying spaghetti monster does not exist, or similar.
|
||||
|
||||
We are aware of the tolerance paradox and, in order to promote tolerance, we will not accept intolerant opinions.
|
||||
|
||||
## 🕊️ This is not a place for content glorifying violence and/or illegal content
|
||||
Such as:
|
||||
|
||||
- Sexual depiction of children
|
||||
- Content that is against the law in Germany and/or France, such as Holocaust denial or Nazi symbols.
|
||||
- Promotion of national socialist ideology
|
||||
- Open violations and depiction of extreme violence
|
||||
- Content that we consider to be hateful towards certain people or groups or to incite violence.
|
21
content/rules/index.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
+++
|
||||
+++
|
||||
{% alert(note=true) %}
|
||||
[Rules in English](@/rules/index.en.md)
|
||||
{% end %}
|
||||
|
||||
# Regeln
|
||||
|
||||
## 🌈 Dies ist kein Ort für Verschwörungs-Mythen oder Intoleranz
|
||||
Wir tolerieren keine öffentlichen Räume die Fehlinformationen streuen. Beispielsweise: Corona sei eine Lüge, Impfungen beinhalten Chips, Chemtrails, die Erde sei rund - äh - flach, das fliegende Spaghetti Monster würde nicht existieren, oder Ähnliches.
|
||||
|
||||
Wir sind uns des Toleranz-Paradoxons bewusst und werden, um Toleranz zu fördern, intolerante Meinungen nicht akzeptieren.
|
||||
|
||||
## 🕊️ Dies ist kein Ort für Gewaltverherrlichende und/oder illegale Inhalte
|
||||
Wie zum Beispiel:
|
||||
|
||||
- Sexuelle Darstellung von Kindern
|
||||
- Inhalte, die in Deutschland und/oder Frankreich gegen das Gesetz verstoßen, beispielsweise Holocaust-Leugnung oder Nazi Symbole.
|
||||
- Bewerben von national-sozialistischen Ideologie
|
||||
- Offene Verletzungen und Darstellung extremer, ausgeübter Gewalt
|
||||
- Inhalte, die wir als hasserfüllt gegenüber bestimmten Personen oder Gruppen, oder zum Anstiften von Gewalt einschätzen.
|
7
content/services/_index.en.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
+++
|
||||
title = "Blog"
|
||||
sort_by = "date"
|
||||
template = "article_list.html"
|
||||
page_template = "article.html"
|
||||
paginate_by = 2
|
||||
+++
|
7
content/services/_index.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
+++
|
||||
title = "Blog"
|
||||
sort_by = "date"
|
||||
template = "service_list.html"
|
||||
page_template = "service.html"
|
||||
paginate_by = 2
|
||||
+++
|
42
content/services/sharkey/index.en.md
Normal file
|
@ -0,0 +1,42 @@
|
|||
+++
|
||||
authors = ["Joners"]
|
||||
title = "Service"
|
||||
description = "Es gibt für alles ein erstes Mal."
|
||||
date = 2025-02-01
|
||||
|
||||
[extra.comments]
|
||||
# Long thread with image
|
||||
#
|
||||
# host = "mastodon.social"
|
||||
# user = "brownpau"
|
||||
# id = "104529877688537579"
|
||||
#
|
||||
# Thread with multiple images per post
|
||||
#
|
||||
# host = "mastodon.blaede.family"
|
||||
# user = "cassidy"
|
||||
# id = "112774854109302186"
|
||||
#
|
||||
# Thread with preview cards
|
||||
# host = "mastodon.blaede.family"
|
||||
# user = "cassidy"
|
||||
# id = "110669429936617026"
|
||||
#
|
||||
# Post on GoToSocial
|
||||
#
|
||||
# host = "alpha.polymaths.social"
|
||||
# user = "orbitalmartian"
|
||||
# id = "01J7ETKJ19FGBDQGS1ZWZ3KEPP"
|
||||
#
|
||||
# Post on Sharkey
|
||||
#
|
||||
# host = "is-a.wyvern.rip"
|
||||
# user = "volpeon"
|
||||
# id = "9qy755nsnu2c0hbc"
|
||||
sharkey = true
|
||||
host = "social.jone.rs"
|
||||
user = "joners"
|
||||
id = "a3mqysjjb21e0070"
|
||||
+++
|
||||
|
||||
Heyho dear people. I will use this site mainly to link my service and other cool projects from other people. It's mainly a collection point. So it's hard to say if and how regularly blog posts will appear here. But if I want to get something off my chest and a social media post is not enough, then it will be posted here. Until then, feel free to look around here.
|
92
content/services/sharkey/index.md
Normal file
|
@ -0,0 +1,92 @@
|
|||
+++
|
||||
authors = ["Joners"]
|
||||
title = "Sharkey"
|
||||
description = "Der umfangreiche Fediverse Server."
|
||||
date = 2025-02-13
|
||||
categories = ["Kategorie 1"]
|
||||
|
||||
[taxonomies]
|
||||
service = ["Social"]
|
||||
|
||||
[extra.comments]
|
||||
# Long thread with image
|
||||
#
|
||||
# host = "mastodon.social"
|
||||
# user = "brownpau"
|
||||
# id = "104529877688537579"
|
||||
#
|
||||
# Thread with multiple images per post
|
||||
#
|
||||
# host = "mastodon.blaede.family"
|
||||
# user = "cassidy"
|
||||
# id = "112774854109302186"
|
||||
#
|
||||
# Thread with preview cards
|
||||
# host = "mastodon.blaede.family"
|
||||
# user = "cassidy"
|
||||
# id = "110669429936617026"
|
||||
#
|
||||
# Post on GoToSocial
|
||||
#
|
||||
# host = "alpha.polymaths.social"
|
||||
# user = "orbitalmartian"
|
||||
# id = "01J7ETKJ19FGBDQGS1ZWZ3KEPP"
|
||||
#
|
||||
# Post on Sharkey
|
||||
#
|
||||
# host = "is-a.wyvern.rip"
|
||||
# user = "volpeon"
|
||||
# id = "9qy755nsnu2c0hbc"
|
||||
sharkey = true
|
||||
host = "social.jone.rs"
|
||||
user = "joners"
|
||||
id = "a3mqysjjb21e0070"
|
||||
+++
|
||||
|
||||
{% alert(note=true) %}
|
||||
[Zur Instanz](https://social.jone.rs)
|
||||
{% end %}
|
||||
|
||||
# Das Fediverse und Microblogging mit Sharkey
|
||||
|
||||
Elon Musk mit X (Twitter).
|
||||
Mark Zuckerberg mit Facebook, Instagram und Threads.
|
||||
Zhang Yiming mit Tiktok. Was haben sie alle drei gemeinsam?
|
||||
Alle drei Personen sind stinkreich und einige davon vertreten sehr antidemokratische Positionen.
|
||||
Das macht sie als sehr einflussreiche Menschen sehr gefährlich.
|
||||
Zusätzlich kommen die Plattformen aus Ländern, die ich aufgrund derer Politik und politischen Entwicklungen sowie deren Verständnis für den Datenschutz kritisch sehe.
|
||||
Diese Plattformen sind alle zentralisierte Plattformen.
|
||||
|
||||
## Das Problem mit zentralisierten Plattformen
|
||||
|
||||
Diese wenigen großen Plattformen haben Unmengen an Daten und stellen Datenmonopole dar.
|
||||
Häufig weiß man nicht genau, wie die persönlichen Daten verwendet, gespeichert oder weitergegeben werden.
|
||||
Außerdem haben diese die Kontrolle über die Daten und Inhalte der Nutzer. (Keine) Regeln und Richtlinien führen zu Zensur und Inhaltskontrollen bzw. Überflutung (rechter) Verschwörungsmythen und Fake News und können ein Einfallstor für Desinformationskampagnen werden.
|
||||
|
||||
Obendrein nutzen alle Plattformen Algorithmen, um Inhalte zu kuratieren und anzuzeigen.
|
||||
Das trägt zu "Filterblasen" bei und kann die Vielfalt der Meinungen und Informationen einschränken.
|
||||
Die Menschen bleiben schlimmstenfalls in ihren bestehenden Überzeugungen gefangen.
|
||||
|
||||
Die Nutzung von zentralisierten Plattformen führt zu einer sehr starken Abhängigkeit eines Anbieters.
|
||||
Eine Folge davon ist, Menschen bleiben auf Plattformen, obwohl sie diese (mittlerweile) verteufeln oder wechseln die Anbieter.
|
||||
Das ändert aber nichts an der Problematik der Abhängigkeit, wenn man von X zu Threads und dann zu Bluesky wechselt.
|
||||
|
||||
Ein Gegenpol zur Zentralisierung kann das Fediverse schaffen.
|
||||
|
||||
## Was ist das Fediverse?
|
||||
|
||||
Unter Fediverse versteht sich eine Vielzahl von dezentralen sozialen Netzwerken, die durch offene Protokolle miteinander verbunden sind.
|
||||
Dies ermöglicht Nutzern, Inhalte zu erstellen, zu teilen und zu interagieren, ohne auf eine zentrale Autorität angewiesen zu sein.
|
||||
Einige bekannte Ableger davon sind Mastodon, Pixelfed und PeerTube.
|
||||
Im Fediverse hat sich das ActivityPub durchgesetzt. Ist es erfolgreich integriert, ist es egal, auf welchem Ableger man sich bewegt, um Inhalte von anderen Nutzern, die andere Ableger nutzen, konsumieren zu können.
|
||||
Eine Dezentralisierung bedeutet, dass Nutzer ihre Daten selbst kontrollieren und die Plattformen nach ihren eigenen Bedürfnissen anpassen.
|
||||
|
||||
## Warum Sharkey
|
||||
|
||||
Sharkey ist ein bisschen das bessere Mastodon.
|
||||
Es ist auch eine Microblogging-Plattform, die im Fediverse angesiedelt ist und sich an Nutzer richtet, die kurze Nachrichten, Gedanken und Updates teilen möchten.
|
||||
|
||||
Es ist mächtiger als Mastodon und dennoch einsteigerfreundlicher als Mastodon durch den sehr schönen vorhandenen Onboarding-Prozess.
|
||||
Sharkey bietet mehrere Themes an und es ist leichter Themen durch das Feature Antenna zu verfolgen.
|
||||
Weitere Highlights finden sich in der [ReadMe](https://activitypub.software/TransFem-org/Sharkey) des Projektes.
|
||||
|
85
i18n/de.toml
Normal file
|
@ -0,0 +1,85 @@
|
|||
# Shown in language picker for multi-language sites
|
||||
language_name = "Deutsch"
|
||||
# Tera date format used for listing posts
|
||||
# (post publication date, tag posts list...).
|
||||
# Not used in comments, "date_locale" is used instead.
|
||||
# See https://docs.rs/chrono/0.4.31/chrono/format/strftime/index.html
|
||||
date_format = "%d. %B %Y"
|
||||
date_locale = "de_DE"
|
||||
|
||||
# Menu items.
|
||||
# Should match the names in config.extra.nav.links and config.extra.footer.links.
|
||||
Links = "Links"
|
||||
Blog = "Blog"
|
||||
Imprint = "Impressum"
|
||||
Mods = "Mods"
|
||||
Coffee = "Coffee"
|
||||
|
||||
all_tags = "Alle Tags anzeigen"
|
||||
archived = "Archiviert"
|
||||
author = "Autor"
|
||||
author_conjunction = " und "
|
||||
author_separator = ", "
|
||||
backlinks = "Backlinks"
|
||||
blog_post_author = "Autor des Blogbeitrags"
|
||||
boosts_from = "Boosts von $INSTANCE"
|
||||
by_author = "Von $AUTHOR"
|
||||
caution = "Achtung"
|
||||
comments = "Kommentare"
|
||||
comments_description = "Du kannst diesen Blogbeitrag kommentieren, indem du dich mit einem Mastodon- oder einem anderen ActivityPub/Fediverse-Konto öffentlich auf diesen Beitrag antwortest. Bekannte nicht-private Antworten werden unten angezeigt."
|
||||
comments_noscript = "Das Laden von Kommentaren basiert auf JavaScript. Versuchen Sie, JavaScript zu aktivieren und neu zu laden, oder besuchen Sie den Originalbeitrag auf Mastodon."
|
||||
comments_qr = "QR-Code zum Mastodon-Beitrag"
|
||||
copy_code = "Code kopieren"
|
||||
disclaimer = "Disclaimer"
|
||||
drafted = "Entwurf"
|
||||
faves_from = "Favorites von $INSTANCE"
|
||||
featured = "Featured"
|
||||
feed = "Feed"
|
||||
file_an_issue = "Problem einreichen"
|
||||
filter_by_tag = "Nach Tag filtern"
|
||||
first = "Erste"
|
||||
go_to_top = "Nach oben gehen"
|
||||
hot = "Hot"
|
||||
important = "Wichtig"
|
||||
language = "Sprache"
|
||||
last = "Letzte"
|
||||
load_comments = "Kommentare laden"
|
||||
loading = "Laden"
|
||||
many_minutes_read = "$NUMBER Minuten Lesedauer"
|
||||
many_posts = "$NUMBER Beiträge insgesamt"
|
||||
many_tags = "$NUMBER Tags insgesamt"
|
||||
minutes_read = "$NUMBER Minute Lesedauer"
|
||||
more_matches = "$MATCHES weitere Treffer"
|
||||
next = "Nächste"
|
||||
no_comments = "Noch keine Kommentare :/"
|
||||
note = "Anmerkung"
|
||||
one_posts = "$NUMBER Beitrag insgesamt"
|
||||
one_tags = "$NUMBER Tag insgesamt"
|
||||
open_post = "Beitrag öffnen"
|
||||
poor = "Mangelhaft"
|
||||
posts = "$NUMBER Beiträge insgesamt"
|
||||
posts_with_tag = "Beiträge mit dem Tag $TAG"
|
||||
powered_by = "Powered by $ZOLA and $DUCKQUILL"
|
||||
previous = "Vorherig"
|
||||
published = "Veröffentlicht am"
|
||||
reload = "Neu laden"
|
||||
repo = "Repository"
|
||||
search = "Suche"
|
||||
search_for = "Suche nach"
|
||||
sensitive = "Sensibler Inhalt"
|
||||
share = "Teilen"
|
||||
skip_to_content = "Zum Hauptinhalt springen"
|
||||
source = "Website source"
|
||||
table_of_contents = "Inhaltsverzeichnis"
|
||||
tags = "tags"
|
||||
tags_title = "Tags"
|
||||
theme = "Theme"
|
||||
theme_dark = "Zum dunklen Theme wechseln"
|
||||
theme_light = "Zum hellen Theme wechseln"
|
||||
theme_system = "Systemtheme verwenden"
|
||||
tip = "Tipp"
|
||||
trigger_warning = "Content Note"
|
||||
updated = "Aktualisiert am"
|
||||
view_comment = "Kommentar anzeigen bei"
|
||||
view_profile = "Profil ansehen unter"
|
||||
warning = "Warnung"
|
85
i18n/en.toml
Normal file
|
@ -0,0 +1,85 @@
|
|||
# Shown in language picker for multi-language sites
|
||||
language_name = "English"
|
||||
# Tera date format used for listing posts
|
||||
# (post publication date, tag posts list...).
|
||||
# Not used in comments, "date_locale" is used instead.
|
||||
# See https://docs.rs/chrono/0.4.31/chrono/format/strftime/index.html
|
||||
date_format = "%B %d, %Y"
|
||||
date_locale = "en_US"
|
||||
|
||||
# Menu items.
|
||||
# Should match the names in config.extra.nav.links and config.extra.footer.links.
|
||||
Links = "Links"
|
||||
Blog = "Blog"
|
||||
Demo = "Demo"
|
||||
Mods = "Mods"
|
||||
Coffee = "Coffee"
|
||||
|
||||
all_tags = "See all tags"
|
||||
archived = "Archived"
|
||||
author = "Author"
|
||||
author_conjunction = " and "
|
||||
author_separator = ", "
|
||||
backlinks = "Backlinks"
|
||||
blog_post_author = "Blog post author"
|
||||
boosts_from = "Boosts from $INSTANCE"
|
||||
by_author = "By $AUTHOR"
|
||||
caution = "Caution"
|
||||
comments = "Comments"
|
||||
comments_description = "You can comment on this blog post by publicly replying to this post using a Mastodon or other ActivityPub/Fediverse account. Known non-private replies are displayed below."
|
||||
comments_noscript = "Loading comments relies on JavaScript. Try enabling JavaScript and reloading, or visit the original post on Mastodon."
|
||||
comments_qr = "QR code to a Mastodon post"
|
||||
copy_code = "Copy Code"
|
||||
disclaimer = "Disclaimer"
|
||||
drafted = "Drafted"
|
||||
faves_from = "Favorites from $INSTANCE"
|
||||
featured = "Featured"
|
||||
feed = "Feed"
|
||||
file_an_issue = "File an Issue"
|
||||
filter_by_tag = "Filter by tag"
|
||||
first = "First"
|
||||
go_to_top = "Go to Top"
|
||||
hot = "Hot"
|
||||
important = "Important"
|
||||
language = "Language"
|
||||
last = "Last"
|
||||
load_comments = "Load Comments"
|
||||
loading = "Loading"
|
||||
many_minutes_read = "$NUMBER minutes read"
|
||||
many_posts = "$NUMBER posts in total"
|
||||
many_tags = "$NUMBER tags in total"
|
||||
minutes_read = "$NUMBER minute read"
|
||||
more_matches = "$MATCHES more matches"
|
||||
next = "Next"
|
||||
no_comments = "No Comments yet :/"
|
||||
note = "Note"
|
||||
one_posts = "$NUMBER post in total"
|
||||
one_tags = "$NUMBER tag in total"
|
||||
open_post = "Open Post"
|
||||
poor = "Poor"
|
||||
posts = "$NUMBER posts in total"
|
||||
posts_with_tag = "Posts with tag $TAG"
|
||||
powered_by = "Powered by $ZOLA and $DUCKQUILL"
|
||||
previous = "Previous"
|
||||
published = "Published on"
|
||||
reload = "Reload"
|
||||
repo = "Repository"
|
||||
search = "Search"
|
||||
search_for = "Search for"
|
||||
sensitive = "Sensitive Content"
|
||||
share = "Share"
|
||||
skip_to_content = "Skip to Main Content"
|
||||
source = "Website source"
|
||||
table_of_contents = "Table of Contents"
|
||||
tags = "tags"
|
||||
tags_title = "Tags"
|
||||
theme = "Theme"
|
||||
theme_dark = "Switch to Dark Theme"
|
||||
theme_light = "Switch to Light Theme"
|
||||
theme_system = "Use System Theme"
|
||||
tip = "Tip"
|
||||
trigger_warning = "Content Note"
|
||||
updated = "Updated on"
|
||||
view_comment = "View Comment At"
|
||||
view_profile = "View Profile At"
|
||||
warning = "Warning"
|
BIN
public/404.gif
Normal file
After Width: | Height: | Size: 4 KiB |
1
public/404.html
Normal file
BIN
public/404.png
Normal file
After Width: | Height: | Size: 340 B |
1
public/about/index.html
Normal file
BIN
public/apple-touch-icon.png
Normal file
After Width: | Height: | Size: 28 KiB |
46
public/atom.xml
Normal file
|
@ -0,0 +1,46 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
|
||||
<title>jone.rs</title>
|
||||
<subtitle>Joners FOSS self-hosting space</subtitle>
|
||||
<link rel="self" type="application/atom+xml" href="https://jone.rs/atom.xml"/>
|
||||
<link rel="alternate" type="text/html" href="https://jone.rs"/>
|
||||
<generator uri="https://www.getzola.org/">Zola</generator>
|
||||
<updated>2025-02-01T00:00:00+00:00</updated>
|
||||
<id>https://jone.rs/atom.xml</id>
|
||||
<entry xml:lang="de">
|
||||
<title>Mein erster Post</title>
|
||||
<published>2025-02-01T00:00:00+00:00</published>
|
||||
<updated>2025-02-01T00:00:00+00:00</updated>
|
||||
|
||||
<author>
|
||||
<name>
|
||||
Joners
|
||||
</name>
|
||||
</author>
|
||||
|
||||
<link rel="alternate" type="text/html" href="https://jone.rs/blog/first-post/"/>
|
||||
<id>https://jone.rs/blog/first-post/</id>
|
||||
|
||||
<content type="html" xml:base="https://jone.rs/blog/first-post/"><p>Heyho liebe Menschen. Ich werde diese Seite hauptsächlich dafür nutzen meine Service zu verlinken und andere coole Projekte von anderen Menschen. Es ist hauptsächlich ein Sammelbecken. Schwierig daher zu sagen, ob und wie regelmäßig Blog Posts hier erscheinen werden. Wenn ich aber was loswerden will und dafür ein Scoial Media Post nicht genügt, dann wird es hier gepostet. Bis dahin schaut euch gerne hier um.</p>
|
||||
</content>
|
||||
|
||||
</entry>
|
||||
<entry xml:lang="de">
|
||||
<title>Service</title>
|
||||
<published>2025-02-01T00:00:00+00:00</published>
|
||||
<updated>2025-02-01T00:00:00+00:00</updated>
|
||||
|
||||
<author>
|
||||
<name>
|
||||
Joners
|
||||
</name>
|
||||
</author>
|
||||
|
||||
<link rel="alternate" type="text/html" href="https://jone.rs/services/service1/"/>
|
||||
<id>https://jone.rs/services/service1/</id>
|
||||
|
||||
<content type="html" xml:base="https://jone.rs/services/service1/"><p>Heyho dear people. I will use this site mainly to link my service and other cool projects from other people. It’s mainly a collection point. So it’s hard to say if and how regularly blog posts will appear here. But if I want to get something off my chest and a social media post is not enough, then it will be posted here. Until then, feel free to look around here.</p>
|
||||
</content>
|
||||
|
||||
</entry>
|
||||
</feed>
|
1
public/auto-render.min.js
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={771:function(t){t.exports=e}},n={};function r(e){var o=n[e];if(void 0!==o)return o.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var o={};return function(){r.d(o,{default:function(){return d}});var e=r(771),t=r.n(e);const n=function(e,t,n){let r=n,o=0;const i=e.length;for(;r<t.length;){const n=t[r];if(o<=0&&t.slice(r,r+i)===e)return r;"\\"===n?r++:"{"===n?o++:"}"===n&&o--,r++}return-1},i=/^\\begin{/;var a=function(e,t){let r;const o=[],a=new RegExp("("+t.map((e=>e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))).join("|")+")");for(;r=e.search(a),-1!==r;){r>0&&(o.push({type:"text",data:e.slice(0,r)}),e=e.slice(r));const a=t.findIndex((t=>e.startsWith(t.left)));if(r=n(t[a].right,e,t[a].left.length),-1===r)break;const l=e.slice(0,r+t[a].right.length),s=i.test(l)?l:e.slice(t[a].left.length,r);o.push({type:"math",data:s,rawData:l,display:t[a].display}),e=e.slice(r+t[a].right.length)}return""!==e&&o.push({type:"text",data:e}),o};const l=function(e,n){const r=a(e,n.delimiters);if(1===r.length&&"text"===r[0].type)return null;const o=document.createDocumentFragment();for(let e=0;e<r.length;e++)if("text"===r[e].type)o.appendChild(document.createTextNode(r[e].data));else{const i=document.createElement("span");let a=r[e].data;n.displayMode=r[e].display;try{n.preProcess&&(a=n.preProcess(a)),t().render(a,i,n)}catch(i){if(!(i instanceof t().ParseError))throw i;n.errorCallback("KaTeX auto-render: Failed to parse `"+r[e].data+"` with ",i),o.appendChild(document.createTextNode(r[e].rawData));continue}o.appendChild(i)}return o},s=function(e,t){for(let n=0;n<e.childNodes.length;n++){const r=e.childNodes[n];if(3===r.nodeType){let o=r.textContent,i=r.nextSibling,a=0;for(;i&&i.nodeType===Node.TEXT_NODE;)o+=i.textContent,i=i.nextSibling,a++;const s=l(o,t);if(s){for(let e=0;e<a;e++)r.nextSibling.remove();n+=s.childNodes.length-1,e.replaceChild(s,r)}else n+=a}else if(1===r.nodeType){const e=" "+r.className+" ";-1===t.ignoredTags.indexOf(r.nodeName.toLowerCase())&&t.ignoredClasses.every((t=>-1===e.indexOf(" "+t+" ")))&&s(r,t)}}};var d=function(e,t){if(!e)throw new Error("No element provided to render");const n={};for(const e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);n.delimiters=n.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],n.ignoredTags=n.ignoredTags||["script","noscript","style","textarea","pre","code","option"],n.ignoredClasses=n.ignoredClasses||[],n.errorCallback=n.errorCallback||console.error,n.macros=n.macros||{},s(e,n)}}(),o=o.default}()}));
|
1
public/blog/first-post/index.html
Normal file
1
public/blog/index.html
Normal file
1
public/blog/page/1/index.html
Normal file
|
@ -0,0 +1 @@
|
|||
<!doctype html><meta charset=utf-8><link href=https://jone.rs/blog/ rel=canonical><meta content="0; url=https://jone.rs/blog/" http-equiv=refresh><title>Redirect</title><p><a href=https://jone.rs/blog/>Click here</a> to be redirected.
|
BIN
public/card.png
Normal file
After Width: | Height: | Size: 1.2 MiB |
27
public/closable.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
const closable = document.querySelectorAll("details.closable");
|
||||
|
||||
closable.forEach((detail) => {
|
||||
detail.addEventListener("toggle", () => {
|
||||
if (detail.open) setTargetDetail(detail);
|
||||
});
|
||||
});
|
||||
|
||||
function setTargetDetail(targetDetail) {
|
||||
closable.forEach((detail) => {
|
||||
if (detail !== targetDetail) {
|
||||
detail.open = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
document.addEventListener("click", function (event) {
|
||||
const isClickInsideDetail = [...closable].some((detail) =>
|
||||
detail.contains(event.target)
|
||||
);
|
||||
|
||||
if (!isClickInsideDetail) {
|
||||
closable.forEach((detail) => {
|
||||
detail.open = false;
|
||||
});
|
||||
}
|
||||
});
|
406
public/comments.js
Normal file
|
@ -0,0 +1,406 @@
|
|||
// Taken from https://carlschwan.eu/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/
|
||||
// Attachment, card, and spoiler code taken from https://github.com/cassidyjames/cassidyjames.github.io/blob/99782788a7e3ba3cc52d6803010873abd1b02b9e/_includes/comments.html#L251-L296
|
||||
|
||||
let blogPostAuthorText = document.getElementById("blog-post-author-text").textContent;
|
||||
let boostsFromText = document.getElementById("boosts-from-text").textContent;
|
||||
let dateLocale = document.getElementById("date-locale").textContent;
|
||||
let favesFromText = document.getElementById("faves-from-text").textContent;
|
||||
let host = document.getElementById("host").textContent;
|
||||
let id = document.getElementById("id").textContent;
|
||||
let lazyAsyncImage = document.getElementById("lazy-async-image").textContent;
|
||||
let loadingText = document.getElementById("loading-text").textContent;
|
||||
let noCommentsText = document.getElementById("no-comments-text").textContent;
|
||||
let relAttributes = document.getElementById("rel-attributes").textContent;
|
||||
let reloadText = document.getElementById("reload-text").textContent;
|
||||
let sensitiveText = document.getElementById("sensitive-text").textContent;
|
||||
let user = document.getElementById("user").textContent;
|
||||
let viewCommentText = document.getElementById("view-comment-text").textContent;
|
||||
let viewProfileText = document.getElementById("view-profile-text").textContent;
|
||||
|
||||
document.getElementById("load-comments").addEventListener("click", loadComments);
|
||||
|
||||
function escapeHtml(unsafe) {
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
function emojify(input, emojis) {
|
||||
let output = input;
|
||||
|
||||
emojis.forEach((emoji) => {
|
||||
let picture = document.createElement("picture");
|
||||
|
||||
let source = document.createElement("source");
|
||||
source.setAttribute("srcset", escapeHtml(emoji.url));
|
||||
source.setAttribute("media", "(prefers-reduced-motion: no-preference)");
|
||||
|
||||
let img = document.createElement("img");
|
||||
img.className = "emoji";
|
||||
img.setAttribute("src", escapeHtml(emoji.static_url));
|
||||
img.setAttribute("alt", `:${emoji.shortcode}:`);
|
||||
img.setAttribute("title", `:${emoji.shortcode}:`);
|
||||
if (lazyAsyncImage == "true") {
|
||||
img.setAttribute("decoding", "async");
|
||||
img.setAttribute("loading", "lazy");
|
||||
}
|
||||
|
||||
picture.appendChild(source);
|
||||
picture.appendChild(img);
|
||||
|
||||
output = output.replace(`:${emoji.shortcode}:`, picture.outerHTML);
|
||||
});
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
function loadComments() {
|
||||
let commentsWrapper = document.getElementById("comments-wrapper");
|
||||
commentsWrapper.innerHTML = "";
|
||||
|
||||
let loadCommentsButton = document.getElementById("load-comments");
|
||||
loadCommentsButton.innerHTML = loadingText;
|
||||
loadCommentsButton.disabled = true;
|
||||
|
||||
fetch(`https://${host}/api/v1/statuses/${id}/context`)
|
||||
.then(function (response) {
|
||||
return response.json();
|
||||
})
|
||||
.then(function (data) {
|
||||
let descendants = data["descendants"];
|
||||
if (
|
||||
descendants &&
|
||||
Array.isArray(descendants) &&
|
||||
descendants.length > 0
|
||||
) {
|
||||
commentsWrapper.innerHTML = "";
|
||||
|
||||
descendants.forEach(function (status) {
|
||||
console.log(descendants);
|
||||
if (status.account.display_name.length > 0) {
|
||||
status.account.display_name = escapeHtml(
|
||||
status.account.display_name
|
||||
);
|
||||
status.account.display_name = emojify(
|
||||
status.account.display_name,
|
||||
status.account.emojis
|
||||
);
|
||||
} else {
|
||||
status.account.display_name = status.account.username;
|
||||
}
|
||||
|
||||
let instance = "";
|
||||
if (status.account.acct.includes("@")) {
|
||||
instance = status.account.acct.split("@")[1];
|
||||
} else {
|
||||
instance = host;
|
||||
}
|
||||
|
||||
const isReply = status.in_reply_to_id !== id;
|
||||
|
||||
let op = false;
|
||||
if (status.account.acct == user) {
|
||||
op = true;
|
||||
}
|
||||
|
||||
status.content = emojify(status.content, status.emojis);
|
||||
|
||||
let comment = document.createElement("article");
|
||||
comment.id = `comment-${status.id}`;
|
||||
comment.className = isReply ? "comment comment-reply" : "comment";
|
||||
comment.setAttribute("itemprop", "comment");
|
||||
comment.setAttribute("itemtype", "http://schema.org/Comment");
|
||||
|
||||
let avatarSource = document.createElement("source");
|
||||
avatarSource.setAttribute(
|
||||
"srcset",
|
||||
escapeHtml(status.account.avatar)
|
||||
);
|
||||
avatarSource.setAttribute(
|
||||
"media",
|
||||
"(prefers-reduced-motion: no-preference)"
|
||||
);
|
||||
|
||||
let avatarImg = document.createElement("img");
|
||||
avatarImg.className = "avatar";
|
||||
avatarImg.setAttribute(
|
||||
"src",
|
||||
escapeHtml(status.account.avatar_static)
|
||||
);
|
||||
avatarImg.setAttribute(
|
||||
"alt",
|
||||
`@${status.account.username}@${instance} avatar`
|
||||
);
|
||||
if (lazyAsyncImage == "true") {
|
||||
avatarImg.setAttribute("decoding", "async");
|
||||
avatarImg.setAttribute("loading", "lazy");
|
||||
}
|
||||
|
||||
let avatarPicture = document.createElement("picture");
|
||||
avatarPicture.appendChild(avatarSource);
|
||||
avatarPicture.appendChild(avatarImg);
|
||||
|
||||
let avatar = document.createElement("a");
|
||||
avatar.className = "avatar-link";
|
||||
avatar.setAttribute("href", status.account.url);
|
||||
avatar.setAttribute("rel", relAttributes);
|
||||
avatar.setAttribute(
|
||||
"title",
|
||||
`${viewProfileText} @${status.account.username}@${instance}`
|
||||
);
|
||||
avatar.appendChild(avatarPicture);
|
||||
comment.appendChild(avatar);
|
||||
|
||||
let instanceBadge = document.createElement("a");
|
||||
instanceBadge.className = "instance";
|
||||
instanceBadge.setAttribute("href", status.account.url);
|
||||
instanceBadge.setAttribute(
|
||||
"title",
|
||||
`@${status.account.username}@${instance}`
|
||||
);
|
||||
instanceBadge.setAttribute("rel", relAttributes);
|
||||
instanceBadge.textContent = instance;
|
||||
|
||||
let display = document.createElement("span");
|
||||
display.className = "display";
|
||||
display.setAttribute("itemprop", "author");
|
||||
display.setAttribute("itemtype", "http://schema.org/Person");
|
||||
display.innerHTML = status.account.display_name;
|
||||
|
||||
let header = document.createElement("header");
|
||||
header.className = "author";
|
||||
header.appendChild(display);
|
||||
header.appendChild(instanceBadge);
|
||||
comment.appendChild(header);
|
||||
|
||||
let permalink = document.createElement("a");
|
||||
permalink.setAttribute("href", status.url);
|
||||
permalink.setAttribute("itemprop", "url");
|
||||
permalink.setAttribute("title", `${viewCommentText} ${instance}`);
|
||||
permalink.setAttribute("rel", relAttributes);
|
||||
permalink.textContent = new Date(
|
||||
status.created_at
|
||||
).toLocaleString(dateLocale, {
|
||||
dateStyle: "long",
|
||||
timeStyle: "short",
|
||||
});
|
||||
|
||||
let timestamp = document.createElement("time");
|
||||
timestamp.setAttribute("datetime", status.created_at);
|
||||
timestamp.appendChild(permalink);
|
||||
permalink.classList.add("external");
|
||||
comment.appendChild(timestamp);
|
||||
|
||||
let main = document.createElement("main");
|
||||
main.setAttribute("itemprop", "text");
|
||||
|
||||
if (status.sensitive == true || status.spoiler_text != "") {
|
||||
let summary = document.createElement("summary");
|
||||
if (status.spoiler_text == "") {
|
||||
status.spoiler_text == sensitiveText;
|
||||
}
|
||||
summary.innerHTML = status.spoiler_text;
|
||||
|
||||
let spoiler = document.createElement("details");
|
||||
spoiler.appendChild(summary);
|
||||
spoiler.innerHTML += status.content;
|
||||
|
||||
main.appendChild(spoiler);
|
||||
} else {
|
||||
main.innerHTML = status.content;
|
||||
}
|
||||
comment.appendChild(main);
|
||||
|
||||
let attachments = status.media_attachments;
|
||||
let SUPPORTED_MEDIA = ["image", "video", "gifv", "audio"];
|
||||
let media = document.createElement("div");
|
||||
media.className = "attachments";
|
||||
if (
|
||||
attachments &&
|
||||
Array.isArray(attachments) &&
|
||||
attachments.length > 0
|
||||
) {
|
||||
attachments.forEach((attachment) => {
|
||||
if (SUPPORTED_MEDIA.includes(attachment.type)) {
|
||||
|
||||
let mediaElement;
|
||||
switch (attachment.type) {
|
||||
case "image":
|
||||
mediaElement = document.createElement("img");
|
||||
mediaElement.setAttribute("src", attachment.preview_url);
|
||||
|
||||
if (attachment.description != null) {
|
||||
mediaElement.setAttribute("alt", attachment.description);
|
||||
mediaElement.setAttribute("title", attachment.description);
|
||||
}
|
||||
|
||||
if (lazyAsyncImage == "true") {
|
||||
mediaElement.setAttribute("decoding", "async");
|
||||
mediaElement.setAttribute("loading", "lazy");
|
||||
}
|
||||
|
||||
if (status.sensitive == true) {
|
||||
mediaElement.classList.add("spoiler");
|
||||
}
|
||||
|
||||
media.appendChild(mediaElement);
|
||||
break;
|
||||
|
||||
case "video":
|
||||
mediaElement = document.createElement("video");
|
||||
mediaElement.setAttribute("src", attachment.url);
|
||||
mediaElement.setAttribute("controls", "");
|
||||
|
||||
if (attachment.description != null) {
|
||||
mediaElement.setAttribute("aria-title", attachment.description);
|
||||
mediaElement.setAttribute("title", attachment.description);
|
||||
}
|
||||
|
||||
if (status.sensitive == true) {
|
||||
mediaElement.classList.add("spoiler");
|
||||
}
|
||||
|
||||
media.appendChild(mediaElement);
|
||||
break;
|
||||
|
||||
case "gifv":
|
||||
mediaElement = document.createElement("video");
|
||||
mediaElement.setAttribute("src", attachment.url);
|
||||
mediaElement.setAttribute("autoplay", "");
|
||||
mediaElement.setAttribute("playsinline", "");
|
||||
mediaElement.setAttribute("loop", "");
|
||||
|
||||
if (attachment.description != null) {
|
||||
mediaElement.setAttribute("aria-title", attachment.description);
|
||||
mediaElement.setAttribute("title", attachment.description);
|
||||
}
|
||||
|
||||
if (status.sensitive == true) {
|
||||
mediaElement.classList.add("spoiler");
|
||||
}
|
||||
|
||||
media.appendChild(mediaElement);
|
||||
break;
|
||||
|
||||
case "audio":
|
||||
mediaElement = document.createElement("audio");
|
||||
mediaElement.setAttribute("src", attachment.url);
|
||||
mediaElement.setAttribute("controls", "");
|
||||
|
||||
if (attachment.description != null) {
|
||||
mediaElement.setAttribute("aria-title", attachment.description);
|
||||
mediaElement.setAttribute("title", attachment.description);
|
||||
}
|
||||
|
||||
media.appendChild(mediaElement);
|
||||
break;
|
||||
}
|
||||
|
||||
let mediaLink = document.createElement("a");
|
||||
mediaLink.setAttribute("href", attachment.url);
|
||||
mediaLink.setAttribute("rel", relAttributes);
|
||||
mediaLink.appendChild(mediaElement);
|
||||
|
||||
media.appendChild(mediaLink);
|
||||
}
|
||||
});
|
||||
|
||||
comment.appendChild(media);
|
||||
}
|
||||
|
||||
let interactions = document.createElement("footer");
|
||||
|
||||
let boosts = document.createElement("a");
|
||||
boosts.className = "boosts";
|
||||
boosts.setAttribute("href", `${status.url}/reblogs`);
|
||||
boosts.setAttribute("title", `${boostsFromText}`.replace("$INSTANCE", instance));
|
||||
|
||||
let boostsIcon = document.createElement("i");
|
||||
boostsIcon.className = "icon";
|
||||
boosts.appendChild(boostsIcon);
|
||||
boosts.insertAdjacentHTML('beforeend', ` ${status.reblogs_count}`);
|
||||
interactions.appendChild(boosts);
|
||||
|
||||
let faves = document.createElement("a");
|
||||
faves.className = "faves";
|
||||
faves.setAttribute("href", `${status.url}/favourites`);
|
||||
faves.setAttribute("title", `${favesFromText}`.replace("$INSTANCE", instance));
|
||||
|
||||
let favesIcon = document.createElement("i");
|
||||
favesIcon.className = "icon";
|
||||
faves.appendChild(favesIcon);
|
||||
faves.insertAdjacentHTML('beforeend', ` ${status.favourites_count}`);
|
||||
interactions.appendChild(faves);
|
||||
comment.appendChild(interactions);
|
||||
|
||||
if (status.card != null) {
|
||||
let cardFigure = document.createElement("figure");
|
||||
|
||||
if (status.card.image != null) {
|
||||
let cardImg = document.createElement("img");
|
||||
cardImg.setAttribute("src", status.card.image);
|
||||
cardImg.classList.add("no-hover");
|
||||
cardFigure.appendChild(cardImg);
|
||||
}
|
||||
|
||||
let cardCaption = document.createElement("figcaption");
|
||||
|
||||
let cardTitle = document.createElement("strong");
|
||||
cardTitle.innerHTML = status.card.title;
|
||||
cardCaption.appendChild(cardTitle);
|
||||
|
||||
if (status.card.description != null && status.card.description.length > 0) {
|
||||
let cardDescription = document.createElement("p");
|
||||
cardDescription.innerHTML = status.card.description;
|
||||
cardCaption.appendChild(cardDescription);
|
||||
}
|
||||
|
||||
cardFigure.appendChild(cardCaption);
|
||||
|
||||
let card = document.createElement("a");
|
||||
card.className = "card";
|
||||
card.setAttribute("href", status.card.url);
|
||||
card.setAttribute("rel", relAttributes);
|
||||
card.appendChild(cardFigure);
|
||||
|
||||
comment.appendChild(card);
|
||||
}
|
||||
|
||||
if (op === true) {
|
||||
comment.classList.add("op");
|
||||
|
||||
avatar.classList.add("op");
|
||||
avatar.setAttribute(
|
||||
"title",
|
||||
`${blogPostAuthorText}: ` + avatar.getAttribute("title")
|
||||
);
|
||||
|
||||
instanceBadge.classList.add("op");
|
||||
instanceBadge.setAttribute(
|
||||
"title",
|
||||
`${blogPostAuthorText}: ` + instanceBadge.getAttribute("title")
|
||||
);
|
||||
}
|
||||
|
||||
commentsWrapper.innerHTML += comment.outerHTML;
|
||||
});
|
||||
}
|
||||
|
||||
else {
|
||||
var statusText = document.createElement("p");
|
||||
statusText.innerHTML = noCommentsText;
|
||||
statusText.setAttribute("id", "comments-status");
|
||||
commentsWrapper.appendChild(statusText);
|
||||
}
|
||||
|
||||
loadCommentsButton.innerHTML = reloadText;
|
||||
})
|
||||
.catch(function (error) {
|
||||
console.error('Error loading comments:', error);
|
||||
})
|
||||
.finally(function () {
|
||||
loadCommentsButton.disabled = false;
|
||||
});
|
||||
}
|
57
public/copy-button.js
Normal file
|
@ -0,0 +1,57 @@
|
|||
// Based on https://www.roboleary.net/2022/01/13/copy-code-to-clipboard-blog.html
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
let blocks = document.querySelectorAll("pre[class^='language-']");
|
||||
|
||||
blocks.forEach((block) => {
|
||||
if (navigator.clipboard) {
|
||||
// Code block header title
|
||||
let title = document.createElement("span");
|
||||
let lang = block.getAttribute("data-lang");
|
||||
title.innerHTML = lang;
|
||||
|
||||
// Copy button icon
|
||||
let icon = document.createElement("i");
|
||||
icon.classList.add("icon");
|
||||
|
||||
// Copy button
|
||||
let button = document.createElement("button");
|
||||
let copyCodeText = document.getElementById("copy-code-text").textContent;
|
||||
button.setAttribute("title", copyCodeText)
|
||||
button.appendChild(icon);
|
||||
|
||||
// Code block header
|
||||
let header = document.createElement("div");
|
||||
header.classList.add("header");
|
||||
header.appendChild(title);
|
||||
header.appendChild(button);
|
||||
|
||||
// Container that holds header and the code block itself
|
||||
let container = document.createElement("div");
|
||||
container.classList.add("pre-container");
|
||||
container.appendChild(header);
|
||||
|
||||
// Move code block into the container
|
||||
block.parentNode.insertBefore(container, block);
|
||||
container.appendChild(block);
|
||||
|
||||
button.addEventListener("click", async () => {
|
||||
await copyCode(block, header, button); // Pass the button here
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
async function copyCode(block, header, button) {
|
||||
let code = block.querySelector("code");
|
||||
let text = code.innerText;
|
||||
|
||||
await navigator.clipboard.writeText(text);
|
||||
|
||||
header.classList.add("active");
|
||||
button.setAttribute("disabled", true);
|
||||
|
||||
header.addEventListener("animationend", () => {
|
||||
header.classList.remove("active");
|
||||
button.removeAttribute("disabled");
|
||||
}, { once: true });
|
||||
}
|
||||
});
|
271
public/count.js
Normal file
|
@ -0,0 +1,271 @@
|
|||
// GoatCounter: https://www.goatcounter.com
|
||||
// This file is released under the ISC license: https://opensource.org/licenses/ISC
|
||||
;(function() {
|
||||
'use strict';
|
||||
|
||||
if (window.goatcounter && window.goatcounter.vars) // Compatibility with very old version; do not use.
|
||||
window.goatcounter = window.goatcounter.vars
|
||||
else
|
||||
window.goatcounter = window.goatcounter || {}
|
||||
|
||||
// Load settings from data-goatcounter-settings.
|
||||
var s = document.querySelector('script[data-goatcounter]')
|
||||
if (s && s.dataset.goatcounterSettings) {
|
||||
try { var set = JSON.parse(s.dataset.goatcounterSettings) }
|
||||
catch (err) { console.error('invalid JSON in data-goatcounter-settings: ' + err) }
|
||||
for (var k in set)
|
||||
if (['no_onload', 'no_events', 'allow_local', 'allow_frame', 'path', 'title', 'referrer', 'event'].indexOf(k) > -1)
|
||||
window.goatcounter[k] = set[k]
|
||||
}
|
||||
|
||||
var enc = encodeURIComponent
|
||||
|
||||
// Get all data we're going to send off to the counter endpoint.
|
||||
var get_data = function(vars) {
|
||||
var data = {
|
||||
p: (vars.path === undefined ? goatcounter.path : vars.path),
|
||||
r: (vars.referrer === undefined ? goatcounter.referrer : vars.referrer),
|
||||
t: (vars.title === undefined ? goatcounter.title : vars.title),
|
||||
e: !!(vars.event || goatcounter.event),
|
||||
s: [window.screen.width, window.screen.height, (window.devicePixelRatio || 1)],
|
||||
b: is_bot(),
|
||||
q: location.search,
|
||||
}
|
||||
|
||||
var rcb, pcb, tcb // Save callbacks to apply later.
|
||||
if (typeof(data.r) === 'function') rcb = data.r
|
||||
if (typeof(data.t) === 'function') tcb = data.t
|
||||
if (typeof(data.p) === 'function') pcb = data.p
|
||||
|
||||
if (is_empty(data.r)) data.r = document.referrer
|
||||
if (is_empty(data.t)) data.t = document.title
|
||||
if (is_empty(data.p)) data.p = get_path()
|
||||
|
||||
if (rcb) data.r = rcb(data.r)
|
||||
if (tcb) data.t = tcb(data.t)
|
||||
if (pcb) data.p = pcb(data.p)
|
||||
return data
|
||||
}
|
||||
|
||||
// Check if a value is "empty" for the purpose of get_data().
|
||||
var is_empty = function(v) { return v === null || v === undefined || typeof(v) === 'function' }
|
||||
|
||||
// See if this looks like a bot; there is some additional filtering on the
|
||||
// backend, but these properties can't be fetched from there.
|
||||
var is_bot = function() {
|
||||
// Headless browsers are probably a bot.
|
||||
var w = window, d = document
|
||||
if (w.callPhantom || w._phantom || w.phantom)
|
||||
return 150
|
||||
if (w.__nightmare)
|
||||
return 151
|
||||
if (d.__selenium_unwrapped || d.__webdriver_evaluate || d.__driver_evaluate)
|
||||
return 152
|
||||
if (navigator.webdriver)
|
||||
return 153
|
||||
return 0
|
||||
}
|
||||
|
||||
// Object to urlencoded string, starting with a ?.
|
||||
var urlencode = function(obj) {
|
||||
var p = []
|
||||
for (var k in obj)
|
||||
if (obj[k] !== '' && obj[k] !== null && obj[k] !== undefined && obj[k] !== false)
|
||||
p.push(enc(k) + '=' + enc(obj[k]))
|
||||
return '?' + p.join('&')
|
||||
}
|
||||
|
||||
// Show a warning in the console.
|
||||
var warn = function(msg) {
|
||||
if (console && 'warn' in console)
|
||||
console.warn('goatcounter: ' + msg)
|
||||
}
|
||||
|
||||
// Get the endpoint to send requests to.
|
||||
var get_endpoint = function() {
|
||||
var s = document.querySelector('script[data-goatcounter]')
|
||||
if (s && s.dataset.goatcounter)
|
||||
return s.dataset.goatcounter
|
||||
return (goatcounter.endpoint || window.counter) // counter is for compat; don't use.
|
||||
}
|
||||
|
||||
// Get current path.
|
||||
var get_path = function() {
|
||||
var loc = location,
|
||||
c = document.querySelector('link[rel="canonical"][href]')
|
||||
if (c) { // May be relative or point to different domain.
|
||||
var a = document.createElement('a')
|
||||
a.href = c.href
|
||||
if (a.hostname.replace(/^www\./, '') === location.hostname.replace(/^www\./, ''))
|
||||
loc = a
|
||||
}
|
||||
return (loc.pathname + loc.search) || '/'
|
||||
}
|
||||
|
||||
// Run function after DOM is loaded.
|
||||
var on_load = function(f) {
|
||||
if (document.body === null)
|
||||
document.addEventListener('DOMContentLoaded', function() { f() }, false)
|
||||
else
|
||||
f()
|
||||
}
|
||||
|
||||
// Filter some requests that we (probably) don't want to count.
|
||||
goatcounter.filter = function() {
|
||||
if ('visibilityState' in document && document.visibilityState === 'prerender')
|
||||
return 'visibilityState'
|
||||
if (!goatcounter.allow_frame && location !== parent.location)
|
||||
return 'frame'
|
||||
if (!goatcounter.allow_local && location.hostname.match(/(localhost$|^127\.|^10\.|^172\.(1[6-9]|2[0-9]|3[0-1])\.|^192\.168\.|^0\.0\.0\.0$)/))
|
||||
return 'localhost'
|
||||
if (!goatcounter.allow_local && location.protocol === 'file:')
|
||||
return 'localfile'
|
||||
if (localStorage && localStorage.getItem('skipgc') === 't')
|
||||
return 'disabled with #toggle-goatcounter'
|
||||
return false
|
||||
}
|
||||
|
||||
// Get URL to send to GoatCounter.
|
||||
window.goatcounter.url = function(vars) {
|
||||
var data = get_data(vars || {})
|
||||
if (data.p === null) // null from user callback.
|
||||
return
|
||||
data.rnd = Math.random().toString(36).substr(2, 5) // Browsers don't always listen to Cache-Control.
|
||||
|
||||
var endpoint = get_endpoint()
|
||||
if (!endpoint)
|
||||
return warn('no endpoint found')
|
||||
|
||||
return endpoint + urlencode(data)
|
||||
}
|
||||
|
||||
// Count a hit.
|
||||
window.goatcounter.count = function(vars) {
|
||||
var f = goatcounter.filter()
|
||||
if (f)
|
||||
return warn('not counting because of: ' + f)
|
||||
var url = goatcounter.url(vars)
|
||||
if (!url)
|
||||
return warn('not counting because path callback returned null')
|
||||
|
||||
if (!navigator.sendBeacon(url)) {
|
||||
// This mostly fails due to being blocked by CSP; try again with an
|
||||
// image-based fallback.
|
||||
var img = document.createElement('img')
|
||||
img.src = url
|
||||
img.style.position = 'absolute' // Affect layout less.
|
||||
img.style.bottom = '0px'
|
||||
img.style.width = '1px'
|
||||
img.style.height = '1px'
|
||||
img.loading = 'eager'
|
||||
img.setAttribute('alt', '')
|
||||
img.setAttribute('aria-hidden', 'true')
|
||||
|
||||
var rm = function() { if (img && img.parentNode) img.parentNode.removeChild(img) }
|
||||
img.addEventListener('load', rm, false)
|
||||
document.body.appendChild(img)
|
||||
}
|
||||
}
|
||||
|
||||
// Get a query parameter.
|
||||
window.goatcounter.get_query = function(name) {
|
||||
var s = location.search.substr(1).split('&')
|
||||
for (var i = 0; i < s.length; i++)
|
||||
if (s[i].toLowerCase().indexOf(name.toLowerCase() + '=') === 0)
|
||||
return s[i].substr(name.length + 1)
|
||||
}
|
||||
|
||||
// Track click events.
|
||||
window.goatcounter.bind_events = function() {
|
||||
if (!document.querySelectorAll) // Just in case someone uses an ancient browser.
|
||||
return
|
||||
|
||||
var send = function(elem) {
|
||||
return function() {
|
||||
goatcounter.count({
|
||||
event: true,
|
||||
path: (elem.dataset.goatcounterClick || elem.name || elem.id || ''),
|
||||
title: (elem.dataset.goatcounterTitle || elem.title || (elem.innerHTML || '').substr(0, 200) || ''),
|
||||
referrer: (elem.dataset.goatcounterReferrer || elem.dataset.goatcounterReferral || ''),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Array.prototype.slice.call(document.querySelectorAll("*[data-goatcounter-click]")).forEach(function(elem) {
|
||||
if (elem.dataset.goatcounterBound)
|
||||
return
|
||||
var f = send(elem)
|
||||
elem.addEventListener('click', f, false)
|
||||
elem.addEventListener('auxclick', f, false) // Middle click.
|
||||
elem.dataset.goatcounterBound = 'true'
|
||||
})
|
||||
}
|
||||
|
||||
// Add a "visitor counter" frame or image.
|
||||
window.goatcounter.visit_count = function(opt) {
|
||||
on_load(function() {
|
||||
opt = opt || {}
|
||||
opt.type = opt.type || 'html'
|
||||
opt.append = opt.append || 'body'
|
||||
opt.path = opt.path || get_path()
|
||||
opt.attr = opt.attr || {width: '200', height: (opt.no_branding ? '60' : '80')}
|
||||
|
||||
opt.attr['src'] = get_endpoint() + 'er/' + enc(opt.path) + '.' + enc(opt.type) + '?'
|
||||
if (opt.no_branding) opt.attr['src'] += '&no_branding=1'
|
||||
if (opt.style) opt.attr['src'] += '&style=' + enc(opt.style)
|
||||
if (opt.start) opt.attr['src'] += '&start=' + enc(opt.start)
|
||||
if (opt.end) opt.attr['src'] += '&end=' + enc(opt.end)
|
||||
|
||||
var tag = {png: 'img', svg: 'img', html: 'iframe'}[opt.type]
|
||||
if (!tag)
|
||||
return warn('visit_count: unknown type: ' + opt.type)
|
||||
|
||||
if (opt.type === 'html') {
|
||||
opt.attr['frameborder'] = '0'
|
||||
opt.attr['scrolling'] = 'no'
|
||||
}
|
||||
|
||||
var d = document.createElement(tag)
|
||||
for (var k in opt.attr)
|
||||
d.setAttribute(k, opt.attr[k])
|
||||
|
||||
var p = document.querySelector(opt.append)
|
||||
if (!p)
|
||||
return warn('visit_count: append not found: ' + opt.append)
|
||||
p.appendChild(d)
|
||||
})
|
||||
}
|
||||
|
||||
// Make it easy to skip your own views.
|
||||
if (location.hash === '#toggle-goatcounter') {
|
||||
if (localStorage.getItem('skipgc') === 't') {
|
||||
localStorage.removeItem('skipgc', 't')
|
||||
alert('GoatCounter tracking is now ENABLED in this browser.')
|
||||
}
|
||||
else {
|
||||
localStorage.setItem('skipgc', 't')
|
||||
alert('GoatCounter tracking is now DISABLED in this browser until ' + location + ' is loaded again.')
|
||||
}
|
||||
}
|
||||
|
||||
if (!goatcounter.no_onload)
|
||||
on_load(function() {
|
||||
// 1. Page is visible, count request.
|
||||
// 2. Page is not yet visible; wait until it switches to 'visible' and count.
|
||||
// See #487
|
||||
if (!('visibilityState' in document) || document.visibilityState === 'visible')
|
||||
goatcounter.count()
|
||||
else {
|
||||
var f = function(e) {
|
||||
if (document.visibilityState !== 'visible')
|
||||
return
|
||||
document.removeEventListener('visibilitychange', f)
|
||||
goatcounter.count()
|
||||
}
|
||||
document.addEventListener('visibilitychange', f)
|
||||
}
|
||||
|
||||
if (!goatcounter.no_events)
|
||||
goatcounter.bind_events()
|
||||
})
|
||||
})();
|
27
public/donate/index.html
Normal file
|
@ -0,0 +1,27 @@
|
|||
<!doctype html><html lang=de xmlns=http://www.w3.org/1999/xhtml><head><meta charset=UTF-8><meta content="Joners FOSS self-hosting space" name=description><meta content="width=device-width,initial-scale=1" name=viewport><meta content=#9a9996 name=theme-color><title>Mods - jone.rs</title><link href=https://jone.rs/donate/ rel=canonical><link href=https://social.jone.rs/@joners rel=me><meta content=@joners@social.jone.rs name=fediverse:creator><link href=https://jone.rs/favicon.png rel=icon type=image/png><link href=https://jone.rs/apple-touch-icon.png rel=apple-touch-icon sizes=180x180 type=image/png><link title="jone.rs - RSS Feed" href=https://jone.rs/rss.xml rel=alternate type=application/rss+xml><link title="jone.rs - Atom Feed" href=https://jone.rs/atom.xml rel=alternate type=application/atom+xml><style>:root{--accent-color:#6f8396;--contrast-color:#fff}</style><link href=https://jone.rs/style.css rel=stylesheet><link href=https://jone.rs/fonts.css rel=stylesheet><link media="(prefers-color-scheme: light)" href=https://jone.rs/syntax-theme-light.css rel=stylesheet><link media="(prefers-color-scheme: dark)" href=https://jone.rs/syntax-theme-dark.css rel=stylesheet><script defer src=https://jone.rs/closable.js></script><script defer src=https://jone.rs/copy-button.js></script><script defer src=https://jone.rs/fuse.js></script><script defer src=https://jone.rs/search-fuse.js></script><script defer src=https://jone.rs/theme-switcher.js></script><meta content=jone.rs property=og:site_name><meta content="Mods - jone.rs" property=og:title><meta content=https://jone.rs/donate/ property=og:url><meta content="Joners FOSS self-hosting space" property=og:description><meta content=https://jone.rs/card.png property=og:image><meta content=de_DE property=og:locale><body><header id=site-nav><nav><a href=#main-content tabindex=0> Zum Hauptinhalt springen </a><ul><li id=home><a href=https://jone.rs> <i class=icon></i>jone.rs</a><li class=divider><li><a href=https://jone.rs/blog/>Blog</a><li><a href=https://jone.rs/services/>Services</a><li><a class=external href=https://liberapay.com/Joners>Spende</a><li id=search><button class=circle id=search-toggle title=Suche><i class=icon></i></button><li id=language-switcher><details class=closable><summary class=circle title=Sprache><i class=icon></i></summary> <ul><li><a href=https://jone.rs/en/donate/ lang=en>English</a></ul></details><li id=theme-switcher><details class=closable><summary class=circle title=Theme><i class=icon></i></summary> <ul><li><button title="Zum hellen Theme wechseln" class=circle id=theme-light><i class=icon></i></button><li><button title="Zum dunklen Theme wechseln" class=circle id=theme-dark><i class=icon></i></button><li><button title="Systemtheme verwenden" class=circle id=theme-system><i class=icon></i></button></ul></details><li id=feed><details class=closable><summary class=circle title=Feed><i class=icon></i></summary> <ul><li><a href=https://jone.rs/rss.xml>RSS</a><li><a href=https://jone.rs/atom.xml>Atom</a></ul></details></ul></nav><div id=search-container><label class=visually-hidden for=search-bar>Suche</label><input placeholder="Suche nach…" autocomplete=off disabled id=search-bar type=search><div id=search-results-container><div id=search-results></div></div></div></header><main id=main-content><h1>Mods</h1><h2>Inhaltsverzeichnis</h2><ol><li><a href=https://jone.rs/donate/#background-image>Background Image</a><li><a href=https://jone.rs/donate/#classic-article-list>Classic Article List</a><li><a href=https://jone.rs/donate/#classic-navbar>Classic Navbar</a><li><a href=https://jone.rs/donate/#classic-strikethrough>Classic Strikethrough</a><li><a href=https://jone.rs/donate/#modern-headings>Modern Headings</a><li><a href=https://jone.rs/donate/#modern-horizontal-rule>Modern Horizontal Rule</a><li><a href=https://jone.rs/donate/#no-edge-highlight>No Edge Highlight</a></ol><p>Mods enhance/change some Duckquill visuals. They are updated alongside Duckquill to ensure that you don’t need to manually update them every release.<pre class="language-toml z-code" data-lang=toml><code class=language-toml data-lang=toml><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">extra</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span>
|
||||
</span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">styles</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-punctuation z-definition z-array z-begin z-toml">[</span><span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>mods.css<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span><span class="z-punctuation z-definition z-array z-end z-toml">]</span>
|
||||
</span></code></pre><h2 id=background-image>Background Image</h2><p>Want to set some nice image as a background? We got you covered:<p><img alt="background image" src=https://files.catbox.moe/no8vfc.png><pre class="language-scss z-code" data-lang=scss><code class=language-scss data-lang=scss><span class="z-source z-scss"><span class="z-meta z-selector z-css"><span class="z-entity z-name z-tag z-css">body</span> </span><span class="z-punctuation z-section z-property-list z-begin z-css">{</span>
|
||||
</span><span class="z-source z-scss"> <span class="z-meta z-property-name z-css"><span class="z-support z-type z-property-name z-css">background-image</span></span><span class="z-punctuation z-separator z-key-value z-css">:</span><span class="z-meta z-property-value z-css"> <span class="z-meta z-function-call z-css"><span class="z-support z-function z-var z-css">var</span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-begin z-css">(</span><span class="z-support z-type z-custom-property z-css"><span class="z-punctuation z-definition z-custom-property z-css">--</span><span class="z-support z-type z-custom-property z-name z-css">bg-overlay</span></span></span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-end z-css">)</span></span></span><span class="z-punctuation z-separator z-css">,</span> <span class="z-meta z-function-call z-css"><span class="z-support z-function z-url z-css">url</span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-begin z-css">(</span><span class="z-string z-quoted z-double z-css"><span class="z-punctuation z-definition z-string z-begin z-css">"</span>https://images.unsplash.com/photo-1523712999610-f77fbcfc3843<span class="z-punctuation z-definition z-string z-end z-css">"</span></span></span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-end z-css">)</span></span></span></span><span class="z-punctuation z-terminator z-rule z-css">;</span>
|
||||
</span><span class="z-source z-scss"> <span class="z-meta z-property-name z-css"><span class="z-support z-type z-property-name z-css">background-position</span></span><span class="z-punctuation z-separator z-key-value z-css">:</span><span class="z-meta z-property-value z-css"> <span class="z-support z-constant z-property-value z-css">center</span></span><span class="z-punctuation z-terminator z-rule z-css">;</span>
|
||||
</span><span class="z-source z-scss"> <span class="z-meta z-property-name z-css"><span class="z-support z-type z-property-name z-css">background-size</span></span><span class="z-punctuation z-separator z-key-value z-css">:</span><span class="z-meta z-property-value z-css"> <span class="z-support z-constant z-property-value z-css">cover</span></span><span class="z-punctuation z-terminator z-rule z-css">;</span>
|
||||
</span><span class="z-source z-scss"> <span class="z-meta z-property-name z-css"><span class="z-support z-type z-property-name z-css">background-attachment</span></span><span class="z-punctuation z-separator z-key-value z-css">:</span><span class="z-meta z-property-value z-css"> <span class="z-support z-constant z-property-value z-css">fixed</span></span><span class="z-punctuation z-terminator z-rule z-css">;</span>
|
||||
</span><span class="z-source z-scss"><span class="z-punctuation z-section z-property-list z-end z-css">}</span>
|
||||
</span></code></pre><p>Most of the time contrast should be okay, but what if it’s not? Simply adjust the opacity of <code>--bg-overlay</code> based on your needs:<pre class="language-scss z-code" data-lang=scss><code class=language-scss data-lang=scss><span class="z-source z-scss"><span class="z-meta z-at-rule z-import z-css"><span class="z-keyword z-control z-at-rule z-import z-css"><span class="z-punctuation z-definition z-keyword z-css">@</span>import</span> <span class="z-string z-quoted z-double z-css"><span class="z-punctuation z-definition z-string z-begin z-css">"</span>../themes/duckquill/sass/_variables.scss<span class="z-punctuation z-definition z-string z-end z-css">"</span></span><span class="z-punctuation z-terminator z-rule z-sass">;</span></span>
|
||||
</span><span class="z-source z-scss">
|
||||
</span><span class="z-source z-scss"><span class="z-meta z-function-call z-sass"><span class="z-variable z-function z-sass"><span class="z-keyword z-control z-at-rule z-sass"><span class="z-punctuation z-definition z-keyword z-sass">@</span>include</span> theme-variables</span> using <span class="z-meta z-function-call z-arguments z-sass"><span class="z-punctuation z-definition z-group z-begin z-sass">(</span><span class="z-variable z-other z-sass"><span class="z-punctuation z-definition z-variable z-sass">$</span>theme</span><span class="z-punctuation z-definition z-group z-end z-sass">)</span></span> </span><span class="z-punctuation z-section z-property-list z-begin z-css">{</span>
|
||||
</span><span class="z-source z-scss"> <span class="z-meta z-at-rule z-sass"><span class="z-keyword z-control z-flow z-conditional z-sass"><span class="z-punctuation z-definition z-keyword z-sass">@</span>if</span> <span class="z-variable z-other z-sass"><span class="z-punctuation z-definition z-variable z-sass">$</span>theme</span> <span class="z-keyword z-operator z-sass">==</span> <span class="z-string z-quoted z-double z-css"><span class="z-punctuation z-definition z-string z-begin z-css">"</span>dark<span class="z-punctuation z-definition z-string z-end z-css">"</span></span> </span><span class="z-punctuation z-section z-property-list z-begin z-css">{</span>
|
||||
</span><span class="z-source z-scss"> <span class="z-meta z-property-name z-css"><span class="z-support z-type z-custom-property z-css"><span class="z-punctuation z-definition z-custom-property z-css">--</span><span class="z-support z-type z-custom-property z-name z-css">bg-overlay</span></span></span><span class="z-punctuation z-separator z-key-value z-css">:</span><span class="z-meta z-property-value z-css"> <span class="z-meta z-function-call z-css"><span class="z-support z-function z-gradient z-css">linear-gradient</span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-begin z-css">(</span><span class="z-meta z-function-call z-css"><span class="z-support z-function z-color z-css">rgb</span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-begin z-css">(</span><span class="z-constant z-numeric z-css">0</span> <span class="z-constant z-numeric z-css">0</span> <span class="z-constant z-numeric z-css">0</span> <span class="z-keyword z-operator z-sass">/</span> <span class="z-constant z-numeric z-float z-decimal z-css">0<span class="z-punctuation z-separator z-decimal z-css">.</span>9</span></span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-end z-css">)</span></span></span><span class="z-punctuation z-separator z-sequence z-css">,</span> <span class="z-meta z-function-call z-css"><span class="z-support z-function z-color z-css">rgb</span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-begin z-css">(</span><span class="z-constant z-numeric z-css">0</span> <span class="z-constant z-numeric z-css">0</span> <span class="z-constant z-numeric z-css">0</span> <span class="z-keyword z-operator z-sass">/</span> <span class="z-constant z-numeric z-float z-decimal z-css">0<span class="z-punctuation z-separator z-decimal z-css">.</span>9</span></span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-end z-css">)</span></span></span></span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-end z-css">)</span></span></span></span><span class="z-punctuation z-terminator z-rule z-css">;</span>
|
||||
</span><span class="z-source z-scss"> <span class="z-punctuation z-section z-property-list z-end z-css">}</span>
|
||||
</span><span class="z-source z-scss">
|
||||
</span><span class="z-source z-scss"> <span class="z-meta z-at-rule z-sass"><span class="z-keyword z-control z-flow z-conditional z-sass"><span class="z-punctuation z-definition z-keyword z-sass">@</span>else</span> </span><span class="z-punctuation z-section z-property-list z-begin z-css">{</span>
|
||||
</span><span class="z-source z-scss"> <span class="z-meta z-property-name z-css"><span class="z-support z-type z-custom-property z-css"><span class="z-punctuation z-definition z-custom-property z-css">--</span><span class="z-support z-type z-custom-property z-name z-css">bg-overlay</span></span></span><span class="z-punctuation z-separator z-key-value z-css">:</span><span class="z-meta z-property-value z-css"> <span class="z-meta z-function-call z-css"><span class="z-support z-function z-gradient z-css">linear-gradient</span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-begin z-css">(</span><span class="z-meta z-function-call z-css"><span class="z-support z-function z-color z-css">rgb</span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-begin z-css">(</span><span class="z-constant z-numeric z-css">255</span> <span class="z-constant z-numeric z-css">255</span> <span class="z-constant z-numeric z-css">255</span> <span class="z-keyword z-operator z-sass">/</span> <span class="z-constant z-numeric z-float z-decimal z-css">0<span class="z-punctuation z-separator z-decimal z-css">.</span>8</span></span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-end z-css">)</span></span></span><span class="z-punctuation z-separator z-sequence z-css">,</span> <span class="z-meta z-function-call z-css"><span class="z-support z-function z-color z-css">rgb</span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-begin z-css">(</span><span class="z-constant z-numeric z-css">255</span> <span class="z-constant z-numeric z-css">255</span> <span class="z-constant z-numeric z-css">255</span> <span class="z-keyword z-operator z-sass">/</span> <span class="z-constant z-numeric z-float z-decimal z-css">0<span class="z-punctuation z-separator z-decimal z-css">.</span>8</span></span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-end z-css">)</span></span></span></span><span class="z-meta z-group z-css"><span class="z-punctuation z-definition z-group z-end z-css">)</span></span></span></span><span class="z-punctuation z-terminator z-rule z-css">;</span>
|
||||
</span><span class="z-source z-scss"> <span class="z-punctuation z-section z-property-list z-end z-css">}</span>
|
||||
</span><span class="z-source z-scss"><span class="z-punctuation z-section z-property-list z-end z-css">}</span>
|
||||
</span></code></pre><h2 id=classic-article-list>Classic Article List</h2><p>Prefer the less fancy look of the article list used in Duckquill some time ago (to some extent)? It can be done with the <code>classic-article-list</code> mod:<p><img alt="classic article list" src=https://files.catbox.moe/yf5feo.png><pre class="language-scss z-code" data-lang=scss><code class=language-scss data-lang=scss><span class="z-source z-scss"><span class="z-meta z-at-rule z-module z-sass"><span class="z-keyword z-control z-at-rule z-module z-sass"><span class="z-punctuation z-definition z-keyword z-sass">@</span>use</span> <span class="z-string z-quoted z-double z-css"><span class="z-punctuation z-definition z-string z-begin z-css">"</span>../themes/duckquill/sass/mods/classic-article-list<span class="z-punctuation z-definition z-string z-end z-css">"</span></span><span class="z-punctuation z-terminator z-rule z-sass">;</span></span>
|
||||
</span></code></pre><h2 id=classic-navbar>Classic Navbar</h2><p>You can make navbar have more traditional look by using the <code>classic-nav</code> mod:<p><img alt="classic navabr" src=https://files.catbox.moe/ga4dmv.png><pre class="language-scss z-code" data-lang=scss><code class=language-scss data-lang=scss><span class="z-source z-scss"><span class="z-meta z-at-rule z-module z-sass"><span class="z-keyword z-control z-at-rule z-module z-sass"><span class="z-punctuation z-definition z-keyword z-sass">@</span>use</span> <span class="z-string z-quoted z-double z-css"><span class="z-punctuation z-definition z-string z-begin z-css">"</span>../themes/duckquill/sass/mods/classic-nav<span class="z-punctuation z-definition z-string z-end z-css">"</span></span><span class="z-punctuation z-terminator z-rule z-sass">;</span></span>
|
||||
</span></code></pre><p>Or you can make it sticked to top but not full-width with the <code>sticked-nav</code> mod:<blockquote class=note><p class=alert-title><i class=icon></i>Anmerkung<p>Not compatible with the <code>classic-nav</code> mod.</blockquote><p><img alt="sticked navabr" src=https://files.catbox.moe/bfu3p7.png><pre class="language-scss z-code" data-lang=scss><code class=language-scss data-lang=scss><span class="z-source z-scss"><span class="z-meta z-at-rule z-module z-sass"><span class="z-keyword z-control z-at-rule z-module z-sass"><span class="z-punctuation z-definition z-keyword z-sass">@</span>use</span> <span class="z-string z-quoted z-double z-css"><span class="z-punctuation z-definition z-string z-begin z-css">"</span>../themes/duckquill/sass/mods/sticked-nav<span class="z-punctuation z-definition z-string z-end z-css">"</span></span><span class="z-punctuation z-terminator z-rule z-sass">;</span></span>
|
||||
</span></code></pre><h2 id=classic-strikethrough>Classic Strikethrough</h2><p>The default strikethrough style is too much? It can be fixed using the <code>classic-del</code> mod:<p><img alt="plain strikethrough" src=https://files.catbox.moe/y2tbwm.png><pre class="language-scss z-code" data-lang=scss><code class=language-scss data-lang=scss><span class="z-source z-scss"><span class="z-meta z-at-rule z-module z-sass"><span class="z-keyword z-control z-at-rule z-module z-sass"><span class="z-punctuation z-definition z-keyword z-sass">@</span>use</span> <span class="z-string z-quoted z-double z-css"><span class="z-punctuation z-definition z-string z-begin z-css">"</span>../themes/duckquill/sass/mods/classic-del<span class="z-punctuation z-definition z-string z-end z-css">"</span></span><span class="z-punctuation z-terminator z-rule z-sass">;</span></span>
|
||||
</span></code></pre><h2 id=modern-headings>Modern Headings</h2><p>Default headings might not fit your taste, that’s understandable. They can be <del>made boring</del> fixed with the <code>modern-headings</code> mod:<p><img alt="boring headings" src=https://files.catbox.moe/6ok740.png><pre class="language-scss z-code" data-lang=scss><code class=language-scss data-lang=scss><span class="z-source z-scss"><span class="z-meta z-at-rule z-module z-sass"><span class="z-keyword z-control z-at-rule z-module z-sass"><span class="z-punctuation z-definition z-keyword z-sass">@</span>use</span> <span class="z-string z-quoted z-double z-css"><span class="z-punctuation z-definition z-string z-begin z-css">"</span>../themes/duckquill/sass/mods/modern-headings<span class="z-punctuation z-definition z-string z-end z-css">"</span></span><span class="z-punctuation z-terminator z-rule z-sass">;</span></span>
|
||||
</span></code></pre><h2 id=modern-horizontal-rule>Modern Horizontal Rule</h2><p>Don’t like that fancy horizontal rule? Make it more modern with the <code>modern-hr</code> mod:<p><img alt="modern horizontal rule" src=https://files.catbox.moe/qyqzoy.png><pre class="language-scss z-code" data-lang=scss><code class=language-scss data-lang=scss><span class="z-source z-scss"><span class="z-meta z-at-rule z-module z-sass"><span class="z-keyword z-control z-at-rule z-module z-sass"><span class="z-punctuation z-definition z-keyword z-sass">@</span>use</span> <span class="z-string z-quoted z-double z-css"><span class="z-punctuation z-definition z-string z-begin z-css">"</span>../themes/duckquill/sass/mods/modern-hr<span class="z-punctuation z-definition z-string z-end z-css">"</span></span><span class="z-punctuation z-terminator z-rule z-sass">;</span></span>
|
||||
</span></code></pre><h2 id=no-edge-highlight>No Edge Highlight</h2><p>Hate the skeuomorphic edge highlight on all semi-transparent elements? Let’s get rid of it using the <code>no-edge-highlight</code> mod:<pre class="language-scss z-code" data-lang=scss><code class=language-scss data-lang=scss><span class="z-source z-scss"><span class="z-meta z-at-rule z-module z-sass"><span class="z-keyword z-control z-at-rule z-module z-sass"><span class="z-punctuation z-definition z-keyword z-sass">@</span>use</span> <span class="z-string z-quoted z-double z-css"><span class="z-punctuation z-definition z-string z-begin z-css">"</span>../themes/duckquill/sass/mods/no-edge-highlight<span class="z-punctuation z-definition z-string z-end z-css">"</span></span><span class="z-punctuation z-terminator z-rule z-sass">;</span></span>
|
||||
</span></code></pre><span class=hidden id=copy-code-text>Code kopieren</span><span class=hidden id=search-index>https://jone.rs/search_index.de.json</span><span class=hidden id=more-matches-text>$MATCHES weitere Treffer</span></main><footer id=site-footer><nav><ul><li><a href=https://jone.rs/imprint/>Impressum</a><li><a href=https://jone.rs/services/>Services</a><li><a class=external href=https://status.jone.rs/status/joners>Status</a></ul></nav><p>© jone.rs, 2025<p><a class=external href=https://git.jone.rs/joners/jone.rs>Website source</a><p><small>Powered by <a class="link external" href=https://www.getzola.org>Zola</a> and <a class="link external" href=https://duckquill.daudix.one>Duckquill</a> </small><ul id=socials><li><a rel=" me" href=https://git.jone.rs/joners title=Forgejo> <i style="--icon:url("data:image/svg+xml,%3Csvg role='img' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle%3EForgejo%3C/title%3E%3Cpath d='M16.7773 0c1.6018 0 2.9004 1.2986 2.9004 2.9005s-1.2986 2.9004-2.9004 2.9004c-1.0854 0-2.0315-.596-2.5288-1.4787H12.91c-2.3322 0-4.2272 1.8718-4.2649 4.195l-.0007 2.1175a7.0759 7.0759 0 0 1 4.148-1.4205l.1176-.001 1.3385.0002c.4973-.8827 1.4434-1.4788 2.5288-1.4788 1.6018 0 2.9004 1.2986 2.9004 2.9005s-1.2986 2.9004-2.9004 2.9004c-1.0854 0-2.0315-.596-2.5288-1.4787H12.91c-2.3322 0-4.2272 1.8718-4.2649 4.195l-.0007 2.319c.8827.4973 1.4788 1.4434 1.4788 2.5287 0 1.602-1.2986 2.9005-2.9005 2.9005-1.6018 0-2.9004-1.2986-2.9004-2.9005 0-1.0853.596-2.0314 1.4788-2.5287l-.0002-9.9831c0-3.887 3.1195-7.0453 6.9915-7.108l.1176-.001h1.3385C14.7458.5962 15.692 0 16.7773 0ZM7.2227 19.9052c-.6596 0-1.1943.5347-1.1943 1.1943s.5347 1.1943 1.1943 1.1943 1.1944-.5347 1.1944-1.1943-.5348-1.1943-1.1944-1.1943Zm9.5546-10.4644c-.6596 0-1.1944.5347-1.1944 1.1943s.5348 1.1943 1.1944 1.1943c.6596 0 1.1943-.5347 1.1943-1.1943s-.5347-1.1943-1.1943-1.1943Zm0-7.7346c-.6596 0-1.1944.5347-1.1944 1.1943s.5348 1.1943 1.1944 1.1943c.6596 0 1.1943-.5347 1.1943-1.1943s-.5347-1.1943-1.1943-1.1943Z'/%3E%3C/svg%3E")" class=icon></i> <span>Forgejo</span> </a><li><a rel=" me" href=https://social.jone.rs/@joners title=Mastodon> <i style="--icon:url("data:image/svg+xml,%3Csvg role='img' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle%3EMastodon%3C/title%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E")" class=icon></i> <span>Mastodon</span> </a><li><a rel=" me" href=https://jone.rs/about#contact title=More> <i style="--icon:url("data:image/svg+xml,%3Csvg fill='%23000000' height='200px' width='200px' version='1.1' id='Capa_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 32.055 32.055' xml:space='preserve'%3E%3Cg id='SVGRepo_bgCarrier' stroke-width='0'%3E%3C/g%3E%3Cg id='SVGRepo_tracerCarrier' stroke-linecap='round' stroke-linejoin='round'%3E%3C/g%3E%3Cg id='SVGRepo_iconCarrier'%3E%3Cg%3E%3Cpath d='M3.968,12.061C1.775,12.061,0,13.835,0,16.027c0,2.192,1.773,3.967,3.968,3.967c2.189,0,3.966-1.772,3.966-3.967 C7.934,13.835,6.157,12.061,3.968,12.061z M16.233,12.061c-2.188,0-3.968,1.773-3.968,3.965c0,2.192,1.778,3.967,3.968,3.967 s3.97-1.772,3.97-3.967C20.201,13.835,18.423,12.061,16.233,12.061z M28.09,12.061c-2.192,0-3.969,1.774-3.969,3.967 c0,2.19,1.774,3.965,3.969,3.965c2.188,0,3.965-1.772,3.965-3.965S30.278,12.061,28.09,12.061z'%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E")" class=icon></i> <span>More</span> </a></ul></footer>
|
1
public/en/about/index.html
Normal file
46
public/en/atom.xml
Normal file
|
@ -0,0 +1,46 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
|
||||
<title>jone.rs</title>
|
||||
<subtitle>Joners FOSS self-hosting space</subtitle>
|
||||
<link rel="self" type="application/atom+xml" href="https://jone.rs/en/atom.xml"/>
|
||||
<link rel="alternate" type="text/html" href="https://jone.rs"/>
|
||||
<generator uri="https://www.getzola.org/">Zola</generator>
|
||||
<updated>2025-02-01T00:00:00+00:00</updated>
|
||||
<id>https://jone.rs/en/atom.xml</id>
|
||||
<entry xml:lang="en">
|
||||
<title>My first post</title>
|
||||
<published>2025-02-01T00:00:00+00:00</published>
|
||||
<updated>2025-02-01T00:00:00+00:00</updated>
|
||||
|
||||
<author>
|
||||
<name>
|
||||
Joners
|
||||
</name>
|
||||
</author>
|
||||
|
||||
<link rel="alternate" type="text/html" href="https://jone.rs/en/blog/first-post/"/>
|
||||
<id>https://jone.rs/en/blog/first-post/</id>
|
||||
|
||||
<content type="html" xml:base="https://jone.rs/en/blog/first-post/"><p>Heyho dear people. I will use this site mainly to link my service and other cool projects from other people. It’s mainly a collection point. So it’s hard to say if and how regularly blog posts will appear here. But if I want to get something off my chest and a social media post is not enough, then it will be posted here. Until then, feel free to look around here.</p>
|
||||
</content>
|
||||
|
||||
</entry>
|
||||
<entry xml:lang="en">
|
||||
<title>Service</title>
|
||||
<published>2025-02-01T00:00:00+00:00</published>
|
||||
<updated>2025-02-01T00:00:00+00:00</updated>
|
||||
|
||||
<author>
|
||||
<name>
|
||||
Joners
|
||||
</name>
|
||||
</author>
|
||||
|
||||
<link rel="alternate" type="text/html" href="https://jone.rs/en/services/service1/"/>
|
||||
<id>https://jone.rs/en/services/service1/</id>
|
||||
|
||||
<content type="html" xml:base="https://jone.rs/en/services/service1/"><p>Heyho dear people. I will use this site mainly to link my service and other cool projects from other people. It’s mainly a collection point. So it’s hard to say if and how regularly blog posts will appear here. But if I want to get something off my chest and a social media post is not enough, then it will be posted here. Until then, feel free to look around here.</p>
|
||||
</content>
|
||||
|
||||
</entry>
|
||||
</feed>
|
1
public/en/blog/first-post/index.html
Normal file
1
public/en/blog/index.html
Normal file
1
public/en/blog/page/1/index.html
Normal file
|
@ -0,0 +1 @@
|
|||
<!doctype html><meta charset=utf-8><link href=https://jone.rs/en/blog/ rel=canonical><meta content="0; url=https://jone.rs/en/blog/" http-equiv=refresh><title>Redirect</title><p><a href=https://jone.rs/en/blog/>Click here</a> to be redirected.
|
1
public/en/donate/index.html
Normal file
1
public/en/imprint/index.html
Normal file
5
public/en/index.html
Normal file
|
@ -0,0 +1,5 @@
|
|||
<!doctype html><html lang=en xmlns=http://www.w3.org/1999/xhtml><head><meta charset=UTF-8><meta content="Joners FOSS self-hosting space" name=description><meta content="width=device-width,initial-scale=1" name=viewport><meta content=#9a9996 name=theme-color><title>jone.rs</title><link href=https://jone.rs/en/ rel=canonical><link href=https://social.jone.rs/@joners rel=me><meta content=@joners@social.jone.rs name=fediverse:creator><link href=https://jone.rs/favicon.png rel=icon type=image/png><link href=https://jone.rs/apple-touch-icon.png rel=apple-touch-icon sizes=180x180 type=image/png><link title="jone.rs - Atom Feed" href=https://jone.rs/atom.xml rel=alternate type=application/atom+xml><style>:root{--accent-color:#6f8396;--contrast-color:#fff}</style><link href=https://jone.rs/style.css rel=stylesheet><link href=https://jone.rs/fonts.css rel=stylesheet><link media="(prefers-color-scheme: light)" href=https://jone.rs/syntax-theme-light.css rel=stylesheet><link media="(prefers-color-scheme: dark)" href=https://jone.rs/syntax-theme-dark.css rel=stylesheet><script defer src=https://jone.rs/closable.js></script><script defer src=https://jone.rs/copy-button.js></script><script defer src=https://jone.rs/theme-switcher.js></script><meta content=jone.rs property=og:site_name><meta content=jone.rs property=og:title><meta content=https://jone.rs/en/ property=og:url><meta content="Joners FOSS self-hosting space" property=og:description><meta content=https://jone.rs/card.png property=og:image><meta content=en_US property=og:locale><body><header id=site-nav><nav><a href=#main-content tabindex=0> Skip to Main Content </a><ul><li id=home><a class=active href=https://jone.rs/en/> <i class=icon></i>jone.rs</a><li class=divider><li><a href=https://jone.rs/en/blog/>Blog</a><li><a href=https://jone.rs/en/services/>Services</a><li><a class=external href=https://liberapay.com/Joners>Spende</a><li id=language-switcher><details class=closable><summary class=circle title=Language><i class=icon></i></summary> <ul><li><a href=https://jone.rs/ lang=de>Deutsch</a></ul></details><li id=theme-switcher><details class=closable><summary class=circle title=Theme><i class=icon></i></summary> <ul><li><button title="Switch to Light Theme" class=circle id=theme-light><i class=icon></i></button><li><button title="Switch to Dark Theme" class=circle id=theme-dark><i class=icon></i></button><li><button title="Use System Theme" class=circle id=theme-system><i class=icon></i></button></ul></details><li id=feed><a class=circle href=https://jone.rs/en/atom.xml title=Feed> <i class=icon></i> </a></ul></nav></header><main id=main-content><div class="crt scanlines" aria-hidden=true><pre class=z-code><code><span class="z-text z-plain"> _ _ _ _ _
|
||||
</span><span class="z-text z-plain"> >(')____, >(')____, >(')____, >(')____, >(') ___,
|
||||
</span><span class="z-text z-plain"> (` =~~/ (` =~~/ (` =~~/ (` =~~/ (` =~~/
|
||||
</span><span class="z-text z-plain">jgs~^~^`---'~^~^~^`---'~^~^~^`---'~^~^~^`---'~^~^~^`---'~^~^~
|
||||
</span></code></pre></div><h1 id=hey-it-s-joners>Hey, It’s Joners</h1><p>I am, well what am I actually. This question has been on my mind for quite a while and I won’t have an answer to it any time soon. Nevertheless, I would like to present some of my projects and websites to you.<h2 id=projects>Projects</h2><ul><li>You can find my blog posts <a href=https://jone.rs/blog/>here</a><li>My self-hosted services are listed <a href=https://jone.rs/services/>here</a><li>You can find out more about me <a href=https://jone.rs/about/>here</a></ul><span class=hidden id=copy-code-text>Copy Code</span></main><footer id=site-footer><nav><ul><li><a href=https://jone.rs/en/imprint/>Imprint</a><li><a href=https://jone.rs/en/services/>Services</a><li><a class=external href=https://status.jone.rs/status/joners>Status</a></ul></nav><p>© jone.rs, 2025<p><a class=external href=https://git.jone.rs/joners/jone.rs>Website source</a><p><small>Powered by <a class="link external" href=https://www.getzola.org>Zola</a> and <a class="link external" href=https://duckquill.daudix.one>Duckquill</a> </small><ul id=socials><li><a rel=" me" href=https://git.jone.rs/joners title=Forgejo> <i style="--icon:url("data:image/svg+xml,%3Csvg role='img' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle%3EForgejo%3C/title%3E%3Cpath d='M16.7773 0c1.6018 0 2.9004 1.2986 2.9004 2.9005s-1.2986 2.9004-2.9004 2.9004c-1.0854 0-2.0315-.596-2.5288-1.4787H12.91c-2.3322 0-4.2272 1.8718-4.2649 4.195l-.0007 2.1175a7.0759 7.0759 0 0 1 4.148-1.4205l.1176-.001 1.3385.0002c.4973-.8827 1.4434-1.4788 2.5288-1.4788 1.6018 0 2.9004 1.2986 2.9004 2.9005s-1.2986 2.9004-2.9004 2.9004c-1.0854 0-2.0315-.596-2.5288-1.4787H12.91c-2.3322 0-4.2272 1.8718-4.2649 4.195l-.0007 2.319c.8827.4973 1.4788 1.4434 1.4788 2.5287 0 1.602-1.2986 2.9005-2.9005 2.9005-1.6018 0-2.9004-1.2986-2.9004-2.9005 0-1.0853.596-2.0314 1.4788-2.5287l-.0002-9.9831c0-3.887 3.1195-7.0453 6.9915-7.108l.1176-.001h1.3385C14.7458.5962 15.692 0 16.7773 0ZM7.2227 19.9052c-.6596 0-1.1943.5347-1.1943 1.1943s.5347 1.1943 1.1943 1.1943 1.1944-.5347 1.1944-1.1943-.5348-1.1943-1.1944-1.1943Zm9.5546-10.4644c-.6596 0-1.1944.5347-1.1944 1.1943s.5348 1.1943 1.1944 1.1943c.6596 0 1.1943-.5347 1.1943-1.1943s-.5347-1.1943-1.1943-1.1943Zm0-7.7346c-.6596 0-1.1944.5347-1.1944 1.1943s.5348 1.1943 1.1944 1.1943c.6596 0 1.1943-.5347 1.1943-1.1943s-.5347-1.1943-1.1943-1.1943Z'/%3E%3C/svg%3E")" class=icon></i> <span>Forgejo</span> </a><li><a rel=" me" href=https://social.jone.rs/@joners title=Mastodon> <i style="--icon:url("data:image/svg+xml,%3Csvg role='img' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle%3EMastodon%3C/title%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E")" class=icon></i> <span>Mastodon</span> </a><li><a rel=" me" href=https://jone.rs/about#contact title=More> <i style="--icon:url("data:image/svg+xml,%3Csvg fill='%23000000' height='200px' width='200px' version='1.1' id='Capa_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 32.055 32.055' xml:space='preserve'%3E%3Cg id='SVGRepo_bgCarrier' stroke-width='0'%3E%3C/g%3E%3Cg id='SVGRepo_tracerCarrier' stroke-linecap='round' stroke-linejoin='round'%3E%3C/g%3E%3Cg id='SVGRepo_iconCarrier'%3E%3Cg%3E%3Cpath d='M3.968,12.061C1.775,12.061,0,13.835,0,16.027c0,2.192,1.773,3.967,3.968,3.967c2.189,0,3.966-1.772,3.966-3.967 C7.934,13.835,6.157,12.061,3.968,12.061z M16.233,12.061c-2.188,0-3.968,1.773-3.968,3.965c0,2.192,1.778,3.967,3.968,3.967 s3.97-1.772,3.97-3.967C20.201,13.835,18.423,12.061,16.233,12.061z M28.09,12.061c-2.192,0-3.969,1.774-3.969,3.967 c0,2.19,1.774,3.965,3.969,3.965c2.188,0,3.965-1.772,3.965-3.965S30.278,12.061,28.09,12.061z'%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E")" class=icon></i> <span>More</span> </a></ul></footer>
|
1
public/en/rules/index.html
Normal file
1
public/en/services/index.html
Normal file
1
public/en/services/page/1/index.html
Normal file
|
@ -0,0 +1 @@
|
|||
<!doctype html><meta charset=utf-8><link href=https://jone.rs/en/services/ rel=canonical><meta content="0; url=https://jone.rs/en/services/" http-equiv=refresh><title>Redirect</title><p><a href=https://jone.rs/en/services/>Click here</a> to be redirected.
|
1
public/en/services/service1/index.html
Normal file
BIN
public/favicon.png
Normal file
After Width: | Height: | Size: 548 B |
1
public/fonts.css
Normal file
|
@ -0,0 +1 @@
|
|||
@font-face{font-style:normal;font-weight:100 900;src:url("fonts/InterVariable.woff2") format("woff2");font-family:"Inter Variable";font-display:swap}@font-face{font-style:italic;font-weight:100 900;src:url("fonts/InterVariable-Italic.woff2") format("woff2");font-family:"Inter Variable";font-display:swap}@font-face{font-style:normal;font-weight:100 900;src:url("fonts/JetBrainsMono.woff2") format("woff2");font-family:"JetBrains Mono";font-display:swap}@font-face{font-style:italic;font-weight:100 900;src:url("fonts/JetBrainsMono-Italic.woff2") format("woff2");font-family:"JetBrains Mono";font-display:swap}body{font-family:"Inter Variable",var(--font-system-ui),var(--font-emoji)}h1,h2,h3,h4,h5,h6{font-weight:bold;font-family:"Inter Variable",var(--font-system-ui),var(--font-emoji)}h1{font-weight:900}pre,code,kbd,samp{font-family:"JetBrains Mono",var(--font-monospace-code)}
|
BIN
public/fonts/InterVariable-Italic.woff2
Normal file
BIN
public/fonts/InterVariable.woff2
Normal file
BIN
public/fonts/JetBrainsMono-Italic.woff2
Normal file
BIN
public/fonts/JetBrainsMono.woff2
Normal file
BIN
public/fonts/KaTeX_AMS-Regular.woff2
Normal file
BIN
public/fonts/KaTeX_Caligraphic-Bold.woff2
Normal file
BIN
public/fonts/KaTeX_Caligraphic-Regular.woff2
Normal file
BIN
public/fonts/KaTeX_Fraktur-Bold.woff2
Normal file
BIN
public/fonts/KaTeX_Fraktur-Regular.woff2
Normal file
BIN
public/fonts/KaTeX_Main-Bold.woff2
Normal file
BIN
public/fonts/KaTeX_Main-BoldItalic.woff2
Normal file
BIN
public/fonts/KaTeX_Main-Italic.woff2
Normal file
BIN
public/fonts/KaTeX_Main-Regular.woff2
Normal file
BIN
public/fonts/KaTeX_Math-BoldItalic.woff2
Normal file
BIN
public/fonts/KaTeX_Math-Italic.woff2
Normal file
BIN
public/fonts/KaTeX_SansSerif-Bold.woff2
Normal file
BIN
public/fonts/KaTeX_SansSerif-Italic.woff2
Normal file
BIN
public/fonts/KaTeX_SansSerif-Regular.woff2
Normal file
BIN
public/fonts/KaTeX_Script-Regular.woff2
Normal file
BIN
public/fonts/KaTeX_Size1-Regular.woff2
Normal file
BIN
public/fonts/KaTeX_Size2-Regular.woff2
Normal file
BIN
public/fonts/KaTeX_Size3-Regular.woff2
Normal file
BIN
public/fonts/KaTeX_Size4-Regular.woff2
Normal file
BIN
public/fonts/KaTeX_Typewriter-Regular.woff2
Normal file
9
public/fuse.js
Normal file
1
public/imprint/index.html
Normal file
5
public/index.html
Normal file
8
public/katex-init.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
document.addEventListener("DOMContentLoaded", function () {
|
||||
renderMathInElement(document.body, {
|
||||
delimiters: [
|
||||
{ left: "$$", right: "$$", display: true },
|
||||
{ left: "$", right: "$", display: false },
|
||||
],
|
||||
});
|
||||
});
|
1209
public/katex.css
Normal file
1
public/katex.min.js
vendored
Normal file
BIN
public/processed_images/banner.11b1c6ec8721de53.webp
Normal file
After Width: | Height: | Size: 96 B |
BIN
public/processed_images/banner.d26f9911a4551316.jpg
Normal file
After Width: | Height: | Size: 103 KiB |
4
public/robots.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
User-agent: *
|
||||
Disallow:
|
||||
Allow: /
|
||||
Sitemap: https://jone.rs/sitemap.xml
|
30
public/rss.xml
Normal file
|
@ -0,0 +1,30 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
|
||||
<channel>
|
||||
<title>jone.rs</title>
|
||||
<link>https://jone.rs</link>
|
||||
<description>Joners FOSS self-hosting space</description>
|
||||
<generator>Zola</generator>
|
||||
<language>de</language>
|
||||
<atom:link href="https://jone.rs/rss.xml" rel="self" type="application/rss+xml"/>
|
||||
<lastBuildDate>Sat, 01 Feb 2025 00:00:00 +0000</lastBuildDate>
|
||||
<item>
|
||||
<title>Mein erster Post</title>
|
||||
<pubDate>Sat, 01 Feb 2025 00:00:00 +0000</pubDate>
|
||||
<author>Joners</author>
|
||||
<link>https://jone.rs/blog/first-post/</link>
|
||||
<guid>https://jone.rs/blog/first-post/</guid>
|
||||
<description xml:base="https://jone.rs/blog/first-post/"><p>Heyho liebe Menschen. Ich werde diese Seite hauptsächlich dafür nutzen meine Service zu verlinken und andere coole Projekte von anderen Menschen. Es ist hauptsächlich ein Sammelbecken. Schwierig daher zu sagen, ob und wie regelmäßig Blog Posts hier erscheinen werden. Wenn ich aber was loswerden will und dafür ein Scoial Media Post nicht genügt, dann wird es hier gepostet. Bis dahin schaut euch gerne hier um.</p>
|
||||
</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Service</title>
|
||||
<pubDate>Sat, 01 Feb 2025 00:00:00 +0000</pubDate>
|
||||
<author>Joners</author>
|
||||
<link>https://jone.rs/services/service1/</link>
|
||||
<guid>https://jone.rs/services/service1/</guid>
|
||||
<description xml:base="https://jone.rs/services/service1/"><p>Heyho dear people. I will use this site mainly to link my service and other cool projects from other people. It’s mainly a collection point. So it’s hard to say if and how regularly blog posts will appear here. But if I want to get something off my chest and a social media post is not enough, then it will be posted here. Until then, feel free to look around here.</p>
|
||||
</description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
1
public/rules/index.html
Normal file
209
public/search-elasticlunr.js
Normal file
|
@ -0,0 +1,209 @@
|
|||
// Based on https://github.com/getzola/zola/blob/1ac1231de1e342bbaf4d7a51a8a9a40ea152e246/docs/static/search.js
|
||||
function debounce(func, wait) {
|
||||
var timeout;
|
||||
|
||||
return function () {
|
||||
var context = this;
|
||||
var args = arguments;
|
||||
clearTimeout(timeout);
|
||||
|
||||
timeout = setTimeout(function () {
|
||||
timeout = null;
|
||||
func.apply(context, args);
|
||||
}, wait);
|
||||
};
|
||||
}
|
||||
|
||||
// Taken from mdbook
|
||||
// The strategy is as follows:
|
||||
// First, assign a value to each word in the document:
|
||||
// Words that correspond to search terms (stemmer aware): 40
|
||||
// Normal words: 2
|
||||
// First word in a sentence: 8
|
||||
// Then use a sliding window with a constant number of words and count the
|
||||
// sum of the values of the words within the window. Then use the window that got the
|
||||
// maximum sum. If there are multiple maximas, then get the last one.
|
||||
// Enclose the terms in <b>.
|
||||
function makeTeaser(body, terms) {
|
||||
var TERM_WEIGHT = 40;
|
||||
var NORMAL_WORD_WEIGHT = 2;
|
||||
var FIRST_WORD_WEIGHT = 8;
|
||||
var TEASER_MAX_WORDS = 30;
|
||||
|
||||
var stemmedTerms = terms.map(function (w) {
|
||||
return elasticlunr.stemmer(w.toLowerCase());
|
||||
});
|
||||
var termFound = false;
|
||||
var index = 0;
|
||||
var weighted = []; // contains elements of ["word", weight, index_in_document]
|
||||
|
||||
// split in sentences, then words
|
||||
var sentences = body.toLowerCase().split(". ");
|
||||
|
||||
for (var i in sentences) {
|
||||
var words = sentences[i].split(" ");
|
||||
var value = FIRST_WORD_WEIGHT;
|
||||
|
||||
for (var j in words) {
|
||||
var word = words[j];
|
||||
|
||||
if (word.length > 0) {
|
||||
for (var k in stemmedTerms) {
|
||||
if (elasticlunr.stemmer(word).startsWith(stemmedTerms[k])) {
|
||||
value = TERM_WEIGHT;
|
||||
termFound = true;
|
||||
}
|
||||
}
|
||||
weighted.push([word, value, index]);
|
||||
value = NORMAL_WORD_WEIGHT;
|
||||
}
|
||||
|
||||
index += word.length;
|
||||
index += 1; // ' ' or '.' if last word in sentence
|
||||
}
|
||||
|
||||
index += 1; // because we split at a two-char boundary '. '
|
||||
}
|
||||
|
||||
if (weighted.length === 0) {
|
||||
return body;
|
||||
}
|
||||
|
||||
var windowWeights = [];
|
||||
var windowSize = Math.min(weighted.length, TEASER_MAX_WORDS);
|
||||
// We add a window with all the weights first
|
||||
var curSum = 0;
|
||||
for (var i = 0; i < windowSize; i++) {
|
||||
curSum += weighted[i][1];
|
||||
}
|
||||
windowWeights.push(curSum);
|
||||
|
||||
for (var i = 0; i < weighted.length - windowSize; i++) {
|
||||
curSum -= weighted[i][1];
|
||||
curSum += weighted[i + windowSize][1];
|
||||
windowWeights.push(curSum);
|
||||
}
|
||||
|
||||
// If we didn't find the term, just pick the first window
|
||||
var maxSumIndex = 0;
|
||||
if (termFound) {
|
||||
var maxFound = 0;
|
||||
// backwards
|
||||
for (var i = windowWeights.length - 1; i >= 0; i--) {
|
||||
if (windowWeights[i] > maxFound) {
|
||||
maxFound = windowWeights[i];
|
||||
maxSumIndex = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var teaser = [];
|
||||
var startIndex = weighted[maxSumIndex][2];
|
||||
for (var i = maxSumIndex; i < maxSumIndex + windowSize; i++) {
|
||||
var word = weighted[i];
|
||||
if (startIndex < word[2]) {
|
||||
// missing text from index to start of `word`
|
||||
teaser.push(body.substring(startIndex, word[2]));
|
||||
startIndex = word[2];
|
||||
}
|
||||
|
||||
// add <strong> around search terms
|
||||
if (word[1] === TERM_WEIGHT) {
|
||||
teaser.push("<strong>");
|
||||
}
|
||||
startIndex = word[2] + word[0].length;
|
||||
teaser.push(body.substring(word[2], startIndex));
|
||||
|
||||
if (word[1] === TERM_WEIGHT) {
|
||||
teaser.push("</strong>");
|
||||
}
|
||||
}
|
||||
teaser.push("…");
|
||||
return teaser.join("");
|
||||
}
|
||||
|
||||
function formatSearchResultItem(item, terms) {
|
||||
return '<div class="item">'
|
||||
+ `<a href="${item.ref}">${item.doc.title}</a>`
|
||||
+ `<span>${makeTeaser(item.doc.body, terms)}</span>`
|
||||
+ '</div>';
|
||||
}
|
||||
|
||||
function initSearch() {
|
||||
var searchBar = document.getElementById("search-bar");
|
||||
var searchContainer = document.getElementById("search-container");
|
||||
var searchResults = document.getElementById("search-results");
|
||||
var MAX_ITEMS = 10;
|
||||
|
||||
var options = {
|
||||
bool: "AND",
|
||||
fields: {
|
||||
title: { boost: 2 },
|
||||
body: { boost: 1 },
|
||||
}
|
||||
};
|
||||
var currentTerm = "";
|
||||
var index;
|
||||
|
||||
var initIndex = async function () {
|
||||
if (index === undefined) {
|
||||
let searchIndex = document.getElementById("search-index").textContent;
|
||||
index = fetch(searchIndex)
|
||||
.then(
|
||||
async function (response) {
|
||||
return await elasticlunr.Index.load(await response.json());
|
||||
}
|
||||
);
|
||||
}
|
||||
let res = await index;
|
||||
return res;
|
||||
}
|
||||
|
||||
searchBar.addEventListener("keyup", debounce(async function () {
|
||||
var term = searchBar.value.trim();
|
||||
if (term === currentTerm) {
|
||||
return;
|
||||
}
|
||||
searchResults.style.display = term === "" ? "none" : "flex";
|
||||
searchResults.innerHTML = "";
|
||||
currentTerm = term;
|
||||
if (term === "") {
|
||||
return;
|
||||
}
|
||||
|
||||
var results = (await initIndex()).search(term, options);
|
||||
if (results.length === 0) {
|
||||
searchResults.style.display = "none";
|
||||
return;
|
||||
}
|
||||
|
||||
for (var i = 0; i < Math.min(results.length, MAX_ITEMS); i++) {
|
||||
searchResults.innerHTML += formatSearchResultItem(results[i], term.split(" "));
|
||||
}
|
||||
}, 150));
|
||||
|
||||
document.addEventListener("keydown", function (event) {
|
||||
if (event.key === "/") {
|
||||
event.preventDefault();
|
||||
toggleSearch();
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("search-toggle").addEventListener("click", toggleSearch);
|
||||
}
|
||||
|
||||
function toggleSearch() {
|
||||
var searchContainer = document.getElementById("search-container");
|
||||
var searchBar = document.getElementById("search-bar");
|
||||
searchContainer.classList.toggle("active");
|
||||
searchBar.toggleAttribute("disabled");
|
||||
searchBar.focus();
|
||||
}
|
||||
|
||||
if (document.readyState === "complete" ||
|
||||
(document.readyState !== "loading" && !document.documentElement.doScroll)
|
||||
) {
|
||||
initSearch();
|
||||
} else {
|
||||
document.addEventListener("DOMContentLoaded", initSearch);
|
||||
}
|
127
public/search-fuse.js
Normal file
|
@ -0,0 +1,127 @@
|
|||
// Based on https://codeberg.org/daudix/duckquill/issues/101#issuecomment-2377169
|
||||
let searchSetup = false;
|
||||
let fuse;
|
||||
|
||||
async function initIndex() {
|
||||
if (searchSetup) return;
|
||||
|
||||
const url = document.getElementById("search-index").textContent;
|
||||
const response = await fetch(url);
|
||||
|
||||
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
|
||||
|
||||
const options = {
|
||||
includeScore: false,
|
||||
includeMatches: true,
|
||||
ignoreLocation: true,
|
||||
threshold: 0.15,
|
||||
keys: [
|
||||
{ name: "title", weight: 3 },
|
||||
{ name: "description", weight: 2 },
|
||||
{ name: "body", weight: 1 }
|
||||
]
|
||||
};
|
||||
|
||||
fuse = new Fuse(await response.json(), options);
|
||||
searchSetup = true;
|
||||
|
||||
console.log("Search index initialized successfully");
|
||||
}
|
||||
|
||||
function toggleSearch() {
|
||||
initIndex();
|
||||
const searchBar = document.getElementById("search-bar");
|
||||
const searchContainer = document.getElementById("search-container");
|
||||
const searchResults = document.getElementById("search-results");
|
||||
searchContainer.classList.toggle("active");
|
||||
searchBar.toggleAttribute("disabled");
|
||||
searchBar.focus();
|
||||
}
|
||||
|
||||
function debounce(actual_fn, wait) {
|
||||
let timeoutId;
|
||||
|
||||
return (...args) => {
|
||||
clearTimeout(timeoutId);
|
||||
|
||||
timeoutId = setTimeout(() => {
|
||||
actual_fn(...args);
|
||||
}, wait);
|
||||
};
|
||||
};
|
||||
|
||||
function initSearch() {
|
||||
const searchBar = document.getElementById("search-bar");
|
||||
const searchResults = document.getElementById("search-results");
|
||||
const searchContainer = document.getElementById("search-container");
|
||||
const MAX_ITEMS = 10;
|
||||
const MAX_RESULTS = 4;
|
||||
|
||||
let currentTerm = "";
|
||||
|
||||
searchBar.addEventListener("keyup", (e) => {
|
||||
const searchVal = searchBar.value.trim();
|
||||
const results = fuse.search(searchVal, { limit: MAX_ITEMS });
|
||||
|
||||
let html = "";
|
||||
for (const result of results) {
|
||||
html += makeTeaser(result, searchVal);
|
||||
}
|
||||
searchResults.innerHTML = html;
|
||||
|
||||
if (html) {
|
||||
searchResults.style.display = "flex";
|
||||
} else {
|
||||
searchResults.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
function makeTeaser(result, searchVal) {
|
||||
const TEASER_SIZE = 20;
|
||||
let output = `<div class="search-result item"><a class="result-title" href=${result.item.url}>${result.item.title}</a>`;
|
||||
|
||||
for (const match of result.matches) {
|
||||
if (match.key === "title") continue;
|
||||
|
||||
const indices = match.indices.sort((a, b) => Math.abs(a[1] - a[0] - searchVal.length) - Math.abs(b[1] - b[0] - searchVal.length)).slice(0, MAX_RESULTS);
|
||||
const value = match.value;
|
||||
|
||||
for (const ind of indices) {
|
||||
const start = Math.max(0, ind[0] - TEASER_SIZE);
|
||||
const end = Math.min(value.length - 1, ind[1] + TEASER_SIZE);
|
||||
output += "<span>"
|
||||
+ value.substring(start, ind[0])
|
||||
+ `<strong>${value.substring(ind[0], ind[1] + 1)}</strong>`
|
||||
+ value.substring(ind[1] + 1, end)
|
||||
+ "</span>";
|
||||
}
|
||||
|
||||
if (match.indices.length > 4) {
|
||||
const moreMatchesText = document.getElementById("more-matches-text").textContent;
|
||||
output += `<span class="more-matches">${moreMatchesText}</span>`.replace("$MATCHES", `+${match.indices.length - MAX_RESULTS}`);
|
||||
}
|
||||
}
|
||||
return output + "</div>";
|
||||
}
|
||||
|
||||
/*window.addEventListener("click", function (event) {
|
||||
if (searchSetup && searchBar.getAttribute("disabled") === null && !searchContainer.contains(event.target)) {
|
||||
toggleSearch();
|
||||
}
|
||||
}, { passive: true });*/
|
||||
|
||||
document.addEventListener("keydown", function(event) {
|
||||
if (event.key === "/") {
|
||||
event.preventDefault();
|
||||
toggleSearch();
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("search-toggle").addEventListener("click", toggleSearch);
|
||||
}
|
||||
|
||||
if (document.readyState === "complete" ||
|
||||
(document.readyState !== "loading" && !document.documentElement.doScroll))
|
||||
initSearch();
|
||||
else
|
||||
document.addEventListener("DOMContentLoaded", initSearch);
|
1
public/search_index.de.json
Normal file
28
public/service/demos/atom.xml
Normal file
|
@ -0,0 +1,28 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
|
||||
<title>jone.rs - Demos</title>
|
||||
<subtitle>Joners FOSS self-hosting space</subtitle>
|
||||
<link rel="self" type="application/atom+xml" href="https://jone.rs/service/demos/atom.xml"/>
|
||||
<link rel="alternate" type="text/html" href="https://jone.rs"/>
|
||||
<generator uri="https://www.getzola.org/">Zola</generator>
|
||||
<updated>2025-02-01T00:00:00+00:00</updated>
|
||||
<id>https://jone.rs/service/demos/atom.xml</id>
|
||||
<entry xml:lang="de">
|
||||
<title>Service</title>
|
||||
<published>2025-02-01T00:00:00+00:00</published>
|
||||
<updated>2025-02-01T00:00:00+00:00</updated>
|
||||
|
||||
<author>
|
||||
<name>
|
||||
Joners
|
||||
</name>
|
||||
</author>
|
||||
|
||||
<link rel="alternate" type="text/html" href="https://jone.rs/services/service1/"/>
|
||||
<id>https://jone.rs/services/service1/</id>
|
||||
|
||||
<content type="html" xml:base="https://jone.rs/services/service1/"><p>Heyho dear people. I will use this site mainly to link my service and other cool projects from other people. It’s mainly a collection point. So it’s hard to say if and how regularly blog posts will appear here. But if I want to get something off my chest and a social media post is not enough, then it will be posted here. Until then, feel free to look around here.</p>
|
||||
</content>
|
||||
|
||||
</entry>
|
||||
</feed>
|
1
public/service/demos/index.html
Normal file
21
public/service/demos/rss.xml
Normal file
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
|
||||
<channel>
|
||||
<title>jone.rs - Demos</title>
|
||||
<link>https://jone.rs</link>
|
||||
<description>Joners FOSS self-hosting space</description>
|
||||
<generator>Zola</generator>
|
||||
<language>de</language>
|
||||
<atom:link href="https://jone.rs/service/demos/rss.xml" rel="self" type="application/rss+xml"/>
|
||||
<lastBuildDate>Sat, 01 Feb 2025 00:00:00 +0000</lastBuildDate>
|
||||
<item>
|
||||
<title>Service</title>
|
||||
<pubDate>Sat, 01 Feb 2025 00:00:00 +0000</pubDate>
|
||||
<author>Joners</author>
|
||||
<link>https://jone.rs/services/service1/</link>
|
||||
<guid>https://jone.rs/services/service1/</guid>
|
||||
<description xml:base="https://jone.rs/services/service1/"><p>Heyho dear people. I will use this site mainly to link my service and other cool projects from other people. It’s mainly a collection point. So it’s hard to say if and how regularly blog posts will appear here. But if I want to get something off my chest and a social media post is not enough, then it will be posted here. Until then, feel free to look around here.</p>
|
||||
</description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
1
public/service/index.html
Normal file
1
public/services/index.html
Normal file
1
public/services/page/1/index.html
Normal file
|
@ -0,0 +1 @@
|
|||
<!doctype html><meta charset=utf-8><link href=https://jone.rs/services/ rel=canonical><meta content="0; url=https://jone.rs/services/" http-equiv=refresh><title>Redirect</title><p><a href=https://jone.rs/services/>Click here</a> to be redirected.
|
1
public/services/service1/index.html
Normal file
94
public/sitemap.xml
Normal file
|
@ -0,0 +1,94 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://jone.rs/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/about/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/blog/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/blog/first-post/</loc>
|
||||
<lastmod>2025-02-01</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/blog/page/1/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/donate/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/en/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/en/about/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/en/blog/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/en/blog/first-post/</loc>
|
||||
<lastmod>2025-02-01</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/en/blog/page/1/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/en/donate/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/en/imprint/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/en/rules/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/en/service/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/en/services/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/en/services/page/1/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/en/services/service1/</loc>
|
||||
<lastmod>2025-02-01</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/en/tags/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/imprint/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/rules/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/service/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/service/demos/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/services/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/services/page/1/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/services/service1/</loc>
|
||||
<lastmod>2025-02-01</lastmod>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/tags/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/tags/demo/</loc>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://jone.rs/tags/test/</loc>
|
||||
</url>
|
||||
</urlset>
|
5
public/style.css
Normal file
283
public/syntax-theme-dark.css
Normal file
|
@ -0,0 +1,283 @@
|
|||
/*
|
||||
* theme "Solarized (dark)" generated by syntect
|
||||
*/
|
||||
|
||||
.z-code {
|
||||
color: #839496;
|
||||
background-color: #002b36;
|
||||
}
|
||||
|
||||
.z-comment, .z-meta.z-documentation {
|
||||
color: #586e75;
|
||||
}
|
||||
.z-string {
|
||||
color: #2aa198;
|
||||
}
|
||||
.z-string.z-regexp {
|
||||
color: #2aa198;
|
||||
}
|
||||
.z-constant.z-character.z-escape {
|
||||
color: #dc322f;
|
||||
}
|
||||
.z-constant.z-numeric {
|
||||
color: #6c71c4;
|
||||
}
|
||||
.z-variable {
|
||||
color: #268bd2;
|
||||
}
|
||||
.z-variable.z-function {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-variable.z-language {
|
||||
color: #d33682;
|
||||
}
|
||||
.z-keyword {
|
||||
color: #859900;
|
||||
}
|
||||
.z-meta.z-import .z-keyword, .z-keyword.z-control.z-import, .z-keyword.z-control.z-import.z-from, .z-keyword.z-other.z-import, .z-keyword.z-control.z-at-rule.z-include, .z-keyword.z-control.z-at-rule.z-import {
|
||||
color: #cb4b16;
|
||||
}
|
||||
.z-keyword.z-operator.z-comparison, .z-keyword.z-operator.z-assignment, .z-keyword.z-operator.z-arithmetic {
|
||||
color: #657b83;
|
||||
}
|
||||
.z-storage {
|
||||
color: #859900;
|
||||
}
|
||||
.z-storage.z-modifier {
|
||||
color: #93a1a1;
|
||||
}
|
||||
.z-keyword.z-control.z-class, .z-entity.z-name, .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-entity.z-other.z-inherited-class {
|
||||
color: #268bd2;
|
||||
}
|
||||
.z-entity.z-other.z-attribute-name {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-support, .z-support.z-type, .z-support.z-class {
|
||||
color: #859900;
|
||||
}
|
||||
.z-entity.z-name.z-function {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-punctuation.z-definition.z-variable {
|
||||
color: #859900;
|
||||
}
|
||||
.z-constant, .z-constant.z-language, .z-meta.z-preprocessor {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-entity.z-name.z-section {
|
||||
color: #cb4b16;
|
||||
}
|
||||
.z-support.z-function.z-construct, .z-keyword.z-other.z-new {
|
||||
color: #dc322f;
|
||||
}
|
||||
.z-constant.z-character, .z-constant.z-other {
|
||||
color: #cb4b16;
|
||||
}
|
||||
.z-entity.z-name.z-tag {
|
||||
color: #268bd2;
|
||||
}
|
||||
.z-punctuation.z-definition.z-tag.z-html, .z-punctuation.z-definition.z-tag.z-begin, .z-punctuation.z-definition.z-tag.z-end {
|
||||
color: #586e75;
|
||||
}
|
||||
.z-support.z-function {
|
||||
color: #859900;
|
||||
}
|
||||
.z-punctuation.z-separator.z-continuation {
|
||||
color: #dc322f;
|
||||
}
|
||||
.z-storage.z-type {
|
||||
color: #268bd2;
|
||||
}
|
||||
.z-support.z-type.z-exception {
|
||||
color: #cb4b16;
|
||||
}
|
||||
.z-keyword.z-other.z-special-method {
|
||||
color: #cb4b16;
|
||||
}
|
||||
.z-invalid {
|
||||
background-color: #6e2e32;
|
||||
}
|
||||
.z-string.z-quoted.z-double, .z-string.z-quoted.z-single {
|
||||
color: #2aa198;
|
||||
}
|
||||
.z-punctuation.z-definition.z-string {
|
||||
color: #839496;
|
||||
}
|
||||
.z-meta.z-brace.z-square, .z-punctuation.z-section.z-brackets {
|
||||
color: #268bd2;
|
||||
}
|
||||
.z-meta.z-brace.z-round, .z-meta.z-brace.z-curly, .z-punctuation.z-section, .z-punctuation.z-section.z-block, .z-punctuation.z-definition.z-parameters, .z-punctuation.z-section.z-group {
|
||||
color: #657b83;
|
||||
}
|
||||
.z-support.z-constant.z-color, .z-invalid.z-deprecated.z-color.z-w3c-non-standard-color-name.z-scss {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-meta.z-selector.z-css {
|
||||
color: #657b83;
|
||||
}
|
||||
.z-entity.z-name.z-tag.z-css, .z-entity.z-name.z-tag.z-scss, .z-source.z-less .z-keyword.z-control.z-html.z-elements, .z-source.z-sass .z-keyword.z-control.z-untitled {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-entity.z-other.z-attribute-name.z-class {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-entity.z-other.z-attribute-name.z-id {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-entity.z-other.z-attribute-name.z-pseudo-element, .z-entity.z-other.z-attribute-name.z-tag.z-pseudo-element, .z-entity.z-other.z-attribute-name.z-pseudo-class, .z-entity.z-other.z-attribute-name.z-tag.z-pseudo-class {
|
||||
color: #268bd2;
|
||||
}
|
||||
.z-text.z-html.z-basic .z-meta.z-tag.z-other.z-html, .z-text.z-html.z-basic .z-meta.z-tag.z-any.z-html, .z-text.z-html.z-basic .z-meta.z-tag.z-block.z-any, .z-text.z-html.z-basic .z-meta.z-tag.z-inline.z-any, .z-text.z-html.z-basic .z-meta.z-tag.z-structure.z-any.z-html, .z-text.z-html.z-basic .z-source.z-js.z-embedded.z-html, .z-punctuation.z-separator.z-key-value.z-html {
|
||||
color: #657b83;
|
||||
}
|
||||
.z-text.z-html.z-basic .z-entity.z-other.z-attribute-name.z-html, .z-meta.z-tag.z-xml .z-entity.z-other.z-attribute-name {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-keyword.z-other.z-special-method.z-ruby {
|
||||
color: #859900;
|
||||
}
|
||||
.z-variable.z-other.z-constant.z-ruby {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-constant.z-other.z-symbol.z-ruby {
|
||||
color: #2aa198;
|
||||
}
|
||||
.z-keyword.z-other.z-special-method.z-ruby {
|
||||
color: #cb4b16;
|
||||
}
|
||||
.z-meta.z-array .z-support.z-function.z-construct.z-php {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-entity.z-name.z-function.z-preprocessor.z-c, .z-meta.z-preprocessor.z-c.z-include, .z-meta.z-preprocessor.z-macro.z-c {
|
||||
color: #cb4b16;
|
||||
}
|
||||
.z-meta.z-preprocessor.z-c.z-include .z-string.z-quoted.z-other.z-lt-gt.z-include.z-c, .z-meta.z-preprocessor.z-c.z-include .z-punctuation.z-definition.z-string.z-begin.z-c, .z-meta.z-preprocessor.z-c.z-include .z-punctuation.z-definition.z-string.z-end.z-c {
|
||||
color: #2aa198;
|
||||
}
|
||||
.z-other.z-package.z-exclude, .z-other.z-remove {
|
||||
color: #dc322f;
|
||||
}
|
||||
.z-other.z-add {
|
||||
color: #2aa198;
|
||||
}
|
||||
.z-punctuation.z-section.z-group.z-tex, .z-punctuation.z-definition.z-arguments.z-begin.z-latex, .z-punctuation.z-definition.z-arguments.z-end.z-latex, .z-punctuation.z-definition.z-arguments.z-latex {
|
||||
color: #dc322f;
|
||||
}
|
||||
.z-meta.z-group.z-braces.z-tex {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-string.z-other.z-math.z-tex {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-variable.z-parameter.z-function.z-latex {
|
||||
color: #cb4b16;
|
||||
}
|
||||
.z-punctuation.z-definition.z-constant.z-math.z-tex {
|
||||
color: #dc322f;
|
||||
}
|
||||
.z-text.z-tex.z-latex .z-constant.z-other.z-math.z-tex, .z-constant.z-other.z-general.z-math.z-tex, .z-constant.z-other.z-general.z-math.z-tex, .z-constant.z-character.z-math.z-tex {
|
||||
color: #2aa198;
|
||||
}
|
||||
.z-string.z-other.z-math.z-tex {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-punctuation.z-definition.z-string.z-begin.z-tex, .z-punctuation.z-definition.z-string.z-end.z-tex {
|
||||
color: #dc322f;
|
||||
}
|
||||
.z-keyword.z-control.z-label.z-latex, .z-text.z-tex.z-latex .z-constant.z-other.z-general.z-math.z-tex {
|
||||
color: #2aa198;
|
||||
}
|
||||
.z-variable.z-parameter.z-definition.z-label.z-latex {
|
||||
color: #dc322f;
|
||||
}
|
||||
.z-support.z-function.z-be.z-latex {
|
||||
color: #859900;
|
||||
}
|
||||
.z-support.z-function.z-section.z-latex {
|
||||
color: #cb4b16;
|
||||
}
|
||||
.z-support.z-function.z-general.z-tex {
|
||||
color: #2aa198;
|
||||
}
|
||||
.z-keyword.z-control.z-ref.z-latex {
|
||||
color: #2aa198;
|
||||
}
|
||||
.z-storage.z-type.z-class.z-python, .z-storage.z-type.z-function.z-python, .z-storage.z-modifier.z-global.z-python {
|
||||
color: #859900;
|
||||
}
|
||||
.z-support.z-type.z-exception.z-python {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-meta.z-scope.z-for-in-loop.z-shell, .z-variable.z-other.z-loop.z-shell {
|
||||
color: #93a1a1;
|
||||
}
|
||||
.z-meta.z-scope.z-case-block.z-shell, .z-meta.z-scope.z-case-body.z-shell {
|
||||
color: #93a1a1;
|
||||
}
|
||||
.z-punctuation.z-definition.z-logical-expression.z-shell {
|
||||
color: #dc322f;
|
||||
}
|
||||
.z-storage.z-modifier.z-c++ {
|
||||
color: #859900;
|
||||
}
|
||||
.z-support.z-function.z-perl {
|
||||
color: #268bd2;
|
||||
}
|
||||
.z-meta.z-diff, .z-meta.z-diff.z-header {
|
||||
color: #586e75;
|
||||
}
|
||||
.z-meta.z-diff.z-range {
|
||||
color: #268bd2;
|
||||
}
|
||||
.z-markup.z-deleted {
|
||||
color: #dc322f;
|
||||
}
|
||||
.z-markup.z-changed {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-markup.z-inserted {
|
||||
color: #859900;
|
||||
}
|
||||
.z-markup.z-warning {
|
||||
color: #b58900;
|
||||
}
|
||||
.z-markup.z-error {
|
||||
color: #dc322f;
|
||||
}
|
||||
.z-markup.z-heading, .z-punctuation.z-definition.z-heading.z-markdown {
|
||||
color: #b58900;
|
||||
font-weight: bold;
|
||||
}
|
||||
.z-markup.z-quote {
|
||||
color: #859900;
|
||||
}
|
||||
.z-markup.z-italic {
|
||||
font-style: italic;
|
||||
}
|
||||
.z-markup.z-bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
.z-markup.z-underline.z-link.z-markdown, .z-meta.z-link.z-reference .z-constant.z-other.z-reference.z-link.z-markdown {
|
||||
color: #2aa198;
|
||||
}
|
||||
.z-constant.z-other.z-reference.z-link.z-markdown {
|
||||
color: #6c71c4;
|
||||
}
|
||||
.z-meta.z-paragraph.z-markdown .z-meta.z-dummy.z-line-break {
|
||||
background-color: #586e75;
|
||||
}
|
||||
.z-brackethighlighter.z-all {
|
||||
color: #586e75;
|
||||
}
|
||||
.z-entity.z-name.z-filename.z-find-in-files {
|
||||
color: #2aa198;
|
||||
}
|
||||
.z-constant.z-numeric.z-line-number.z-find-in-files {
|
||||
color: #586e75;
|
||||
}
|
||||
.z-variable.z-other.z-readwrite.z-js, .z-variable.z-other.z-object.z-js, .z-variable.z-other.z-constant.z-js {
|
||||
color: #839496;
|
||||
}
|