use logical css and add jsonld explainer

This commit is contained in:
a 2022-12-11 10:29:21 -06:00
parent b10ab5b93d
commit 8655202e36
15 changed files with 453 additions and 67 deletions

View file

@ -1,6 +1,6 @@
.content {
/* text */
p, li {max-width: 80ch;}
p, li {max-inline-size: 80ch;}
h1 {font-size: 1.8em}
h2 {font-size: 1.6em}
h3 {font-size: 1.423em}
@ -9,13 +9,13 @@
h6 {font-size: 1em}
h1, h2, h3, h4, h5, h6 {
line-height: 1.2;
margin-bottom: 1rem;
margin-top: 2rem;
margin-block-start: 2rem;
margin-block-end: 1rem;
font-weight: 700;
}
p {
line-height: 2;
margin-bottom: 1em;
margin-block-end: 1em;
}
a {
word-wrap: break-word;
@ -28,7 +28,7 @@
sup {
position: relative;
font-size: var(--script-size);
top: -1em;
inset-block-start: -1em;
}
sub {
position: relative;
@ -61,8 +61,8 @@
background: var(--primary-accent-transparent);
color: var(--ui-text);
--pad-x-highlight: 0.125em;
padding-left: var(--pad-x-highlight);
padding-right: var(--pad-x-highlight);
padding-inline-start: var(--pad-x-highlight);
padding-inline-end: var(--pad-x-highlight);
}
abbr[title]:after {
content: '?';
@ -70,23 +70,23 @@
color: var(--ui-text-muted);
}
/* lists */
ul {list-style: disc; margin: 1em 0;}
li {margin-bottom: 1em; line-height: 1.4; margin-left: 1em;}
ol {list-style: decimal; margin: 1em 0;}
dl {margin: 1em 0; line-height: 1.4;}
ul {list-style: disc; margin-block: 1em;}
li {margin-block-end: 1em; line-height: 1.4; margin-inline-start: 1em;}
ol {list-style: decimal; margin-block: 1em;}
dl {margin-block: 1em; line-height: 1.4;}
dt {font-weight: 700;}
dd {margin-left: 1em;}
dd {margin-inline-start: 1em;}
/* block elements */
img {
width: 100%;
margin-bottom: 1em;
margin-block-end: 1em;
}
blockquote {
font-style: italic;
font-size: 1em;
margin: 1em 0;
border-left: 0.25rem solid var(--ui-text-bold);
padding-left: 0.75em;
border-inline-start: 0.25rem solid var(--ui-text-bold);
padding-inline-start: 0.75em;
line-height: 1.4;
}
pre {
@ -95,11 +95,11 @@
color: var(--ui-overlay-text);
padding: 1em;
line-height: 1.4;
overflow-x: auto;
overflow-inline: auto;
white-space: pre;
display: grid;
tab-size: 3;
margin-bottom: 1em;
margin-block-end: 1em;
}
code {
font-family: monospace;
@ -117,18 +117,18 @@
padding: 0;
}
pre code > span {
padding: 0 1em;
padding-inline: 1em;
}
.highlight pre {
padding: 1em 0;
padding-block: 1em;
}
/* figures */
figure {
margin-bottom: 1em;
margin-block-end: 1em;
}
figure img {
width: 100%;
margin-bottom: -0.125em;
margin-block-end: -0.125em;
}
figcaption {
background: #212121;
@ -158,17 +158,17 @@
.hint.info,
.hint.tip {
background: rgba(142, 226, 142, 0.2);
border-left: 4px solid rgb(142, 226, 142);
border-inline-start: 4px solid rgb(142, 226, 142);
}
.hint.warning {
background: rgba(218, 226, 142, 0.2);
border-left: 4px solid rgb(218, 226, 142);
border-inline-start: 4px solid rgb(218, 226, 142);
}
.hint.danger {
background: rgba(226, 142, 142, 0.2);
border-left: 4px solid rgb(226, 142, 142);
border-inline-start: 4px solid rgb(226, 142, 142);
}
/* hugo-specific citation footnote */
cite sup {
@ -200,8 +200,8 @@
&:after {
content: '';
width: 100%;
margin-left: 1rem;
border-bottom: 1px solid var(--ui-text-muted);
margin-inline-start: 1rem;
border-block-end: 1px solid var(--ui-text-muted);
}
}
}

View file

@ -2,8 +2,8 @@
display: flex;
flex-flow: row wrap;
li:not(:first-child) {
margin-left: 1.5rem;
margin-bottom: 1rem;
margin-inline-start: 1.5rem;
margin-block-end: 1rem;
}
li::marker {
content: "/ ";
@ -12,13 +12,13 @@
content: "";
}
li:first-child {
margin-left: 0;
margin-inline-start: 0;
}
font-family: monospace;
}
.breadcrumb-nav {
.title {
margin-bottom: 0.5em;
margin-block-end: 0.5em;
color: var(--ui-text-muted);
text-transform: uppercase;
font-weight: 900;

View file

@ -1,7 +1,7 @@
.site-footer {
display: flex;
align-items: center;
padding: 1em 0;
padding-block: 1em;
hr {display: none;}
@ -29,12 +29,12 @@
}
a[href='#top'] {
margin-left: auto;
margin-inline-start: auto;
}
.lastmod {
.edit-link {
margin-left: 1em;
margin-inline-start: 1em;
}
}

View file

@ -6,7 +6,7 @@
text-decoration: none;
}
.site-icon {
height: 2em;
block-size: 2em;
}
.site-title {
font-weight: 900;

View file

@ -1,5 +1,5 @@
.toc-title {
margin-bottom: 0.5em;
margin-block-end: 0.5em;
font-weight: 900;
text-transform: uppercase;
color: var(--ui-text-muted);
@ -15,7 +15,7 @@
}
li > ul { /* indent subheadings */
margin: 0;
margin-left: 1em;
margin-inline-start: 1em;
}
ol {
list-style: none;

View file

@ -1,20 +1,20 @@
h2.heading {
border-bottom: 1px solid var(--ui-text-muted);
padding-bottom: 1rem;
border-block-end: 1px solid var(--ui-text-muted);
padding-block-end: 1rem;
}
/* headings with no numbers */
article:not([autonumbering]) .heading {
position: relative;
margin-right: 2.5rem;
margin-inline-end: 2.5rem;
&__anchor-link {
display: inline-flex;
align-content: center;
margin-left: 0.25em;
margin-inline-start: 0.25em;
position: absolute;
right: -2.5rem;
top: 3px;
inset-inline-end: -2.5rem;
inset-block-start: 3px;
font-size: 1rem;
}
}
@ -43,7 +43,7 @@ article[autonumbering] {
h3:before,
h4:before
{
margin-right: 1em;
margin-inline-end: 1em;
font-family: monospace;
font-size: 1rem;
}

View file

@ -2,7 +2,7 @@
display: block;
font-size: 2em;
line-height: 1;
margin-bottom: 1em;
margin-block-end: 1em;
}
.search-results strong {
@ -14,21 +14,21 @@
#search-results {
display: flex;
flex-flow: column;
max-width: 80ch;
max-inline-size: 80ch;
}
#search-results li:not(:first-child) {
border-top: 1px solid var(--ui-text-muted);
border-block-start: 1px solid var(--ui-text-muted);
}
#search-results li {
padding: 1em 0;
padding-block: 1em;
}
.search-result-page-title {
font-size: 1.25em;
display: block;
margin-bottom: 1rem;
margin-block-end: 1rem;
}
.search-result-item p {
@ -39,7 +39,7 @@
display: flex;
justify-content: center;
align-items: center;
max-width: 100%;
max-inline-size: 100%;
}
#search-input {
@ -48,9 +48,9 @@
border-radius: 100rem;
border: 0;
padding: 0.5rem 1rem;
margin-right: 0.5rem;
margin-inline-end: 0.5rem;
flex-shrink: 1;
height: 2rem;
block-size: 2rem;
box-sizing: border-box;
}
@ -60,5 +60,5 @@
background: var(--primary-accent);
color: var(--primary-accent-text);
border-radius: 4px;
height: 2rem;
block-size: 2rem;
}

View file

@ -1,11 +1,11 @@
.subsections,
.subpages {
list-style: disc;
margin-top: 1em;
margin-bottom: 2em;
margin-block-start: 1em;
margin-block-end: 2em;
li {
margin-left: 1em;
margin-bottom: 1em;
margin-inline-start: 1em;
margin-block-end: 1em;
}
a {
@ -13,13 +13,13 @@
}
.section-title {
font-size: 2em;
border-bottom: 1px solid var(--ui-text-muted);
padding-bottom: 0.5em;
margin-bottom: 1em;
border-block-end: 1px solid var(--ui-text-muted);
padding-block-end: 0.5em;
margin-block-end: 1em;
}
.subsections-title,
.subpages-title {
margin-top: 1em;
margin-block-start: 1em;
font-weight: 500;
text-decoration: underline;
}

View file

@ -27,3 +27,16 @@ a:hover {
@media (prefers-reduced-motion) {
a:link {transition: none}
}
a:link[target=_blank] {
svg {
margin-inline-start: 0.35em;
margin-inline-end: 0.15em;
vertical-align: baseline;
font-size: 0.65em;
}
}
a:link[title] {
text-decoration-style: dotted;
}

View file

@ -2,12 +2,15 @@ baseURL = 'https://wiki.trwnh.com/'
languageCode = 'en-us'
title = 'wiki.trwnh.com'
[markup.goldmark.renderer]
unsafe = true
[frontmatter]
lastmod = ["lastmod", ":git", "date", "publishDate"]
[outputs]
home = ["HTML", "RSS", "JSON"]
page = ["HTML"]
home = ["HTML", "RSS", "JSON"]
page = ["HTML"]
[params]
use_titles_in_section_lists = false

View file

@ -1,5 +1,11 @@
# Gotchas
## @context
** DO NOT VALIDATE @CONTEXT IF YOU DO NOT UNDERSTAND JSON-LD **
you CANNOT check for the presence of `https://www.w3.org/ns/activitystreams` AT ALL -- the activitystreams context may be included within another context hosted elsewhere. just ignore this property entirely if you don't understand it
## id
### transient ids

View file

@ -0,0 +1,341 @@
+++
autonumbering = true
+++
# everything you need to know about JSON-LD as far as activitypub is concerned
{{<toc>}}
## IRIs
basically just URI+. the i stands for "internationalized"
## the playground
<https://json-ld.org/playground/> is a good way to get a better understanding of stuff
## json-ld keywords
there are [a lot](https://www.w3.org/TR/json-ld11/#syntax-tokens-and-keywords "no, seriously") but we only really care about @id and @context really
### @id
the identifier for a json-ld node. by "node" we mean like a node on a graph. typically this is an iri, and dereferencing the iri should give us that node.
### @context
basically a way to map shorthand names to a full iri.
#### namespacing
the benefit of the context definition is that we can namespace different json-ld terms based on which vocabulary they came from
the activitystreams namespace (or base iri, if you will) is `https://www.w3.org/ns/activitystreams#` because this is what all activitystreams vocab terms begin with
- consider the `actor` property, whose full iri is actually `https://www.w3.org/ns/activitystreams#actor`
- similarly, consider the `Public` collection, whose full iri is `https://www.w3.org/ns/activitystreams#Public`
- ...and so on
we can also map some arbitrary string to the base iri. the activitystreams context by default uses `as:` => `https://www.w3.org/ns/activitystreams#`. so instead of typing out the base iri every single time, we can instead type the *shorthand* prefix `as:`, or in other words, `as:actor` or `as:Public`
note once again the equivalencies:
- `actor` == `as:actor` == `https://www.w3.org/ns/activitystreams#actor`
- `Public` == `as:Public` == `https://www.w3.org/ns/activitystreams#Public`
- ...and so on
## the three ways to normalize you should be familiar with
let's do expansion, compaction, flattening of the following example document:
```json
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"Hashtag": "as:Hashtag",
"toot": "https://joinmastodon.org/ns#",
"Emoji": "toot:Emoji"
}
],
"id": "https://social.example/~alice/notes/1",
"type": "Note",
"content": "#HelloWorld :blobcatHug:",
"tag": [
{
"type": "Hashtag",
"name": "#HelloWorld",
"href": "https://social.example/tags/HelloWorld"
},
{
"type": "Emoji",
"name": "blobcatHug",
"icon": {
"type": "Image",
"mediaType": "image/png",
"url": "https://social.example/emojos/blobcatHug.png"
}
}
]
}
```
and let's assume we only understand the following context:
```json
{
"@context": "https://www.w3.org/ns/activitystreams"
}
```
### expansion
expansion works by taking the context and expanding every single term to its full iri form, and every single value into an array of objects with either a single @value (if the value before was a literal) or a single @id (if the value before was an iri)
so if we expand the example document, we get this:
```json
[
{
"https://www.w3.org/ns/activitystreams#content": [
{
"@value": "#HelloWorld :blobcatHug:"
}
],
"@id": "https://social.example/~alice/notes/1",
"https://www.w3.org/ns/activitystreams#tag": [
{
"https://www.w3.org/ns/activitystreams#href": [
{
"@id": "https://social.example/tags/HelloWorld"
}
],
"https://www.w3.org/ns/activitystreams#name": [
{
"@value": "#HelloWorld"
}
],
"@type": [
"https://www.w3.org/ns/activitystreams#Hashtag"
]
},
{
"https://www.w3.org/ns/activitystreams#icon": [
{
"https://www.w3.org/ns/activitystreams#mediaType": [
{
"@value": "image/png"
}
],
"@type": [
"https://www.w3.org/ns/activitystreams#Image"
],
"https://www.w3.org/ns/activitystreams#url": [
{
"@id": "https://social.example/emojos/blobcatHug.png"
}
]
}
],
"https://www.w3.org/ns/activitystreams#name": [
{
"@value": "blobcatHug"
}
],
"@type": [
"https://joinmastodon.org/ns#Emoji"
]
}
],
"@type": [
"https://www.w3.org/ns/activitystreams#Note"
]
}
]
```
the point of expansion is to end up with a document that is **completely unambiguous** and doesn't need a @context -- see how everything is expressed purely in terms of keywords, literals, and iris? no shorthands are used, so you know exactly what each term represents.
### compaction
compaction is similar to expansion but it keeps values collapsed. so again, you end up with full iris, but you don't have to deal with keywords everywhere other than @id (which sticks around bc any iri represents a node and not just a value)
note that you can compact against a blank @context or supply your own @context.
if you compact against a blank @context, you'll get everything as a full iri:
```json
{
"@id": "https://social.example/~alice/notes/1",
"@type": "https://www.w3.org/ns/activitystreams#Note",
"https://www.w3.org/ns/activitystreams#content": "#HelloWorld :blobcatHug:",
"https://www.w3.org/ns/activitystreams#tag": [
{
"@type": "https://www.w3.org/ns/activitystreams#Hashtag",
"https://www.w3.org/ns/activitystreams#href": {
"@id": "https://social.example/tags/HelloWorld"
},
"https://www.w3.org/ns/activitystreams#name": "#HelloWorld"
},
{
"@type": "https://joinmastodon.org/ns#Emoji",
"https://www.w3.org/ns/activitystreams#icon": {
"@type": "https://www.w3.org/ns/activitystreams#Image",
"https://www.w3.org/ns/activitystreams#mediaType": "image/png",
"https://www.w3.org/ns/activitystreams#url": {
"@id": "https://social.example/emojos/blobcatHug.png"
}
},
"https://www.w3.org/ns/activitystreams#name": "blobcatHug"
}
]
}
```
but if you compact against whatever @context you understand, you will end up with shorthands for everything you understand and leave the full iris only for the stuff you *don't* understand. so again assuming we only understand the activitystreams context:
```json
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://social.example/~alice/notes/1",
"type": "Note",
"content": "#HelloWorld :blobcatHug:",
"tag": [
{
"type": "as:Hashtag",
"href": "https://social.example/tags/HelloWorld",
"name": "#HelloWorld"
},
{
"type": "https://joinmastodon.org/ns#Emoji",
"icon": {
"type": "Image",
"mediaType": "image/png",
"url": "https://social.example/emojos/blobcatHug.png"
},
"name": "blobcatHug"
}
]
}
```
note that this basically matches the input, **except** because we didn't compact against the extension vocab terms, we have a few namespaced terms to grapple with:
- `as:Hashtag` is left in there because it's not actually part of the activitystreams namespace. it was a proposed extension, but the context document was never updated to include it. this is why pretty much all existing impls currently include it as an extension term in their supplied @context.
- note the `as:` namespace was maintained here because `as:` is defined within the activitystreams context document as a convenient shorthand for `https://www.w3.org/ns/activitystreams#` as discussed in [above sections](#namespacing)
- `https://joinmastodon.org/ns#Emoji` was left completely uncompacted because we didn't pass in the joinmastodon namespace at all when compacting
- note that `as:id` is just an alias for json-ld's @id keyword, and `as:type` is likewise just an alias for json-ld's @type keyword
in summary, compaction is good for **simplifying the document based on what you know** -- worst case scenario, you have no @context and you can just parse for full iris (in a manner somewhat more efficient than parsing the expanded form). best case scenario, you have a @context that lets you parse for shorthand terms of your own choosing, and everything else is shortened only as much as possible (so you can generally ignore anything you don't understand, right?)
### flattening
similar to compaction, except you can flatten the document into a single @graph which contains a flat list of nodes.
flattening against no @context:
```json
{
"@graph": [
{
"@id": "_:b0",
"@type": "https://www.w3.org/ns/activitystreams#Hashtag",
"https://www.w3.org/ns/activitystreams#href": {
"@id": "https://social.example/tags/HelloWorld"
},
"https://www.w3.org/ns/activitystreams#name": "#HelloWorld"
},
{
"@id": "_:b1",
"@type": "https://joinmastodon.org/ns#Emoji",
"https://www.w3.org/ns/activitystreams#icon": {
"@id": "_:b2"
},
"https://www.w3.org/ns/activitystreams#name": "blobcatHug"
},
{
"@id": "_:b2",
"@type": "https://www.w3.org/ns/activitystreams#Image",
"https://www.w3.org/ns/activitystreams#mediaType": "image/png",
"https://www.w3.org/ns/activitystreams#url": {
"@id": "https://social.example/emojos/blobcatHug.png"
}
},
{
"@id": "https://social.example/~alice/notes/1",
"@type": "https://www.w3.org/ns/activitystreams#Note",
"https://www.w3.org/ns/activitystreams#content": "#HelloWorld :blobcatHug:",
"https://www.w3.org/ns/activitystreams#tag": [
{
"@id": "_:b0"
},
{
"@id": "_:b1"
}
]
}
]
}
```
flattening against our understood @context of only activitystreams:
```json
{
"@context": "https://www.w3.org/ns/activitystreams",
"@graph": [
{
"id": "_:b0",
"type": "as:Hashtag",
"href": "https://social.example/tags/HelloWorld",
"name": "#HelloWorld"
},
{
"id": "_:b1",
"type": "https://joinmastodon.org/ns#Emoji",
"icon": "_:b2",
"name": "blobcatHug"
},
{
"id": "_:b2",
"type": "Image",
"mediaType": "image/png",
"url": "https://social.example/emojos/blobcatHug.png"
},
{
"id": "https://social.example/~alice/notes/1",
"type": "Note",
"content": "#HelloWorld :blobcatHug:",
"tag": [
"_:b0",
"_:b1"
]
}
]
}
```
notice that the nodes that didn't have an id previously have now been assigned what is called a *blank node identifier* -- essentially an @id without a namespace and with a randomly generated identifier.
the idea is that you can **parse the @graph and then filter that list by @id to obtain any relevant node** -- no worrying about nesting or otherwise having to deal with structure. for example, we receive `https://social.example/~alice/notes/1` and flatten it against our @context to get a list of nodes, which we filter for the given @id `https://social.example/~alice/notes/1`, and we can see that this node refers to `_:b0` and `_:b1` within the tag property
## conclusion
that's pretty much it tbh
## further reading
- [JSON-LD 1.1](https://www.w3.org/TR/json-ld11/)
- [3.2 IRIs](https://www.w3.org/TR/json-ld11/#iris)
- > An IRI is defined in [RFC3987] as containing a scheme along with path and optional query and fragment segments. A relative IRI reference is an IRI that is relative to some other IRI. In JSON-LD, with exceptions that are as described below, all relative IRI references are resolved relative to the base IRI.
- > While it is a good practice for resource identifiers to be dereferenceable, sometimes this is not practical. In particular, note the [URN] scheme for Uniform Resource Names, such as UUID. An example UUID is urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6.
- [3.1 The Context](https://www.w3.org/TR/json-ld11/#the-context)
- > Simply speaking, a <mark>context is used to map terms to IRIs</mark>. Terms are case sensitive and most valid strings that are not reserved JSON-LD keywords can be used as a term. Exceptions are the empty string "" and strings that have the form of a keyword (i.e., starting with "@"
- > Contexts can either be directly embedded into the document (an embedded context) or be referenced using a URL. Assuming the context document in the previous example can be retrieved at https://json-ld.org/contexts/person.jsonld, it can be referenced by adding a single line and <mark>allows a JSON-LD document to be expressed much more concisely</mark>
- [5.1 Expanded Document Form](https://www.w3.org/TR/json-ld11/#expanded-document-form)
- > Expansion is the process of taking a JSON-LD document and applying a context such that all IRIs, types, and values are expanded so that the <mark>@context is no longer necessary</mark>.
- [5.2 Compacted Document Form](https://www.w3.org/TR/json-ld11/#compacted-document-form)
- > Compaction is the process of applying a developer-supplied context to shorten IRIs to terms or compact IRIs and JSON-LD values expressed in expanded form to simple values such as strings or numbers. Often this makes it simpler to work with document as the <mark>data is expressed in application-specific terms</mark>. Compacted documents are also typically easier to read for humans.
- > The purpose of compaction is to apply the term definitions, vocabulary mapping, default language, and base IRI to an existing JSON-LD document to cause it to be represented in a form that is tailored to the use of the JSON-LD document <mark>directly as JSON</mark>.
- [5.3 Flattened Document Form](https://www.w3.org/TR/json-ld11/#flattened-document-form)
- > Flattening collects all properties of a node in a single map and <mark>labels all blank nodes</mark> with blank node identifiers. This ensures a <mark>shape of the data</mark> and consequently may drastically <mark>simplify the code required to process JSON-LD</mark> in certain applications.

View file

@ -0,0 +1,6 @@
<h{{.Level}} class="heading" id="{{.Anchor | safeURL}}">
<span class="heading__text">{{.Text | safeHTML}}</span>
<a class="heading__anchor-link" href="#{{.Anchor | safeURL}}">
[link]
</a>
</h{{.Level}}>

View file

@ -0,0 +1,20 @@
{{ $link := .Destination }}
{{ $isRemote := strings.HasPrefix $link "http" }}
{{- if not $isRemote -}}
{{ $url := urls.Parse .Destination }}
{{- if $url.Path -}}
{{ $fragment := "" }}
{{- with $url.Fragment }}{{ $fragment = printf "#%s" . }}{{ end -}}
{{- with .Page.GetPage $url.Path }}{{ $link = printf "%s%s" .RelPermalink $fragment }}{{ end }}{{ end -}}
{{- end -}}
<a href="{{ $link | safeURL }}"
{{- with .Title}} title="{{ . }}"
{{- end -}}
{{ if $isRemote }} target="_blank"{{ end -}}
>
{{- .Text | safeHTML -}}
{{ if $isRemote -}}
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 1000 1000" width="1em"><path fill="currentColor" d="M609.34 13.31c-23.11 8.5-28.16 20.46-28.42 65.35 0 29.49.8 34.8 6.11 45.16 10.89 21.52 13.81 22.31 96.96 23.91l72.25 1.33L568.7 336.32C465.63 439.39 379.57 526.79 377.44 530.77c-4.78 9.3-4.78 24.17 0 33.47 2.13 3.98 15.67 18.86 30.28 33.47 24.17 23.91 27.36 26.3 38.52 27.36 6.64.8 15.41.53 19.66-.26 5.05-1.33 65.88-60.3 196.04-190.46C765.8 330.74 851.6 246.01 852.66 246.01c1.06 0 1.86 32.67 1.86 72.78 0 70.93.26 72.78 6.11 81.29 11.16 16.47 19.39 18.86 63.49 18.06 42.5-.8 46.49-2.12 58.97-19.13 5.58-7.17 5.58-10.36 6.37-180.37l.53-173.2-5.84-11.95c-3.72-6.91-9.83-14.08-15.41-17.27-9.03-5.05-14.08-5.31-179.31-5.84-137.59-.53-171.85.01-180.09 2.93z"/><path fill="currentColor" d="M100.12 121.42c-29.75 5.05-57.91 24.44-73.58 50.47-17.8 29.49-17 10.63-16.2 390.49l.8 343.73 8.5 17.8c9.56 20.19 27.89 41.44 44.36 51 26.83 15.67 8.5 14.87 381.46 14.87 306.28 0 343.2-.53 356.22-4.25 38.25-11.42 68.01-43.57 76.51-82.88 2.13-9.83 2.92-81.82 2.92-235.62v-221.8H745.63v409.08H145.27V256.63h409.08V118.5l-219.68.27c-121.13.26-226.59 1.32-234.55 2.65z"/></svg>
{{- end -}}
</a>

View file

@ -1,14 +1,11 @@
<style>
a[href^="http"]:after {
content: "🡕";
}
a[href^="{{.Site.BaseURL}}"]:after
a[href^="{{.Site.BaseURL}}"] svg
{
display: none !important;
}
a[href^="http://localhost"]:after
a[href^="http://localhost"] svg
{
display: none !important;
}