webmention sending endpoint client

This commit is contained in:
Wouter Groeneveld 2021-03-19 21:34:19 +01:00
parent 6a0e15ef03
commit 40f4fe9a14
14 changed files with 405 additions and 17 deletions

Binary file not shown.

View File

@ -0,0 +1,3 @@
{
"since": "2021-03-19T20:08:40.327Z"
}

137
data/webmentions.json Normal file
View File

@ -0,0 +1,137 @@
[
{
"author": {
"name": "Wouter Groeneveld",
"picture": "https://brainbaking.com/img/avatar.jpg"
},
"name": "The insanity of collecting retro games",
"content": "Is a physical collection really worth it?",
"published": "2021-02-21",
"type": "mention",
"url": "https://brainbaking.com/post/2021/02/the-insanity-of-retro-game-collecting/",
"source": "https://brainbaking.com/post/2021/02/the-insanity-of-retro-game-collecting/",
"target": "https://jefklakscodex.com/articles/features/super-mario-64-aged-badly/",
"publishedFromNow": "a month ago",
"relativeTarget": "/articles/features/super-mario-64-aged-badly/"
},
{
"author": {
"name": "Wouter Groeneveld",
"picture": "https://brainbaking.com/img/avatar.jpg"
},
"name": "The insanity of collecting retro games",
"content": "Is a physical collection really worth it?",
"published": "2021-02-21",
"type": "mention",
"url": "https://brainbaking.com/post/2021/02/the-insanity-of-retro-game-collecting/",
"source": "https://brainbaking.com/post/2021/02/the-insanity-of-retro-game-collecting/",
"target": "https://jefklakscodex.com/articles/features/gaming-setup-2007-flashback/",
"publishedFromNow": "a month ago",
"relativeTarget": "/articles/features/gaming-setup-2007-flashback/"
},
{
"author": {
"name": "Wouter Groeneveld",
"picture": "https://brainbaking.com/img/avatar.jpg"
},
"name": "Win98 Upgrade: GeForce 3 Ti200 vs Riva TNT2",
"content": "Get more out of that AGPx4 slot!",
"published": "2021-01-28",
"type": "mention",
"url": "https://brainbaking.com/post/2021/01/win98-upgrade-geforce3/",
"source": "https://brainbaking.com/post/2021/01/win98-upgrade-geforce3/",
"target": "https://jefklakscodex.com/articles/features/the-best-and-worst-retro-hack-and-slash-games/",
"publishedFromNow": "2 months ago",
"relativeTarget": "/articles/features/the-best-and-worst-retro-hack-and-slash-games/"
},
{
"author": {
"name": "Wouter Groeneveld",
"picture": "https://brainbaking.com/img/avatar.jpg"
},
"name": "Win98 Upgrade: GeForce 3 Ti200 vs Riva TNT2",
"content": "Get more out of that AGPx4 slot!",
"published": "2021-01-28",
"type": "mention",
"url": "https://brainbaking.com/post/2021/01/win98-upgrade-geforce3/",
"source": "https://brainbaking.com/post/2021/01/win98-upgrade-geforce3/",
"target": "https://jefklakscodex.com/tags/wizardry8/",
"publishedFromNow": "2 months ago",
"relativeTarget": "/tags/wizardry8/"
},
{
"author": {
"name": "Wouter Groeneveld",
"picture": "https://brainbaking.com/img/avatar.jpg"
},
"name": "Win98 Upgrade: GeForce 3 Ti200 vs Riva TNT2",
"content": "Get more out of that AGPx4 slot!",
"published": "2021-01-28",
"type": "mention",
"url": "https://brainbaking.com/post/2021/01/win98-upgrade-geforce3/",
"source": "https://brainbaking.com/post/2021/01/win98-upgrade-geforce3/",
"target": "https://jefklakscodex.com/articles/reviews/dungeon-siege/",
"publishedFromNow": "2 months ago",
"relativeTarget": "/articles/reviews/dungeon-siege/"
},
{
"author": {
"name": "Wouter Groeneveld",
"picture": "https://brainbaking.com/img/avatar.jpg"
},
"name": "The Internet Killed Secrets in Games",
"content": "What's the 'secret' of the secret cow level in Diablo II?",
"published": "2020-11-19",
"type": "mention",
"url": "https://brainbaking.com/post/2020/11/the-internet-killed-secrets-in-games/",
"source": "https://brainbaking.com/post/2020/11/the-internet-killed-secrets-in-games/",
"target": "https://jefklakscodex.com/articles/reviews/gobliins2/",
"publishedFromNow": "4 months ago",
"relativeTarget": "/articles/reviews/gobliins2/"
},
{
"author": {
"name": "Wouter Groeneveld",
"picture": "https://brainbaking.com/img/avatar.jpg"
},
"name": "The Internet Killed Secrets in Games",
"content": "What's the 'secret' of the secret cow level in Diablo II?",
"published": "2020-11-19",
"type": "mention",
"url": "https://brainbaking.com/post/2020/11/the-internet-killed-secrets-in-games/",
"source": "https://brainbaking.com/post/2020/11/the-internet-killed-secrets-in-games/",
"target": "https://jefklakscodex.com/articles/reviews/sacred/",
"publishedFromNow": "4 months ago",
"relativeTarget": "/articles/reviews/sacred/"
},
{
"author": {
"name": "Wouter Groeneveld",
"picture": "https://brainbaking.com/img/avatar.jpg"
},
"name": "Building an Athlon Windows 98 Retro PC",
"content": "Gaming from Quake to Quake III: Arena!",
"published": "2020-10-17",
"type": "mention",
"url": "https://brainbaking.com/post/2020/10/building-an-athlon-win98-retro-pc/",
"source": "https://brainbaking.com/post/2020/10/building-an-athlon-win98-retro-pc/",
"target": "https://jefklakscodex.com/tags/wizardry8/",
"publishedFromNow": "5 months ago",
"relativeTarget": "/tags/wizardry8/"
},
{
"author": {
"name": "Wouter Groeneveld",
"picture": "https://brainbaking.com/img/avatar.jpg"
},
"name": "A journey through the history of webdesign",
"content": "Using personal websites and the Internet Archive",
"published": "2020-10-04",
"type": "mention",
"url": "https://brainbaking.com/post/2020/10/a-personal-journey-through-the-history-of-webdesign/",
"source": "https://brainbaking.com/post/2020/10/a-personal-journey-through-the-history-of-webdesign/",
"target": "https://jefklakscodex.com/tags/baldurs-gate-2/",
"publishedFromNow": "6 months ago",
"relativeTarget": "/tags/baldurs-gate-2/"
}
]

View File

@ -1,5 +1,5 @@
const { howlongtobeat } = require('jam-my-stack');
const { howlongtobeat, webmention } = require('jam-my-stack');
const fsp = require('fs').promises;
@ -7,5 +7,15 @@ const fsp = require('fs').promises;
console.log("1. adding Howlongtobeat info...")
await howlongtobeat.howlong(`${__dirname}/content/articles`)
// 4. get webmentions
console.log("2. Fetching webmentions...")
const mentions = await webmention.getWebmentions("jefklakscodex.com")
const json = JSON.stringify(mentions, null, 4)
await fsp.writeFile(`${__dirname}/data/webmentions.json`, json, 'utf-8')
// 5. send webmentions
console.log("3. Sending webmentions...")
await webmention.send("jefklakscodex.com", `${__dirname}/data/webmentions-since.json`)
console.log("-- all done!")
})()

View File

@ -20,6 +20,6 @@
},
"homepage": "https://jefklakscodex.com",
"dependencies": {
"jam-my-stack": "^1.0.4"
"jam-my-stack": "^1.0.13"
}
}

View File

@ -0,0 +1,40 @@
.toot
background: scale-color($bglight, $lightness: +40%)
border: 1px solid #cccccc
padding: 0.5em
border-radius: 5px
box-shadow: rgba(100, 100, 111, 0.2) 0px 7px 29px 0px
&:hover
border-color: var(--accent)
box-shadow: rgba(100, 100, 111, 0.2) 5px 17px 29px 5px
.notes
.u-photo
border-radius: 50%
margin-top: 0
.u-comment .avatar
margin-top: -55px
img
width: 60px
height: 60px
.tootlist
h1, h2, h3
text-align: left
h3
margin-left: 3rem
.toot
cursor: pointer
margin-bottom: 3rem !important
margin-top: 2rem !important
.meta
border-top: 1px solid #eeeeee
padding-top: 0.5rem

View File

@ -1,3 +1,6 @@
// can't mix both, but want to "lighten" this one dynamically
$bglight: #f1f4dd
html
--accent: #a6a57c
--bglight: #f1f4dd

View File

@ -2,3 +2,4 @@
@import 'fonts'
@import 'codex'
@import 'sidebar'
@import 'toot'

View File

@ -1,3 +1,4 @@
{{- $allowedRssSections := (slice "articles") -}}
{{- $baseurl := .Site.BaseURL -}}
{{- $pctx := . -}}
{{- if .IsHome -}}{{ $pctx = .Site }}{{- end -}}
@ -27,6 +28,7 @@
{{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
{{ end }}
{{ range $pages }}
{{ if in $allowedRssSections .Section }}
<item>
<title>{{ .Title }}</title>
<link>{{ .Permalink }}</link>
@ -65,5 +67,6 @@
</description>
</item>
{{ end }}
{{ end }}
</channel>
</rss>

View File

@ -45,13 +45,15 @@
<div class="categories">
Categorized under:
{{ range .Params.tags }}
<a class="u-url p-category" href="{{ $.Site.BaseURL }}tags/{{ . | urlize }}"><kbd class="item-tag">{{ . }}</kbd></a>
<a class="p-category" href="{{ $.Site.BaseURL }}tags/{{ . | urlize }}"><kbd class="item-tag">{{ . }}</kbd></a>
{{ end }}
{{ end }}
</div>
{{ partial "single-comments" . }}
{{ partial "single-mentions" . }}
<hr/>
</article>
</div>

View File

@ -1,6 +1,6 @@
{{ if (not .Params.disableComments) }}
<hr/>
<h3 class="page-header"><i class="fa fa-comments-o"></i>&nbsp;
<h3 class="page-header">
Bio and Support
</h3>

View File

@ -0,0 +1,44 @@
{{ if (not .Params.disableComments) }}
<hr/>
{{ $mentions := (where .Site.Data.webmentions "relativeTarget" "==" $.RelPermalink) }}
{{ if $mentions }}
<h3 class="page-header" id="mentions">
<a href="#mentions">
<i class="fa fa-comments-o"></i>
</a>&nbsp;
Mentions and Replies
</h3>
<div class="tootlist" style="margin-bottom: -3rem">
{{ range $mentions }}
<article class="u-comment h-cite toot">
<p class="p-content p-name">
{{ .name | safeHTML }}: {{ .content | safeHTML }}
</p>
<div class="meta">
<i class="fa fa-calendar"></i>&nbsp;
<time class="dt-published" datetime="{{ .published }}">
{{ .publishedFromNow }}
</time>
&nbsp;|&nbsp;by&nbsp;
<a rel="author" class="u-author h-card u-url permalink" href="{{ .source }}">
{{ $name := .author.name | safeHTML }}
{{ if isset .author "picture" }}
<div class="avatar">
<img class="u-photo" loading="lazy" src="{{ .author.picture | safeHTML }}" alt="{{ $name }}" />
</div>
{{ else }}
<div class="avatar">
<img class="u-photo" loading="lazy" src="/img/avatar-anonymous.jpg" alt="{{ $name }} anonymous photo" />
</div>
{{ end }}
{{ $name }}
</a>
</div>
</article>
{{ end }}
</div>
<br/>
{{ end }}
{{ end }}

View File

@ -101,6 +101,17 @@ $(function() {
$('.sidebar').mouseenter(animate).mouseleave(inanimate);
};
(function makeTootClickable() {
[...document.querySelectorAll('.toot')].forEach(toot => {
toot.addEventListener('click', function() {
const permalink = this.querySelector('.permalink')?.href
if(permalink) {
window.location.href = permalink
}
})
})
})();
animateActiveGameImagesIfFound();
setSideBarPlatformHeight();
addRandomImageToSideBarMenus();

160
yarn.lock
View File

@ -77,6 +77,15 @@ __metadata:
languageName: node
linkType: hard
"ansi-styles@npm:^3.2.1":
version: 3.2.1
resolution: "ansi-styles@npm:3.2.1"
dependencies:
color-convert: ^1.9.0
checksum: 456e1c23d9277512a47718da75e7fbb0a5ee215ef893c2f76d6b3efe8fceabc861121b80b0362146f5f995d21a1633f05a19bbf6283ae66ac11dc3b9c0bed779
languageName: node
linkType: hard
"argparse@npm:^1.0.7":
version: 1.0.10
resolution: "argparse@npm:1.0.10"
@ -102,6 +111,13 @@ __metadata:
languageName: node
linkType: hard
"async@npm:0.9.x":
version: 0.9.2
resolution: "async@npm:0.9.2"
checksum: 78c0aad8add0b84ccf9bde90d20a9cd20146e3734a4c9ac9bfb3a30d1b7df12b7d95c13119af825a89480210c02f7ffee38ac07c13ac43abd6636691b982b591
languageName: node
linkType: hard
"asynckit@npm:^0.4.0":
version: 0.4.0
resolution: "asynckit@npm:0.4.0"
@ -123,6 +139,13 @@ __metadata:
languageName: node
linkType: hard
"balanced-match@npm:^1.0.0":
version: 1.0.0
resolution: "balanced-match@npm:1.0.0"
checksum: f515a605fe1b59f476f7477c5e1d53ad55b4f42982fca1d57b6701906f4ad1f1ac90fd6587d92cc1af2edb43eecf979214dd847ee410a6de9db4ebf0dd128d62
languageName: node
linkType: hard
"bcrypt-pbkdf@npm:^1.0.0":
version: 1.0.2
resolution: "bcrypt-pbkdf@npm:1.0.2"
@ -139,6 +162,16 @@ __metadata:
languageName: node
linkType: hard
"brace-expansion@npm:^1.1.7":
version: 1.1.11
resolution: "brace-expansion@npm:1.1.11"
dependencies:
balanced-match: ^1.0.0
concat-map: 0.0.1
checksum: 4c878e25e4858baf801945dfd63eb68feab2e502cf1122f25f3915c0e3bf397af3a93ff6bef0798db41c0d81ef28c08e55daac38058710f749a3b96eee6b8f40
languageName: node
linkType: hard
"cacheable-lookup@npm:^5.0.3":
version: 5.0.4
resolution: "cacheable-lookup@npm:5.0.4"
@ -168,6 +201,17 @@ __metadata:
languageName: node
linkType: hard
"chalk@npm:^2.4.2":
version: 2.4.2
resolution: "chalk@npm:2.4.2"
dependencies:
ansi-styles: ^3.2.1
escape-string-regexp: ^1.0.5
supports-color: ^5.3.0
checksum: 22c7b7b5bc761c882bb6516454a1a671923f1c53ff972860065aa0b28a195f230163c1d46ee88bcc7a03e5539177d896457d8bc727de7f244c6e87032743038e
languageName: node
linkType: hard
"cheerio-select-tmp@npm:^0.1.0":
version: 0.1.1
resolution: "cheerio-select-tmp@npm:0.1.1"
@ -205,6 +249,22 @@ __metadata:
languageName: node
linkType: hard
"color-convert@npm:^1.9.0":
version: 1.9.3
resolution: "color-convert@npm:1.9.3"
dependencies:
color-name: 1.1.3
checksum: 5f244daa3d1fe1f216d48878c550465067d15268688308554e613b7640a068f96588096d51f0b98b68f15d6ff6bb8ad24e172582ac8c0ad43fa4d3da60fd1b79
languageName: node
linkType: hard
"color-name@npm:1.1.3":
version: 1.1.3
resolution: "color-name@npm:1.1.3"
checksum: d8b91bb90aefc05b6ff568cf8889566dcc6269824df6f3c9b8ca842b18d7f4d089c07dc166808d33f22092d4a79167aa56a96a5ff0d21efab548bf44614db43b
languageName: node
linkType: hard
"combined-stream@npm:^1.0.6, combined-stream@npm:~1.0.6":
version: 1.0.8
resolution: "combined-stream@npm:1.0.8"
@ -214,6 +274,13 @@ __metadata:
languageName: node
linkType: hard
"concat-map@npm:0.0.1":
version: 0.0.1
resolution: "concat-map@npm:0.0.1"
checksum: 554e28d9ee5aa6e061795473ee092cb3d3a2cbdb76c35416e0bb6e03f136d7d07676da387b2ed0ec4106cedbb6534080d9abc48ecc4a92b76406cf2d0c3c0c4b
languageName: node
linkType: hard
"core-util-is@npm:1.0.2":
version: 1.0.2
resolution: "core-util-is@npm:1.0.2"
@ -250,6 +317,13 @@ __metadata:
languageName: node
linkType: hard
"dayjs@npm:^1.10.4":
version: 1.10.4
resolution: "dayjs@npm:1.10.4"
checksum: 3b7bb2232fff808209870bc72d4b2000941a1aa45f0226e2907f9dd1dda306d4b3a1eb9058450fd2c324b01a007a37809ac6f9b525806a86902c55e2934cd5d5
languageName: node
linkType: hard
"decompress-response@npm:^6.0.0":
version: 6.0.0
resolution: "decompress-response@npm:6.0.0"
@ -348,6 +422,17 @@ __metadata:
languageName: node
linkType: hard
"ejs@npm:^3.1.6":
version: 3.1.6
resolution: "ejs@npm:3.1.6"
dependencies:
jake: ^10.6.1
bin:
ejs: ./bin/cli.js
checksum: cb77a9368e50c7b11cb8d64c911397a7bf8f9f6d155474bc64154fd1d0ccf896de28a01d5e6ce135470ede038ca7dc02a83b8c0a904277eaef605cce4ab46dfb
languageName: node
linkType: hard
"end-of-stream@npm:^1.1.0":
version: 1.4.4
resolution: "end-of-stream@npm:1.4.4"
@ -378,6 +463,13 @@ __metadata:
languageName: node
linkType: hard
"escape-string-regexp@npm:^1.0.5":
version: 1.0.5
resolution: "escape-string-regexp@npm:1.0.5"
checksum: f9484b8b4c8827d816e0fd905c25ed4b561376a9c220e1430403ea84619bf680c76a883a48cff8b8e091daf55d6a497e37479f9787b9f15f3c421b6054289744
languageName: node
linkType: hard
"esprima@npm:^4.0.0":
version: 4.0.1
resolution: "esprima@npm:4.0.1"
@ -458,6 +550,15 @@ __metadata:
languageName: node
linkType: hard
"filelist@npm:^1.0.1":
version: 1.0.2
resolution: "filelist@npm:1.0.2"
dependencies:
minimatch: ^3.0.4
checksum: f8bf29d31779dd04ee9e5d225e5a669920d5443f40b38fb5ecc8442ac29848a6f8bc3c937cb8ba78f5ae0d819dad52f4750d23c4dd1b2a51370aa67027d95c0c
languageName: node
linkType: hard
"for-in@npm:^1.0.2":
version: 1.0.2
resolution: "for-in@npm:1.0.2"
@ -549,6 +650,13 @@ __metadata:
languageName: node
linkType: hard
"has-flag@npm:^3.0.0":
version: 3.0.0
resolution: "has-flag@npm:3.0.0"
checksum: 63aade480d27aeedb3b5b63a2e069d47d0006bf182338d662e7941cdc024e68a28418e0efa8dc5df30db9c4ee2407f39e6ea3f16cfbc6b83848b450826a28aa0
languageName: node
linkType: hard
"howlongtobeat@npm:^1.3.1":
version: 1.3.1
resolution: "howlongtobeat@npm:1.3.1"
@ -670,18 +778,33 @@ __metadata:
languageName: node
linkType: hard
"jam-my-stack@npm:^1.0.4":
version: 1.0.4
resolution: "jam-my-stack@npm:1.0.4"
"jake@npm:^10.6.1":
version: 10.8.2
resolution: "jake@npm:10.8.2"
dependencies:
async: 0.9.x
chalk: ^2.4.2
filelist: ^1.0.1
minimatch: ^3.0.4
bin:
jake: ./bin/cli.js
checksum: c60d3f491ce59bba09b8a2ee351122eb6dd19a6826347de5ec4e94ddee5c5e70e14120c14ce6fc2efa360d0db12d7a28a1044d7aa084414dd695ce154fb87d9e
languageName: node
linkType: hard
"jam-my-stack@npm:^1.0.13":
version: 1.0.13
resolution: "jam-my-stack@npm:1.0.13"
dependencies:
dayjs: ^1.10.4
ejs: ^3.1.6
ent: ^2.2.0
fast-xml-parser: ^3.18.0
got: ^11.8.2
howlongtobeat: ^1.3.1
lunr: ^2.3.9
moment: ^2.29.1
parser-front-matter: ^1.6.4
checksum: 9962c87f145ff83aa85b11e9b0072c0f6541049039783bd4e3a363e86083430e25a6acf027a61579a05375db10beafd2f1cb27eef47bbaa4d7b504b24dd5901f
checksum: 27a2e3f004672b243a756ecc3bcfb358f942629be9a13614350ca6a9e6e4fcafba76174c84643305d60d5df02392dac348d4e958b1b7a27c642530e76917949b
languageName: node
linkType: hard
@ -689,7 +812,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "jefklakscodex@workspace:."
dependencies:
jam-my-stack: ^1.0.4
jam-my-stack: ^1.0.13
languageName: unknown
linkType: soft
@ -837,6 +960,15 @@ __metadata:
languageName: node
linkType: hard
"minimatch@npm:^3.0.4":
version: 3.0.4
resolution: "minimatch@npm:3.0.4"
dependencies:
brace-expansion: ^1.1.7
checksum: 47eab9263962cacd5733e274ecad2d8e54b0f8e124ba35ae69189e296058f634a4967b87a98954f86fa5c830ff177caf827ce0136d28717ed3232951fb4fae62
languageName: node
linkType: hard
"mixin-deep@npm:^1.2.0":
version: 1.3.2
resolution: "mixin-deep@npm:1.3.2"
@ -847,13 +979,6 @@ __metadata:
languageName: node
linkType: hard
"moment@npm:^2.29.1":
version: 2.29.1
resolution: "moment@npm:2.29.1"
checksum: 86729013febf7160de5b93da69273dd304d674b0224f9544b3abd09a87671ddd2cdd57598261ce57588910d63747ffd5590965e83c790d8bf327083c0e0a06e0
languageName: node
linkType: hard
"normalize-url@npm:^4.1.0":
version: 4.5.0
resolution: "normalize-url@npm:4.5.0"
@ -1071,6 +1196,15 @@ __metadata:
languageName: node
linkType: hard
"supports-color@npm:^5.3.0":
version: 5.5.0
resolution: "supports-color@npm:5.5.0"
dependencies:
has-flag: ^3.0.0
checksum: edacee6425498440744c418be94b0660181aad2a1828bcf2be85c42bd385da2fd8b2b358d9b62b0c5b03ff5cd3e992458d7b8f879d9fb42f2201fe05a4848a29
languageName: node
linkType: hard
"to-object-path@npm:^0.3.0":
version: 0.3.0
resolution: "to-object-path@npm:0.3.0"