New Post + support for mastodon
This commit is contained in:
parent
71ecae9875
commit
ab84019b99
11 changed files with 322 additions and 2 deletions
|
|
@ -89,10 +89,11 @@ preserveTaxonomyNames = true
|
||||||
# this will also be in author bio if there is no writer.
|
# this will also be in author bio if there is no writer.
|
||||||
[params.social]
|
[params.social]
|
||||||
email = "duck@duckland.org"
|
email = "duck@duckland.org"
|
||||||
twitter = "https://twitter.com/duckunix"
|
#twitter = "https://twitter.com/duckunix"
|
||||||
linkedin = "https://www.linkedin.com/in/donaldharper/"
|
linkedin = "https://www.linkedin.com/in/donaldharper/"
|
||||||
|
mastodon = "https://fosstodon/@duckunix"
|
||||||
#stackoverflow = "full profile url in stackoverflow"
|
#stackoverflow = "full profile url in stackoverflow"
|
||||||
instagram = "https://www.instagram.com/duckunix/"
|
#instagram = "https://www.instagram.com/duckunix/"
|
||||||
github = "https://github.com/duckunix"
|
github = "https://github.com/duckunix"
|
||||||
rss = true
|
rss = true
|
||||||
[params.writers]
|
[params.writers]
|
||||||
|
|
|
||||||
37
content/post/2022/12/check-in-2022-q4.md
Normal file
37
content/post/2022/12/check-in-2022-q4.md
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
---
|
||||||
|
date: "2022-06-18T04:00:00-07:00"
|
||||||
|
title: "Check-in 2022-Q4"
|
||||||
|
tags: ["family","sa", "photos"]
|
||||||
|
categories: ["Personal"]
|
||||||
|
image: "/photos/Christmas/2022/20221219211012886-0600.webp"
|
||||||
|
featured_image: "/photos/Christmas/2022/20221219211012886-0600.webp"
|
||||||
|
#series: [""]
|
||||||
|
summary: "Where did the year go?"
|
||||||
|
Victor_Hugo: "true"
|
||||||
|
Focus_Keyword: "close"
|
||||||
|
---
|
||||||
|
|
||||||
|
2022 is drawing to a close, and I have been bad about updating this blog. Maybe next year will be better for me. :)
|
||||||
|
|
||||||
|
# Technology
|
||||||
|
|
||||||
|
Since all the changes on [Twitter](https://twitter.com/duckunix), I am now active on [Fosstodon](https://fosstodom/@duckunix), which is a [Mastodon](https://joinmastodon.org/). I joined back in 2018, but I just started using it more. My #introduction toot:
|
||||||
|
{{<smoot "fosstodon.org" "100578860152016241">}}
|
||||||
|
|
||||||
|
On the home network front, I finally retired the big server as the drivers were failing. I decided to move the containers running there to my old desktop which was not doing anything. Some new disks, and life is better there.
|
||||||
|
|
||||||
|
One of the other things I have been looking into is [NixOS](https://nixos.org) which is a declarative Linux distribution. What does that mean? By describing the machine in a single file (or multiple for readability), you can have a easily reproducible install. After a little research and testing, I was able to install two separate machines which are identically configured expect for the host name. Pretty cool. And since installing a new program is done in this file, you always have a complete record of what is installed and you get OS versioning as an added feature. I am going to flip my main machine over during the holiday break.
|
||||||
|
|
||||||
|
# Photography
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
I am still doing my P52 project (posting a new photo every week) over on my [photo blog](https://www.donaldharper.com). I had gotten out of the habit of carrying my camera with me, so I am trying to get back into it. Sometimes, it is not with my main rig, but with smaller point-n-shoot cameras which I can keep in a pocket. I have also switched my phone case so taking pictures with my phone is easier.
|
||||||
|
|
||||||
|
# Job
|
||||||
|
|
||||||
|
Looking back, I realize that during this whole [plague thing](/tags/plague), I switched teams three times, finally going back to a position which I held last time I worked for my employer. I also have been working here for 6 years last month this time. Is this my final or dream job? I do not think so, but it is interesting and stable, so there is that.
|
||||||
|
|
||||||
|
# Family
|
||||||
|
|
||||||
|
Everybody is doing fine, and thankfully this year has been free of any major illness or injury, so that is a win in my book!
|
||||||
BIN
static/photos/Christmas/2022/20221219211012886-0600.webp
Normal file
BIN
static/photos/Christmas/2022/20221219211012886-0600.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 47 KiB |
106
static/photos/Christmas/2022/index.html
Normal file
106
static/photos/Christmas/2022/index.html
Normal file
|
|
@ -0,0 +1,106 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
||||||
|
|
||||||
|
<title>2022 - duckland.org's photo gallery</title>
|
||||||
|
<meta name="description" content="">
|
||||||
|
<meta name="author" content="Don Harper">
|
||||||
|
<meta name="viewport" content="width=device-width">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="../../static/css/normalize.css">
|
||||||
|
<link rel="stylesheet" href="../../static/themes/classic/galleria.classic.css">
|
||||||
|
<link rel="stylesheet" href="../../static/css/style.css">
|
||||||
|
<style>
|
||||||
|
body::after{
|
||||||
|
position:absolute; width:0; height:0; overflow:hidden; z-index:-1;
|
||||||
|
content:url(20221219211012886-0600.webp);
|
||||||
|
}</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<header>
|
||||||
|
<h1><a href="../../">duckland.org's photo gallery</a></h1>
|
||||||
|
|
||||||
|
<nav id="menu">
|
||||||
|
<ul>
|
||||||
|
<li><a href="/photos/">Photos Home</a></li>
|
||||||
|
<li><a href="/">Home Page</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
<div class="breadcrumb">
|
||||||
|
<h2>
|
||||||
|
<a href="../">Christmas</a> » <a href=".">2022</a></h2>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div id="main" role="main">
|
||||||
|
<div class="icons">
|
||||||
|
<a id="fullscreen"><img src="../../static/img/fullscreen.png"
|
||||||
|
title="Fullscreen" alt="Fullscreen (f)" /></a>
|
||||||
|
</div>
|
||||||
|
<div id="gallery"></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="../../static/jquery-3.3.1.min.js"></script>
|
||||||
|
<script src="../../static/galleria.min.js"></script>
|
||||||
|
<script src="../../static/themes/classic/galleria.classic.min.js"></script>
|
||||||
|
<script src="../../static/plugins/history/galleria.history.min.js"></script>
|
||||||
|
<script>
|
||||||
|
var data = [
|
||||||
|
{
|
||||||
|
title: "20221219211012886-0600",
|
||||||
|
description: "",
|
||||||
|
thumb: "thumbnails/20221219211012886-0600.webp",
|
||||||
|
image: "20221219211012886-0600.webp"
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
Galleria.ready(function() {
|
||||||
|
/*
|
||||||
|
load thumbnails after gallery setup, and download has started
|
||||||
|
for the main images, but before the loading of map tiles starts
|
||||||
|
in the background. This ensures visible elements are prioritised
|
||||||
|
over non-visible elements
|
||||||
|
|
||||||
|
The choice to lazy load thumbnails in batches of 50 was not made
|
||||||
|
scientifically. Other numbers may yield better performance.
|
||||||
|
*/
|
||||||
|
this.lazyLoadChunks( 50 );
|
||||||
|
|
||||||
|
this.attachKeyboard({
|
||||||
|
right: this.next,
|
||||||
|
left: this.prev,
|
||||||
|
/* Toggle fullscreen display on press of 'f' key */
|
||||||
|
0x46: this.toggleFullscreen,
|
||||||
|
});
|
||||||
|
|
||||||
|
var gallery = this;
|
||||||
|
$('#fullscreen').click(function() {
|
||||||
|
gallery.toggleFullscreen();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.icons').appendTo(this.$('container'));
|
||||||
|
});
|
||||||
|
|
||||||
|
Galleria.configure({
|
||||||
|
imageCrop: false,
|
||||||
|
transition: "fade",
|
||||||
|
thumbnails: "lazy"
|
||||||
|
});
|
||||||
|
Galleria.run("#gallery", {dataSource: data});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
<footer>
|
||||||
|
<p>
|
||||||
|
<span>© Don Harper</span>
|
||||||
|
<span>Generated by <a href="https://github.com/saimn/sigal">sigal</a></span>
|
||||||
|
</p>
|
||||||
|
</footer> </div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 9.1 KiB |
|
|
@ -62,6 +62,10 @@
|
||||||
<img src="2019/thumbnails/20191214125859.webp" class="album_thumb" alt="2019" title="2019" /></a>
|
<img src="2019/thumbnails/20191214125859.webp" class="album_thumb" alt="2019" title="2019" /></a>
|
||||||
<span class="album_title">2019</span>
|
<span class="album_title">2019</span>
|
||||||
</li>
|
</li>
|
||||||
|
<li><a href="2022/">
|
||||||
|
<img src="2022/thumbnails/20221219211012886-0600.webp" class="album_thumb" alt="2022" title="2022" /></a>
|
||||||
|
<span class="album_title">2022</span>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="icons">
|
<div class="icons">
|
||||||
|
|
|
||||||
BIN
static/photos/Random/2022-P52.webp
Normal file
BIN
static/photos/Random/2022-P52.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 109 KiB |
|
|
@ -166,6 +166,12 @@
|
||||||
thumb: "thumbnails/sunset-on-katori.webp",
|
thumb: "thumbnails/sunset-on-katori.webp",
|
||||||
image: "sunset-on-katori.webp"
|
image: "sunset-on-katori.webp"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: "2022-P52",
|
||||||
|
description: "",
|
||||||
|
thumb: "thumbnails/2022-P52.webp",
|
||||||
|
image: "2022-P52.webp"
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
Galleria.ready(function() {
|
Galleria.ready(function() {
|
||||||
|
|
|
||||||
BIN
static/photos/Random/thumbnails/2022-P52.webp
Normal file
BIN
static/photos/Random/thumbnails/2022-P52.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
|
|
@ -22,6 +22,15 @@
|
||||||
<ul class="social-media-icons">
|
<ul class="social-media-icons">
|
||||||
|
|
||||||
|
|
||||||
|
{{ with .Site.Params.social.mastodon }}
|
||||||
|
<li>
|
||||||
|
<a href="{{ . }}" data-animate-hover="pulse" class="mastodon" target="_blank">
|
||||||
|
<i class="fab fa-mastodon " title="mastodon"></i>
|
||||||
|
<span class="screen-reader-text">mastodon</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
{{ with .Site.Params.social.facebook }}
|
{{ with .Site.Params.social.facebook }}
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ . }}" data-animate-hover="pulse" class="facebook" target="_blank">
|
<a href="{{ . }}" data-animate-hover="pulse" class="facebook" target="_blank">
|
||||||
|
|
|
||||||
157
themes/nederburg/layouts/shortcodes/smoot.html
Normal file
157
themes/nederburg/layouts/shortcodes/smoot.html
Normal file
|
|
@ -0,0 +1,157 @@
|
||||||
|
{{ $masIns := .Get 0 }}
|
||||||
|
{{ $tootLink := "" }}
|
||||||
|
{{ $card := "" }}
|
||||||
|
{{ $handleInst := "" }}
|
||||||
|
{{ $mediaMD5 := "" }}
|
||||||
|
{{ $imageCount := 0 }}
|
||||||
|
{{ $votesCount := 0 }}
|
||||||
|
{{ $id := .Get 1 }}
|
||||||
|
{{ $urlToGet := print "https://" $masIns "/api/v1/statuses/" $id }}
|
||||||
|
{{ $json := getJSON $urlToGet }}
|
||||||
|
{{ $jsonHolder := $json }}{{/* Being safe */}}
|
||||||
|
|
||||||
|
{{ if isset $json "account" }}
|
||||||
|
{{ $tootLink = print "https://" $masIns "@" $json.account.acct "/status/" $id }}
|
||||||
|
{{ $handleInst = print "@" $json.account.acct "@" $masIns }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ if isset $json "content" }}
|
||||||
|
<blockquote class="tweet-card" cite="{{ $tootLink }}">
|
||||||
|
<div class="tweet-header">
|
||||||
|
<a class="tweet-profile twitterExt" href="https://{{ $masIns }}/@{{ $json.account.acct }}" rel="noopener">
|
||||||
|
<img
|
||||||
|
src="{{ $json.account.avatar }}"
|
||||||
|
alt="Mastodon avatar for {{ $handleInst }}"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
|
</a>
|
||||||
|
<div class="tweet-author">
|
||||||
|
<a class="tweet-author-name twitterExt" href="https://{{ $masIns }}/@{{ $json.account.acct }}" rel="noopener">{{ $json.account.display_name }}</a>
|
||||||
|
<a class="tweet-author-handle twitterExt" href="https://{{ $masIns }}/@{{ $json.account.acct }}" rel="noopener">{{ $handleInst }}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="tweet-body">
|
||||||
|
{{ $json.content | safeHTML }}
|
||||||
|
</p>
|
||||||
|
{{ with $json.media_attachments }}
|
||||||
|
{{ range $media_attachments := . }}
|
||||||
|
{{ if eq $media_attachments.type "image" }}
|
||||||
|
{{ $imageCount = (add ($imageCount) 1) }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
<div class="tweet-img-grid-{{ $imageCount }}">
|
||||||
|
{{ range $media_attachments := . }}
|
||||||
|
{{ if eq $media_attachments.type "image" }}
|
||||||
|
{{ $mediaMD5 = md5 $media_attachments.url }}
|
||||||
|
<style>
|
||||||
|
.img-{{ $mediaMD5 }} {
|
||||||
|
aspect-ratio: {{ $media_attachments.meta.original.width }} / {{ $media_attachments.meta.original.height }};
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<img
|
||||||
|
src="{{ $media_attachments.url }}"
|
||||||
|
alt="Image {{ $media_attachments.id }} from toot {{ $id }} on {{ $masIns }}"
|
||||||
|
class="tweet-media-img img-{{ $mediaMD5 }}{{ if $json.sensitive }} tweet-sens-blur{{ end }}"
|
||||||
|
loading="lazy"
|
||||||
|
{{- if $json.sensitive }}onclick="this.classList.toggle('tweet-sens-blur-no')"{{- end }}
|
||||||
|
/>
|
||||||
|
{{- if $json.sensitive -}}
|
||||||
|
<div class="blur-text">
|
||||||
|
Sensitive content<br />
|
||||||
|
(flagged at origin)
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{/*
|
||||||
|
N.B.:
|
||||||
|
The above results in an empty, no-height div
|
||||||
|
when there's no image but there **is**
|
||||||
|
at least one item in `$media_attachments`.
|
||||||
|
Unfortunately, it seems to be the only way
|
||||||
|
to accomplish this. Not a good HTML practice,
|
||||||
|
but gets the job done.
|
||||||
|
*/}}
|
||||||
|
{{ range $media_attachments := . }}
|
||||||
|
{{ if eq $media_attachments.type "video" }}
|
||||||
|
{{ $mediaMD5 = md5 $media_attachments.url }}
|
||||||
|
<style>
|
||||||
|
.img-{{ $mediaMD5 }} {
|
||||||
|
aspect-ratio: {{ $media_attachments.meta.original.width }} / {{ $media_attachments.meta.original.height }};
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div class="ctr tweet-video-wrapper">
|
||||||
|
<video muted playsinline controls class="ctr tweet-media-img img-{{ $mediaMD5 }}{{ if $json.sensitive }} tweet-sens-blur{{ end }}"{{- if $json.sensitive }}onclick="this.classList.toggle('tweet-sens-blur-no')"{{- end }}>
|
||||||
|
<source src="{{ $media_attachments.url }}">
|
||||||
|
<p class="legal ctr">(Your browser doesn’t support the <code>video</code> tag.)</p>
|
||||||
|
</video>
|
||||||
|
{{- if $json.sensitive -}}
|
||||||
|
<div class="blur-text">
|
||||||
|
Sensitive content<br />
|
||||||
|
(flagged at origin)
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
{{ if eq $media_attachments.type "gifv" }}
|
||||||
|
{{ $mediaMD5 = md5 $media_attachments.url }}
|
||||||
|
<style>
|
||||||
|
.img-{{ $mediaMD5 }} {
|
||||||
|
aspect-ratio: {{ $media_attachments.meta.original.width }} / {{ $media_attachments.meta.original.height }};
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div class="ctr tweet-video-wrapper">
|
||||||
|
<video loop autoplay muted playsinline controls controlslist="nofullscreen" class="ctr tweet-media-img img-{{ $mediaMD5 }}{{ if $json.sensitive }} tweet-sens-blur{{ end }}" {{- if $json.sensitive }}onclick="this.classList.toggle('tweet-sens-blur-no')"{{- end }}>
|
||||||
|
<source src="{{ $media_attachments.url }}">
|
||||||
|
<p class="legal ctr">(Your browser doesn’t support the <code>video</code> tag.)</p>
|
||||||
|
</video>
|
||||||
|
{{- if $json.sensitive -}}
|
||||||
|
<div class="blur-text">
|
||||||
|
Sensitive content<br />
|
||||||
|
(flagged at origin)
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ with $json.card }}
|
||||||
|
{{- $cardData := . -}}
|
||||||
|
{{- with $cardData.image -}}
|
||||||
|
<a href="{{ $cardData.url }}" rel="'noopener">
|
||||||
|
<div class="card">
|
||||||
|
<img src="{{ $cardData.image }}" alt="Card image from {{ $masIns }} toot {{ $id }}" loading="lazy" class="tweet-card-img" />
|
||||||
|
<p>
|
||||||
|
<span class="card-title">{{ $cardData.title }}</span><br />
|
||||||
|
{{ $cardData.description }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{{- end -}}
|
||||||
|
{{ end }}
|
||||||
|
{{ with $json.poll }}
|
||||||
|
{{ $poll := . }}
|
||||||
|
{{ with $poll.options }}
|
||||||
|
{{ range $pollOptions := . }}
|
||||||
|
{{ $votesCount = add $votesCount $pollOptions.votes_count }}
|
||||||
|
{{ end }}
|
||||||
|
<div class="tweet-poll-wrapper">
|
||||||
|
{{ range $pollOptions := . }}
|
||||||
|
<div class="tweet-poll-count">
|
||||||
|
<strong>{{ (mul 100 (div $pollOptions.votes_count $votesCount)) | lang.FormatPercent 1 }}</strong>
|
||||||
|
</div>
|
||||||
|
<div class="tweet-poll-meter">
|
||||||
|
<meter id="vote-count" max="{{ $votesCount }}" value="{{ $pollOptions.votes_count }}"></meter>
|
||||||
|
</div>
|
||||||
|
<div class="tweet-poll-title">{{ $pollOptions.title }}</div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
<p class="legal">{{ $votesCount }} votes</p>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
<div class="tweet-footer">
|
||||||
|
<a href="https://{{ $masIns }}/@{{ $json.account.acct }}/{{ $json.id }}" class="tweet-date twitterExt" rel="noopener">{{ dateFormat "3:04 PM • January 2, 2006" $json.created_at }}</a> <span class="legal">(UTC)</span>
|
||||||
|
</div>
|
||||||
|
</blockquote>
|
||||||
|
{{ end }}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue