Adding new module

This commit is contained in:
fundor333
2024-07-25 22:48:56 +02:00
parent 52e414d335
commit 4933bcb299
80 changed files with 43 additions and 287 deletions

View File

@@ -1,7 +1,7 @@
DefaultContentLanguage: en
baseURL: "https://fundor333.com"
languageCode: en
theme: fugu
theme: ["github.com/fundor333/macia-webmention", "fugu"]
title: Fundor 333
author:
name: Fundor 333

View File

@@ -7,3 +7,11 @@ logo: /img/logo.jpg
hostName: "https://fundor333.com"
copyright: Fundor333
ShowFullTextinRSS: false
webmention:
webmention: "https://webmention.io/fundor333.com/webmention"
pingback: "https://webmention.io/fundor333.com/xmlrpc"
micropub: "https://appletune.fundor333.com/micropub"
microsub: "https://aperture.p3k.io/microsub/699"
authorization_endpoint: "https://indieauth.com/auth"
token_endpoint: "https://tokens.indieauth.com/token"

5
go.mod Normal file
View File

@@ -0,0 +1,5 @@
module github.com/fundor333/fundor333.github.io
go 1.22.5
require github.com/fundor333/macia-webmention v0.0.0-20240725204131-1193320b19e5 // indirect

10
go.sum Normal file
View File

@@ -0,0 +1,10 @@
github.com/fundor333/macia-webmention v0.0.0-20240725202417-69f3c4586b26 h1:aV2wtABOlWPzS9F5Q6o3MWbMKHVFRO0HCoZMqne5Jus=
github.com/fundor333/macia-webmention v0.0.0-20240725202417-69f3c4586b26/go.mod h1:a52OEN3AjE6bu2d8wov8c7xIhDTsp3PC7H70f+5Xb8c=
github.com/fundor333/macia-webmention v0.0.0-20240725203136-acd9ddafa51d h1:M0yM2psjhVY6p+z3s+ST0TWP9tR5nwRLVBYpLbteDXc=
github.com/fundor333/macia-webmention v0.0.0-20240725203136-acd9ddafa51d/go.mod h1:a52OEN3AjE6bu2d8wov8c7xIhDTsp3PC7H70f+5Xb8c=
github.com/fundor333/macia-webmention v0.0.0-20240725203400-990320f8dd56 h1:F6YUoZtT7bU+f2YZKyxf8xg2hsG7brbjQsrEZ6m+su0=
github.com/fundor333/macia-webmention v0.0.0-20240725203400-990320f8dd56/go.mod h1:a52OEN3AjE6bu2d8wov8c7xIhDTsp3PC7H70f+5Xb8c=
github.com/fundor333/macia-webmention v0.0.0-20240725203647-94709b2283ee h1:tNRs/zS5bSJnBXjq1vqiWPxbxw3CHA5Z8jxhQI9raJE=
github.com/fundor333/macia-webmention v0.0.0-20240725203647-94709b2283ee/go.mod h1:a52OEN3AjE6bu2d8wov8c7xIhDTsp3PC7H70f+5Xb8c=
github.com/fundor333/macia-webmention v0.0.0-20240725204131-1193320b19e5 h1:jDyO9aCnKpkKLyOnoujiqaettjeur4z/vuRqrL6sJUs=
github.com/fundor333/macia-webmention v0.0.0-20240725204131-1193320b19e5/go.mod h1:a52OEN3AjE6bu2d8wov8c7xIhDTsp3PC7H70f+5Xb8c=

View File

@@ -4,27 +4,32 @@ help: ## Show this help
install: ## Intall
@npm install
@hugo mod get -u
send_webmention: ## Send webmention from feed
@pushl -c $HOME/.config/pushl-cache https://fundor333.com/index.xml
develop: ## Run the site localy
hugo server --minify --disableFastRender
@hugo server --minify --disableFastRender
developfuture: ## Run the site localy with all the future article
hugo server --minify --disableFastRender --buildFuture
@hugo server --minify --disableFastRender --buildFuture
developall: ## Run the site localy with all the article, future or drafts
hugo server --minify --disableFastRender --buildFuture --buildDrafts
@hugo server --minify --disableFastRender --buildFuture --buildDrafts
.PHONY: gomodule
gomodule: ## Update Go Module
@hugo mod get -u
.PHONY: syntax
syntax: ## Build the style of the code
hugo gen chromastyles --style=dracula > themes/fugu/assets/css/_syntax.scss
@hugo gen chromastyles --style=dracula > themes/fugu/assets/css/_syntax.scss
cache: ## Clean the cache
hugo --gc
@hugo --gc
clean: cache syntax ## Clean the directory of the project of chache e meta file and other things
clean: cache gomodule syntax ## Clean the directory of the project of chache e meta file and other things
.PHONY: run
run: clean ## Build the site cleaning all
@@ -39,8 +44,10 @@ characters: ## Sorting characters
deploy: clean characters ## Ready to deploy
@npm update
@hugo mod get -u
@hugo --minify
brodcast: clean ## Brodcast the site
@hugo mod get -u
@hugo server --disableFastRender --buildFuture --buildDrafts -bind=0.0.0.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 321 KiB

After

Width:  |  Height:  |  Size: 269 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 545 KiB

After

Width:  |  Height:  |  Size: 492 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 530 KiB

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 324 KiB

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 KiB

After

Width:  |  Height:  |  Size: 646 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 KiB

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 281 KiB

After

Width:  |  Height:  |  Size: 433 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 KiB

After

Width:  |  Height:  |  Size: 616 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 764 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 433 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 616 KiB

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 591 KiB

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 329 KiB

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 530 KiB

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 MiB

After

Width:  |  Height:  |  Size: 567 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 390 KiB

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 983 KiB

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 492 KiB

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 248 KiB

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 764 KiB

After

Width:  |  Height:  |  Size: 279 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 KiB

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 545 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 269 KiB

After

Width:  |  Height:  |  Size: 329 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 285 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 KiB

After

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 KiB

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 300 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 KiB

After

Width:  |  Height:  |  Size: 530 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 567 KiB

After

Width:  |  Height:  |  Size: 459 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 KiB

After

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 520 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 530 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 KiB

After

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 591 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 646 KiB

After

Width:  |  Height:  |  Size: 390 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 520 KiB

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

After

Width:  |  Height:  |  Size: 983 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 KiB

After

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 KiB

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 214 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 KiB

After

Width:  |  Height:  |  Size: 313 KiB

View File

@@ -1,102 +0,0 @@
{{ $data := getJSON "https://appletune.fundor333.com/api/commenti/" .Params.slug }}
{{ range $index, $element := $data }}
<div class="card mb-3" style="max-width: 540px;">
<div class="row g-0 align-items-center">
<div class="col-md-4 align-middle">
<img src="https://icotar.com/avatar/{{$element.name}}" height="40" width="40" class="img-fluid rounded-start"
alt="{{$element.name}}">
</div>
<div class="col-md-8">
<div class="card-body">
<h5 class="card-title">{{$element.name}}</h5>
<p class="card-text">{{$element.text}}</p>
<p class="card-text"> {{$element.added}} </p>
{{ if $element.website }}
<a href="{{ $element.website }}" class="card-link"><i class="fa-duotone theme-fundor333 fa-link"></i></a>
{{ end }}
{{ if $element.twitter_account }}
<a href="https://twitter.com/{{ $element.twitter_account }}" class="card-link"><i
class="fab fa-twitter"></i></a>
{{ end }}
{{ if $element.github_account }}
<a href="https://github.com/{{ $element.github_account }}" class="card-link"><i class="fab fa-github"></i></a>
{{ end }}
</div>
</div>
</div>
</div>
{{end}}
<form id="commenti-form">
<input type="hidden" id="id_post_url" name="post_url" value="{{ .Params.slug }}">
<div class="form-group">
<label>Name/Alias</label>
<input class="form-control" name="name" id="id_name" placeholder="Name/Alias" required>
</div>
<div class="form-group">
<label>Comment</label>
<textarea class="form-control" name="text" id="id_text" rows="5" required></textarea>
</div>
<br>
<div class="form-group">
<label>WebSite (Optional)</label>
<input class="form-control" name="website" id="id_website" placeholder="My magical comment">
</div>
<div class="form-group">
<label>Twitter (Optional)</label>
<input class="form-control" name="twitter_account" id="id_twitter_account" placeholder="my-twitter-alias">
</div>
<div class="form-group">
<label>Github (Optional)</label>
<input class="form-control" name="github_account" id="id_github_account" placeholder="my-github-alias">
</div>
<button type="submit" class="btn block m-2 d-md-inline-block">Submit</button>
</form>
<script src="https://www.gstatic.com/firebasejs/8.9.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.9.1/firebase-database.js"></script>
<script>
// Your web app's Firebase configuration
// For Firebase JS SDK v7.20.0 and later, measurementId is optional
const config = {
apiKey: "AIzaSyDNuz8jJaiUyA5TkBsZ83Qoy7qSyf_EQ_c",
authDomain: "fundor333-77b0c.firebaseapp.com",
databaseURL: "https://fundor333-77b0c-default-rtdb.europe-west1.firebasedatabase.app",
projectId: "fundor333-77b0c",
storageBucket: "fundor333-77b0c.appspot.com",
messagingSenderId: "250188864128"
};
document.forms['commenti-form'].addEventListener('submit', (event) => {
event.preventDefault();
if (!firebase.apps.length) {
firebase.initializeApp(config);
}
var myRef = firebase.database().ref("commenti").push().set({
post_url: $("#id_post_url").val(),
name: $("#id_name").val(),
text: $("#id_text").val(),
website: $("#id_website").val(),
twitter_account: $("#id_twitter_account").val(),
github_account: $("#id_github_account").val(),
});
//window.location.href = '{{ .Permalink }}?comment=yes';
document.getElementById("commenti-form").reset();
return alert('Thanks for the comment');
});
</script>

View File

@@ -1,166 +0,0 @@
<style>
#consent-notice {padding: 1rem 1rem; display: none; text-align: center; position: fixed; bottom: 0; width: calc(100% - 2rem); background: #222; color: rgba(255,255,255,0.8);}
#consent-notice span {margin-right: 1rem;}
#consent-notice button {cursor: pointer; display: inline-block; width: auto;}
#consent-notice span a {color: inherit; text-decoration: underline; text-decoration-color: rgba(255,255,255,0.5);}
#consent-notice button.btn {margin-left: 0.5rem;}
#consent-notice button.btn.manage-consent {background: rgba(255,255,255,0.1); font-weight: normal;}
#consent-overlay {position: fixed; left: 0; top: 0; width: 100%; height: 100vh; display: none; background: rgba(0,0,0,0.75); z-index: 999999; overflow: auto; cursor: pointer;}
#consent-overlay.active {display: flex;}
#consent-overlay > div {background: white; width: 100%; max-width: 30rem; padding: 1.75rem; margin: auto; cursor: initial;}
#consent-overlay > div > div {display: flex; align-items: flex-start; margin-bottom: 1rem;}
#consent-overlay > div > div:last-child {margin: 0;}
#consent-overlay h3 {padding-top: 0;}
#consent-overlay input {margin-top: 0.3rem;}
#consent-overlay label {display: block;}
#consent-overlay .btn {margin-right: 0.5rem;}
#consent-overlay button.btn.save-consent {background: rgba(0,0,0,0.6); font-weight: normal;}
@media (max-width: 767px) {
#consent-overlay > div {padding: 1.75rem 1rem;}
#consent-notice span {display: block; padding-top: 3px; margin-bottom: 1.5rem;}
#consent-notice button.btn {position: relative; bottom: 4px;}
}
</style>
<div id="consent-notice"><span>We would like to use <a class="manage-consent" href="#manage-consent">third party code</a> to improve the functionality of this website.</span><button class="btn manage-consent">Manage preferences</button><button class="btn deny-consent">Deny</button><button class="btn approve-consent">Allow</button></div>
<div id="consent-overlay">
<div>
{{ range $index, $item := .Site.Data.consent.items }}
<div>
<input type="checkbox" id="item{{ $index }}" value="1" name="item{{ $index }}" {{ if $item.is_functional }}checked disabled{{ end }} />
<label for="item{{ $index }}">
<h3>{{ $item.title }}</h3>
<p>{{ $item.description }}</p>
</label>
</div>
{{ end }}
<div>
<button id="save-consent" class="btn save-consent" data-consentvalue="{{ range $index, $item := .Site.Data.consent.items }}{{ if $item.is_functional}}{{ else }}0{{ end }}{{ end }}">Save preferences</button>
<button class="btn approve-consent">Allow all</button>
</div>
</div>
</div>
<script>
const scripts = [];{{ range $index, $item := (where .Site.Data.consent.items "is_functional" false) }}
scripts[{{ $index }}] = "/js/{{ $item.script_file }}";{{ end }}
function createCookie(name,value,days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days*24*60*60*1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + value + expires + "; path=/";
}
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
function eraseCookie(name) {
createCookie(name,"",-1);
}
function denyAllConsentScripts() {
var consentValue = "";
scripts.forEach(function(){
consentValue = consentValue + "0";
});
acceptSomeConsentScripts(consentValue);
}
function acceptAllConsentScripts() {
var consentValue = "";
scripts.forEach(function(){
consentValue = consentValue + "1";
});
acceptSomeConsentScripts(consentValue);
}
function acceptSomeConsentScripts(consentValue) {
setConsentInputs(consentValue);
createCookie('consent-settings',consentValue,31);
document.getElementById('consent-notice').style.display = 'none';
document.getElementById('consent-overlay').classList.remove('active');
loadConsentScripts(consentValue);
}
function loadConsentScripts(consentValue) {
scripts.forEach(function(value,key){
//console.log('script'+key+' is set to ' +consentValue[key]+' and is file '+value);
if(consentValue[key]=="1") {
var s = document.createElement('script');
s.type = 'text/javascript';
s.src = value;
document.body.appendChild(s);
}
});
}
function setConsentInputs(consentValue) {
var elements = document.querySelectorAll('#consent-overlay input:not([disabled])');
elements.forEach(function(el,index) {
if(consentValue[index]=="1") el.checked = true;
else el.checked = false;
});
}
function setConsentValue() {
var elements = document.querySelectorAll('#consent-overlay input:not([disabled])');
var consentValue = "";
elements.forEach(function(el) {
if(el.checked) consentValue = consentValue + "1";
else consentValue = consentValue + "0";
});
document.getElementById("save-consent").dataset.consentvalue = consentValue;
}
var elements = document.querySelectorAll('#consent-overlay input:not([disabled])');
elements.forEach(function(el) {
el.checked = false;
});
if(readCookie('consent-settings')) {
var consentValue = readCookie('consent-settings').toString();
console.log(consentValue);
setConsentInputs(consentValue);
loadConsentScripts(consentValue);
} else {
document.getElementById('consent-notice').style.display = 'block';
}
var elements = document.querySelectorAll('.manage-consent');
elements.forEach(function(el) {
el.addEventListener("click",function() {
document.getElementById('consent-overlay').classList.toggle('active');
});
});
var elements = document.querySelectorAll('.deny-consent');
elements.forEach(function(el) {
el.addEventListener("click",function() {
denyAllConsentScripts();
});
});
var elements = document.querySelectorAll('.approve-consent');
elements.forEach(function(el) {
el.addEventListener("click",function() {
acceptAllConsentScripts();
});
});
document.getElementById("save-consent").addEventListener("click",function() {
setConsentValue();
acceptSomeConsentScripts(this.dataset.consentvalue);
});
document.getElementById("consent-overlay").addEventListener("click",function(e) {
if (!document.querySelector("#consent-overlay > div").contains(e.target)){
this.classList.toggle('active');
}
});
</script>
{{ range $index, $item := .Site.Data.consent.items }}
{{ if $item.is_functional }}
<script type="text/javascript" src="/js/{{ $item.script_file }}"></script>
{{ end }}
{{ end }}

View File

@@ -23,9 +23,9 @@
{{ end }} {{ end }}
<link rel="alternate" type="application/rss+xml" href="https://fundor333.com/post/index.xml" title="Fundor333's Posts" />
<link rel="alternate" type="application/rss+xml" href="https://fundor333.com/index.xml" title="Fundor333's all stuffs from the blog" />
{{ with .OutputFormats.Get "rss" -}}
{{ printf `<link rel=%q type=%q href=%q title=%q>` .Rel .MediaType.Type .Permalink site.Title | safeHTML }}
{{ end }}
{{ if .Site.Params.gtm_id}}{{- partial "gtm.html" . }}{{ end }}
@@ -37,14 +37,8 @@
<enclosure url="{{ $featured.Permalink }}" type="image/jpg"></enclosure>
{{- end -}}
{{ partial "macia-webmention/webmention.html" . }}
<link rel="webmention" href="https://webmention.io/fundor333.com/webmention" />
<link rel="pingback" href="https://webmention.io/fundor333.com/xmlrpc" />
<link rel="micropub" href="https://appletune.fundor333.com/micropub">
<link rel="microsub" href="https://aperture.p3k.io/microsub/699">
<link rel="authorization_endpoint" href="https://indieauth.com/auth">
<link rel="token_endpoint" href="https://tokens.indieauth.com/token">
<script src="https://code.jquery.com/jquery-3.6.1.min.js" integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>
<script src="https://kit.fontawesome.com/2f3b6e2e4c.js" crossorigin="anonymous" async></script>
<script src="https://code.jquery.com/jquery-3.6.1.min.js" integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>
<script src="https://kit.fontawesome.com/2f3b6e2e4c.js" crossorigin="anonymous" async></script>