Making much progress.
This commit is contained in:
parent
e8041c74df
commit
47f16f0e30
21
README.md
21
README.md
|
@ -25,33 +25,50 @@ Zola itself. Eventually, though, I'm going to add whatever scraps I have lying
|
||||||
around for some, perhaps most, of the following topics, since I've worked in all
|
around for some, perhaps most, of the following topics, since I've worked in all
|
||||||
of them:
|
of them:
|
||||||
|
|
||||||
|
- .NET compilation chain
|
||||||
|
- Aloq
|
||||||
- Apache Configuration
|
- Apache Configuration
|
||||||
|
- Assembly
|
||||||
|
- Audio & Music production
|
||||||
- Bash
|
- Bash
|
||||||
- Bash Customization
|
- Bash Customization
|
||||||
- C
|
- C
|
||||||
- C++
|
- C++
|
||||||
- CMake
|
- CMake
|
||||||
- Clojure
|
- Clojure
|
||||||
|
- Cobol
|
||||||
- Django
|
- Django
|
||||||
- ESlint
|
- ESlint
|
||||||
- Emacs
|
- Emacs
|
||||||
- F#
|
- F#
|
||||||
- Git & Pre-Commit
|
- Git & Pre-Commit
|
||||||
- Go
|
- Go
|
||||||
|
- Graphic design
|
||||||
|
- HAML
|
||||||
- HTML & CSS
|
- HTML & CSS
|
||||||
|
- Handbrake Cookbook
|
||||||
- Haskell
|
- Haskell
|
||||||
|
- ID3V2
|
||||||
|
- Imagemagick
|
||||||
- Javascript
|
- Javascript
|
||||||
|
- Kanren
|
||||||
|
- Kubernetes
|
||||||
- Linux Administration
|
- Linux Administration
|
||||||
- Linux Software Development
|
- Linux Software Development
|
||||||
- Lisp
|
- Lisp
|
||||||
- Lit-HTML
|
- Lit-HTML
|
||||||
|
- Machine learning
|
||||||
- Makefiles
|
- Makefiles
|
||||||
- Markdown
|
- Markdown
|
||||||
|
- Mate / Gnome customization
|
||||||
- Nginx Configuration
|
- Nginx Configuration
|
||||||
- Org-mode
|
- Org mode
|
||||||
|
- PHP
|
||||||
|
- PNM Suite
|
||||||
- Perl
|
- Perl
|
||||||
- Podman
|
- Podman
|
||||||
- Prettier
|
- Prettier
|
||||||
|
- Prolog
|
||||||
- Python
|
- Python
|
||||||
- Rails
|
- Rails
|
||||||
- React
|
- React
|
||||||
|
@ -61,8 +78,10 @@ of them:
|
||||||
- SQL
|
- SQL
|
||||||
- Sass
|
- Sass
|
||||||
- Scheme
|
- Scheme
|
||||||
|
- Snobol
|
||||||
- Typescript
|
- Typescript
|
||||||
- Vite
|
- Vite
|
||||||
|
- Wasm
|
||||||
- Web Components
|
- Web Components
|
||||||
- X86 Assembly
|
- X86 Assembly
|
||||||
- XCB / X11 Systems Programming
|
- XCB / X11 Systems Programming
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
* Organization
|
||||||
|
** TODO Figure out weight/taxonomy scheme for home page.
|
||||||
|
** TODO Implement multiple cards
|
||||||
|
** TODO Sidebar - what navigation should be in sidebar?
|
||||||
|
** TODO Menu - Megamenu on other pages, but always link back to home
|
||||||
|
*** Check out Asana's nifty morph in their mobile transition; looks like pure CSS
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
+++
|
||||||
|
title = "Git Notes"
|
||||||
|
description = "Basic documentation of Git"
|
||||||
|
date = 2022-04-27T18:00:00+00:00
|
||||||
|
updated = 2022-04-27T18:00:00+00:00
|
||||||
|
template = "docs/section.html"
|
||||||
|
sort_by = "weight"
|
||||||
|
weight = 6
|
||||||
|
draft = false
|
||||||
|
[taxonomies]
|
||||||
|
documentation=["Reference"]
|
||||||
|
categories=["Git", "Version Control", "VCS"]
|
||||||
|
+++
|
||||||
|
|
||||||
|
[Git](https://git-scm.com/) is the most widely used version control system (or
|
||||||
|
source configuration management) tool. Pretty much everything I do uses Git.
|
||||||
|
This is where I keep my notes on how to do things.
|
||||||
|
|
||||||
|
## Starting a project
|
||||||
|
|
||||||
|
Git is project and folder-centered, and to start using git go to the root folder
|
||||||
|
of a project you want to place under source control and initialize it:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ mkdir a-new-project
|
||||||
|
$ git init
|
||||||
|
```
|
||||||
|
|
||||||
|
This creates a new folder, `.git`, where Git will store your commit history and
|
||||||
|
some configuration details.
|
||||||
|
|
||||||
|
## Putting files into git
|
||||||
|
|
||||||
|
To put files under source control, you must add them. To update the entire
|
||||||
|
folder, switch to the root of the project and add _all_ of it:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ git add .
|
||||||
|
$ git commit
|
||||||
|
```
|
||||||
|
|
||||||
|
An editor will pop-up, asking you what this commit is about. It's generally
|
||||||
|
polite, especially if you're working in a team, to explain your commit in some
|
||||||
|
detail-- and to generally keep the commit small, in order to ensure that you
|
||||||
|
don't have to explain too much!
|
||||||
|
|
||||||
|
If your commit message could be a single line, you can add it directly from the
|
||||||
|
command line:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ git add .
|
||||||
|
$ git commit -m "Updated the widget to widgetize."
|
||||||
|
```
|
||||||
|
|
||||||
|
... and you can even combine both commands, but be careful: this command will
|
||||||
|
not add any files that are new. It will only commit existing files that have
|
||||||
|
been modified, and will delete any files that you have deleted, from the
|
||||||
|
repository. (Deleted files still exist in the history and can always be
|
||||||
|
recovered.)
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ git commit -am "Updated the widget to widgetize."
|
||||||
|
```
|
||||||
|
|
||||||
|
## Git Configuration
|
||||||
|
|
||||||
|
You can have a global Git configuration file, `$HOME/\.gitconfig`, in which you
|
||||||
|
keep your personal information and command aliases, which is one of three ways
|
||||||
|
you can add your own commands to Git.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
[user]
|
||||||
|
name = Elf M. Sternberg
|
||||||
|
email = someguy@example.com
|
||||||
|
|
||||||
|
[alias]
|
||||||
|
unstage = reset -q HEAD --
|
||||||
|
nevermind = !git reset --hard HEAD && git clean -d -f
|
||||||
|
wip = for-each-ref --sort='authordate:iso8601' --format='%(color:green)%(authordate:relative)%09%(color:white)%(refname:short)' refs/heads
|
||||||
|
stem = "!f() { git checkout -b $1 master; }; f"
|
||||||
|
start = !git init && git commit --allow-empty -m \"Initial commit\"
|
||||||
|
```
|
||||||
|
|
||||||
|
I'll explain each of these eventually, but for now, just know that if you want
|
||||||
|
your commits to be attributed to the right person, you must have the `[user]`
|
||||||
|
block, and
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
+++
|
||||||
|
title = "Zola Cookbook"
|
||||||
|
description = "Snippets I've developed that I want to keep"
|
||||||
|
date = 2022-04-27T18:00:00+00:00
|
||||||
|
updated = 2022-04-27T18:00:00+00:00
|
||||||
|
template = "docs/section.html"
|
||||||
|
sort_by = "weight"
|
||||||
|
weight = 5
|
||||||
|
draft = false
|
||||||
|
[taxonomies]
|
||||||
|
documentation=["Reference"]
|
||||||
|
categories=["Web Development", "Static Site Generation", "Zola"]
|
||||||
|
+++
|
||||||
|
|
||||||
|
[Zola](../zola) is the static site generator I use for most of my websites that
|
||||||
|
don't require much dynamic functionality.
|
||||||
|
|
||||||
|
## Generating Nested Lists from Data
|
||||||
|
|
||||||
|
Example data:
|
||||||
|
|
||||||
|
```html
|
||||||
|
{
|
||||||
|
"definitions": [
|
||||||
|
{ "dt": "undefined", "dd": " the thing is undefined." },
|
||||||
|
{ "dt": "defined", "dd": " the thing is defined.", definitions: [
|
||||||
|
{ "dt": "truthy", "dd": "the defined thing is truthy" },
|
||||||
|
{ "dt": "falsy", "dd": "the defined thing is falsy" }
|
||||||
|
]}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Tera macro to render a nested list:
|
||||||
|
|
||||||
|
```
|
||||||
|
{% macro definition_body(source) %}
|
||||||
|
<dl>
|
||||||
|
{% for entry in source %}
|
||||||
|
<dt><kbd>{{ entry.dt | safe }}</kbd></dt>
|
||||||
|
<dd>
|
||||||
|
{{ entry.dd | safe }}
|
||||||
|
{% if entry.definitions %}
|
||||||
|
{{ self::definition_body(source=entry.definitions) }}
|
||||||
|
{% endif %}
|
||||||
|
</dd>
|
||||||
|
{% endfor %}
|
||||||
|
</dl>
|
||||||
|
{% endmacro %}
|
||||||
|
```
|
||||||
|
|
||||||
|
Zola shortcode to import the macro template into Markdown and start the render:
|
||||||
|
|
||||||
|
```
|
||||||
|
{%- import 'macros/definition_body.html' as renderer -%}
|
||||||
|
<div>
|
||||||
|
{% set content = load_data(path=source) %}
|
||||||
|
{{ renderer::definition_body(source=content.definitions) }}
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
Invocation in Markdown file, providing the data source:
|
||||||
|
|
||||||
|
```
|
||||||
|
{{ definition_list(source="@/docs/zola/definitions.json") }}
|
||||||
|
```
|
||||||
|
|
|
@ -107,6 +107,8 @@ Conditional statements are managed with `if/is ... else ... endif`
|
||||||
|
|
||||||
The list of `is` tests that are shipped with Zola are:
|
The list of `is` tests that are shipped with Zola are:
|
||||||
|
|
||||||
|
{{ definition_list(source="@/docs/zola/predicates.yaml") }}
|
||||||
|
|
||||||
- `defined`: the given variable is defined.
|
- `defined`: the given variable is defined.
|
||||||
- `undefined`: the given variable is undefined.
|
- `undefined`: the given variable is undefined.
|
||||||
- `odd`: the given variable is an odd number.
|
- `odd`: the given variable is an odd number.
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
{
|
||||||
|
"definitions": [
|
||||||
|
{ "dt": "defined", "dd": " the given variable is defined." },
|
||||||
|
{ "dt": "undefined", "dd": " the given variable is undefined." },
|
||||||
|
{ "dt": "odd", "dd": " the given variable is an odd number." },
|
||||||
|
{ "dt": "even", "dd": " the given variable is an even number." },
|
||||||
|
{ "dt": "string", "dd": " the given variable is a string." },
|
||||||
|
{ "dt": "number", "dd": " the given variable is a number." },
|
||||||
|
{ "dt": "divisibleby", "dd": " the given expression is divisible by the arg given." },
|
||||||
|
{
|
||||||
|
"dt": "iterable",
|
||||||
|
"dd": " Returns true if the given variable can be iterated over in Tera (i.e. is an array/tuple or an object)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dt": "object",
|
||||||
|
"dd": " Returns true if the given variable is an object (i.e. can be iterated over key, value)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dt": "starting_with(string)",
|
||||||
|
"dd": " Returns true if the given variable is a string and starts with the arg given."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dt": "ending_with(string)",
|
||||||
|
"dd": " Returns true if the given variable is a string and ends with the arg given."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dt": "containing(val)",
|
||||||
|
"dd": " Returns true if the given variable contains the arg given.",
|
||||||
|
"definitions": [
|
||||||
|
{ "dt": "strings", "dd": " is the arg a substring?" },
|
||||||
|
{ "dt": "arrays", "dd": " is the arg one of the members of the array?" },
|
||||||
|
{ "dt": "maps", "dd": " is the arg a key of the map?" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dt": "matching(regexp)",
|
||||||
|
"dd": " Returns true if the given variable is a string and matches the regex in the argument."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
---
|
||||||
|
definitions:
|
||||||
|
-
|
||||||
|
dt: "defined"
|
||||||
|
dd: " the given variable is defined."
|
||||||
|
-
|
||||||
|
dt: "undefined"
|
||||||
|
dd: " the given variable is undefined."
|
||||||
|
-
|
||||||
|
dt: "odd"
|
||||||
|
dd: " the given variable is an odd number."
|
||||||
|
-
|
||||||
|
dt: "even"
|
||||||
|
dd: " the given variable is an even number."
|
||||||
|
-
|
||||||
|
dt: "string"
|
||||||
|
dd: " the given variable is a string."
|
||||||
|
-
|
||||||
|
dt: "number"
|
||||||
|
dd: " the given variable is a number."
|
||||||
|
-
|
||||||
|
dt: "divisibleby"
|
||||||
|
dd: " the given expression is divisible by the arg given."
|
||||||
|
-
|
||||||
|
dt: "iterable"
|
||||||
|
dd: " Returns true if the given variable can be iterated over in Tera (i.e. is an array/tuple or an object)."
|
||||||
|
-
|
||||||
|
dt: "object"
|
||||||
|
dd: " Returns true if the given variable is an object (i.e. can be iterated over key, value)."
|
||||||
|
-
|
||||||
|
dt: "starting_with(string)"
|
||||||
|
dd: " Returns true if the given variable is a string and starts with the arg given."
|
||||||
|
-
|
||||||
|
dt: "ending_with(string)"
|
||||||
|
dd: " Returns true if the given variable is a string and ends with the arg given."
|
||||||
|
-
|
||||||
|
dt: "containing(val)"
|
||||||
|
dd: " Returns true if the given variable contains the arg given."
|
||||||
|
definitions:
|
||||||
|
-
|
||||||
|
dt: "strings"
|
||||||
|
dd: " is the arg a substring?"
|
||||||
|
-
|
||||||
|
dt: "arrays"
|
||||||
|
dd: " is the arg one of the members of the array?"
|
||||||
|
-
|
||||||
|
dt: "maps"
|
||||||
|
dd: " is the arg a key of the map?"
|
||||||
|
-
|
||||||
|
dt: "matching(regexp)"
|
||||||
|
dd: " Returns true if the given variable is a string and matches the regex in the argument."
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
{% macro definition_body(source) %}
|
||||||
|
<dl>
|
||||||
|
{% for entry in source %}
|
||||||
|
<dt><kbd>{{ entry.dt | safe }}</kbd></dt>
|
||||||
|
<dd>{{ entry.dd | safe }}</dd>
|
||||||
|
{% if entry.definitions %}{{ self::definition_body(source=entry.definitions) }}{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</dl>
|
||||||
|
{% endmacro %}
|
|
@ -0,0 +1,5 @@
|
||||||
|
{%- import 'macros/definition_body.html' as renderer -%}
|
||||||
|
<div>
|
||||||
|
{% set content = load_data(path=source) %}
|
||||||
|
{{ renderer::definition_body(source=content.definitions) }}
|
||||||
|
</div>
|
Loading…
Reference in New Issue