Compare commits
2 Commits
5508b4f2b2
...
2b93a43494
Author | SHA1 | Date |
---|---|---|
Rin | 2b93a43494 | |
Rin | 4dad03e3c9 |
|
@ -2,6 +2,7 @@
|
||||||
/public/
|
/public/
|
||||||
/resources/_gen/
|
/resources/_gen/
|
||||||
/assets/jsconfig.json
|
/assets/jsconfig.json
|
||||||
|
/static/fonts
|
||||||
hugo_stats.json
|
hugo_stats.json
|
||||||
|
|
||||||
# Executable may be added to repository
|
# Executable may be added to repository
|
||||||
|
|
|
@ -1,3 +1,92 @@
|
||||||
|
/* Example Font-Face Set-Up */
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Majesty';
|
||||||
|
src: url('/fonts/Majesty/majesty-medium.otf');
|
||||||
|
weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Majesty Display';
|
||||||
|
src: url('/fonts/Majesty/majesty-display.otf');
|
||||||
|
weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Majesty Light';
|
||||||
|
src: url('/fonts/Majesty/majesty-light.otf');
|
||||||
|
weight: 200;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Quincy';
|
||||||
|
src: url('/fonts/Fontspring-DEMO-quincycf-regular.otf');
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Quincy';
|
||||||
|
src: url('/fonts/Fontspring-DEMO-quincycf-regularitalic.otf');
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: italic, oblique;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Quincy';
|
||||||
|
src: url('/fonts/Fontspring-DEMO-quincycf-bolditalic.otf');
|
||||||
|
font-weight: bold;
|
||||||
|
font-style: italic, oblique;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roxborough';
|
||||||
|
src: url('/fonts/Fontspring-DEMO-Calluna-Regular.otf');
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roxborough';
|
||||||
|
src: url('/fonts/Fontspring-DEMO-Calluna-It.otf');
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Roxborough';
|
||||||
|
src: url('/fonts/Fontspring-DEMO-Calluna-SemiboldIt.otf');
|
||||||
|
font-weight: bold;
|
||||||
|
font-style: italic, oblique;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
line-height: 1.1;
|
||||||
|
/*font-family: 'Roxborough';*/
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
font-family: 'Roxborough';
|
||||||
|
}
|
||||||
|
|
||||||
|
time, .reading-time, .word-count {
|
||||||
|
font-family: 'Roxborough';
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-family: 'Roxborough';
|
||||||
|
}
|
||||||
|
|
||||||
|
h2, h3, h4, h5, h6 {
|
||||||
|
font-family: 'Roxborough';
|
||||||
|
}
|
||||||
|
|
||||||
|
p, article {
|
||||||
|
font-family: 'Roxborough';
|
||||||
|
}
|
||||||
|
|
||||||
|
.text {
|
||||||
|
font-family: 'Roxborough';
|
||||||
|
}
|
||||||
|
|
||||||
/* Max Content Width */
|
/* Max Content Width */
|
||||||
.max-w-prose {
|
.max-w-prose {
|
||||||
max-width: 80ch;
|
max-width: 80ch;
|
||||||
|
@ -31,6 +120,11 @@
|
||||||
color: rgba(var(--color-primary-700),var(--tw-text-opacity));
|
color: rgba(var(--color-primary-700),var(--tw-text-opacity));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.prose :where(code):not(:where([class~=not-prose] *)) {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.dark .chroma .ow {
|
.dark .chroma .ow {
|
||||||
color: rgba(var(--color-primary-400),var(--tw-text-opacity));
|
color: rgba(var(--color-primary-400),var(--tw-text-opacity));
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,74 @@
|
||||||
|
---
|
||||||
|
title: "Cleaning up fortune and friends"
|
||||||
|
date: 2022-11-20T22:22:22+11:00
|
||||||
|
draft: true
|
||||||
|
showSummary: true
|
||||||
|
summary: "As it turns out, fortune-mod has an -o option for \"offensive\" fortunes, which range from vaguely off-colour
|
||||||
|
to wildly homophobic and outright racist. We figured someone should clean up and reorganise the program to get rid
|
||||||
|
of anything vile, and replace the offensive category with an NSFW category."
|
||||||
|
---
|
||||||
|
|
||||||
|
# Background
|
||||||
|
|
||||||
|
> **(Selene)** Hi there. Unlike most of the blogs on here, I'll be narrating this one. This topic is closer to my heart,
|
||||||
|
> and requires less technical expertise than most of the others. I'll still defer to Ashe for any code changes, though.
|
||||||
|
> The gods know I can't grok C to save my life.
|
||||||
|
|
||||||
|
The [original fortune package](https://en.wikipedia.org/wiki/Fortune_(Unix)) was written in 1979, a good 43 years ago.
|
||||||
|
Obviously, times have changed since than, and the package itself has gone through several revisions and re-writes.
|
||||||
|
Fortunes have also been added, removed, and moved around.
|
||||||
|
|
||||||
|
There currently exist two maintained distributions. The [original BSD version](https://github.com/ahills/fortune),
|
||||||
|
repackaged to run on Alpine Linux, and [fortune-mod](https://github.com/shlomif/fortune-mod), which is a re-write in C.
|
||||||
|
|
||||||
|
## Why is this a problem?
|
||||||
|
|
||||||
|
Three Reasons:
|
||||||
|
|
||||||
|
1. A lot of the "offensive" fortunes are simply insensitive, mocking, or degrading by today's standards.
|
||||||
|
Even were they not, it sets a bad example to have a fortunes package that spits out slurs or homophobia[^1]
|
||||||
|
at people by default, even if it *is* gated behind a flag. If people truly want these fortunes, they should
|
||||||
|
be contained in their own package that distros can opt and out of as they please,
|
||||||
|
instead of everything being clubbed together.
|
||||||
|
2. Sensibilities have changed since the 1970s, and while some fortunes have been removed, a lot of the fortunes in these
|
||||||
|
packages would get you a stern talking-to if your manager saw it. These should live in an NSFW category.
|
||||||
|
While this overlaps with an "offensive" category, it is not the same thing.
|
||||||
|
3. As fortunes have been written, added, modified, and removed, the categories have gotten blurry and indistinct. The
|
||||||
|
fortunes themselves need a re-organisation and trim.
|
||||||
|
|
||||||
|
[^1]: Or Hitler quotes, for that matter.
|
||||||
|
|
||||||
|
## How do we fix this?
|
||||||
|
|
||||||
|
There's a number of problems here, but fundamentally, they are all organisational problems. As such, our first task is to tag each fortune as NSFW, a candidate for removal, or inaccurate in its category.
|
||||||
|
|
||||||
|
From there we can restructure the packages and propose these changes upstream.
|
||||||
|
|
||||||
|
## Where do we start?
|
||||||
|
|
||||||
|
We'll start with BSD's `fortune` package, as used in Alpine, for two reasons. For one, it is smaller than `fortunes-mod`. For two, the Alpine Linux maintainers tend to be relatively sensible, so this will be a good proving ground.
|
||||||
|
|
||||||
|
## Let's get to it
|
||||||
|
|
||||||
|
We started by mirroring the [fortune](https://github.com/ahills/fortune) package used on Alpine.
|
||||||
|
|
||||||
|
### First steps
|
||||||
|
|
||||||
|
The very first thing we'll do is move the default branch from `master` to `main`. This is a very small thing, but if we should be thorough if we're going to do this.
|
||||||
|
|
||||||
|
### Scanning through the fortunes
|
||||||
|
In the BSD/Alpine version, the fortunes are located in the `datfiles` directory, and the files we care about are:
|
||||||
|
- fortunes-o
|
||||||
|
- fortunes2-o
|
||||||
|
- limerick
|
||||||
|
|
||||||
|
These are noted as having the "offensive" fortunes, however we'll also give the non-offensive fortunes a scan. Since the fortunes in this version aren't categorised, we'll leave them uncategorised for now. Maybe a project for later.
|
||||||
|
|
||||||
|
> **(Doll)** Doll will remind Miss Selene about this another time!
|
||||||
|
>
|
||||||
|
> **(Selene)** Thanks Doll.
|
||||||
|
|
||||||
|
We've created a [full breakdown]({{< ref "lists/fortunes-cleanup" >}}) of each fortune that was removed, moved, or altered, and *why*, if you're interested. Content Notices for that page are **everything**. This is not a joke. I try to provide a summary near the top of the kinds
|
||||||
|
of content present, but it is not exhaustive, and fortunes are not individually marked and spoilered.
|
||||||
|
|
||||||
|
By the by, huge thanks to the Treehouse Systems community for helping us out with screening these.
|
|
@ -0,0 +1,95 @@
|
||||||
|
{{ $constrainItemsWidth := .Page.Site.Params.list.constrainItemsWidth | default false }}
|
||||||
|
|
||||||
|
{{ $articleClasses := "flex flex-wrap article" }}
|
||||||
|
{{ if .Site.Params.list.showCards }}
|
||||||
|
{{ $articleClasses = delimit (slice $articleClasses "border border-neutral-200 dark:border-neutral-700 border-2 rounded-md backdrop-blur") " " }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $articleClasses = delimit (slice $articleClasses "") " " }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ $articleImageClasses := "w-full md:w-auto h-full thumbnail nozoom" }}
|
||||||
|
{{ if .Site.Params.list.showCards }}
|
||||||
|
{{ $articleImageClasses = delimit (slice $articleImageClasses "") " " }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $articleImageClasses = delimit (slice $articleImageClasses "thumbnailshadow md:mr-7") " " }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ $disableImageOptimization := .Page.Site.Params.disableImageOptimization | default false }}
|
||||||
|
|
||||||
|
{{ $articleInnerClasses := "" }}
|
||||||
|
{{ if .Site.Params.list.showCards }}
|
||||||
|
{{ $articleInnerClasses = delimit (slice $articleInnerClasses "p-4") " " }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $articleInnerClasses = delimit (slice $articleInnerClasses "mt-3 md:mt-0") " " }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ if $constrainItemsWidth }}
|
||||||
|
{{ $articleClasses = delimit (slice $articleClasses "max-w-prose") " " }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
|
||||||
|
{{ with .Params.externalUrl }}
|
||||||
|
<a class="{{ $articleClasses }}" href="{{ . }}" target="_blank" rel="external">
|
||||||
|
{{ else }}
|
||||||
|
<a class="{{ $articleClasses }}" href="{{ .RelPermalink }}">
|
||||||
|
{{ end }}
|
||||||
|
{{- with $.Params.images -}}
|
||||||
|
{{- range first 6 . }}
|
||||||
|
<meta property="og:image" content="{{ . | absURL }}" />{{ end -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{- $images := $.Resources.ByType "image" -}}
|
||||||
|
{{- $featured := $images.GetMatch "*feature*" -}}
|
||||||
|
{{- if not $featured }}{{ $featured = $images.GetMatch "{*cover*,*thumbnail*}" }}{{ end -}}
|
||||||
|
{{- with $featured -}}
|
||||||
|
{{ if $disableImageOptimization }}
|
||||||
|
{{ with . }}
|
||||||
|
<div class="{{ $articleImageClasses }}" style="background-image:url({{ .RelPermalink }});"></div>
|
||||||
|
{{ end }}
|
||||||
|
{{ else }}
|
||||||
|
{{ with .Resize "600x" }}
|
||||||
|
<div class="{{ $articleImageClasses }}" style="background-image:url({{ .RelPermalink }});"></div>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{- else -}}
|
||||||
|
{{- with $.Site.Params.images }}
|
||||||
|
<meta property="og:image" content="{{ index . 0 | absURL }}" />{{ end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
|
||||||
|
<div class="{{ $articleInnerClasses }}">
|
||||||
|
<div class="items-center text-xl font-semibold">
|
||||||
|
{{ with .Params.externalUrl }}
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="text-neutral-800 decoration-primary-500 hover:underline hover:underline-offset-2 dark:text-neutral">
|
||||||
|
{{ $.Title | emojify }}
|
||||||
|
<span class="text-xs align-top cursor-default text-neutral-400 dark:text-neutral-500">
|
||||||
|
<span class="rtl:hidden">↗</span>
|
||||||
|
<span class="ltr:hidden">↖</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ else }}
|
||||||
|
<div class="text-neutral-800 decoration-primary-500 hover:underline hover:underline-offset-2 dark:text-neutral"
|
||||||
|
href="{{ .RelPermalink }}"><h2>{{ .Title | emojify }}</h2></div>
|
||||||
|
{{ end }}
|
||||||
|
{{ if and .Draft .Site.Params.article.showDraftLabel }}
|
||||||
|
<div class=" ltr:ml-2 rtl:mr-2">
|
||||||
|
{{ partial "badge.html" (i18n "article.draft" | emojify) }}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
{{ if templates.Exists "partials/extend-article-link.html" }}
|
||||||
|
{{ partial "extend-article-link.html" . }}
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
<div class="text-sm text-neutral-500 dark:text-neutral-400">
|
||||||
|
{{ partial "article-meta/basic.html" . }}
|
||||||
|
</div>
|
||||||
|
{{ if .Params.showSummary | default (.Site.Params.list.showSummary | default false) }}
|
||||||
|
<div class="py-1 max-w-fit prose dark:prose-invert">
|
||||||
|
{{ .Summary | emojify }}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</a>
|
|
@ -0,0 +1,4 @@
|
||||||
|
<time datetime="{{ . }}">
|
||||||
|
{{- i18n "article.date_updated" (dict "Date" (partial "functions/date.html" .)) | markdownify | emojify -}}
|
||||||
|
</time>
|
||||||
|
{{- /* Trim EOF */ -}}
|
|
@ -0,0 +1,4 @@
|
||||||
|
<time datetime="{{ . }}">
|
||||||
|
{{- i18n "article.date" (dict "Date" (partial "functions/date.html" .)) | markdownify | emojify -}}
|
||||||
|
</time>
|
||||||
|
{{- /* Trim EOF */ -}}
|
|
@ -0,0 +1,4 @@
|
||||||
|
<span title="{{ i18n "article.reading_time_title" }}" class="reading-time">
|
||||||
|
{{- i18n "article.reading_time" .ReadingTime | markdownify | emojify -}}
|
||||||
|
</span>
|
||||||
|
{{- /* Trim EOF */ -}}
|
|
@ -0,0 +1,4 @@
|
||||||
|
<span title="Word count" class="word-count">
|
||||||
|
{{- i18n "article.word_count" .WordCount | markdownify | emojify -}}
|
||||||
|
</span>
|
||||||
|
{{- /* Trim EOF */ -}}
|
Loading…
Reference in New Issue