Compare commits
5 Commits
009877ae76
...
priority-e
| Author | SHA1 | Date | |
|---|---|---|---|
| 33ba8b19b6 | |||
| 21dc56aa6d | |||
| 7df5daaa6c | |||
| 4f74dd5fe0 | |||
| 0751849492 |
@@ -43,8 +43,47 @@ function get_title(path, default_title, full_path, line, title, in_fm) {
|
||||
return default_title
|
||||
}
|
||||
|
||||
function get_priority(path, full_path, line, prio, in_fm) {
|
||||
full_path = src "/" path
|
||||
if (path !~ /\.md$/) {
|
||||
full_path = full_path "/index.md"
|
||||
}
|
||||
|
||||
function compare_paths(p1, p2, parts1, parts2, n1, n2, i, name1, name2, lname1, lname2, w1, w2) {
|
||||
prio = ""
|
||||
in_fm = 0
|
||||
while ((getline line < full_path) > 0) {
|
||||
if (line ~ /^---[[:space:]]*$/) {
|
||||
if (in_fm == 0) {
|
||||
in_fm = 1
|
||||
continue
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
if (in_fm) {
|
||||
if (line ~ /^[[:space:]]*priority[[:space:]]*=/) {
|
||||
sub(/^[[:space:]]*priority[[:space:]]*=[[:space:]]*/, "", line)
|
||||
if (line ~ /^".*"$/) {
|
||||
prio = substr(line, 2, length(line) - 2)
|
||||
} else if (line ~ /^'.*'$/) {
|
||||
prio = substr(line, 2, length(line) - 2)
|
||||
} else {
|
||||
prio = line
|
||||
}
|
||||
break
|
||||
}
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
close(full_path)
|
||||
|
||||
if (prio != "" && prio + 0 == prio) return prio + 0
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
function compare_paths(p1, p2, parts1, parts2, n1, n2, i, k, name1, name2, lname1, lname2, pr1, pr2, dir1, dir2, ent1, ent2) {
|
||||
n1 = split(p1, parts1, "/")
|
||||
n2 = split(p2, parts2, "/")
|
||||
for (i = 1; i <= n1 && i <= n2; i++) {
|
||||
@@ -58,15 +97,37 @@ function compare_paths(p1, p2, parts1, parts2, n1, n2, i, name1, name2, lname
|
||||
if (lname1 == "index" && i == n1 && lname2 != "index") return -1
|
||||
if (lname2 == "index" && i == n2 && lname1 != "index") return 1
|
||||
|
||||
w1 = (lname1 in custom_order ? custom_order[lname1] : 999999)
|
||||
w2 = (lname2 in custom_order ? custom_order[lname2] : 999999)
|
||||
if (lname1 != lname2) {
|
||||
dir1 = ""
|
||||
dir2 = ""
|
||||
for (k = 1; k < i; k++) {
|
||||
dir1 = (dir1 == "" ? parts1[k] : dir1 "/" parts1[k])
|
||||
dir2 = (dir2 == "" ? parts2[k] : dir2 "/" parts2[k])
|
||||
}
|
||||
|
||||
if (w1 < w2) return -1
|
||||
if (w1 > w2) return 1
|
||||
if (i == n1) {
|
||||
pr1 = get_priority(p1)
|
||||
} else {
|
||||
ent1 = (dir1 == "" ? name1 : dir1 "/" name1)
|
||||
pr1 = get_priority(ent1)
|
||||
}
|
||||
|
||||
if (i == n2) {
|
||||
pr2 = get_priority(p2)
|
||||
} else {
|
||||
ent2 = (dir2 == "" ? name2 : dir2 "/" name2)
|
||||
pr2 = get_priority(ent2)
|
||||
}
|
||||
|
||||
if (pr1 > 0 || pr2 > 0) {
|
||||
if (pr1 < pr2) return -1
|
||||
if (pr1 > pr2) return 1
|
||||
}
|
||||
|
||||
if (lname1 < lname2) return -1
|
||||
if (lname1 > lname2) return 1
|
||||
}
|
||||
}
|
||||
if (n1 < n2) return -1
|
||||
if (n1 > n2) return 1
|
||||
return 0
|
||||
@@ -76,7 +137,6 @@ BEGIN {
|
||||
src = ENVIRON["AWK_SRC"]
|
||||
single_file_index = ENVIRON["AWK_SINGLE_FILE_INDEX"]
|
||||
flatten = ENVIRON["AWK_FLATTEN"]
|
||||
order = ENVIRON["AWK_ORDER"]
|
||||
home_name = ENVIRON["AWK_HOME_NAME"]
|
||||
show_home_in_nav = ENVIRON["AWK_SHOW_HOME_IN_NAV"]
|
||||
dinfo = ENVIRON["AWK_DINFO"]
|
||||
@@ -87,16 +147,6 @@ BEGIN {
|
||||
d_dirs[dparts[1]] = dparts[3]
|
||||
}
|
||||
}
|
||||
|
||||
n_order = split(order, oparts, ",")
|
||||
for (i = 1; i <= n_order; i++) {
|
||||
name = oparts[i]
|
||||
sub(/^[[:space:]]*/, "", name)
|
||||
sub(/[[:space:]]*$/, "", name)
|
||||
if (name != "") {
|
||||
custom_order[tolower(name)] = i
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -375,6 +375,13 @@ function rewrite_img_tags(line, out, rest, tag, src, alt, force_inline_tag, e
|
||||
} else if (is_image_ext(ext_of(src)) && force_inline_tag == "") {
|
||||
# Preserve hand-written <img> attributes (style/class/etc) for normal images.
|
||||
repl = tag
|
||||
} else if (force_inline_tag != "" && !is_global_url(src) && is_inline_text_ext(ext_of(src))) {
|
||||
repl = render_code_include(src, 1)
|
||||
if (repl != "") {
|
||||
repl = "<pre><code>" repl "</code></pre>"
|
||||
} else {
|
||||
repl = render_embed(src, alt, (alt != ""), 1)
|
||||
}
|
||||
} else {
|
||||
repl = render_embed(src, alt, (alt != ""), (force_inline_tag != ""))
|
||||
}
|
||||
@@ -399,7 +406,12 @@ function rewrite_double_bang_with_parens(line, out, rest, token, inside, src,
|
||||
src = substr(inside, sep + 2)
|
||||
sub(/\)$/, "", src)
|
||||
|
||||
repl = render_code_include(src, 1)
|
||||
if (repl != "") {
|
||||
repl = "<pre><code>" repl "</code></pre>"
|
||||
} else {
|
||||
repl = render_embed(src, alt, (alt != ""), 1)
|
||||
}
|
||||
out = out pre repl
|
||||
rest = post
|
||||
}
|
||||
@@ -416,7 +428,12 @@ function rewrite_double_bang_bare(line, out, rest, token, src, pre, post, rep
|
||||
src = token
|
||||
sub(/^!!\[/, "", src)
|
||||
sub(/\]$/, "", src)
|
||||
repl = render_code_include(src, 1)
|
||||
if (repl != "") {
|
||||
repl = "<pre><code>" repl "</code></pre>"
|
||||
} else {
|
||||
repl = render_embed(src, "", 0, 1)
|
||||
}
|
||||
out = out pre repl
|
||||
rest = post
|
||||
}
|
||||
@@ -576,6 +593,75 @@ function restore_plain_markers(line) {
|
||||
return line
|
||||
}
|
||||
|
||||
function break_code_double_bang(line, out, rest, pstart, pend, code_content, token, pre, post, inside, sep, src, alt, repl) {
|
||||
out = ""
|
||||
rest = line
|
||||
while (1) {
|
||||
pstart = index(rest, "<code>")
|
||||
if (pstart == 0) {
|
||||
out = out rest
|
||||
break
|
||||
}
|
||||
out = out substr(rest, 1, pstart - 1)
|
||||
rest = substr(rest, pstart)
|
||||
pend = index(substr(rest, 7), "</code>")
|
||||
if (pend == 0) {
|
||||
out = out rest
|
||||
break
|
||||
}
|
||||
pend = pend + 6
|
||||
code_content = substr(rest, 7, pend - 7)
|
||||
rest = substr(rest, pend + 7)
|
||||
if (match(code_content, /!!\[[^\]]*\]\([^)]*\)/)) {
|
||||
token = substr(code_content, RSTART, RLENGTH)
|
||||
pre = substr(code_content, 1, RSTART - 1)
|
||||
post = substr(code_content, RSTART + RLENGTH)
|
||||
inside = token
|
||||
sub(/^!!\[/, "", inside)
|
||||
sep = index(inside, "](")
|
||||
alt = substr(inside, 1, sep - 1)
|
||||
src = substr(inside, sep + 2)
|
||||
sub(/\)$/, "", src)
|
||||
repl = render_code_include(src, 1)
|
||||
if (repl != "") {
|
||||
repl = "<pre><code>" repl "</code></pre>"
|
||||
} else {
|
||||
repl = render_embed(src, alt, (alt != ""), 1)
|
||||
}
|
||||
if (repl == "") {
|
||||
out = out "<code>" code_content "</code>"
|
||||
} else {
|
||||
if (pre != "") out = out "<code>" pre "</code>"
|
||||
out = out repl
|
||||
if (post != "") out = out "<code>" post "</code>"
|
||||
}
|
||||
} else if (match(code_content, /!!\[[^\]]+\]/)) {
|
||||
token = substr(code_content, RSTART, RLENGTH)
|
||||
pre = substr(code_content, 1, RSTART - 1)
|
||||
post = substr(code_content, RSTART + RLENGTH)
|
||||
src = token
|
||||
sub(/^!!\[/, "", src)
|
||||
sub(/\]$/, "", src)
|
||||
repl = render_code_include(src, 1)
|
||||
if (repl != "") {
|
||||
repl = "<pre><code>" repl "</code></pre>"
|
||||
} else {
|
||||
repl = render_embed(src, "", 0, 1)
|
||||
}
|
||||
if (repl == "") {
|
||||
out = out "<code>" code_content "</code>"
|
||||
} else {
|
||||
if (pre != "") out = out "<code>" pre "</code>"
|
||||
out = out repl
|
||||
if (post != "") out = out "<code>" post "</code>"
|
||||
}
|
||||
} else {
|
||||
out = out "<code>" code_content "</code>"
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
BEGIN {
|
||||
input_dir = dirname_of(input_file)
|
||||
in_pre_code = 0
|
||||
@@ -601,6 +687,9 @@ BEGIN {
|
||||
|
||||
line = apply_td_vertical_align(line)
|
||||
line = restore_plain_markers(line)
|
||||
if (!(in_pre_code || start_pre)) {
|
||||
line = break_code_double_bang(line)
|
||||
}
|
||||
print line
|
||||
|
||||
if (start_pre && !end_pre) {
|
||||
|
||||
@@ -67,6 +67,17 @@ function mask(s, t) {
|
||||
if (plen >= 2 && substr(content, 1, 1) == " " && substr(content, length(content), 1) == " ") {
|
||||
content = substr(content, 2, length(content) - 2)
|
||||
}
|
||||
if (content ~ /!!\[/) {
|
||||
_rb_test = content
|
||||
gsub(/!!\[[^\]]*\]\([^)]*\)/, "", _rb_test)
|
||||
gsub(/!!\[[^\]]+\]/, "", _rb_test)
|
||||
gsub(/[[:space:]]+/, "", _rb_test)
|
||||
if (_rb_test == "") {
|
||||
out = out content
|
||||
p = pstart + plen + mpos + plen - 1
|
||||
continue
|
||||
}
|
||||
}
|
||||
out = out "<code>" mask(content) "</code>"
|
||||
p = pstart + plen + mpos + plen - 1
|
||||
} else {
|
||||
|
||||
@@ -50,7 +50,7 @@ END {
|
||||
in_pre = 0
|
||||
i = 1
|
||||
while (i <= count) {
|
||||
if (lines[i] ~ /^<pre><code>/) {
|
||||
if (lines[i] ~ /^<pre><code/) {
|
||||
in_pre = 1
|
||||
print lines[i]
|
||||
i++
|
||||
|
||||
@@ -170,10 +170,17 @@ eval "find \"$src\" \( $IGNORE_ARGS \) -prune -o -type d -print" | sort | while
|
||||
label="$p_date $p_time"
|
||||
fi
|
||||
fi
|
||||
if [ "$is_post_entry" = "true" ]; then
|
||||
sort_key="${p_date} ${p_time}"
|
||||
if [ -n "$fm_priority" ]; then
|
||||
prio_val="$fm_priority"
|
||||
else
|
||||
sort_key="$name"
|
||||
prio_val="0"
|
||||
fi
|
||||
if [ "$is_post_entry" = "true" ]; then
|
||||
prio_key=$(printf '%05d' "$prio_val")
|
||||
sort_key="${prio_key} ${p_date} ${p_time}"
|
||||
else
|
||||
prio_key=$(printf '%05d' "$((99999 - prio_val))")
|
||||
sort_key="${prio_key} $name"
|
||||
fi
|
||||
echo "${sort_key}|- [$label](${name%.md}.html)|$name|${name%.md}.html" >> "$temp_entries"
|
||||
else
|
||||
|
||||
@@ -5,7 +5,6 @@ draft_by_default = false
|
||||
dir_indexes = true
|
||||
single_file_index = true
|
||||
flatten = false
|
||||
order = ""
|
||||
home_name = "Home"
|
||||
show_home_in_nav = true
|
||||
nav_links = ""
|
||||
@@ -67,7 +66,6 @@ footer="made with <a href=\"https://kewt.krzak.org\">kewt</a>"
|
||||
dir_indexes="true"
|
||||
single_file_index="true"
|
||||
flatten="false"
|
||||
order=""
|
||||
home_name="Home"
|
||||
show_home_in_nav="true"
|
||||
nav_links=""
|
||||
@@ -127,7 +125,6 @@ load_config() {
|
||||
dir_indexes) dir_indexes="$val" ;;
|
||||
single_file_index) single_file_index="$val" ;;
|
||||
flatten) flatten="$val" ;;
|
||||
order) order="$val" ;;
|
||||
home_name) home_name="$val" ;;
|
||||
show_home_in_nav) show_home_in_nav="$val" ;;
|
||||
nav_links) nav_links="$val" ;;
|
||||
|
||||
@@ -8,7 +8,7 @@ generate_nav() {
|
||||
if [ -n "$posts_dir" ] && [ -d "$1/$posts_dir" ]; then
|
||||
find_cmd="$find_cmd && echo \"$1/$posts_dir/index.md\""
|
||||
fi
|
||||
eval "$find_cmd" | sort -u | AWK_SRC="$1" AWK_SINGLE_FILE_INDEX="$single_file_index" AWK_FLATTEN="$flatten" AWK_ORDER="$order" AWK_HOME_NAME="$home_name" AWK_SHOW_HOME_IN_NAV="$show_home_in_nav" AWK_DINFO="$dinfo" awk -f "$awk_dir/generate_sidebar.awk"
|
||||
eval "$find_cmd" | sort -u | AWK_SRC="$1" AWK_SINGLE_FILE_INDEX="$single_file_index" AWK_FLATTEN="$flatten" AWK_HOME_NAME="$home_name" AWK_SHOW_HOME_IN_NAV="$show_home_in_nav" AWK_DINFO="$dinfo" awk -f "$awk_dir/generate_sidebar.awk"
|
||||
}
|
||||
escape_html_text() {
|
||||
printf '%s' "$1" | sed \
|
||||
@@ -34,6 +34,7 @@ parse_frontmatter() {
|
||||
fm_description=""
|
||||
fm_content_warning=""
|
||||
fm_tags=""
|
||||
fm_priority=""
|
||||
while IFS='=' read -r _fk _fv; do
|
||||
case "$_fk" in
|
||||
title) fm_title="$_fv" ;;
|
||||
@@ -42,6 +43,7 @@ parse_frontmatter() {
|
||||
description) fm_description="$_fv" ;;
|
||||
content_warning) fm_content_warning="$_fv" ;;
|
||||
tags) fm_tags="$_fv" ;;
|
||||
priority) fm_priority="$_fv" ;;
|
||||
esac
|
||||
done < "$_fm_out"
|
||||
rm -f "$_fm_out"
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
---
|
||||
priority = 0
|
||||
---
|
||||
# Hello!
|
||||
|
||||

|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
---
|
||||
priority = 2
|
||||
---
|
||||
# Depths
|
||||
|
||||
This is a custom index for a directory
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title = "Configuration"
|
||||
priority = 2
|
||||
---
|
||||
# Configuration
|
||||
|
||||
@@ -13,7 +14,6 @@ draft_by_default = false
|
||||
dir_indexes = true
|
||||
single_file_index = true
|
||||
flatten = false
|
||||
order = ""
|
||||
home_name = "Home"
|
||||
show_home_in_nav = true
|
||||
nav_links = ""
|
||||
@@ -43,13 +43,12 @@ search_in_header = false
|
||||
include_cw_pages_in_search = false
|
||||
```
|
||||
- `title` - site title
|
||||
- `style` - style file name from `./styles` (without `.css`)
|
||||
- `style` - style name from the built-in `styles/` directory. See [Theming](theming.md)
|
||||
- `lang` - document language, used for the `<html lang="...">` attribute (default: "en")
|
||||
- `draft_by_default` - default value for the `draft` frontmatter field in new posts created (default: false)
|
||||
- `dir_indexes` - generate directory index pages when missing `index.md`
|
||||
- `single_file_index` - if a directory has one markdown file and no `index.md`, use that file as `index.html`
|
||||
- `flatten` - flatten sidebar directory levels
|
||||
- `order` - comma separated file/directory name list to order the sidebar (alphabetical by default)
|
||||
- `home_name` - text for the home link in navigation (default: "Home")
|
||||
- `show_home_in_nav` - show home link in navigation (default: true)
|
||||
- `nav_links` - comma separated extra nav links, as bare URLs or Markdown links like `[Label](https://example.com)`
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title = "Embeds"
|
||||
priority = 5
|
||||
---
|
||||
# Embeds
|
||||
|
||||
@@ -13,6 +14,14 @@ title = "Embeds"
|
||||
|
||||
If you want to **force** a file to be inlined, use `\!![]` instead of `\![]`
|
||||
|
||||
## Reality-Breaking Embeds
|
||||
|
||||
`\!![link]` and `\!` work even inside inline code blocks. If the content between backticks consists only of `\!![]` embeds, the embed triggers and the content is inlined instead of being rendered as code.
|
||||
|
||||
```
|
||||
`!![/file.sh]`
|
||||
```
|
||||
|
||||
## Typed Embeds
|
||||
|
||||
Force specific output regardless of extension:
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title = "Frontmatter"
|
||||
priority = 4
|
||||
---
|
||||
# Frontmatter
|
||||
|
||||
@@ -12,6 +13,7 @@ date = "2026-03-23 11:32"
|
||||
draft = false
|
||||
description = "A short page summary"
|
||||
tags = "example, tutorial"
|
||||
priority = 10
|
||||
---
|
||||
```
|
||||
- `title` - overrides the page title, post name in index links, and RSS `<title>`.
|
||||
@@ -20,3 +22,4 @@ tags = "example, tutorial"
|
||||
- `description` - page description, used for Open Graph `og:description` meta tag.
|
||||
- `tags` - comma separated list of tags. Used for tag index generation when `generate_tags` is enabled in `site.conf`.
|
||||
- `content_warning` - if set, creates an interstitial warning page that the user must click through. If set to `true` uses a generic warning, otherwise uses your string.
|
||||
- `priority` - numeric value for ordering. Lower values sort first in the sidebar and directory indexes. Falls back to alphabetical/date ordering when not set or when items share the same priority.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title = "Documentation"
|
||||
priority = 0
|
||||
---
|
||||
# Documentation
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title = "Installation"
|
||||
priority = 0
|
||||
---
|
||||
# Installation
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title = "Markdown Extensions"
|
||||
priority = 7
|
||||
---
|
||||
# Markdown Extensions
|
||||
|
||||
@@ -39,3 +40,82 @@ This renders as `<dl><dt>Term</dt><dd>Definition</dd></dl>`. Multiple definition
|
||||
## Emoji Shortcodes
|
||||
|
||||
Standard GitHub/MkDocs emoji shortcodes like `:smile:`, `:fire:`, `:rocket:` are automatically replaced with their Unicode emoji equivalents. Shortcodes inside code blocks are left as-is.
|
||||
|
||||
## Pipe Tables
|
||||
|
||||
Tables use the GitHub-style syntax:
|
||||
|
||||
```md
|
||||
| Header 1 | Header 2 |
|
||||
|---|---|
|
||||
| cell 1 | cell 2 |
|
||||
| cell 3 | cell 4 |
|
||||
```
|
||||
Column alignment is set with colons in the separator:
|
||||
|
||||
```md
|
||||
| Left | Center | Right |
|
||||
|:---|:---:|---:|
|
||||
| a | b | c |
|
||||
```
|
||||
Tables can drop the header row and with a separator:
|
||||
|
||||
```md
|
||||
|---|---|
|
||||
| a | b |
|
||||
```
|
||||
## Blockquotes
|
||||
|
||||
Standard Markdown blockquote syntax using `>`:
|
||||
|
||||
```md
|
||||
> This is a blockquote.
|
||||
> It can span multiple lines.
|
||||
```
|
||||
### Admonitions
|
||||
|
||||
Blockquotes that start with a type tag become styled admonition blocks. Five built-in types are supported: `NOTE`, `TIP`, `IMPORTANT`, `WARNING`, `CAUTION`.
|
||||
|
||||
```md
|
||||
> [!NOTE]
|
||||
> This is a note admonition.
|
||||
```
|
||||
Custom admonition types can be added via the `custom_admonitions` config option in `site.conf`.
|
||||
|
||||
## Task Lists
|
||||
|
||||
GFM-style task lists are supported inside **both** ordered and unordered lists:
|
||||
|
||||
```md
|
||||
- [ ] Unchecked item
|
||||
- [x] Checked item
|
||||
- Normal item
|
||||
|
||||
1. [ ] Unchecked item
|
||||
2. [x] Checked item
|
||||
3. Normal item
|
||||
```
|
||||
## Reference Links
|
||||
|
||||
Markdown reference-style links and images are supported:
|
||||
|
||||
```md
|
||||
[link text][ref]
|
||||
|
||||
[ref]: https://example.com "Optional title"
|
||||
|
||||
![alt text][img-ref]
|
||||
|
||||
[img-ref]: /image.png "Optional title"
|
||||
```
|
||||
## Plain Text Blocks
|
||||
|
||||
Content inside `<plain>...</plain>` tags is rendered without any Markdown processing
|
||||
|
||||
## MFM Font Syntax
|
||||
|
||||
Misskey-style font syntax is supported for inline font family changes:
|
||||
|
||||
- `$[font.serif text]` - serif font
|
||||
- `$[font.mono text]` - monospace font
|
||||
- `$[font.sans text]` - sans-serif font
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title = "Quickstart"
|
||||
priority = 1
|
||||
---
|
||||
# Quickstart
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title = "Templates"
|
||||
priority = 8
|
||||
---
|
||||
# Templates
|
||||
|
||||
|
||||
61
site/docs/theming.md
Normal file
61
site/docs/theming.md
Normal file
@@ -0,0 +1,61 @@
|
||||
---
|
||||
title = "Theming"
|
||||
priority = 6
|
||||
---
|
||||
# Theming
|
||||
|
||||
*kewt* has a few colour palettes built-in. Set the `style` option in `site.conf` to a theme name to apply it.
|
||||
|
||||
## Built-in Themes
|
||||
|
||||
| Theme | `style` value | Dark/Light |
|
||||
|---|---|---|
|
||||
| Kewt (default) | `kewt` | Light |
|
||||
| Kewt Light | `kewt-light` | Light |
|
||||
| Nord | `nord` | Dark |
|
||||
| Nord Light | `nord-light` | Light |
|
||||
| Monokai | `mono` | Dark |
|
||||
| Monokai Light | `mono-light` | Light |
|
||||
| One Dark | `onedark` | Dark |
|
||||
| One Light | `onelight` | Light |
|
||||
| Rose Pine | `rosepine` | Dark |
|
||||
| Rose Pine Light | `rosepine-light` | Light |
|
||||
| Solarized | `solarized` | Light |
|
||||
| Solarized Dark | `solarized-dark` | Dark |
|
||||
|
||||
```conf
|
||||
style = "kewt-light"
|
||||
```
|
||||
## How It Works
|
||||
|
||||
Each theme is a `.root.css` file containing a `:root` block with CSS custom properties. At build time, *kewt* merges the theme's variables with the base `kewt.css` stylesheet. The base `:root` block is stripped out and replaced with the theme's variables.
|
||||
|
||||
## Style Resolution
|
||||
|
||||
*kewt* resolves styles in this priority order (highest wins):
|
||||
|
||||
1. `site/styles.css` - a full custom stylesheet in your site directory. Overrides everything.
|
||||
2. `site/styles.root.css` - custom `:root` variables merged with the built-in `kewt.css` base.
|
||||
3. built-in `<style>.css` - a full stylesheet matching the `style` config value.
|
||||
4. built-in `<style>.root.css` - `:root` variables merged with `kewt.css`.
|
||||
|
||||
If none of these exist, the unmodified `kewt.css` is used
|
||||
|
||||
## Custom Themes
|
||||
|
||||
To create a custom colour theme, place a `styles.root.css` file in your site directory. The file should contain only a `:root` block with the CSS variables you want to override:
|
||||
|
||||
```css
|
||||
:root {
|
||||
--bg: #1a1b26;
|
||||
--fg: #c0caf5;
|
||||
--fg-link: #7aa2f7;
|
||||
--fg-heading: #c0caf5;
|
||||
--code-bg: #24283b;
|
||||
}
|
||||
```
|
||||
Any variables not overridden will fall back to the defaults in `kewt.css`. The `:root` block in the base stylesheet is automatically removed to prevent conflicts.
|
||||
|
||||
## Per-Directory Styles
|
||||
|
||||
Subdirectories can have their own `styles.css` or `styles.root.css` that apply only to pages in that directory. Per-directory styles follow the same priority.
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title = "Usage"
|
||||
priority = 3
|
||||
---
|
||||
# Usage
|
||||
|
||||
@@ -20,4 +21,6 @@ kewt --serve [port]
|
||||
- `--generate-template [path]` writes the default `template.html` to the given path (defaults to `template.html` in the current directory).
|
||||
- `--update [dir]` adds any missing keys to `site.conf` and checks `template.html` against the latest default.
|
||||
- `--watch` (`-w`) watches for file changes in the source directory and rebuilds automatically.
|
||||
- `--clean` cleans the output directory before building (default behavior).
|
||||
- `--no-clean` does not clean the output directory before building. Useful with `--watch` to avoid clearing output on every rebuild.
|
||||
- `--serve` (`-s`) starts a local HTTP server (python3 or busybox) in the output directory after building. Use with the port number to specify the port. Composable with `--watch`.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title = "Heaven"
|
||||
priority = 3
|
||||
content_warning = "This page may contain CSS"
|
||||
---
|
||||
# Heaven
|
||||
@@ -9,4 +10,4 @@ Told you
|
||||
Probably should've mentioned the catgirl too
|
||||
|
||||
| --- | --- |
|
||||
| ```![/styles.css]``` | <img style="vertical-align: top;" src="catgirl.jpg"> |
|
||||
| ```!![/styles.css]``` | <img style="vertical-align: top;" src="catgirl.jpg"> |
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
---
|
||||
title = "Home"
|
||||
priority = 0
|
||||
---
|
||||
# _kewt_
|
||||
### Pronounced "cute"
|
||||
|
||||
@@ -14,7 +18,7 @@ It's meant to be a static site generator, like _[kew](https://github.com/uint23/
|
||||
## Features
|
||||
|
||||
- No dependencies
|
||||
- Frontmatter support (title, date, draft, description)
|
||||
- Frontmatter support (title, date, draft, description, priority)
|
||||
- Supports many embed types
|
||||
- Automatic css variable replacement for older browsers
|
||||
- Automatic inlining and embedding of many filetypes with `\![link]` or `\`
|
||||
|
||||
@@ -9,7 +9,6 @@ display_logo = false
|
||||
display_title = true
|
||||
logo_as_favicon = false
|
||||
favicon = "favicon.ico"
|
||||
order = "Home, docs, depths, heaven"
|
||||
home_name = "Home"
|
||||
show_home_in_nav = true
|
||||
nav_links = ""
|
||||
|
||||
@@ -23,4 +23,5 @@
|
||||
--adm-warning-border: #b8860b;
|
||||
--adm-caution-bg: #f5dddd;
|
||||
--adm-caution-border: #c44569;
|
||||
--thead-bg: #e8dffa;
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
--adm-warning-border: #ffe2bd;
|
||||
--adm-caution-bg: #662d43;
|
||||
--adm-caution-border: #ffc4d5;
|
||||
--thead-bg: #3d2d5c;
|
||||
}
|
||||
|
||||
body {
|
||||
@@ -271,6 +272,32 @@ hr {
|
||||
border-top: 1px solid var(--code-border);
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
margin: 20px 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
thead {
|
||||
border-bottom: 2px solid var(--code-border);
|
||||
background: var(--thead-bg);
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
padding: 8px 12px;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 8px 12px;
|
||||
border-top: 1px solid var(--code-border);
|
||||
}
|
||||
|
||||
tr:nth-child(even) {
|
||||
background: var(--bg-deep);
|
||||
}
|
||||
|
||||
.nav-toggle,
|
||||
.nav-toggle-label {
|
||||
display: none;
|
||||
|
||||
@@ -23,4 +23,5 @@
|
||||
--adm-warning-border: #aaaa78;
|
||||
--adm-caution-bg: #eee0e0;
|
||||
--adm-caution-border: #aa8888;
|
||||
--thead-bg: #e8e8e8;
|
||||
}
|
||||
|
||||
@@ -23,4 +23,5 @@
|
||||
--adm-warning-border: #8a8a5a;
|
||||
--adm-caution-bg: #2e1a1a;
|
||||
--adm-caution-border: #8a5a5a;
|
||||
--thead-bg: #111111;
|
||||
}
|
||||
|
||||
@@ -23,4 +23,5 @@
|
||||
--adm-warning-border: #ebcb8b;
|
||||
--adm-caution-bg: #eddcdc;
|
||||
--adm-caution-border: #bf616a;
|
||||
--thead-bg: #d8dee9;
|
||||
}
|
||||
|
||||
@@ -23,4 +23,5 @@
|
||||
--adm-warning-border: #ebcb8b;
|
||||
--adm-caution-bg: #3b3840;
|
||||
--adm-caution-border: #bf616a;
|
||||
--thead-bg: #3b4252;
|
||||
}
|
||||
|
||||
@@ -23,4 +23,5 @@
|
||||
--adm-warning-border: #e5c07b;
|
||||
--adm-caution-bg: #3a2c2e;
|
||||
--adm-caution-border: #e06c75;
|
||||
--thead-bg: #21252b;
|
||||
}
|
||||
|
||||
@@ -23,4 +23,5 @@
|
||||
--adm-warning-border: #986801;
|
||||
--adm-caution-bg: #fae8e8;
|
||||
--adm-caution-border: #e45649;
|
||||
--thead-bg: #eaeaeb;
|
||||
}
|
||||
|
||||
@@ -23,4 +23,5 @@
|
||||
--adm-warning-border: #ea9d34;
|
||||
--adm-caution-bg: #f5e5e8;
|
||||
--adm-caution-border: #b4637a;
|
||||
--thead-bg: #f2e9e1;
|
||||
}
|
||||
|
||||
@@ -23,4 +23,5 @@
|
||||
--adm-warning-border: #f6c177;
|
||||
--adm-caution-bg: #2a1f22;
|
||||
--adm-caution-border: #eb6f92;
|
||||
--thead-bg: #1f1d2e;
|
||||
}
|
||||
|
||||
@@ -23,4 +23,5 @@
|
||||
--adm-warning-border: #b58900;
|
||||
--adm-caution-bg: #360a07;
|
||||
--adm-caution-border: #cb4b16;
|
||||
--thead-bg: #073642;
|
||||
}
|
||||
|
||||
@@ -23,4 +23,5 @@
|
||||
--adm-warning-border: #b58900;
|
||||
--adm-caution-bg: #fde8e8;
|
||||
--adm-caution-border: #dc322f;
|
||||
--thead-bg: #eee8d5;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user