Compare commits
71 Commits
b9a91e76ce
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 952502e690 | |||
| 388a4f1589 | |||
| 806d3a318f | |||
| b06b695653 | |||
| 4ff04221b0 | |||
| c5c57405b0 | |||
| 2beded7c14 | |||
| 2b7645a572 | |||
| 98a9d78273 | |||
| 0cdd2fbf64 | |||
| 431d4b0990 | |||
| 9536c9fb25 | |||
| 85ea55402e | |||
| 7a263ce2e5 | |||
| 8b8d3c7fd0 | |||
| dde3fb61ae | |||
| 378a6f2ae1 | |||
| aae8912c08 | |||
| 84278b2e91 | |||
| 3a281dfa8a | |||
| dee7579b29 | |||
| acaa00754b | |||
| c00867d46b | |||
| 8c3d93bc2d | |||
| f931e6eceb | |||
| acf86b8d76 | |||
| a5cda19e5e | |||
| 7c085b4d39 | |||
| 5b5b971538 | |||
| f4e0bed9cd | |||
| 109ff6ce95 | |||
| 99247db83d | |||
| ce4161db0d | |||
| 2c57790c59 | |||
| 1bc7cba988 | |||
| ed270bc915 | |||
| 8b6874ec75 | |||
| 6921dbbd08 | |||
| a622d4d77c | |||
| 1a9d9f33cf | |||
| 7e8a89ccd2 | |||
| 7b3ef86744 | |||
| 60041d1d37 | |||
| 2a77e0d308 | |||
| 9abee96bd2 | |||
| 13eeadf6f0 | |||
| f677a3731c | |||
| a8549922c3 | |||
| db9433bda1 | |||
| 25e9057dd8 | |||
| e431a4f22b | |||
| a4bff7623d | |||
| b282843b40 | |||
| b1d4dd7a32 | |||
| df22cb2b87 | |||
| 4b19da5006 | |||
| ec7b58c8ec | |||
| 97e965feec | |||
| 5bfbaf397b | |||
| 5e6b28a9a6 | |||
| d088d79d3f | |||
| 1aeb600750 | |||
| 3ccb5e8c65 | |||
| e531ebd992 | |||
| 8a5bbf460b | |||
| 48bdf9ef08 | |||
| b1334455ea | |||
| a6425c7510 | |||
| 52ea5abbc8 | |||
| 67da389005 | |||
| a6a14c3909 |
22
assets/bergamot/rendering/minimal.bergamot
Normal file
22
assets/bergamot/rendering/minimal.bergamot
Normal file
@@ -0,0 +1,22 @@
|
||||
LatexListNil @ latexlist(nil, nil) <-;
|
||||
LatexListCons @ latexlist(cons(?x, ?xs), cons(?l_x, ?l_s)) <- latex(?x, ?l_x), latexlist(?xs, ?l_s);
|
||||
|
||||
IntercalateNil @ intercalate(?sep, nil, nil) <-;
|
||||
IntercalateConsCons @ intercalate(?sep, cons(?x_1, cons(?x_2, ?xs)), cons(?x_1, cons(?sep, ?ys))) <- intercalate(?sep, cons(?x_2, ?xs), ?ys);
|
||||
IntercalateConsNil @ intercalate(?sep, cons(?x, nil), cons(?x, nil)) <-;
|
||||
|
||||
NonEmpty @ nonempty(cons(?x, ?xs)) <-;
|
||||
|
||||
LatexInt @ latex(?i, ?l) <- int(?i), tostring(?i, ?l);
|
||||
LatexFloat @ latex(?f, ?l) <- float(?f), tostring(?f, ?l);
|
||||
LatexStr @ latex(?s, ?l) <- str(?s), escapestring(?s, ?l_1), latexifystring(?s, ?l_2), join(["\\texttt{\"", ?l_2, "\"}"], ?l);
|
||||
LatexMeta @ latex(metavariable(?l), ?l) <-;
|
||||
LatexLit @ latex(lit(?i), ?l) <- latex(?i, ?l);
|
||||
LatexVar @ latex(var(?s), ?l) <- latex(?s, ?l);
|
||||
|
||||
LatexIsInt @ latex(int(?e), ?l) <- latex(?e, ?l_e), join([?l_e, " \\in \\texttt{Int}"], ?l);
|
||||
LatexIsFloat @ latex(float(?e), ?l) <- latex(?e, ?l_e), join([?l_e, " \\in \\texttt{Float}"], ?l);
|
||||
LatexIsNum @ latex(num(?e), ?l) <- latex(?e, ?l_e), join([?l_e, " \\in \\texttt{Num}"], ?l);
|
||||
LatexIsStr @ latex(str(?e), ?l) <- latex(?e, ?l_e), join([?l_e, " \\in \\texttt{Str}"], ?l);
|
||||
LatexSym @ latex(?s, ?l) <- sym(?s), tostring(?s, ?l_1), join(["\\text{", ?l_1,"}"], ?l);
|
||||
LatexCall @ latex(?c, ?l) <- call(?c, ?n, ?ts), nonempty(?ts), latexlist(?ts, ?lts_1), intercalate(", ", ?lts_1, ?lts_2), join(?lts_2, ?lts_3), join(["\\text{", ?n, "}", "(", ?lts_3, ")"], ?l);
|
||||
102
assets/js/bergamot-helpers.js
Normal file
102
assets/js/bergamot-helpers.js
Normal file
@@ -0,0 +1,102 @@
|
||||
const loadedWidgets = {};
|
||||
const getButtons = (inputGroup) => {
|
||||
return {
|
||||
play: inputGroup.querySelector(".bergamot-play"),
|
||||
reset: inputGroup.querySelector(".bergamot-reset"),
|
||||
close: inputGroup.querySelector(".bergamot-close"),
|
||||
}
|
||||
}
|
||||
const setRunning = (inputGroup, running) => {
|
||||
if (inputGroup !== null) {
|
||||
const buttons = getButtons(inputGroup);
|
||||
if (buttons.play) buttons.play.classList.toggle("bergamot-hidden", running);
|
||||
if (buttons.reset) buttons.reset.classList.toggle("bergamot-hidden", !running);
|
||||
if (buttons.close) buttons.close.classList.toggle("bergamot-hidden", !running);
|
||||
}
|
||||
}
|
||||
|
||||
// The object language parsing is handling by a separate standalone Elm
|
||||
// application in the ObjectLanguage module, which has two ports:
|
||||
//
|
||||
// * `parseString` requests a string to be parsed
|
||||
// * `parsedString` returns the parsed string, or null
|
||||
//
|
||||
// We want there to be a single global ObjectLanguage object, but it works
|
||||
// on a "subscription" model (we have to give a callback to its port).
|
||||
// Configure this callback to invoke `resolve` functions from a list,
|
||||
// so that callers can just get a promise. This way we aren't continuously
|
||||
// registering more and more handlers for each parsed string, and we can
|
||||
// use a convenient promise API.
|
||||
const parsingPromiseResolvers = {};
|
||||
const ensureObjectLanguage = () => {
|
||||
if (!window.Bergamot.ObjectLanguage) {
|
||||
window.Bergamot.ObjectLanguage = Elm.Bergamot.ObjectLanguage.init({});
|
||||
window.Bergamot.ObjectLanguage.ports.parsedString.subscribe(({ string, term }) => {
|
||||
if (string in parsingPromiseResolvers) {
|
||||
for (const resolver of parsingPromiseResolvers[string]) {
|
||||
resolver(term);
|
||||
}
|
||||
parsingPromiseResolvers[string] = [];
|
||||
}
|
||||
});
|
||||
}
|
||||
return window.Bergamot.ObjectLanguage;
|
||||
}
|
||||
const parseBergamotObjectLanguage = (str) => {
|
||||
if (!(str in parsingPromiseResolvers)) {
|
||||
parsingPromiseResolvers[str] = [];
|
||||
}
|
||||
|
||||
return new Promise(resolve => {
|
||||
parsingPromiseResolvers[str].push(resolve);
|
||||
ensureObjectLanguage().ports.parseString.send(str);
|
||||
});
|
||||
}
|
||||
|
||||
window.Bergamot = {};
|
||||
window.Bergamot.run = (inputGroup, nodeId, inputModes, inputPrompt, rules, renderPreset, input) => {
|
||||
var app = Elm.Main.init({
|
||||
node: document.getElementById(nodeId),
|
||||
flags: {
|
||||
inputModes,
|
||||
renderRules: window.Bergamot.renderPresets[renderPreset],
|
||||
rules, input
|
||||
}
|
||||
});
|
||||
app.ports.convertInput.subscribe(async ({ mode, input }) => {
|
||||
if (!(mode in window.Bergamot.inputModes)) {
|
||||
app.ports.receiveConverted.send({ input, result: { error: "Improperly configured desugaring function (this is the website developer's fault)" } });
|
||||
}
|
||||
|
||||
let query = await (window.Bergamot.inputModes[mode])(input);
|
||||
if (query !== null) {
|
||||
query = inputPrompt.replace("TERM", query);
|
||||
app.ports.receiveConverted.send({ input, result: { query } });
|
||||
} else {
|
||||
app.ports.receiveConverted.send({ input, result: { error: "Unable to parse object language term" } });
|
||||
}
|
||||
});
|
||||
loadedWidgets[nodeId] = { app, parentNode: inputGroup ? inputGroup.parentElement : null };
|
||||
setRunning(inputGroup, true);
|
||||
};
|
||||
window.Bergamot.runPreset = (inputGroup, nodeId, presetName) => {
|
||||
const preset = window.Bergamot.presets[presetName];
|
||||
window.Bergamot.run(inputGroup, nodeId, preset.inputModes, preset.inputPrompt, preset.rules, preset.renderPreset, preset.query || "");
|
||||
};
|
||||
window.Bergamot.close = (inputGroup, nodeId) => {
|
||||
if (!(nodeId in loadedWidgets)) return;
|
||||
|
||||
const placeholderDiv = document.createElement('div');
|
||||
placeholderDiv.id = nodeId;
|
||||
|
||||
const widget = loadedWidgets[nodeId];
|
||||
const elmRoot = widget.parentNode.querySelector(".bergamot-root");
|
||||
elmRoot.replaceWith(placeholderDiv)
|
||||
delete loadedWidgets[nodeId];
|
||||
setRunning(inputGroup, false);
|
||||
}
|
||||
window.Bergamot.inputModes = {
|
||||
"Bergamot Object Language": parseBergamotObjectLanguage
|
||||
};
|
||||
window.Bergamot.presets = {};
|
||||
window.Bergamot.renderPresets = {};
|
||||
31
assets/js/katex-component.js
Normal file
31
assets/js/katex-component.js
Normal file
@@ -0,0 +1,31 @@
|
||||
class KatexExpressionShim extends HTMLElement {
|
||||
static observedAttributes = ["expression", "katex-options"];
|
||||
targetSpan;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
doRender() {
|
||||
if (!this.targetSpan) return;
|
||||
|
||||
const options = this.hasAttribute("katex-options") ?
|
||||
this.getAttribute("katex-options") : {};
|
||||
katex.render(
|
||||
this.getAttribute("expression"),
|
||||
this.targetSpan,
|
||||
JSON.parse(options)
|
||||
);
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
this.targetSpan = document.createElement('span');
|
||||
this.appendChild(this.targetSpan);
|
||||
this.doRender();
|
||||
}
|
||||
|
||||
attributeChangedCallback(name, oldValue, newValue) {
|
||||
this.doRender();
|
||||
}
|
||||
}
|
||||
customElements.define("katex-expression", KatexExpressionShim);
|
||||
@@ -39,6 +39,15 @@ pre code {
|
||||
overflow: auto;
|
||||
margin-bottom: 1rem;
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
border: none;
|
||||
|
||||
&:hover, &:focus {
|
||||
background-color: rgba($primary-color, 0.25);
|
||||
}
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 0;
|
||||
}
|
||||
@@ -95,15 +104,13 @@ pre code {
|
||||
}
|
||||
|
||||
.kr, .kd, .k {
|
||||
font-weight: bold;
|
||||
@include var(color, code-keyword-color);
|
||||
}
|
||||
|
||||
.kt {
|
||||
font-weight: bold;
|
||||
@include var(color, code-type-color);
|
||||
}
|
||||
|
||||
.c, .c1, .cm {
|
||||
color: $code-comment-color;
|
||||
@include var(color, code-comment-color);
|
||||
}
|
||||
|
||||
45
assets/scss/fonts.scss
Normal file
45
assets/scss/fonts.scss
Normal file
@@ -0,0 +1,45 @@
|
||||
@mixin font-inconsolata($weight) {
|
||||
@font-face {
|
||||
font-family: 'Inconsolata';
|
||||
font-display: swap;
|
||||
font-weight: $weight;
|
||||
src: local('Inconsolata'),
|
||||
url('../fonts/gen/Inconsolata-#{$weight}.woff2');
|
||||
}
|
||||
}
|
||||
|
||||
@mixin font-lora {
|
||||
@font-face {
|
||||
font-family: 'Lora';
|
||||
font-display: swap;
|
||||
src: local('Lora'),
|
||||
url('../fonts/gen/Lora-Regular.woff2'),
|
||||
url('../fonts/gen/Lora-Italic.woff2');
|
||||
}
|
||||
}
|
||||
|
||||
@mixin font-raleway($weight) {
|
||||
@font-face {
|
||||
font-family: 'Raleway';
|
||||
font-display: swap;
|
||||
font-weight: $weight;
|
||||
src: local('Raleway'),
|
||||
url('../fonts/gen/Raleway-#{$weight}.woff2'),
|
||||
url('../fonts/gen/Raleway-#{$weight}-Italic.woff2');
|
||||
}
|
||||
}
|
||||
|
||||
@mixin font-stixgeneral {
|
||||
@font-face {
|
||||
font-family: 'STIXGeneral';
|
||||
font-display: swap;
|
||||
src: local('STIXGeneral-Regular'),
|
||||
url('../fonts/STIXGeneral-Regular.ttf');
|
||||
}
|
||||
}
|
||||
|
||||
@include font-inconsolata(400);
|
||||
@include font-lora();
|
||||
@include font-raleway(400);
|
||||
@include font-raleway(700);
|
||||
@include font-stixgeneral();
|
||||
@@ -7,6 +7,10 @@
|
||||
2 * ($margin-width + $margin-inner-offset + $margin-outer-offset)) {
|
||||
@content;
|
||||
}
|
||||
|
||||
@media print {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin below-one-margin {
|
||||
@@ -15,6 +19,10 @@
|
||||
($margin-width + $margin-inner-offset + $margin-outer-offset)) {
|
||||
@content;
|
||||
}
|
||||
|
||||
@media print {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin margin-content {
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
}
|
||||
|
||||
@mixin below-container-width {
|
||||
@media screen and (max-width: $container-width-threshold){
|
||||
@media screen and (max-width: $container-width-threshold) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
--code-color: #{$code-color-dark};
|
||||
--code-lineno-color: white;
|
||||
--code-keyword-color: #{$code-token-color-dark};
|
||||
--code-comment-color: #{$code-comment-color-dark};
|
||||
--code-type-color: #{$code-token-color-dark};
|
||||
--code-highlight-color: #{$code-highlight-color-dark};
|
||||
}
|
||||
|
||||
@@ -48,13 +48,20 @@
|
||||
|
||||
@mixin hidden-sidenote {
|
||||
position: static;
|
||||
margin-top: 1rem;
|
||||
// Author can override margin inline to shift sidenote, but when displayed
|
||||
// on mobile (and thus, between text), shifting it would overlap it
|
||||
// with text, so override the shift.
|
||||
margin-top: 1rem !important;
|
||||
margin-bottom: 1rem;
|
||||
width: 100%;
|
||||
|
||||
.sidenote-checkbox:checked ~ & {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@media print {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
@include below-two-margins {
|
||||
|
||||
@@ -59,7 +59,7 @@ p {
|
||||
}
|
||||
|
||||
@include below-two-margins {
|
||||
left: -($margin-width + $margin-inner-offset + $margin-outer-offset)/2;
|
||||
left: -($margin-width + $margin-inner-offset + $margin-outer-offset) / 2;
|
||||
}
|
||||
|
||||
@include below-one-margin {
|
||||
@@ -149,6 +149,19 @@ a {
|
||||
color: $primary-color;
|
||||
transition: color 0.25s;
|
||||
}
|
||||
|
||||
&.external-link, &.same-page-link {
|
||||
.feather {
|
||||
fill: none;
|
||||
margin-left: 0.25rem;
|
||||
position: relative;
|
||||
top: 0.125em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.draft-link {
|
||||
border-bottom: .2rem solid $border-color;
|
||||
}
|
||||
|
||||
img {
|
||||
@@ -234,7 +247,25 @@ ul.post-list {
|
||||
|
||||
p.post-wordcount, p.post-status {
|
||||
text-align: center;
|
||||
margin-bottom: 0.6rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.series-link {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
margin-top: 1rem;
|
||||
font-size: 1.1rem;
|
||||
border-top: $standard-border;
|
||||
padding-top: 1rem;
|
||||
|
||||
.feather {
|
||||
fill: none;
|
||||
flex-shrink: 0;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
margin-right: 0.5em;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -243,7 +274,10 @@ ul.post-list {
|
||||
}
|
||||
|
||||
figure {
|
||||
break-inside: avoid;
|
||||
|
||||
img {
|
||||
border: $standard-border;
|
||||
border-radius: 0.5rem;
|
||||
max-width: 70%;
|
||||
display: block;
|
||||
@@ -273,6 +307,11 @@ figure {
|
||||
&.medium img {
|
||||
max-height: 30rem;
|
||||
}
|
||||
|
||||
&.fullwide {
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.twitter-tweet {
|
||||
@@ -286,6 +325,13 @@ figure {
|
||||
@include var(border-color, warning-border-color);
|
||||
}
|
||||
|
||||
/*
|
||||
Note: by absolute default (via inline CSS) feather icons are hidden.
|
||||
That's because firefox reader mode doesn't play nice with them, and
|
||||
it seems to ignore all styles in <head>. Then, the inline style
|
||||
in <head> uses !important to restore the display of icons, but provides
|
||||
limited styling. Here, we finally apply the full extent of the feather styles.
|
||||
*/
|
||||
.feather {
|
||||
width: 1rem;
|
||||
height: 1rem;
|
||||
@@ -309,7 +355,7 @@ figure {
|
||||
|
||||
.dialog {
|
||||
.message {
|
||||
max-width: 0.8*$container-width;
|
||||
max-width: 0.8 * $container-width;
|
||||
margin-top: 0.5rem;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
@@ -337,7 +383,7 @@ figure {
|
||||
}
|
||||
}
|
||||
|
||||
#SeriesNavigation {
|
||||
.series-navigation {
|
||||
margin-top: 1em;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
@@ -355,8 +401,7 @@ figure {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
a {
|
||||
a, .ongoing-placeholder {
|
||||
@include bordered-block;
|
||||
padding: 0.5em 1em 0.5em 1em;
|
||||
font-size: 1.1em;
|
||||
@@ -373,6 +418,10 @@ figure {
|
||||
}
|
||||
}
|
||||
|
||||
.ongoing-placeholder {
|
||||
border-style: dashed;
|
||||
}
|
||||
|
||||
div.title {
|
||||
font-weight: bold;
|
||||
}
|
||||
@@ -415,3 +464,36 @@ blockquote {
|
||||
margin-left: 0;
|
||||
padding-left: 1rem;
|
||||
}
|
||||
|
||||
.early-navigation-wrapper {
|
||||
margin-bottom: 3rem;
|
||||
}
|
||||
|
||||
.side-by-side {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.side-by-side-item {
|
||||
flex-basis: 0;
|
||||
}
|
||||
|
||||
.internal-ref {
|
||||
text-decoration: underline;
|
||||
break-inside: avoid;
|
||||
|
||||
&:target {
|
||||
@include var(background-color, target-background-color);
|
||||
border-radius: 1rem;
|
||||
|
||||
.internal-ref-counter {
|
||||
@include var(background-color, target-background-color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.internal-ref-counter {
|
||||
display: inline-block;
|
||||
border: $standard-border;
|
||||
border-radius: 0.5rem;
|
||||
padding: 0 0.25rem 0 0.25rem;
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ $standard-border: $standard-border-width solid $border-color;
|
||||
|
||||
$font-heading: "Lora", serif;
|
||||
$font-body: "Raleway", serif;
|
||||
$font-code: "Inconsolata", monospace;
|
||||
$font-code: "Inconsolata", monospace, "STIXGeneral";
|
||||
|
||||
$warning-background-color: #ffee99;
|
||||
$warning-border-color: #f5c827;
|
||||
@@ -23,7 +23,7 @@ $target-background-color-dark: #55511c;
|
||||
|
||||
$code-color: #f0f0f0;
|
||||
$code-color-dark: lighten($background-color-dark, 10%);
|
||||
$code-token-color: black;
|
||||
$code-token-color: darken($primary-color, 25%);
|
||||
$code-token-color-dark: $primary-color;
|
||||
$code-highlight-color: #fffd99;
|
||||
$code-highlight-color-dark: #555538;
|
||||
@@ -31,6 +31,7 @@ $code-border-color: darken($code-color, 10%);
|
||||
$code-lineno-color: black;
|
||||
$code-lineno-spacing: 1rem;
|
||||
$code-comment-color: grey;
|
||||
$code-comment-color-dark: #68dcff;
|
||||
$code-border: $standard-border-width solid $code-border-color;
|
||||
|
||||
$input-padding: 0.5rem;
|
||||
@@ -57,6 +58,7 @@ $css-vars: (
|
||||
code-color: $code-color,
|
||||
code-lineno-color: $code-lineno-color,
|
||||
code-keyword-color: $code-token-color,
|
||||
code-comment-color: $code-comment-color,
|
||||
code-type-color: $code-token-color,
|
||||
code-highlight-color: $code-highlight-color,
|
||||
);
|
||||
|
||||
69
chatgpt-instance-fonts.py
Normal file
69
chatgpt-instance-fonts.py
Normal file
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
"""
|
||||
Instantiate variable fonts at specific weights/styles, producing static TTF files.
|
||||
No subsetting, no recursive searching—just direct calls with hardcoded axis values.
|
||||
Requires fontTools >= 4.0.
|
||||
|
||||
Genererated by ChatGTP o3-mini-high. Not human-modified.
|
||||
"""
|
||||
|
||||
from fontTools.ttLib import TTFont
|
||||
from fontTools.varLib.instancer import instantiateVariableFont
|
||||
|
||||
def instantiate_variable_font(input_font_path, axis_values, output_font_path):
|
||||
"""
|
||||
1) Loads a variable font from `input_font_path`.
|
||||
2) Instantiates (flattens) it at the specified axis values (e.g. {"wght": 400}).
|
||||
3) Saves the result as a static TTF at `output_font_path`.
|
||||
"""
|
||||
print(f"Instantiating {input_font_path} with axes={axis_values} -> {output_font_path}")
|
||||
vf = TTFont(input_font_path)
|
||||
static_font = instantiateVariableFont(vf, axis_values)
|
||||
static_font.flavor = "woff2"
|
||||
static_font.save(output_font_path)
|
||||
|
||||
def main():
|
||||
# Inconsolata (Variable)
|
||||
instantiate_variable_font(
|
||||
"Inconsolata-VariableFont_wdth,wght.ttf",
|
||||
{"wght": 400},
|
||||
"Inconsolata-400.woff2"
|
||||
)
|
||||
|
||||
# Lora (Variable, normal and italic)
|
||||
instantiate_variable_font(
|
||||
"Lora-VariableFont_wght.ttf",
|
||||
{"wght": 400},
|
||||
"Lora-Regular.woff2"
|
||||
)
|
||||
instantiate_variable_font(
|
||||
"Lora-Italic-VariableFont_wght.ttf",
|
||||
{"wght": 400},
|
||||
"Lora-Italic.woff2"
|
||||
)
|
||||
|
||||
# Raleway (Variable, normal and italic)
|
||||
instantiate_variable_font(
|
||||
"Raleway-VariableFont_wght.ttf",
|
||||
{"wght": 400},
|
||||
"Raleway-400.woff2"
|
||||
)
|
||||
instantiate_variable_font(
|
||||
"Raleway-VariableFont_wght.ttf",
|
||||
{"wght": 700},
|
||||
"Raleway-700.woff2"
|
||||
)
|
||||
instantiate_variable_font(
|
||||
"Raleway-Italic-VariableFont_wght.ttf",
|
||||
{"wght": 400},
|
||||
"Raleway-400-Italic.woff2"
|
||||
)
|
||||
instantiate_variable_font(
|
||||
"Raleway-Italic-VariableFont_wght.ttf",
|
||||
{"wght": 700},
|
||||
"Raleway-700-Italic.woff2"
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,4 +1,7 @@
|
||||
[params]
|
||||
katexCssUrl = "//static.danilafe.com/katex/katex.min.css"
|
||||
katexJsUrl = "//static.danilafe.com/katex/katex.min.js"
|
||||
normalizeCssUrl = "//static.danilafe.com/normalize/normalize.css"
|
||||
visNetworkJsUrl = "//static.danilafe.com/vis-network/vis-network.min.js"
|
||||
bergamotJsUrl = "//static.danilafe.com/bergamot/bergamot.js"
|
||||
bergamotObjectLanguageJsUrl = "//static.danilafe.com/bergamot/objectlang.js"
|
||||
|
||||
@@ -27,6 +27,9 @@
|
||||
one = "about one minute to read"
|
||||
other = "about {{ .Count }} minutes to read"
|
||||
|
||||
[latestInSeries]
|
||||
other = "Latest in series:"
|
||||
|
||||
[recentPosts]
|
||||
other = "Recent posts"
|
||||
|
||||
|
||||
9
layouts/_default/_markup/render-blockquote.html
Normal file
9
layouts/_default/_markup/render-blockquote.html
Normal file
@@ -0,0 +1,9 @@
|
||||
{{ if and (eq .Type "alert") (eq .AlertType "todo") -}}
|
||||
<div style="background-color: tomato; color: white; padding: 10px;">
|
||||
<em>TODO: </em>{{- .Text | plainify -}}
|
||||
</div>
|
||||
{{- else -}}
|
||||
<blockquote {{- with .Attributes.id }} id="{{ . }}"{{ end }}>
|
||||
{{ .Text -}}
|
||||
</blockquote>
|
||||
{{- end }}
|
||||
6
layouts/_default/_markup/render-heading.html
Normal file
6
layouts/_default/_markup/render-heading.html
Normal file
@@ -0,0 +1,6 @@
|
||||
{{- .Page.Scratch.SetInMap "definedSections" (printf "#%s" .Anchor) true -}}
|
||||
<a href="#{{ .Anchor }}">
|
||||
<h{{ .Level }} id="{{ .Anchor }}">
|
||||
{{- .Text | safeHTML -}}
|
||||
</h{{ .Level }}>
|
||||
</a>
|
||||
32
layouts/_default/_markup/render-link.html
Normal file
32
layouts/_default/_markup/render-link.html
Normal file
@@ -0,0 +1,32 @@
|
||||
{{- $class := "" -}}
|
||||
{{- $icon := "" -}}
|
||||
{{- $absoluteDest := absLangURL .Destination -}}
|
||||
{{- $siteRootUrl := absLangURL "" -}}
|
||||
{{- $isExternal := not (hasPrefix $absoluteDest $siteRootUrl) -}}
|
||||
{{- $isSamePage := hasPrefix .Destination "#" -}}
|
||||
|
||||
{{- if $isSamePage -}}
|
||||
{{- $class = "same-page-link" -}}
|
||||
{{- if index (.Page.Scratch.Get "definedSections") .Destination -}}
|
||||
{{- $icon = "arrow-up" -}}
|
||||
{{- else -}}
|
||||
{{- /* Do not render "down" links because don't know how to distinguish unseen titles from paragraph links. */ -}}
|
||||
{{- /* $icon = "arrow-down" */ -}}
|
||||
{{- end -}}
|
||||
{{- else if $isExternal -}}
|
||||
{{- $class = "external-link" -}}
|
||||
{{- $icon = "external-link" -}}
|
||||
{{- end -}}
|
||||
<a href="{{ .Destination | safeURL }}"
|
||||
{{- with .Title }} title="{{ . }}"{{ end -}}
|
||||
{{- with $class -}}
|
||||
class="{{ . }}"
|
||||
{{- end -}}
|
||||
{{- if (and site.Params.externalLinksInNewTab $isExternal) -}}
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
{{- end -}}
|
||||
>
|
||||
{{- with .Text | safeHTML }}{{ . }}{{ end -}}
|
||||
{{- with $icon -}}{{- partial "icon.html" . -}}{{- end -}}
|
||||
</a>
|
||||
{{- /* chomp trailing newline */ -}}
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
<ul class="post-list">
|
||||
{{ range .Pages.ByDate.Reverse }}
|
||||
{{ partial "post.html" . }}
|
||||
{{ partial "post.html" (dict "page" .) }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
{{ end }}
|
||||
|
||||
@@ -2,44 +2,34 @@
|
||||
<h2>{{ .Title }}</h2>
|
||||
<div class="post-subscript">
|
||||
<p>
|
||||
{{ range .Params.tags }}
|
||||
<a class="button" href="{{ $.Site.BaseURL }}/tags/{{ . | urlize }}">{{ . }}</a>
|
||||
{{ end }}
|
||||
{{- range (.GetTerms "tags") -}}
|
||||
<a class="button" href="{{ .Permalink }}">{{ .Title }}</a>
|
||||
{{ end -}}
|
||||
</p>
|
||||
<p>{{ i18n "postedOn" (.Date.Format "January 2, 2006") }}.</p>
|
||||
</div>
|
||||
|
||||
<div class="post-content">
|
||||
{{ if not (eq .TableOfContents "<nav id=\"TableOfContents\"></nav>") }}
|
||||
{{- if not (eq .TableOfContents "<nav id=\"TableOfContents\"></nav>") -}}
|
||||
<div class="table-of-contents">
|
||||
<div class="wrapper">
|
||||
<em>{{ i18n "tableOfContents" }}</em>
|
||||
{{ .TableOfContents }}
|
||||
<em>{{- i18n "tableOfContents" -}}</em>
|
||||
{{- .TableOfContents -}}
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{- end -}}
|
||||
|
||||
{{ if .Draft }}
|
||||
{{ partial "warning.html" (i18n "postDraft") }}
|
||||
{{ end }}
|
||||
{{- if .Draft -}}
|
||||
{{- partial "warning.html" (i18n "postDraft") -}}
|
||||
{{- end -}}
|
||||
|
||||
{{ .Content }}
|
||||
{{- .Content -}}
|
||||
</div>
|
||||
{{- end -}}
|
||||
{{- define "after" -}}
|
||||
<div class="container">
|
||||
{{- partial "seriesnav.html" . -}}
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ define "after" }}
|
||||
{{ $term := index (.GetTerms "series") 0 }}
|
||||
{{ with $term }}
|
||||
{{- /* No idea why the 'Reverse' is needed? */ -}}
|
||||
{{ $pages := (site.Taxonomies.series.Get .Data.Term).Pages.ByDate.Reverse }}
|
||||
<nav id="SeriesNavigation" class="container">
|
||||
{{ with $pages.Prev page }}
|
||||
{{ partial "serieslink.html" (dict "direction" "previous" "link" .RelPermalink "term" $term "page" .) }}
|
||||
{{ end }}
|
||||
{{ with $pages.Next page }}
|
||||
{{ partial "serieslink.html" (dict "direction" "next" "link" .RelPermalink "term" $term "page" .) }}
|
||||
{{ end }}
|
||||
</nav>
|
||||
{{ end }}
|
||||
<hr class="container footer-divider">
|
||||
<footer class="container">
|
||||
<p>{{ i18n "contactFooter" | safeHTML }}</p>
|
||||
@@ -51,4 +41,4 @@
|
||||
to learn more about me!</p>
|
||||
-->
|
||||
</footer>
|
||||
{{ end }}
|
||||
{{- end -}}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
<ul class="post-list">
|
||||
{{ range (where (where .Site.Pages.ByDate.Reverse "Section" "blog") ".Kind" "!=" "section") }}
|
||||
{{ if .Params.favorite }}{{ partial "post.html" . }}{{ end }}
|
||||
{{ if .Params.favorite }}{{ partial "post.html" (dict "page" .) }}{{ end }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
{{ end }}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{{ define "main" }}
|
||||
<h2>{{ .Title }} </h2>
|
||||
<script src="{{ .Site.Params.visNetworkJsUrl }}"></script>
|
||||
<script type="module" src="{{ .Site.BaseURL }}/graph/graph.js"></script>
|
||||
<script type="module" src="{{ absLangURL "graph/graph.js" }}"></script>
|
||||
<style>
|
||||
#graph-container {
|
||||
width: 100%;
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
{{ .Content }}
|
||||
|
||||
{{ i18n "recentPosts" }}:
|
||||
{{ partial "uniquebyseries.html" (dict "scratch" .Scratch) }}
|
||||
<ul class="post-list">
|
||||
{{ range first 10 (where (where .Site.Pages.ByDate.Reverse "Section" "blog") ".Kind" "!=" "section") }}
|
||||
{{ partial "post.html" . }}
|
||||
{{ range first 10 (.Scratch.Get "pages") }}
|
||||
{{ partial "post.html" (dict "page" . "linkSeries" true) }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
|
||||
|
||||
6
layouts/partials/bergamotinputmode.html
Normal file
6
layouts/partials/bergamotinputmode.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<script>
|
||||
window.addEventListener('load', function() {
|
||||
window.Bergamot.inputModes['{{ .name }}'] = {{ .fn | safeJS }};
|
||||
});
|
||||
</script>
|
||||
|
||||
17
layouts/partials/bergamotparseinputmodes.js
Normal file
17
layouts/partials/bergamotparseinputmodes.js
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
{{ if . }}
|
||||
{{ range $name := split . ";" }}
|
||||
{{ if eq $name "query" }}
|
||||
"Query": "query",
|
||||
{{ else }}
|
||||
{{ $pieces := split $name ":" }}
|
||||
{{ $name := index $pieces 0 }}
|
||||
{{ $modestring := index $pieces 1 }}
|
||||
"{{ $name }}": { "custom": "{{ $modestring }}" },
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ else }}
|
||||
"Languge Term": { "custom": "Bergamot Object Language" },
|
||||
"Query": "query",
|
||||
{{ end }}
|
||||
}
|
||||
11
layouts/partials/bergamotpreset.html
Normal file
11
layouts/partials/bergamotpreset.html
Normal file
@@ -0,0 +1,11 @@
|
||||
<script>
|
||||
window.addEventListener('load', function() {
|
||||
window.Bergamot.presets['{{ .name }}'] = {
|
||||
rules: {{ .file }},
|
||||
inputModes: {{ partial "bergamotparseinputmodes.js" .modes | safeJS }},
|
||||
inputPrompt: '{{ .prompt }}',
|
||||
query: '{{ .query }}',
|
||||
renderPreset: '{{ default "default" .renderPreset }}'
|
||||
};
|
||||
});
|
||||
</script>
|
||||
6
layouts/partials/bergamotrenderpreset.html
Normal file
6
layouts/partials/bergamotrenderpreset.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<script>
|
||||
window.addEventListener('load', function() {
|
||||
window.Bergamot.renderPresets['{{ .name }}'] =
|
||||
{{ .file }};
|
||||
});
|
||||
</script>
|
||||
@@ -1,11 +1,27 @@
|
||||
{{ $scratch := .scratch }}
|
||||
{{ $scratch.Set "bestLength" -1 }}
|
||||
{{ $scratch.Set "bestUrl" (printf "%s/code/%s" .siteSourceUrl .path) }}
|
||||
{{ $filePath := .path }}
|
||||
{{ range $path, $url := .submoduleLinks }}
|
||||
{{ $bestLength := $scratch.Get "bestLength" }}
|
||||
{{ if and (le $bestLength (len $path)) (hasPrefix $filePath $path) }}
|
||||
{{ $scratch.Set "bestLength" (len $path) }}
|
||||
{{ $scratch.Set "bestUrl" (printf "%s%s" $url (strings.TrimPrefix $path $filePath)) }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{- $siteSourceUrl := site.Params.siteSourceUrl -}}
|
||||
{{- $submoduleLinks := site.Data.submodules -}}
|
||||
{{- $hostData := site.Data.hosts -}}
|
||||
{{- $scratch := .scratch -}}
|
||||
{{- $lines := .lines -}}
|
||||
{{- $scratch.Set "bestLength" -1 -}}
|
||||
{{- $scratch.Set "bestUrl" (printf "%s/code/%s" $siteSourceUrl .path) -}}
|
||||
{{- $scratch.Set "bestPath" "" -}}
|
||||
{{- $filePath := .path -}}
|
||||
{{- range $path, $url := $submoduleLinks -}}
|
||||
{{- $bestLength := $scratch.Get "bestLength" -}}
|
||||
{{- if and (le $bestLength (len $path)) (hasPrefix $filePath $path) -}}
|
||||
{{- $scratch.Set "bestLength" (len $path) -}}
|
||||
{{- $scratch.Set "bestPath" $path -}}
|
||||
{{- $scratch.Set "bestUrl" (printf "%s%s" $url (strings.TrimPrefix $path $filePath)) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- if .lines -}}
|
||||
{{- /* If the user provided a line range, see if we can tack it on to the end of the link. */ -}}
|
||||
{{- range $host, $data := $hostData -}}
|
||||
{{- if hasPrefix ($scratch.Get "bestUrl") $host -}}
|
||||
{{- with $data.linesSuffix -}}
|
||||
{{- $scratch.Add "bestUrl" (printf . (index $lines 0) (index $lines 1)) -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<div class="highlight-group">
|
||||
<div class="highlight-group" {{ with .attrs }}{{ . | safeHTMLAttr }}{{ end }}>
|
||||
<div class="highlight-label">{{ i18n "from" }} <a href="{{ .url }}">{{ path.Base .path }}</a>{{ .comment }}</div>{{ .content }}
|
||||
</div>
|
||||
|
||||
@@ -5,42 +5,91 @@
|
||||
{{ if .Description }}
|
||||
<meta name="description" content="{{ .Description }}">
|
||||
{{ end }}
|
||||
{{ with index (.GetTerms "series") 0 }}
|
||||
<meta name="blog-series" content="{{ .Data.Term }}">
|
||||
{{ end }}
|
||||
|
||||
{{ range .Params.discussionRooms }}
|
||||
<meta name="matrix-highlight-comments" content="{{ . }}">
|
||||
{{ end }}
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;700&family=Raleway:wght@400;700&family=Lora&display=block" media="screen">
|
||||
{{ if not (.Site.Params.noCss) }}
|
||||
{{ $fonts := resources.Get "scss/fonts.scss" | css.Sass | resources.Minify }}
|
||||
<link rel="stylesheet" href="{{ $fonts.Permalink }}" media="screen">
|
||||
{{ end }}
|
||||
|
||||
<!-- External CSS (normalize and KaTeX -->
|
||||
{{ if not (.Site.Params.noCss) }}
|
||||
{{ partial "defercss.html" (dict "url" .Site.Params.normalizeCssUrl "extra" "") }}
|
||||
{{ partial "defercss.html" (dict "url" .Site.Params.katexCssUrl "extra" "") }}
|
||||
{{ end }}
|
||||
|
||||
<!-- Links to other formats (RSS, TOML) -->
|
||||
{{ range .AlternativeOutputFormats -}}
|
||||
{{ range .Site.Home.AlternativeOutputFormats -}}
|
||||
<link rel="{{ .Rel }}" type="{{ .MediaType.Type | html }}" href="{{ .Permalink | safeURL }}">
|
||||
{{ end -}}
|
||||
|
||||
<!-- In-house CSS -->
|
||||
{{ $style := resources.Get "scss/style.scss" | resources.ToCSS | resources.Minify }}
|
||||
{{ $sidenotes := resources.Get "scss/sidenotes.scss" | resources.ToCSS | resources.Minify }}
|
||||
{{ $code := resources.Get "scss/code.scss" | resources.ToCSS | resources.Minify }}
|
||||
{{ $style := resources.Get "scss/style.scss" | css.Sass | resources.Minify }}
|
||||
{{ $sidenotes := resources.Get "scss/sidenotes.scss" | css.Sass | resources.Minify }}
|
||||
{{ $code := resources.Get "scss/code.scss" | css.Sass | resources.Minify }}
|
||||
{{ $icon := resources.Get "img/favicon.png" }}
|
||||
<style>.sidenote-checkbox { display: none; }</style>
|
||||
<style>.feather { width: 1rem; height: 1rem; }</style>
|
||||
<style>.feather { display: inline !important; width: 10px; height: 10px; }</style>
|
||||
<style>img { max-width: 70%; }</style>
|
||||
{{ if not (.Site.Params.noCss) }}
|
||||
<link rel="stylesheet" href="{{ $style.Permalink }}">
|
||||
{{ partial "defercss.html" (dict "url" $sidenotes.Permalink "extra" "") }}
|
||||
{{ partial "defercss.html" (dict "url" $code.Permalink "extra" "") }}
|
||||
{{ end }}
|
||||
<link rel="icon" type="image/png" href="{{ $icon.Permalink }}">
|
||||
|
||||
{{ if .Site.IsServer }}
|
||||
{{ if .Params.custom_js }}
|
||||
{{ range $customJs := .Params.custom_js }}
|
||||
<script src="{{ page.Resources.Get $customJs }}"></script>
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ if hugo.IsServer }}
|
||||
<!-- KaTeX auto-rendering for when we don't have a post-processing step. -->
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.js" integrity="sha384-X/XCfMm41VSsqRNQgDerQczD69XqmjOOOwYQvr/uuC+j4OPoNhVgjdGFwhvN02Ja" crossorigin="anonymous"></script>
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/contrib/auto-render.min.js" integrity="sha384-+XBljXPPiv+OzfbB3cVmLHf4hdUFHlWNZN5spNQ7rmHTXpd7WvJum6fIACpNNfIR" crossorigin="anonymous"
|
||||
onload="renderMathInElement(document.body);"></script>
|
||||
{{ end }}
|
||||
|
||||
{{ if .Params.bergamot }}
|
||||
<!-- Code to support the Bergamot JS widget -->
|
||||
<script defer src="{{ .Site.Params.katexJsUrl }}" crossorigin="anonymous"></script>
|
||||
{{ $katexComponentJs := resources.Get "js/katex-component.js" | resources.Minify }}
|
||||
<script defer src="{{ $katexComponentJs.Permalink }}"></script>
|
||||
<script defer src="{{ .Site.Params.bergamotJsUrl }}"></script>
|
||||
<script defer src="{{ .Site.Params.bergamotObjectLanguageJsUrl }}"></script>
|
||||
{{ $bergamotHelpers := resources.Get "js/bergamot-helpers.js" | resources.Minify }}
|
||||
<script defer src="{{ $bergamotHelpers.Permalink }}"></script>
|
||||
{{ $bergamotStyle := resources.Get "scss/bergamot.scss" | css.Sass | resources.Minify }}
|
||||
{{ partial "defercss.html" (dict "url" $bergamotStyle.Permalink "extra" "") }}
|
||||
{{ if .Params.bergamot.render_presets }}
|
||||
{{ range $name, $rulefile := .Params.bergamot.render_presets }}
|
||||
{{ $file := default (resources.Get $rulefile) (page.Resources.Get $rulefile) }}
|
||||
{{ partial "bergamotrenderpreset.html" (dict "name" $name "file" $file.Content) }}
|
||||
{{ end }}
|
||||
{{ else }}
|
||||
{{ partial "bergamotrenderpreset.html" (dict "name" "default" "file" (resources.Get "bergamot/rendering/minimal.bergamot").Content) }}
|
||||
{{ end }}
|
||||
{{ if .Params.bergamot.presets }}
|
||||
{{ range $name, $preset := .Params.bergamot.presets }}
|
||||
{{ $file := default (resources.Get $preset.file) (page.Resources.Get $preset.file) }}
|
||||
{{ $info := dict "name" $name "prompt" $preset.prompt "query" $preset.query "file" $file.Content "renderPreset" $preset.render_preset "inputModes" $preset.input_modes }}
|
||||
{{ partial "bergamotpreset.html" $info }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ if .Params.bergamot.input_modes }}
|
||||
{{ range $mode := .Params.bergamot.input_modes }}
|
||||
{{ partial "bergamotinputmode.html" (dict "name" $mode.name "fn" $mode.fn) }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
|
||||
{{ with .Site.Params.plausibleAnalyticsDomain }}
|
||||
<!-- Plausible analytics, because log parsing is not working all that well. -->
|
||||
<script defer data-domain="{{ . }}" src="https://plausible.io/js/script.js"></script>
|
||||
|
||||
@@ -3,18 +3,18 @@
|
||||
</div>
|
||||
<nav>
|
||||
<div class="container">
|
||||
<a href="{{ .Site.BaseURL }}">{{ i18n "home" }}</a>
|
||||
<a href="{{ .Site.Home.Permalink }}">{{ i18n "home" }}</a>
|
||||
<a href="{{ relref . "about" }}">{{ i18n "about" }}</a>
|
||||
{{ with .Site.Params.githubUsername }}
|
||||
<a href="https://github.com/{{ . }}">GitHub</a>
|
||||
{{ end }}
|
||||
{{ if .Site.Params.resumeStaticFile }}
|
||||
<a href="{{ .Site.BaseURL }}/{{ .Site.Params.resumeStaticFile }}">{{ i18n "resume" }}</a>
|
||||
<a href="{{ absLangURL .Site.Params.resumeStaticFile }}">{{ i18n "resume" }}</a>
|
||||
{{ end }}
|
||||
<a href="{{ .Site.BaseURL }}/tags">{{ i18n "tags" }}</a>
|
||||
<a href="{{ .Site.BaseURL }}/series">{{ i18n "series" }}</a>
|
||||
<a href="{{ .Site.BaseURL }}/favorites">{{ i18n "favorites" }}</a>
|
||||
<a href="{{ .Site.BaseURL }}/search">{{ i18n "search" }}</a>
|
||||
<a href="{{ site.Taxonomies.tags.Page.Permalink }}">{{ i18n "tags" }}</a>
|
||||
<a href="{{ site.Taxonomies.series.Page.Permalink }}">{{ i18n "series" }}</a>
|
||||
<a href="{{ relref . "favorites" }}">{{ i18n "favorites" }}</a>
|
||||
<a href="{{ relref . "search" }}">{{ i18n "search" }}</a>
|
||||
<a href="{{ relref . "blog" }}">{{ i18n "allPosts" }}</a>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
@@ -1 +1,11 @@
|
||||
{{ partial "group.html" (dict "url" .url "path" .path "comment" .comment "content" (highlight .code .language .opts)) }}
|
||||
{{- $highlightGroupAttrs := (printf "data-base-path=\"%s\" data-file-path=\"%v\"" .basePath .path) -}}
|
||||
{{- if (or .firstLine .lastLine) -}}
|
||||
{{- $highlightGroupAttrs = add $highlightGroupAttrs (printf " data-first-line=\"%v\" data-last-line=\"%v\"" .firstLine .lastLine) -}}
|
||||
{{- end -}}
|
||||
{{- if eq (lower .language) "agda" -}}
|
||||
{{- $highlightGroupAttrs = add $highlightGroupAttrs " data-agda-block" -}}
|
||||
{{- end -}}
|
||||
{{- with .offset -}}
|
||||
{{- $highlightGroupAttrs = add $highlightGroupAttrs (printf " data-source-offset=\"%v\"" .) -}}
|
||||
{{- end -}}
|
||||
{{ partial "group.html" (dict "url" .url "path" .path "comment" .comment "content" (highlight .code .language .opts) "attrs" $highlightGroupAttrs) }}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<svg class="feather">
|
||||
<svg class="feather" style="display: none;">
|
||||
<use xlink:href="/feather-sprite.svg#{{ . }}"/>
|
||||
</svg>
|
||||
{{- /* This comment is to remove trailing whitespace */ -}}
|
||||
|
||||
|
Before Width: | Height: | Size: 81 B After Width: | Height: | Size: 164 B |
8
layouts/partials/nameinseries.html
Normal file
8
layouts/partials/nameinseries.html
Normal file
@@ -0,0 +1,8 @@
|
||||
{{- $term := index (.page.GetTerms "series") 0 -}}
|
||||
{{- $divider := $term.Params.divider -}}
|
||||
{{- if (and $divider (strings.Contains .page.Title $divider)) -}}
|
||||
{{- $rest := after 1 (split .page.Title $divider) -}}
|
||||
{{- .scratch.Set "name" (delimit $rest $divider) -}}
|
||||
{{- else -}}
|
||||
{{- .scratch.Set "name" .page.Title -}}
|
||||
{{- end -}}
|
||||
@@ -1,12 +1,27 @@
|
||||
<li>
|
||||
<a href="{{ .Permalink }}" class="post-title">{{ if .Params.favorite }}{{ partial "icon.html" "star" }}{{ end }} {{ .Title }}</a>
|
||||
{{ if (not (eq .WordCount 0)) }}
|
||||
<p class="post-wordcount">{{ i18n "nWords" .WordCount }}, {{ i18n "nMinutesToRead" .ReadingTime }}.</p>
|
||||
{{- $scratch := newScratch -}}
|
||||
{{- if .seriesName -}}
|
||||
{{- partial "nameinseries" (dict "page" .page "scratch" $scratch) -}}
|
||||
{{- else -}}
|
||||
{{- $scratch.Set "name" (.page.Title) -}}
|
||||
{{- end -}}
|
||||
<a href="{{ .page.Permalink }}" class="post-title">{{ if .page.Params.favorite }}{{ partial "icon.html" "star" }}{{ end }} {{ $scratch.Get "name" }}</a>
|
||||
{{ if (not (eq .page.WordCount 0)) }}
|
||||
<p class="post-wordcount">{{ i18n "nWords" .page.WordCount }}, {{ i18n "nMinutesToRead" .page.ReadingTime }}.</p>
|
||||
{{ end }}
|
||||
{{ if .Params.status }}
|
||||
{{ if .page.Params.status }}
|
||||
<p class="post-status">
|
||||
{{ partial "seriesstatus.html" .Params.status }}
|
||||
{{ partial "seriesstatus.html" .page.Params.status }}
|
||||
</p>
|
||||
{{ end }}
|
||||
<p class="post-preview">{{ .Summary }} {{ if .Truncated }}. . .{{ end }}</p>
|
||||
<p class="post-preview">{{ partial "summary" .page }}</p>
|
||||
{{- if .linkSeries -}}
|
||||
{{- $term := index (.page.GetTerms "series") 0 -}}
|
||||
{{- with $term -}}
|
||||
<div class="series-link">
|
||||
{{- partial "icon.html" "corner-down-right" -}}
|
||||
<p>{{- i18n "latestInSeries" }} <a href="{{ $term.Permalink }}">{{ $term.Title }}</a></p>
|
||||
</div>
|
||||
{{- end -}}
|
||||
{{- end }}
|
||||
</li>
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
<div class="{{ .direction }} wrapper">
|
||||
<a href="{{ .link }}">
|
||||
<a href="{{ .page.RelPermalink }}">
|
||||
{{ if eq .direction "previous" }}{{ partial "icon.html" "chevrons-left" }}{{ end }}
|
||||
<div class="title-subtitle">
|
||||
{{ title .direction }} in Series
|
||||
{{ $divider := .term.Params.divider }}
|
||||
{{ if (and $divider (strings.Contains .page.Title $divider)) }}
|
||||
{{ $rest := after 1 (split .page.Title $divider) }}
|
||||
<div class="title">{{ delimit $rest $divider }}</div>
|
||||
{{ else }}
|
||||
<div class="title">{{ .page.Title }}</div>
|
||||
{{ end }}
|
||||
{{ $scratch := newScratch -}}
|
||||
{{- partial "nameinseries.html" (dict "page" .page "scratch" $scratch) -}}
|
||||
<div class="title">{{ $scratch.Get "name" }}</div>
|
||||
</div>
|
||||
{{ if eq .direction "next" }}{{ partial "icon.html" "chevrons-right" }}{{ end }}
|
||||
</a>
|
||||
|
||||
10
layouts/partials/serieslinkplaceholder.html
Normal file
10
layouts/partials/serieslinkplaceholder.html
Normal file
@@ -0,0 +1,10 @@
|
||||
<div class="{{ .direction }} wrapper">
|
||||
<div class="ongoing-placeholder">
|
||||
{{ if eq .direction "previous" }}{{ partial "icon.html" "chevrons-left" }}{{ end }}
|
||||
<div class="title-subtitle">
|
||||
{{ title .direction }} in Series
|
||||
<div class="title">Coming soon!</div>
|
||||
</div>
|
||||
{{ if eq .direction "next" }}{{ partial "icon.html" "chevrons-right" }}{{ end }}
|
||||
</div>
|
||||
</div>
|
||||
17
layouts/partials/seriesnav.html
Normal file
17
layouts/partials/seriesnav.html
Normal file
@@ -0,0 +1,17 @@
|
||||
{{- $page := . -}}
|
||||
{{- $term := index (.GetTerms "series") 0 -}}
|
||||
{{- with $term -}}
|
||||
{{- /* No idea why the 'Reverse' is needed? */ -}}
|
||||
{{- $pages := (site.Taxonomies.series.Get .Data.Term).Pages.ByDate.Reverse -}}
|
||||
<nav class="series-navigation">
|
||||
{{- with $pages.Prev $page -}}
|
||||
{{- partial "serieslink.html" (dict "direction" "previous" "page" .) -}}
|
||||
{{- end -}}
|
||||
{{- $nextPage := $pages.Next $page -}}
|
||||
{{- if $nextPage -}}
|
||||
{{- partial "serieslink.html" (dict "direction" "next" "page" $nextPage) -}}
|
||||
{{- else if eq $term.Params.status "ongoing" -}}
|
||||
{{- partial "serieslinkplaceholder.html" (dict "direction" "next") -}}
|
||||
{{- end -}}
|
||||
</nav>
|
||||
{{- end -}}
|
||||
5
layouts/partials/summary.html
Normal file
5
layouts/partials/summary.html
Normal file
@@ -0,0 +1,5 @@
|
||||
{{- if .Params.summary -}}
|
||||
{{ .Params.summary }}
|
||||
{{- else -}}
|
||||
{{ .Summary | plainify | truncate 180 }}
|
||||
{{- end -}}
|
||||
14
layouts/partials/uniquebyseries.html
Normal file
14
layouts/partials/uniquebyseries.html
Normal file
@@ -0,0 +1,14 @@
|
||||
{{- $scratch := .scratch -}}
|
||||
{{- $scratch.Set "pages" slice -}}
|
||||
{{- $tmpScratch := newScratch -}}
|
||||
{{- range $post := (where (where site.Pages.ByDate.Reverse "Section" "blog") ".Kind" "!=" "section") -}}
|
||||
{{- $term := index ($post.GetTerms "series") 0 -}}
|
||||
{{- if $term -}}
|
||||
{{- if not ($tmpScratch.Get $term.Permalink) -}}
|
||||
{{- $tmpScratch.Set $term.Permalink true -}}
|
||||
{{- $scratch.Add "pages" $post -}}
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
{{- $scratch.Add "pages" $post -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
@@ -2,7 +2,7 @@
|
||||
<h2>{{ .Title }} </h2>
|
||||
{{ .Content }}
|
||||
|
||||
{{ $search := resources.Get "scss/search.scss" | resources.ToCSS | resources.Minify }}
|
||||
{{ $search := resources.Get "scss/search.scss" | css.Sass | resources.Minify }}
|
||||
<link rel="stylesheet" href="{{ $search.Permalink }}" media="screen">
|
||||
|
||||
<div class="stork-wrapper">
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
<p>{{ partial "seriesstatus.html" .Params.status }}</p>
|
||||
<p>{{ i18n "postsFromTo" (dict "from" $startYear "to" $endYear) }}</p>
|
||||
</div>
|
||||
<p>{{ .Summary }}</p>
|
||||
<p>{{ partial "summary" . }}</p>
|
||||
|
||||
<ul class="post-list">
|
||||
{{ range $pages }}
|
||||
{{ partial "post.html" . }}
|
||||
{{ partial "post.html" (dict "page" . "seriesName" true) }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
{{ end }}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
<ul class="post-list">
|
||||
{{ range sort .Pages "Title" }}
|
||||
{{ partial "post.html" . }}
|
||||
{{ partial "post.html" (dict "page" .) }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
{{ end }}
|
||||
|
||||
21
layouts/shortcodes/bergamot_exercise.html
Normal file
21
layouts/shortcodes/bergamot_exercise.html
Normal file
@@ -0,0 +1,21 @@
|
||||
<div class="bergamot-exercise">
|
||||
<details open>
|
||||
<summary>
|
||||
<span class="bergamot-exercise-label">
|
||||
<span class="bergamot-exercise-number"></span>
|
||||
{{ if or (eq (.Get "label") "") (eq (.Get "label") nil) }}{{ else }}({{ .Get "label" }}){{ end }}:
|
||||
</span>
|
||||
</summary>
|
||||
{{ transform.Markdownify .Inner }}
|
||||
|
||||
<div class="bergamot-button-group">
|
||||
{{ if or (eq (.Get "preset") "") (eq (.Get "preset") nil) }}
|
||||
{{ else }}
|
||||
<button class="bergamot-button bergamot-play" onclick='window.Bergamot.runPreset(this.parentElement, "bergamot-widget-container-{{ .Get "id" }}", "{{ .Get "preset" }}")'>{{ partial "icon.html" "play" }}Start Bergamot</button>
|
||||
<button class="bergamot-button bergamot-close bergamot-hidden" onclick='window.Bergamot.close(this.parentElement, "bergamot-widget-container-{{ .Get "id" }}")'>{{ partial "icon.html" "x" }}Close Bergamot</button>
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
<div id="bergamot-widget-container-{{ .Get "id" }}"></div>
|
||||
</details>
|
||||
</div>
|
||||
8
layouts/shortcodes/bergamot_widget.html
Normal file
8
layouts/shortcodes/bergamot_widget.html
Normal file
@@ -0,0 +1,8 @@
|
||||
<div id="{{ .Get "id" }}"></div>
|
||||
<script>
|
||||
window.addEventListener('load', function() {
|
||||
window.Bergamot.run(null, '{{ .Get "id" }}',
|
||||
{{ partial "bergamotparseinputmodes.js" (.Get "modes") | safeJS }},
|
||||
'{{ .Get "prompt" }}', '{{ .Inner }}', '{{ default "default" (.Get "rendering") }}', '{{ .Get "query" }}');
|
||||
});
|
||||
</script>
|
||||
@@ -1,3 +1,3 @@
|
||||
<div class="block">
|
||||
{{ .Inner }}
|
||||
{{- .Inner -}}
|
||||
</div>
|
||||
|
||||
@@ -1,2 +1,12 @@
|
||||
{{ partial "geturl.html" (dict "scratch" .Scratch "path" (.Get 1) "siteSourceUrl" .Site.Params.siteSourceUrl "submoduleLinks" .Site.Data.submodules) }}
|
||||
{{ partial "highlightgroup.html" (dict "url" (.Scratch.Get "bestUrl") "path" (.Get 1) "comment" ", entire file" "code" (readFile (printf "code/%s" (.Get 1))) "language" (.Get 0) "opts" "linenos=table") }}
|
||||
{{- $scratch := newScratch -}}
|
||||
{{- partial "geturl.html" (dict "scratch" $scratch "path" (.Get 1)) -}}
|
||||
{{- $groupconfig := dict
|
||||
"url" ($scratch.Get "bestUrl")
|
||||
"basePath" ($scratch.Get "bestPath")
|
||||
"path" (.Get 1)
|
||||
"comment" ", entire file"
|
||||
"code" (readFile (printf "code/%s" (.Get 1)))
|
||||
"language" (.Get 0)
|
||||
"opts" "linenos=table"
|
||||
-}}
|
||||
{{- partial "highlightgroup.html" $groupconfig -}}
|
||||
|
||||
@@ -1,29 +1,59 @@
|
||||
{{ $source := (readFile (printf "code/%s" (.Get 1))) }}
|
||||
{{ $allLines := split $source "\n" }}
|
||||
{{ if not (eq (int (.Get 2)) 1) }}
|
||||
{{ .Scratch.Set "remLines" (after (sub (int (.Get 2)) 1) $allLines) }}
|
||||
{{ else }}
|
||||
{{ .Scratch.Set "remLines" $allLines }}
|
||||
{{ end }}
|
||||
{{ $lines := first (add (sub (int (.Get 3)) (int (.Get 2))) 1) (.Scratch.Get "remLines") }}
|
||||
{{- $source := (readFile (printf "code/%s" (.Get 1))) -}}
|
||||
{{- $allLines := split $source "\n" -}}
|
||||
{{- $scratch := newScratch -}}
|
||||
{{- $remLines := $allLines -}}
|
||||
{{- if not (eq (int (.Get 2)) 1) -}}
|
||||
{{- $remLines = after (sub (int (.Get 2)) 1) $allLines -}}
|
||||
{{- end -}}
|
||||
{{- $lines := first (add (sub (int (.Get 3)) (int (.Get 2))) 1) $remLines -}}
|
||||
|
||||
{{ if (.Get 4) }}
|
||||
{{ .Scratch.Set "opts" (printf ",%s" (.Get 4)) }}
|
||||
{{ else }}
|
||||
{{ .Scratch.Set "opts" "" }}
|
||||
{{ end }}
|
||||
{{- $opts := "" -}}
|
||||
{{- if (.Get 4) -}}
|
||||
{{- $opts = printf ",%s" (.Get 4) -}}
|
||||
{{- end -}}
|
||||
|
||||
{{ if (.Get 5) }}
|
||||
{{ .Scratch.Set "hidden" (.Get 5) }}
|
||||
{{ end }}
|
||||
{{- if (.Get 5) -}}
|
||||
{{- $scratch.Set "hidden" (.Get 5) -}}
|
||||
{{- end -}}
|
||||
|
||||
{{ partial "geturl.html" (dict "scratch" .Scratch "path" (.Get 1) "siteSourceUrl" .Site.Params.siteSourceUrl "submoduleLinks" .Site.Data.submodules) }}
|
||||
{{ partial "linerangestr.html" (dict "scratch" .Scratch "from" (.Get 2) "to" (.Get 3)) }}
|
||||
{{- $prefixLength := "" -}}
|
||||
{{- $joinedLines := "" -}}
|
||||
{{- if or (.Page.Params.left_align_code) (.Get 6) -}}
|
||||
{{- $prefixLength = -1 -}}
|
||||
{{- range $line := $lines -}}
|
||||
{{- $leading := sub (len $line) (len (strings.TrimLeft " " $line)) -}}
|
||||
{{- if and (ne $line "") (or (eq $prefixLength -1) (le $leading $prefixLength)) -}}
|
||||
{{- $prefixLength = $leading -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{ with (.Scratch.Get "hidden") }}
|
||||
<details><summary>{{ . | markdownify }}</summary>
|
||||
{{ end }}
|
||||
{{ partial "highlightgroup.html" (dict "url" (.Scratch.Get "bestUrl") "path" (.Get 1) "comment" (.Scratch.Get "comment") "code" (delimit $lines "\n") "language" (.Get 0) "opts" (printf "linenos=table,linenostart=%d%s" (.Get 2) (.Scratch.Get "opts"))) }}
|
||||
{{ with (.Scratch.Get "hidden") }}
|
||||
{{- range $line := $lines -}}
|
||||
{{- $joinedLines = add $joinedLines (substr $line $prefixLength) -}}
|
||||
{{- $joinedLines = add $joinedLines "\n" -}}
|
||||
{{- end -}}
|
||||
{{- else -}}
|
||||
{{- $joinedLines = delimit $lines "\n" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- partial "geturl.html" (dict "scratch" $scratch "path" (.Get 1) "lines" (slice (.Get 2) (.Get 3))) -}}
|
||||
{{- partial "linerangestr.html" (dict "scratch" $scratch "from" (.Get 2) "to" (.Get 3)) -}}
|
||||
|
||||
{{- with ($scratch.Get "hidden") -}}
|
||||
<details><summary>{{- . | markdownify -}}</summary>
|
||||
{{- end -}}
|
||||
{{- $groupconfig := dict
|
||||
"url" ($scratch.Get "bestUrl")
|
||||
"basePath" ($scratch.Get "bestPath")
|
||||
"path" (.Get 1)
|
||||
"comment" ($scratch.Get "comment")
|
||||
"code" $joinedLines
|
||||
"firstLine" (int (.Get 2))
|
||||
"lastLine" (int (.Get 3))
|
||||
"language" (.Get 0)
|
||||
"offset" $prefixLength
|
||||
"opts" (printf "linenos=table,linenostart=%d%s" (.Get 2) $opts)
|
||||
-}}
|
||||
{{- partial "highlightgroup.html" $groupconfig -}}
|
||||
{{- with ($scratch.Get "hidden") -}}
|
||||
</details>
|
||||
{{ end }}
|
||||
{{- end -}}
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
{{ partial "geturl.html" (dict "scratch" .Scratch "path" (.Get 0) "siteSourceUrl" .Site.Params.siteSourceUrl "submoduleLinks" .Site.Data.submodules) }}
|
||||
{{- .Scratch.Get "bestUrl" -}}
|
||||
{{- $scratch := newScratch -}}
|
||||
{{- partial "geturl.html" (dict "scratch" $scratch "path" (.Get 0)) -}}
|
||||
{{- $scratch.Get "bestUrl" -}}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<details>
|
||||
<summary>{{ .Get "summary" | markdownify }}</summary>
|
||||
{{ .Inner | markdownify }}
|
||||
<summary>{{- .Get "summary" | markdownify -}}</summary>
|
||||
{{- .Inner | markdownify -}}
|
||||
</details>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<p class="dialog">
|
||||
{{ .Inner }}
|
||||
{{- .Inner -}}
|
||||
</p>
|
||||
|
||||
6
layouts/shortcodes/draftlink.html
Normal file
6
layouts/shortcodes/draftlink.html
Normal file
@@ -0,0 +1,6 @@
|
||||
{{- $page := site.GetPage (.Get 1) -}}
|
||||
{{- if $page -}}
|
||||
<a href="{{ $page.RelPermalink }}">{{ .Get 0 }}</a>
|
||||
{{- else -}}
|
||||
<span class="draft-link">{{ .Get 0 }} (coming soon)</span>
|
||||
{{- end -}}
|
||||
@@ -5,6 +5,7 @@
|
||||
{{- $line := .Get 4 -}}
|
||||
{{- $lines := split (trim .Inner "\n") "\n" -}}
|
||||
|
||||
{{- $scratch := newScratch -}}
|
||||
{{- $url := printf "https://github.com/%s/blob/%s/%s#L%d" $repo $commit $file $line -}}
|
||||
{{- partial "linerangestr.html" (dict "scratch" .Scratch "from" 0 "to" $line) -}}
|
||||
{{- partial "highlightgroup.html" (dict "url" $url "path" $file "comment" (.Scratch.Get "comment") "code" (trim .Inner "\n") "language" $lang) -}}
|
||||
{{- partial "linerangestr.html" (dict "scratch" $scratch "from" 0 "to" $line) -}}
|
||||
{{- partial "highlightgroup.html" (dict "url" $url "path" $file "comment" ($scratch.Get "comment") "code" (trim .Inner "\n") "language" $lang) -}}
|
||||
|
||||
12
layouts/shortcodes/internal.html
Normal file
12
layouts/shortcodes/internal.html
Normal file
@@ -0,0 +1,12 @@
|
||||
{{- $name := .Get 0 -}}
|
||||
{{- $number := 1 -}}
|
||||
{{- with .Page.Scratch.Get "internal-ref-counter" -}}
|
||||
{{- $number = add . 1 }}
|
||||
{{- end -}}
|
||||
{{- .Page.Scratch.Set "internal-ref-counter" $number -}}
|
||||
{{- .Page.Scratch.SetInMap "internal-ref" $name $number -}}
|
||||
|
||||
<span class="internal-ref" id="internal-ref-{{ $name }}">
|
||||
{{ .Inner }}
|
||||
<span class="internal-ref-counter">{{ $number }}</span></span>
|
||||
{{- /* chomp whitespace at the end */ -}}
|
||||
7
layouts/shortcodes/internalref.html
Normal file
7
layouts/shortcodes/internalref.html
Normal file
@@ -0,0 +1,7 @@
|
||||
{{- $name := .Get 0 -}}
|
||||
{{- $number := index (.Page.Scratch.Get "internal-ref") $name -}}
|
||||
|
||||
<a href="#internal-ref-{{ $name }}">
|
||||
{{ .Inner }}
|
||||
<span class="internal-ref-counter">{{ $number }}</span></a>
|
||||
{{- /* chomp whitespace at the end */ -}}
|
||||
@@ -1,10 +1,10 @@
|
||||
<span class="message side-{{ .Get 0 }}">
|
||||
<span class="message-sender">
|
||||
{{ if (eq (.Get 1) "reader") }}
|
||||
{{ partial "icon.html" "moon" }}
|
||||
{{ else }}
|
||||
{{ partial "icon.html" "sun" }}
|
||||
{{ end }}
|
||||
{{- if (eq (.Get 1) "reader") -}}
|
||||
{{- partial "icon.html" "moon" -}}
|
||||
{{- else -}}
|
||||
{{- partial "icon.html" "sun" -}}
|
||||
{{- end -}}
|
||||
</span>
|
||||
<span class="message-text">{{ .Inner }}</span>
|
||||
<span class="message-text">{{- .Inner -}}</span>
|
||||
</span>
|
||||
|
||||
@@ -1,2 +1,10 @@
|
||||
{{ partial "geturl.html" (dict "scratch" .Scratch "path" (.Get 0) "siteSourceUrl" .Site.Params.siteSourceUrl "submoduleLinks" .Site.Data.submodules) }}
|
||||
{{ partial "group.html" (dict "url" (.Scratch.Get "bestUrl") "path" (.Get 0) "comment" ", entire file" "content" (safeHTML (printf "<pre><code>%s</code></pre>" (htmlEscape (readFile (printf "code/%s" (.Get 0))))))) }}
|
||||
{{- $scratch := newScratch -}}
|
||||
{{- partial "geturl.html" (dict "scratch" $scratch "path" (.Get 0) "siteSourceUrl" .Site.Params.siteSourceUrl "submoduleLinks" .Site.Data.submodules) -}}
|
||||
{{- $groupconfig := dict
|
||||
"url" ($scratch.Get "bestUrl")
|
||||
"basePath" ($scratch.Get "bestPath")
|
||||
"path" (.Get 0)
|
||||
"comment" ", entire file"
|
||||
"content" (safeHTML (printf "<pre><code>%s</code></pre>" (htmlEscape (readFile (printf "code/%s" (.Get 0))))))
|
||||
-}}
|
||||
{{- partial "group.html" $groupconfig -}}
|
||||
|
||||
3
layouts/shortcodes/seriesnav.html
Normal file
3
layouts/shortcodes/seriesnav.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<div class="early-navigation-wrapper">
|
||||
{{ partial "seriesnav.html" .Page }}
|
||||
</div>
|
||||
3
layouts/shortcodes/sidebyside.html
Normal file
3
layouts/shortcodes/sidebyside.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<div class="side-by-side">
|
||||
{{ .Inner }}
|
||||
</div>
|
||||
3
layouts/shortcodes/sidebysideitem.html
Normal file
3
layouts/shortcodes/sidebysideitem.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<div class="side-by-side-item" {{ with .Get "weight" }} style="flex-grow: {{ . }};" {{ end }}>
|
||||
{{ .Inner }}
|
||||
</div>
|
||||
@@ -1,13 +1,13 @@
|
||||
<span class="sidenote">
|
||||
<label class="sidenote-label" for="{{ .Get 1 }}">{{ .Get 2 }}</label>
|
||||
<input class="sidenote-checkbox" type="checkbox" id="{{ .Get 1 }}"></input>
|
||||
{{ if $offset := .Get 3 }}
|
||||
<span class="sidenote-content sidenote-{{ .Get 0 }}" style="margin-top: {{ $offset }}rem">
|
||||
{{ else }}
|
||||
<span class="sidenote-content sidenote-{{ .Get 0 }}">
|
||||
{{ end }}
|
||||
<span class="sidenote-delimiter">[{{ i18n "note" }}:</span>
|
||||
{{ .Inner }}
|
||||
<label class="sidenote-label" for="{{- .Get 1 -}}">{{- .Get 2 | markdownify -}}</label>
|
||||
<input class="sidenote-checkbox" style="display: none;" type="checkbox" id="{{- .Get 1 -}}"></input>
|
||||
{{- if $offset := .Get 3 -}}
|
||||
<span class="sidenote-content sidenote-{{- .Get 0 -}}" style="margin-top: {{- $offset -}}rem">
|
||||
{{- else -}}
|
||||
<span class="sidenote-content sidenote-{{- .Get 0 -}}">
|
||||
{{- end -}}
|
||||
<span class="sidenote-delimiter">[{{- i18n "note" -}}:</span>
|
||||
{{- .Inner -}}
|
||||
<span class="sidenote-delimiter">]</span>
|
||||
</span>
|
||||
</span>
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
<div style="background-color: tomato; color: white; padding: 10px;">
|
||||
<em>TODO: </em>{{ .Inner }}
|
||||
</div>
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
<ul class="post-list">
|
||||
{{ range .Pages.ByDate.Reverse }}
|
||||
{{ partial "post.html" . }}
|
||||
{{ partial "post.html" (dict "page" .) }}
|
||||
{{ end }}
|
||||
</ul>
|
||||
{{ end }}
|
||||
|
||||
BIN
static/fonts/Inconsolata-VariableFont_wdth,wght.ttf
Normal file
BIN
static/fonts/Inconsolata-VariableFont_wdth,wght.ttf
Normal file
Binary file not shown.
BIN
static/fonts/Lora-Italic-VariableFont_wght.ttf
Normal file
BIN
static/fonts/Lora-Italic-VariableFont_wght.ttf
Normal file
Binary file not shown.
BIN
static/fonts/Lora-VariableFont_wght.ttf
Normal file
BIN
static/fonts/Lora-VariableFont_wght.ttf
Normal file
Binary file not shown.
BIN
static/fonts/Raleway-Italic-VariableFont_wght.ttf
Normal file
BIN
static/fonts/Raleway-Italic-VariableFont_wght.ttf
Normal file
Binary file not shown.
BIN
static/fonts/Raleway-VariableFont_wght.ttf
Normal file
BIN
static/fonts/Raleway-VariableFont_wght.ttf
Normal file
Binary file not shown.
BIN
static/fonts/STIXGeneral-Regular.ttf
Normal file
BIN
static/fonts/STIXGeneral-Regular.ttf
Normal file
Binary file not shown.
BIN
static/fonts/gen/Inconsolata-400.woff2
Normal file
BIN
static/fonts/gen/Inconsolata-400.woff2
Normal file
Binary file not shown.
BIN
static/fonts/gen/Lora-Italic.woff2
Normal file
BIN
static/fonts/gen/Lora-Italic.woff2
Normal file
Binary file not shown.
BIN
static/fonts/gen/Lora-Regular.woff2
Normal file
BIN
static/fonts/gen/Lora-Regular.woff2
Normal file
Binary file not shown.
BIN
static/fonts/gen/Raleway-400-Italic.woff2
Normal file
BIN
static/fonts/gen/Raleway-400-Italic.woff2
Normal file
Binary file not shown.
BIN
static/fonts/gen/Raleway-400.woff2
Normal file
BIN
static/fonts/gen/Raleway-400.woff2
Normal file
Binary file not shown.
BIN
static/fonts/gen/Raleway-700-Italic.woff2
Normal file
BIN
static/fonts/gen/Raleway-700-Italic.woff2
Normal file
Binary file not shown.
BIN
static/fonts/gen/Raleway-700.woff2
Normal file
BIN
static/fonts/gen/Raleway-700.woff2
Normal file
Binary file not shown.
Reference in New Issue
Block a user