Compare commits
16 Commits
1f5d63c035
...
v1.0.1b
| Author | SHA1 | Date | |
|---|---|---|---|
| af453ca2ec | |||
| cea84de242 | |||
| ad1ec9c2e3 | |||
| fa3b5592da | |||
| 722d687afe | |||
| 77c0b29b4c | |||
| 9ae965662c | |||
| 9ced2af562 | |||
| f407b1c4af | |||
| bee12ce8c1 | |||
| 696dc1c142 | |||
| c2416e731b | |||
| 01fd55001a | |||
| b1f69673d1 | |||
| 6418b64672 | |||
| e3cc1c1688 |
16
.gitea/workflows/lint.yml
Normal file
16
.gitea/workflows/lint.yml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
name: Lint
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, master ]
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
shellcheck:
|
||||||
|
runs-on: local
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Install Shellcheck
|
||||||
|
run: sudo apt-get update && sudo apt-get install -y shellcheck
|
||||||
|
- name: Run Shellcheck
|
||||||
|
run: shellcheck kewt.sh markdown.sh tools/build-standalone.sh || true
|
||||||
109
.gitea/workflows/release.yml
Normal file
109
.gitea/workflows/release.yml
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
name: Release Standalone Builder
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: local
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Build standalone executable
|
||||||
|
run: |
|
||||||
|
chmod +x tools/build-standalone.sh
|
||||||
|
./tools/build-standalone.sh
|
||||||
|
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.21'
|
||||||
|
|
||||||
|
- name: Upload Release Asset
|
||||||
|
uses: https://gitea.com/actions/release-action@main
|
||||||
|
with:
|
||||||
|
files: |-
|
||||||
|
kewt
|
||||||
|
api_key: '${{secrets.GITEA_TOKEN}}'
|
||||||
|
|
||||||
|
- name: Push to GitHub Release
|
||||||
|
run: |
|
||||||
|
TAG="${GITHUB_REF#refs/tags/}"
|
||||||
|
|
||||||
|
# Create the release on GitHub
|
||||||
|
curl -sL -X POST \
|
||||||
|
-H "Authorization: token ${{ secrets.GH_RELEASE_TOKEN }}" \
|
||||||
|
-H "Accept: application/vnd.github+json" \
|
||||||
|
"https://api.github.com/repos/n0va-bot/kewt/releases" \
|
||||||
|
-d "{\"tag_name\":\"${TAG}\",\"name\":\"${TAG}\",\"draft\":false,\"prerelease\":false}" || true
|
||||||
|
|
||||||
|
# Get the release ID
|
||||||
|
RELEASE_ID=$(curl -sL \
|
||||||
|
-H "Authorization: token ${{ secrets.GH_RELEASE_TOKEN }}" \
|
||||||
|
-H "Accept: application/vnd.github+json" \
|
||||||
|
"https://api.github.com/repos/n0va-bot/kewt/releases/tags/${TAG}" | jq -r '.id')
|
||||||
|
|
||||||
|
# Upload the asset
|
||||||
|
curl -sL -X POST \
|
||||||
|
-H "Authorization: token ${{ secrets.GH_RELEASE_TOKEN }}" \
|
||||||
|
-H "Content-Type: application/octet-stream" \
|
||||||
|
"https://uploads.github.com/repos/n0va-bot/kewt/releases/${RELEASE_ID}/assets?name=kewt" \
|
||||||
|
--data-binary @kewt
|
||||||
|
|
||||||
|
publish-aur:
|
||||||
|
runs-on: local
|
||||||
|
needs: build
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Arch Linux environment
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y pacman-package-manager curl jq || true
|
||||||
|
|
||||||
|
- name: Render PKGBUILD and SRCINFO
|
||||||
|
run: |
|
||||||
|
VERSION=${GITHUB_REF#refs/tags/v}
|
||||||
|
VERSION=${VERSION#refs/tags/}
|
||||||
|
|
||||||
|
curl -sL -o kewt https://git.krzak.org/N0VA/kewt/releases/download/v${VERSION}/kewt
|
||||||
|
|
||||||
|
CHECKSUM=$(sha256sum kewt | awk '{print $1}')
|
||||||
|
|
||||||
|
mkdir -p aur-work
|
||||||
|
sed -e "s/VERSION_PLACEHOLDER/${VERSION}/g" \
|
||||||
|
-e "s/SHA256SUM_PLACEHOLDER/${CHECKSUM}/g" \
|
||||||
|
packaging/AUR/PKGBUILD.template > aur-work/PKGBUILD
|
||||||
|
|
||||||
|
cat > aur-work/.SRCINFO << SRCEOF
|
||||||
|
pkgbase = kewt-bin
|
||||||
|
pkgdesc = A minimalist, 100% POSIX static site generator inspired by werc and kew
|
||||||
|
pkgver = ${VERSION}
|
||||||
|
pkgrel = 1
|
||||||
|
url = https://git.krzak.org/N0VA/kewt
|
||||||
|
arch = any
|
||||||
|
license = MIT
|
||||||
|
depends = sh
|
||||||
|
provides = kewt
|
||||||
|
conflicts = kewt
|
||||||
|
conflicts = kewt-git
|
||||||
|
source = kewt-bin-${VERSION}.sh::https://git.krzak.org/N0VA/kewt/releases/download/v${VERSION}/kewt
|
||||||
|
sha256sums = ${CHECKSUM}
|
||||||
|
|
||||||
|
pkgname = kewt-bin
|
||||||
|
SRCEOF
|
||||||
|
# Remove leading whitespace from heredoc
|
||||||
|
sed -i 's/^ //' aur-work/.SRCINFO
|
||||||
|
|
||||||
|
- name: Publish to AUR
|
||||||
|
uses: KSXGitHub/github-actions-deploy-aur@v3.0.1
|
||||||
|
with:
|
||||||
|
pkgname: kewt-bin
|
||||||
|
pkgbuild: ./aur-work/PKGBUILD
|
||||||
|
commit_username: ${{ github.actor }}
|
||||||
|
commit_email: ${{ github.actor }}@users.noreply.github.com
|
||||||
|
ssh_private_key: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
|
||||||
|
commit_message: "Update kewt-bin to ${{ github.ref_name }}"
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
out/
|
out/
|
||||||
|
kewt
|
||||||
23
README.md
23
README.md
@@ -19,6 +19,15 @@ It's meant to be a static site generator, like _[kew](https://github.com/uint23/
|
|||||||
|
|
||||||
If you want to **force** a file to be inlined, use `\!![]` instead of `\![]`
|
If you want to **force** a file to be inlined, use `\!![]` instead of `\![]`
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
You can clone the repository to use `kewt.sh` directly, or you can download the standalone executable, which bundles all dependencies into a single file:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -L -o kewt https://git.krzak.org/N0VA/kewt/releases/latest/download/kewt
|
||||||
|
chmod +x kewt
|
||||||
|
```
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@@ -39,6 +48,10 @@ dir_indexes = true
|
|||||||
single_file_index = true
|
single_file_index = true
|
||||||
flatten = false
|
flatten = false
|
||||||
order = ""
|
order = ""
|
||||||
|
home_name = "Home"
|
||||||
|
show_home_in_nav = true
|
||||||
|
nav_links = ""
|
||||||
|
nav_extra = ""
|
||||||
footer = "made with <a href="https://kewt.krzak.org">kewt</a>"
|
footer = "made with <a href="https://kewt.krzak.org">kewt</a>"
|
||||||
logo = ""
|
logo = ""
|
||||||
display_logo = false
|
display_logo = false
|
||||||
@@ -53,6 +66,10 @@ favicon = ""
|
|||||||
- `single_file_index` if a directory has one markdown file and no `index.md`, use that file as `index.html`
|
- `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
|
- `flatten` flatten sidebar directory levels
|
||||||
- `order` comma separated file/directory name list to order the sidebar (alphabetical by default)
|
- `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)`
|
||||||
|
- `nav_extra` raw HTML appended inside the `<nav>` after the generated link list
|
||||||
- `footer` footer html/text shown at the bottom of pages
|
- `footer` footer html/text shown at the bottom of pages
|
||||||
- `logo` logo image path (used in header if enabled)
|
- `logo` logo image path (used in header if enabled)
|
||||||
- `display_logo` show logo in header
|
- `display_logo` show logo in header
|
||||||
@@ -60,6 +77,12 @@ favicon = ""
|
|||||||
- `logo_as_favicon` use `logo` as favicon
|
- `logo_as_favicon` use `logo` as favicon
|
||||||
- `favicon` explicit favicon path (used when `logo_as_favicon` is false or no logo is set)
|
- `favicon` explicit favicon path (used when `logo_as_favicon` is false or no logo is set)
|
||||||
|
|
||||||
|
## Ignores
|
||||||
|
|
||||||
|
- `.kewtignore`: Files/directories to ignore. If empty, the whole directory gets ignored
|
||||||
|
- `.kewthide`: Files/directories to hide from navigation but still process. Same empty rules as with ignore
|
||||||
|
- `.kewtpreserve`: Files/directories to copy but not convert markdown to html. Same empty rules again
|
||||||
|
|
||||||
## Embeds
|
## Embeds
|
||||||
|
|
||||||
- `\![link]`:
|
- `\![link]`:
|
||||||
|
|||||||
@@ -80,8 +80,9 @@ END {
|
|||||||
}
|
}
|
||||||
|
|
||||||
print "<ul>"
|
print "<ul>"
|
||||||
if ("index.md" in all_paths) {
|
if (show_home_in_nav == "true" && "index.md" in all_paths) {
|
||||||
print "<li><a href=\"/index.html\">Home</a></li>"
|
if (home_name == "") home_name = "Home"
|
||||||
|
print "<li><a href=\"/index.html\">" home_name "</a></li>"
|
||||||
}
|
}
|
||||||
|
|
||||||
depth = 0
|
depth = 0
|
||||||
|
|||||||
@@ -3,36 +3,11 @@ function strip_markdown(s) {
|
|||||||
gsub(/[*_`~]/, "", s)
|
gsub(/[*_`~]/, "", s)
|
||||||
gsub(/[\[\]]/, "", s)
|
gsub(/[\[\]]/, "", s)
|
||||||
gsub(/\([^\)]*\)/, "", s)
|
gsub(/\([^\)]*\)/, "", s)
|
||||||
sub(/^[[:space:]]*/, "", s)
|
gsub(/^[[:space:]]+|[[:space:]]+$/, "", s)
|
||||||
sub(/[[:space:]]*$/, "", s)
|
gsub(/[[:space:]]+/, "-", s)
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
BEGIN {
|
function print_header(line) {
|
||||||
has_prev = 0
|
|
||||||
in_pre = 0
|
|
||||||
}
|
|
||||||
{
|
|
||||||
if ($0 ~ /^<pre><code>/) {
|
|
||||||
in_pre = 1
|
|
||||||
if (has_prev && prev != "") { print prev; has_prev = 0 }
|
|
||||||
print
|
|
||||||
next
|
|
||||||
}
|
|
||||||
if (in_pre) {
|
|
||||||
if ($0 ~ /<\/code><\/pre>/) in_pre = 0
|
|
||||||
print
|
|
||||||
next
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($0 ~ /^=+$/ && has_prev && prev != "" && prev !~ /^<[a-z]/) {
|
|
||||||
print "<h1 id=\"" strip_markdown(prev) "\">" prev "</h1>"
|
|
||||||
has_prev = 0
|
|
||||||
} else if ($0 ~ /^-+$/ && has_prev && prev != "" && prev !~ /^<[a-z]/) {
|
|
||||||
print "<h2 id=\"" strip_markdown(prev) "\">" prev "</h2>"
|
|
||||||
has_prev = 0
|
|
||||||
} else {
|
|
||||||
if (has_prev) {
|
|
||||||
line = prev
|
|
||||||
if (line ~ /^# /) {
|
if (line ~ /^# /) {
|
||||||
sub(/^# /, "", line); print "<h1 id=\"" strip_markdown(line) "\">" line "</h1>"
|
sub(/^# /, "", line); print "<h1 id=\"" strip_markdown(line) "\">" line "</h1>"
|
||||||
} else if (line ~ /^## /) {
|
} else if (line ~ /^## /) {
|
||||||
@@ -46,20 +21,59 @@ BEGIN {
|
|||||||
} else if (line ~ /^###### /) {
|
} else if (line ~ /^###### /) {
|
||||||
sub(/^###### /, "", line); print "<h6 id=\"" strip_markdown(line) "\">" line "</h6>"
|
sub(/^###### /, "", line); print "<h6 id=\"" strip_markdown(line) "\">" line "</h6>"
|
||||||
} else {
|
} else {
|
||||||
print prev
|
print line
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BEGIN {
|
||||||
|
has_prev = 0
|
||||||
|
in_pre = 0
|
||||||
|
}
|
||||||
|
{
|
||||||
|
if ($0 ~ /^<pre><code>/) {
|
||||||
|
in_pre = 1
|
||||||
|
if (has_prev && prev != "") { print_header(prev); has_prev = 0 }
|
||||||
|
print
|
||||||
|
next
|
||||||
|
}
|
||||||
|
if (in_pre) {
|
||||||
|
if ($0 ~ /<\/code><\/pre>/) in_pre = 0
|
||||||
|
print
|
||||||
|
next
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($0 ~ /^=+$/) {
|
||||||
|
if (has_prev && prev != "" && prev !~ /^<[a-z]/) {
|
||||||
|
print "<h1 id=\"" strip_markdown(prev) "\">" prev "</h1>"
|
||||||
|
has_prev = 0
|
||||||
|
} else {
|
||||||
|
if (has_prev) print_header(prev)
|
||||||
|
print $0
|
||||||
|
has_prev = 0
|
||||||
|
}
|
||||||
|
} else if ($0 ~ /^-+$/) {
|
||||||
|
if (has_prev && prev != "" && prev !~ /^<[a-z]/) {
|
||||||
|
print "<h2 id=\"" strip_markdown(prev) "\">" prev "</h2>"
|
||||||
|
has_prev = 0
|
||||||
|
} else {
|
||||||
|
if (has_prev) print_header(prev)
|
||||||
|
if (length($0) >= 3) print "<hr />"
|
||||||
|
else print $0
|
||||||
|
has_prev = 0
|
||||||
|
}
|
||||||
|
} else if ($0 ~ /^[*_]+$/ && length($0) >= 3) {
|
||||||
|
if (has_prev) print_header(prev)
|
||||||
|
print "<hr />"
|
||||||
|
has_prev = 0
|
||||||
|
} else {
|
||||||
|
if (has_prev) {
|
||||||
|
print_header(prev)
|
||||||
|
}
|
||||||
prev = $0
|
prev = $0
|
||||||
has_prev = 1
|
has_prev = 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
END {
|
END {
|
||||||
if (has_prev) {
|
if (has_prev) {
|
||||||
line = prev
|
print_header(prev)
|
||||||
if (line ~ /^# /) {
|
|
||||||
sub(/^# /, "", line); print "<h1 id=\"" strip_markdown(line) "\">" line "</h1>"
|
|
||||||
} else {
|
|
||||||
print prev
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,31 @@ BEGIN {
|
|||||||
in_pre = 0
|
in_pre = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function mask_html_tags(s, out, rest, start, len, tag, token) {
|
||||||
|
out = ""
|
||||||
|
rest = s
|
||||||
|
html_tag_count = 0
|
||||||
|
while (match(rest, /<[^>]+>/)) {
|
||||||
|
out = out substr(rest, 1, RSTART - 1)
|
||||||
|
start = RSTART
|
||||||
|
len = RLENGTH
|
||||||
|
tag = substr(rest, start, len)
|
||||||
|
html_tag_count++
|
||||||
|
html_tag_token[html_tag_count] = "\034HT" html_tag_count "\034"
|
||||||
|
html_tag_value[html_tag_count] = tag
|
||||||
|
out = out html_tag_token[html_tag_count]
|
||||||
|
rest = substr(rest, start + len)
|
||||||
|
}
|
||||||
|
return out rest
|
||||||
|
}
|
||||||
|
|
||||||
|
function restore_html_tags(s, i) {
|
||||||
|
for (i = 1; i <= html_tag_count; i++) {
|
||||||
|
gsub(html_tag_token[i], html_tag_value[i], s)
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
if ($0 ~ /<pre>/) {
|
if ($0 ~ /<pre>/) {
|
||||||
in_pre = 1
|
in_pre = 1
|
||||||
@@ -114,6 +139,8 @@ BEGIN {
|
|||||||
line = substr(line, 1, start - 1) "<span style=\"font-family: sans-serif;\">" content "</span>" substr(line, start + len)
|
line = substr(line, 1, start - 1) "<span style=\"font-family: sans-serif;\">" content "</span>" substr(line, start + len)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
line = mask_html_tags(line)
|
||||||
|
|
||||||
# Bold, Italic, Strikethrough (BRE-like logic in AWK)
|
# Bold, Italic, Strikethrough (BRE-like logic in AWK)
|
||||||
# Strong Bold **
|
# Strong Bold **
|
||||||
while (match(line, /\*\*[^*]+\*\*/)) {
|
while (match(line, /\*\*[^*]+\*\*/)) {
|
||||||
@@ -152,6 +179,8 @@ BEGIN {
|
|||||||
line = substr(line, 1, start - 1) repl substr(line, start + len)
|
line = substr(line, 1, start - 1) repl substr(line, start + len)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
line = restore_html_tags(line)
|
||||||
|
|
||||||
# special characters
|
# special characters
|
||||||
if (line !~ /&[A-Za-z0-9#]+;/) {
|
if (line !~ /&[A-Za-z0-9#]+;/) {
|
||||||
gsub(/&/, "&", line)
|
gsub(/&/, "&", line)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ BEGIN {
|
|||||||
next
|
next
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($0 ~ /^<\/?(div|table|p|[ou]l|h[1-6]|[bh]r|blockquote|li)/) {
|
if ($0 ~ /^<\/?(div|table|p|[ou]l|h[1-6]|[bh]r|blockquote|li|hr)/) {
|
||||||
if (in_p) {
|
if (in_p) {
|
||||||
print "</p>"
|
print "</p>"
|
||||||
in_p = 0
|
in_p = 0
|
||||||
|
|||||||
220
kewt.sh
220
kewt.sh
@@ -20,7 +20,7 @@ Options:
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
script_dir=$(CDPATH="" cd -- "$(dirname -- "$0")" && pwd)
|
||||||
awk_dir="$script_dir/awk"
|
awk_dir="$script_dir/awk"
|
||||||
|
|
||||||
ensure_root_defaults() {
|
ensure_root_defaults() {
|
||||||
@@ -32,6 +32,10 @@ dir_indexes = true
|
|||||||
single_file_index = true
|
single_file_index = true
|
||||||
flatten = false
|
flatten = false
|
||||||
order = ""
|
order = ""
|
||||||
|
home_name = "Home"
|
||||||
|
show_home_in_nav = true
|
||||||
|
nav_links = ""
|
||||||
|
nav_extra = ""
|
||||||
footer = "made with <a href="https://kewt.krzak.org">kewt</a>"
|
footer = "made with <a href="https://kewt.krzak.org">kewt</a>"
|
||||||
logo = ""
|
logo = ""
|
||||||
display_logo = false
|
display_logo = false
|
||||||
@@ -89,10 +93,7 @@ create_new_site() {
|
|||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_nav() {
|
|
||||||
dinfo=$(find "$1" \( -name ".*" ! -name "." ! -name ".." -prune \) -o -print | sort | awk -v src="$1" -f "$awk_dir/collect_dir_info.awk")
|
|
||||||
find "$1" \( -name ".*" ! -name "." ! -name ".." -prune \) -o -name "*.md" -print | sort | awk -v src="$1" -v single_file_index="$single_file_index" -v flatten="$flatten" -v order="$order" -v dinfo="$dinfo" -f "$awk_dir/generate_sidebar.awk"
|
|
||||||
}
|
|
||||||
|
|
||||||
src=""
|
src=""
|
||||||
out=""
|
out=""
|
||||||
@@ -129,9 +130,9 @@ while [ $# -gt 0 ]; do
|
|||||||
*)
|
*)
|
||||||
positional_count=$((positional_count + 1))
|
positional_count=$((positional_count + 1))
|
||||||
if [ "$positional_count" -eq 1 ]; then
|
if [ "$positional_count" -eq 1 ]; then
|
||||||
[ -z "$src" ] && src="$1" || die "Source already set (use either positional or --from)."
|
if [ -z "$src" ]; then src="$1"; else die "Source already set (use either positional or --from)."; fi
|
||||||
elif [ "$positional_count" -eq 2 ]; then
|
elif [ "$positional_count" -eq 2 ]; then
|
||||||
[ -z "$out" ] && out="$1" || die "Output already set (use either positional or --to)."
|
if [ -z "$out" ]; then out="$1"; else die "Output already set (use either positional or --to)."; fi
|
||||||
else
|
else
|
||||||
die "Too many positional arguments."
|
die "Too many positional arguments."
|
||||||
fi
|
fi
|
||||||
@@ -147,8 +148,106 @@ ensure_root_defaults
|
|||||||
[ -z "$src" ] && src="site"
|
[ -z "$src" ] && src="site"
|
||||||
[ -z "$out" ] && out="out"
|
[ -z "$out" ] && out="out"
|
||||||
|
|
||||||
|
src="${src%/}"
|
||||||
|
out="${out%/}"
|
||||||
|
|
||||||
[ -d "$src" ] || die "Source directory '$src' does not exist."
|
[ -d "$src" ] || die "Source directory '$src' does not exist."
|
||||||
|
|
||||||
|
IGNORE_ARGS="-name '.kewtignore' -o -path '$src/.*'"
|
||||||
|
|
||||||
|
if [ -f "$src/.kewtignore" ]; then
|
||||||
|
while IFS= read -r line || [ -n "$line" ]; do
|
||||||
|
case "$line" in
|
||||||
|
''|'#'*) continue ;;
|
||||||
|
esac
|
||||||
|
pattern=$(echo "$line" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')
|
||||||
|
[ -z "$pattern" ] && continue
|
||||||
|
|
||||||
|
pattern_clean="${pattern#/}"
|
||||||
|
pattern_clean="${pattern_clean%/}"
|
||||||
|
|
||||||
|
if echo "$pattern" | grep -q "/"; then
|
||||||
|
IGNORE_ARGS="$IGNORE_ARGS -o -path '$src/$pattern_clean' -o -path '$src/$pattern_clean/*'"
|
||||||
|
else
|
||||||
|
IGNORE_ARGS="$IGNORE_ARGS -o -name '$pattern_clean'"
|
||||||
|
fi
|
||||||
|
done < "$src/.kewtignore"
|
||||||
|
fi
|
||||||
|
|
||||||
|
find "$src" -name .kewtignore > "/tmp/kewt_ignore_$$"
|
||||||
|
while read -r ki; do
|
||||||
|
d="${ki%/.kewtignore}"
|
||||||
|
if [ "$d" != "$src" ] && [ "$d" != "." ]; then
|
||||||
|
IGNORE_ARGS="$IGNORE_ARGS -o -path '$d' -o -path '$d/*'"
|
||||||
|
fi
|
||||||
|
done < "/tmp/kewt_ignore_$$"
|
||||||
|
rm -f "/tmp/kewt_ignore_$$"
|
||||||
|
|
||||||
|
HIDE_ARGS="-name '.kewtignore' -o -name '.kewthide' -o -name '.kewtpreserve' -o -path '$src/.*'"
|
||||||
|
|
||||||
|
if [ -f "$src/.kewthide" ]; then
|
||||||
|
while IFS= read -r line || [ -n "$line" ]; do
|
||||||
|
case "$line" in
|
||||||
|
''|'#'*) continue ;;
|
||||||
|
esac
|
||||||
|
pattern=$(echo "$line" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')
|
||||||
|
[ -z "$pattern" ] && continue
|
||||||
|
|
||||||
|
pattern_clean="${pattern#/}"
|
||||||
|
pattern_clean="${pattern_clean%/}"
|
||||||
|
|
||||||
|
if echo "$pattern" | grep -q "/"; then
|
||||||
|
HIDE_ARGS="$HIDE_ARGS -o -path '$src/$pattern_clean' -o -path '$src/$pattern_clean/*'"
|
||||||
|
else
|
||||||
|
HIDE_ARGS="$HIDE_ARGS -o -name '$pattern_clean'"
|
||||||
|
fi
|
||||||
|
done < "$src/.kewthide"
|
||||||
|
fi
|
||||||
|
|
||||||
|
find "$src" -name .kewthide > "/tmp/kewt_hide_$$"
|
||||||
|
while read -r kh; do
|
||||||
|
d="${kh%/.kewthide}"
|
||||||
|
if [ "$d" != "$src" ] && [ "$d" != "." ]; then
|
||||||
|
HIDE_ARGS="$HIDE_ARGS -o -path '$d' -o -path '$d/*'"
|
||||||
|
fi
|
||||||
|
done < "/tmp/kewt_hide_$$"
|
||||||
|
rm -f "/tmp/kewt_hide_$$"
|
||||||
|
|
||||||
|
PRESERVE_ARGS="-false"
|
||||||
|
|
||||||
|
if [ -f "$src/.kewtpreserve" ]; then
|
||||||
|
while IFS= read -r line || [ -n "$line" ]; do
|
||||||
|
case "$line" in
|
||||||
|
''|'#'*) continue ;;
|
||||||
|
esac
|
||||||
|
pattern=$(echo "$line" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')
|
||||||
|
[ -z "$pattern" ] && continue
|
||||||
|
|
||||||
|
pattern_clean="${pattern#/}"
|
||||||
|
pattern_clean="${pattern_clean%/}"
|
||||||
|
|
||||||
|
if echo "$pattern" | grep -q "/"; then
|
||||||
|
PRESERVE_ARGS="$PRESERVE_ARGS -o -path '$src/$pattern_clean' -o -path '$src/$pattern_clean/*'"
|
||||||
|
else
|
||||||
|
PRESERVE_ARGS="$PRESERVE_ARGS -o -name '$pattern_clean'"
|
||||||
|
fi
|
||||||
|
done < "$src/.kewtpreserve"
|
||||||
|
fi
|
||||||
|
|
||||||
|
find "$src" -name .kewtpreserve > "/tmp/kewt_preserve_$$"
|
||||||
|
while read -r kp; do
|
||||||
|
d="${kp%/.kewtpreserve}"
|
||||||
|
if [ "$d" != "$src" ] && [ "$d" != "." ]; then
|
||||||
|
PRESERVE_ARGS="$PRESERVE_ARGS -o -path '$d' -o -path '$d/*'"
|
||||||
|
fi
|
||||||
|
done < "/tmp/kewt_preserve_$$"
|
||||||
|
rm -f "/tmp/kewt_preserve_$$"
|
||||||
|
|
||||||
|
generate_nav() {
|
||||||
|
dinfo=$(eval "find \"$1\" \( $IGNORE_ARGS -o $HIDE_ARGS -o $PRESERVE_ARGS \) -prune -o -print" | sort | awk -v src="$1" -f "$awk_dir/collect_dir_info.awk")
|
||||||
|
eval "find \"$1\" \( $IGNORE_ARGS -o $HIDE_ARGS -o $PRESERVE_ARGS \) -prune -o -name \"*.md\" -print" | sort | awk -v src="$1" -v single_file_index="$single_file_index" -v flatten="$flatten" -v order="$order" -v home_name="$home_name" -v show_home_in_nav="$show_home_in_nav" -v dinfo="$dinfo" -f "$awk_dir/generate_sidebar.awk"
|
||||||
|
}
|
||||||
|
|
||||||
title="kewt"
|
title="kewt"
|
||||||
style="kewt"
|
style="kewt"
|
||||||
footer="made with <a href=\"https://kewt.krzak.org\">kewt</a>"
|
footer="made with <a href=\"https://kewt.krzak.org\">kewt</a>"
|
||||||
@@ -156,6 +255,11 @@ dir_indexes="true"
|
|||||||
single_file_index="true"
|
single_file_index="true"
|
||||||
flatten="false"
|
flatten="false"
|
||||||
order=""
|
order=""
|
||||||
|
home_name="Home"
|
||||||
|
show_home_in_nav="true"
|
||||||
|
nav_links=""
|
||||||
|
nav_extra=""
|
||||||
|
footer="made with <a href=\"https://kewt.krzak.org\">kewt</a>"
|
||||||
logo=""
|
logo=""
|
||||||
display_logo="false"
|
display_logo="false"
|
||||||
display_title="true"
|
display_title="true"
|
||||||
@@ -188,6 +292,10 @@ load_config() {
|
|||||||
single_file_index) single_file_index="$val" ;;
|
single_file_index) single_file_index="$val" ;;
|
||||||
flatten) flatten="$val" ;;
|
flatten) flatten="$val" ;;
|
||||||
order) order="$val" ;;
|
order) order="$val" ;;
|
||||||
|
home_name) home_name="$val" ;;
|
||||||
|
show_home_in_nav) show_home_in_nav="$val" ;;
|
||||||
|
nav_links) nav_links="$val" ;;
|
||||||
|
nav_extra) nav_extra="$val" ;;
|
||||||
footer) footer="$val" ;;
|
footer) footer="$val" ;;
|
||||||
logo) logo="$val" ;;
|
logo) logo="$val" ;;
|
||||||
display_logo) display_logo="$val" ;;
|
display_logo) display_logo="$val" ;;
|
||||||
@@ -201,6 +309,65 @@ load_config() {
|
|||||||
load_config "./site.conf"
|
load_config "./site.conf"
|
||||||
load_config "$src/site.conf"
|
load_config "$src/site.conf"
|
||||||
|
|
||||||
|
escape_html_text() {
|
||||||
|
printf '%s' "$1" | sed \
|
||||||
|
-e 's/&/\&/g' \
|
||||||
|
-e 's/</\</g' \
|
||||||
|
-e 's/>/\>/g'
|
||||||
|
}
|
||||||
|
|
||||||
|
escape_html_attr() {
|
||||||
|
printf '%s' "$1" | sed \
|
||||||
|
-e 's/&/\&/g' \
|
||||||
|
-e 's/"/\"/g' \
|
||||||
|
-e 's/</\</g' \
|
||||||
|
-e 's/>/\>/g'
|
||||||
|
}
|
||||||
|
|
||||||
|
nav_links_html() {
|
||||||
|
[ -n "$nav_links" ] || return
|
||||||
|
|
||||||
|
old_ifs=$IFS
|
||||||
|
set -f
|
||||||
|
IFS=','
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
set -- $nav_links
|
||||||
|
IFS=$old_ifs
|
||||||
|
set +f
|
||||||
|
|
||||||
|
[ $# -gt 0 ] || return
|
||||||
|
|
||||||
|
printf '<ul class="nav-extra-links">\n'
|
||||||
|
for raw_link in "$@"; do
|
||||||
|
link=$(printf '%s' "$raw_link" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//')
|
||||||
|
[ -n "$link" ] || continue
|
||||||
|
|
||||||
|
case "$link" in
|
||||||
|
\[*\]\(*\))
|
||||||
|
label=${link#\[}
|
||||||
|
label=${label%%\]*}
|
||||||
|
link_url=${link#*](}
|
||||||
|
link_url=${link_url%)}
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
link_url=$link
|
||||||
|
label=$(printf '%s' "$link" | sed \
|
||||||
|
-e 's|^[A-Za-z][A-Za-z0-9+.-]*://||' \
|
||||||
|
-e 's|/$||')
|
||||||
|
[ -n "$label" ] || label="$link"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
[ -n "$link_url" ] || continue
|
||||||
|
[ -n "$label" ] || label="$link_url"
|
||||||
|
|
||||||
|
link_attr=$(escape_html_attr "$link_url")
|
||||||
|
label_text=$(escape_html_text "$label")
|
||||||
|
printf '<li><a href="%s">%s</a></li>\n' "$link_attr" "$label_text"
|
||||||
|
done
|
||||||
|
printf '</ul>'
|
||||||
|
}
|
||||||
|
|
||||||
template="$src/template.html"
|
template="$src/template.html"
|
||||||
[ -f "$template" ] || template="./template.html"
|
[ -f "$template" ] || template="./template.html"
|
||||||
[ -f "$template" ] || die "Template '$template' not found."
|
[ -f "$template" ] || die "Template '$template' not found."
|
||||||
@@ -209,6 +376,15 @@ template="$src/template.html"
|
|||||||
mkdir -p "$out"
|
mkdir -p "$out"
|
||||||
|
|
||||||
nav=$(generate_nav "$src")
|
nav=$(generate_nav "$src")
|
||||||
|
extra_links=$(nav_links_html)
|
||||||
|
if [ -n "$extra_links" ]; then
|
||||||
|
nav="$nav
|
||||||
|
$extra_links"
|
||||||
|
fi
|
||||||
|
if [ -n "$nav_extra" ]; then
|
||||||
|
nav="$nav
|
||||||
|
$nav_extra"
|
||||||
|
fi
|
||||||
|
|
||||||
find_closest() {
|
find_closest() {
|
||||||
target="$1"
|
target="$1"
|
||||||
@@ -240,7 +416,7 @@ render_markdown() {
|
|||||||
closest_style_src=$(find_closest "styles.css" "$(dirname "$file")")
|
closest_style_src=$(find_closest "styles.css" "$(dirname "$file")")
|
||||||
[ -z "$closest_style_src" ] && closest_style_src=$(find_closest "style.css" "$(dirname "$file")")
|
[ -z "$closest_style_src" ] && closest_style_src=$(find_closest "style.css" "$(dirname "$file")")
|
||||||
if [ -n "$closest_style_src" ]; then
|
if [ -n "$closest_style_src" ]; then
|
||||||
style_rel_to_src="${closest_style_src#$src/}"
|
style_rel_to_src="${closest_style_src#"$src"/}"
|
||||||
case "$closest_style_src" in
|
case "$closest_style_src" in
|
||||||
"$src/styles.css") style_rel_to_src="styles.css" ;;
|
"$src/styles.css") style_rel_to_src="styles.css" ;;
|
||||||
"$src/style.css") style_rel_to_src="style.css" ;;
|
"$src/style.css") style_rel_to_src="style.css" ;;
|
||||||
@@ -282,14 +458,15 @@ render_markdown() {
|
|||||||
head_extra="<link rel=\"icon\" href=\"$favicon_src\" />"
|
head_extra="<link rel=\"icon\" href=\"$favicon_src\" />"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
MARKDOWN_SITE_ROOT="$src" MARKDOWN_FALLBACK_FILE="styles/$style.css" sh "$script_dir/markdown.sh" "$file" | awk -v title="$title" -v nav="$nav" -v footer="$footer" -v style_path="$style_path" -v header_brand="$header_brand" -v head_extra="$head_extra" -f "$awk_dir/render_template.awk" "$local_template"
|
MARKDOWN_SITE_ROOT="$src" MARKDOWN_FALLBACK_FILE="$script_dir/styles/$style.css" sh "$script_dir/markdown.sh" "$file" | awk -v title="$title" -v nav="$nav" -v footer="$footer" -v style_path="$style_path" -v header_brand="$header_brand" -v head_extra="$head_extra" -f "$awk_dir/render_template.awk" "$local_template"
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "Building site from '$src' to '$out'..."
|
echo "Building site from '$src' to '$out'..."
|
||||||
|
|
||||||
find "$src" \( -name ".*" ! -name "." ! -name ".." -prune \) -o -type d -print | sort | while read -r dir; do
|
eval "find \"$src\" \( $IGNORE_ARGS \) -prune -o -type d -print" | sort | while read -r dir; do
|
||||||
rel_dir="${dir#$src/}"
|
rel_dir="${dir#"$src"}"
|
||||||
[ "$dir" = "$src" ] && rel_dir="."
|
rel_dir="${rel_dir#/}"
|
||||||
|
[ -z "$rel_dir" ] && rel_dir="."
|
||||||
out_dir="$out/$rel_dir"
|
out_dir="$out/$rel_dir"
|
||||||
mkdir -p "$out_dir"
|
mkdir -p "$out_dir"
|
||||||
|
|
||||||
@@ -334,12 +511,13 @@ find "$src" \( -name ".*" ! -name "." ! -name ".." -prune \) -o -type d -print |
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ ! -f "$out/styles.css" ] && [ -f "styles/$style.css" ]; then
|
if [ ! -f "$out/styles.css" ] && [ -f "$script_dir/styles/$style.css" ]; then
|
||||||
copy_style_with_resolved_vars "styles/$style.css" "$out/styles.css"
|
copy_style_with_resolved_vars "$script_dir/styles/$style.css" "$out/styles.css"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
find "$src" \( -name ".*" ! -name "." ! -name ".." -prune \) -o -type f -print | sort | while IFS= read -r file; do
|
eval "find \"$src\" \( $IGNORE_ARGS \) -prune -o -type f -print" | sort | while IFS= read -r file; do
|
||||||
rel_path="${file#$src/}"
|
rel_path="${file#"$src"}"
|
||||||
|
rel_path="${rel_path#/}"
|
||||||
dir_rel=$(dirname "$rel_path")
|
dir_rel=$(dirname "$rel_path")
|
||||||
out_dir="$out/$dir_rel"
|
out_dir="$out/$dir_rel"
|
||||||
|
|
||||||
@@ -347,12 +525,17 @@ find "$src" \( -name ".*" ! -name "." ! -name ".." -prune \) -o -type f -print |
|
|||||||
template.html|site.conf|style.css|styles.css) continue ;;
|
template.html|site.conf|style.css|styles.css) continue ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [ "$single_file_index" = "true" ] && [ "${file%.md}" != "$file" ] && [ ! -f "$(dirname "$file")/index.md" ]; then
|
is_preserved=0
|
||||||
|
if [ -n "$(eval "find \"$file\" \( $PRESERVE_ARGS \) -print")" ]; then
|
||||||
|
is_preserved=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$single_file_index" = "true" ] && [ "${file%.md}" != "$file" ] && [ "$is_preserved" -eq 0 ] && [ ! -f "$(dirname "$file")/index.md" ]; then
|
||||||
md_count=$(find "$(dirname "$file")" ! -name "$(basename "$(dirname "$file")")" -prune -name "*.md" | wc -l)
|
md_count=$(find "$(dirname "$file")" ! -name "$(basename "$(dirname "$file")")" -prune -name "*.md" | wc -l)
|
||||||
[ "$md_count" -eq 1 ] && continue
|
[ "$md_count" -eq 1 ] && continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${file%.md}" != "$file" ]; then
|
if [ "${file%.md}" != "$file" ] && [ "$is_preserved" -eq 0 ]; then
|
||||||
out_file="$out/${rel_path%.md}.html"
|
out_file="$out/${rel_path%.md}.html"
|
||||||
render_markdown "$file" > "$out_file"
|
render_markdown "$file" > "$out_file"
|
||||||
else
|
else
|
||||||
@@ -360,4 +543,5 @@ find "$src" \( -name ".*" ! -name "." ! -name ".." -prune \) -o -type f -print |
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
echo "Build complete."
|
echo "Build complete."
|
||||||
|
|||||||
20
markdown.sh
20
markdown.sh
@@ -1,27 +1,31 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
script_dir=$(CDPATH="" cd -- "$(dirname -- "$0")" && pwd)
|
||||||
awk_dir="$script_dir/awk"
|
awk_dir="$script_dir/awk"
|
||||||
|
|
||||||
sed_inplace() {
|
sed_inplace() {
|
||||||
script="$1"
|
script="$1"
|
||||||
file="$2"
|
file="$2"
|
||||||
tmp="${file}.tmp.$$"
|
tmp="${file}.tmp.$$"
|
||||||
sed "$script" "$file" > "$tmp" && mv "$tmp" "$file" || {
|
if sed "$script" "$file" > "$tmp" && mv "$tmp" "$file"; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
rm -f "$tmp"
|
rm -f "$tmp"
|
||||||
return 1
|
return 1
|
||||||
}
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
temp_file="/tmp/markdown.$$"
|
temp_file="/tmp/markdown.$$.md"
|
||||||
cat "$@" > "$temp_file"
|
cat "$@" > "$temp_file"
|
||||||
|
|
||||||
|
trap 'rm -f "$temp_file" "$temp_file.tmp"' EXIT INT TERM
|
||||||
|
|
||||||
# Mask
|
# Mask
|
||||||
awk -f "$awk_dir/mask_inline_code.awk" "$temp_file" > "$temp_file.tmp" && mv "$temp_file.tmp" "$temp_file"
|
awk -f "$awk_dir/mask_inline_code.awk" "$temp_file" > "$temp_file.tmp" && mv "$temp_file.tmp" "$temp_file"
|
||||||
awk -f "$awk_dir/mask_plain.awk" "$temp_file" > "$temp_file.tmp" && mv "$temp_file.tmp" "$temp_file"
|
awk -f "$awk_dir/mask_plain.awk" "$temp_file" > "$temp_file.tmp" && mv "$temp_file.tmp" "$temp_file"
|
||||||
|
|
||||||
# Reference links
|
# Reference links
|
||||||
refs=$(cat "$@" | awk '/^\[[^\]]+\]: +/')
|
refs=$(cat "$@" | awk '/^\[[^\]]+\]: */')
|
||||||
IFS='
|
IFS='
|
||||||
'
|
'
|
||||||
for ref in $refs; do
|
for ref in $refs; do
|
||||||
@@ -33,7 +37,7 @@ for ref in $refs; do
|
|||||||
sed_inplace "s|!\[$ref_id\]\[\]|<img src=\"$ref_url\" title=\"$ref_title\" alt=\"$ref_id\" />|g" "$temp_file"
|
sed_inplace "s|!\[$ref_id\]\[\]|<img src=\"$ref_url\" title=\"$ref_title\" alt=\"$ref_id\" />|g" "$temp_file"
|
||||||
sed_inplace "s|\[$ref_id\]\[\]|<a href=\"$ref_url\" title=\"$ref_title\">$ref_id</a>|g" "$temp_file"
|
sed_inplace "s|\[$ref_id\]\[\]|<a href=\"$ref_url\" title=\"$ref_title\">$ref_id</a>|g" "$temp_file"
|
||||||
done
|
done
|
||||||
sed_inplace "/^\[[^\]]*\]: +/d" "$temp_file"
|
sed_inplace "/^\[[^\]]*\]: */d" "$temp_file"
|
||||||
|
|
||||||
# Blocks
|
# Blocks
|
||||||
sed_inplace "s/^>!\[/> [!/g" "$temp_file"
|
sed_inplace "s/^>!\[/> [!/g" "$temp_file"
|
||||||
@@ -50,10 +54,6 @@ awk -f "$awk_dir/pipe_tables.awk" "$temp_file" > "$temp_file.tmp" && mv "$temp_f
|
|||||||
awk -f "$awk_dir/headers.awk" "$temp_file" > "$temp_file.tmp" && mv "$temp_file.tmp" "$temp_file"
|
awk -f "$awk_dir/headers.awk" "$temp_file" > "$temp_file.tmp" && mv "$temp_file.tmp" "$temp_file"
|
||||||
awk -f "$awk_dir/lists.awk" "$temp_file" > "$temp_file.tmp" && mv "$temp_file.tmp" "$temp_file"
|
awk -f "$awk_dir/lists.awk" "$temp_file" > "$temp_file.tmp" && mv "$temp_file.tmp" "$temp_file"
|
||||||
|
|
||||||
sed_inplace "s/^\*\*\*+$/<hr \/>/g" "$temp_file"
|
|
||||||
sed_inplace "s/^---+$/<hr \/>/g" "$temp_file"
|
|
||||||
sed_inplace "s/^___+$/<hr \/>/g" "$temp_file"
|
|
||||||
|
|
||||||
# Spacing
|
# Spacing
|
||||||
awk -f "$awk_dir/breaks.awk" "$temp_file" > "$temp_file.tmp" && mv "$temp_file.tmp" "$temp_file"
|
awk -f "$awk_dir/breaks.awk" "$temp_file" > "$temp_file.tmp" && mv "$temp_file.tmp" "$temp_file"
|
||||||
awk -f "$awk_dir/paragraphs.awk" "$temp_file" > "$temp_file.tmp" && mv "$temp_file.tmp" "$temp_file"
|
awk -f "$awk_dir/paragraphs.awk" "$temp_file" > "$temp_file.tmp" && mv "$temp_file.tmp" "$temp_file"
|
||||||
|
|||||||
21
packaging/AUR/PKGBUILD.template
Normal file
21
packaging/AUR/PKGBUILD.template
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Maintainer: n0va <n0va@krzak.org>
|
||||||
|
pkgname=kewt-bin
|
||||||
|
pkgver=VERSION_PLACEHOLDER
|
||||||
|
pkgrel=1
|
||||||
|
pkgdesc="A minimalist, 100% POSIX static site generator inspired by werc and kew"
|
||||||
|
arch=('any')
|
||||||
|
url="https://git.krzak.org/N0VA/kewt"
|
||||||
|
license=('MIT')
|
||||||
|
depends=('sh')
|
||||||
|
provides=('kewt')
|
||||||
|
conflicts=('kewt' 'kewt-git')
|
||||||
|
source=("${pkgname}-${pkgver}.sh::${url}/releases/download/v${pkgver}/kewt")
|
||||||
|
sha256sums=('SHA256SUM_PLACEHOLDER')
|
||||||
|
|
||||||
|
build() {
|
||||||
|
chmod +x "${srcdir}/${pkgname}-${pkgver}.sh"
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
install -Dm755 "${srcdir}/${pkgname}-${pkgver}.sh" "${pkgdir}/usr/bin/kewt"
|
||||||
|
}
|
||||||
@@ -10,3 +10,7 @@ display_title = true
|
|||||||
logo_as_favicon = true
|
logo_as_favicon = true
|
||||||
favicon = ""
|
favicon = ""
|
||||||
order = ""
|
order = ""
|
||||||
|
home_name = "Home"
|
||||||
|
show_home_in_nav = true
|
||||||
|
nav_links = ""
|
||||||
|
nav_extra = ""
|
||||||
|
|||||||
@@ -15,3 +15,5 @@ Sed dictum tortor at interdum dignissim. Nunc hendrerit sollicitudin elementum.
|
|||||||
Cras vitae sapien egestas, blandit libero et, volutpat augue. Ut augue quam, sollicitudin quis libero laoreet, bibendum imperdiet massa. Duis sed venenatis risus. Praesent a est mollis, viverra erat quis, faucibus elit. Donec at sagittis est, non posuere nisi. Integer posuere pharetra dui in aliquam. Morbi vehicula eros in hendrerit aliquam. Duis in turpis vel mauris mattis convallis in id tortor. Cras et aliquam augue.
|
Cras vitae sapien egestas, blandit libero et, volutpat augue. Ut augue quam, sollicitudin quis libero laoreet, bibendum imperdiet massa. Duis sed venenatis risus. Praesent a est mollis, viverra erat quis, faucibus elit. Donec at sagittis est, non posuere nisi. Integer posuere pharetra dui in aliquam. Morbi vehicula eros in hendrerit aliquam. Duis in turpis vel mauris mattis convallis in id tortor. Cras et aliquam augue.
|
||||||
|
|
||||||
Cras quis consectetur dolor, a sodales tortor. Vestibulum aliquam lacinia metus, sed viverra erat egestas in. Morbi interdum sapien sed bibendum maximus. Aenean accumsan pharetra libero dapibus aliquam. Etiam sodales purus posuere gravida ullamcorper. Vestibulum tincidunt, nibh a pulvinar aliquet, leo tortor pulvinar diam, ut viverra nunc elit bibendum nulla. Praesent vel pulvinar erat, eu efficitur magna. Mauris at consequat purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce in dui quis nisi elementum aliquam. Proin eget justo sed est commodo accumsan. Suspendisse a feugiat tellus, eget gravida tellus.
|
Cras quis consectetur dolor, a sodales tortor. Vestibulum aliquam lacinia metus, sed viverra erat egestas in. Morbi interdum sapien sed bibendum maximus. Aenean accumsan pharetra libero dapibus aliquam. Etiam sodales purus posuere gravida ullamcorper. Vestibulum tincidunt, nibh a pulvinar aliquet, leo tortor pulvinar diam, ut viverra nunc elit bibendum nulla. Praesent vel pulvinar erat, eu efficitur magna. Mauris at consequat purus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce in dui quis nisi elementum aliquam. Proin eget justo sed est commodo accumsan. Suspendisse a feugiat tellus, eget gravida tellus.
|
||||||
|
|
||||||
|
![https://www.youtube.com/embed/NvQD9E5Cq8A]
|
||||||
|
|||||||
@@ -19,6 +19,15 @@ It's meant to be a static site generator, like _[kew](https://github.com/uint23/
|
|||||||
|
|
||||||
If you want to **force** a file to be inlined, use `\!![]` instead of `\![]`
|
If you want to **force** a file to be inlined, use `\!![]` instead of `\![]`
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
You can clone the repository to use `kewt.sh` directly, or you can download the standalone executable, which bundles all dependencies into a single file:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -L -o kewt https://git.krzak.org/N0VA/kewt/releases/latest/download/kewt
|
||||||
|
chmod +x kewt
|
||||||
|
```
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@@ -39,6 +48,10 @@ dir_indexes = true
|
|||||||
single_file_index = true
|
single_file_index = true
|
||||||
flatten = false
|
flatten = false
|
||||||
order = ""
|
order = ""
|
||||||
|
home_name = "Home"
|
||||||
|
show_home_in_nav = true
|
||||||
|
nav_links = ""
|
||||||
|
nav_extra = ""
|
||||||
footer = "made with <a href="https://kewt.krzak.org">kewt</a>"
|
footer = "made with <a href="https://kewt.krzak.org">kewt</a>"
|
||||||
logo = ""
|
logo = ""
|
||||||
display_logo = false
|
display_logo = false
|
||||||
@@ -53,6 +66,10 @@ favicon = ""
|
|||||||
- `single_file_index` if a directory has one markdown file and no `index.md`, use that file as `index.html`
|
- `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
|
- `flatten` flatten sidebar directory levels
|
||||||
- `order` comma separated file/directory name list to order the sidebar (alphabetical by default)
|
- `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)`
|
||||||
|
- `nav_extra` raw HTML appended inside the `<nav>` after the generated link list
|
||||||
- `footer` footer html/text shown at the bottom of pages
|
- `footer` footer html/text shown at the bottom of pages
|
||||||
- `logo` logo image path (used in header if enabled)
|
- `logo` logo image path (used in header if enabled)
|
||||||
- `display_logo` show logo in header
|
- `display_logo` show logo in header
|
||||||
@@ -60,6 +77,12 @@ favicon = ""
|
|||||||
- `logo_as_favicon` use `logo` as favicon
|
- `logo_as_favicon` use `logo` as favicon
|
||||||
- `favicon` explicit favicon path (used when `logo_as_favicon` is false or no logo is set)
|
- `favicon` explicit favicon path (used when `logo_as_favicon` is false or no logo is set)
|
||||||
|
|
||||||
|
## Ignores
|
||||||
|
|
||||||
|
- `.kewtignore`: Files/directories to ignore. If empty, the whole directory gets ignored
|
||||||
|
- `.kewthide`: Files/directories to hide from navigation but still process. Same empty rules as with ignore
|
||||||
|
- `.kewtpreserve`: Files/directories to copy but not convert markdown to html. Same empty rules again
|
||||||
|
|
||||||
## Embeds
|
## Embeds
|
||||||
|
|
||||||
- `\![link]`:
|
- `\![link]`:
|
||||||
|
|||||||
@@ -43,6 +43,15 @@ header h1 {
|
|||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.site-logo {
|
||||||
|
vertical-align: middle;
|
||||||
|
height: 1.1em;
|
||||||
|
width: auto;
|
||||||
|
border: none;
|
||||||
|
margin-right: 0.2em;
|
||||||
|
margin-top: -0.1em;
|
||||||
|
}
|
||||||
|
|
||||||
header a {
|
header a {
|
||||||
color: var(--fg);
|
color: var(--fg);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
@@ -199,3 +208,15 @@ footer {
|
|||||||
margin-left: 240px;
|
margin-left: 240px;
|
||||||
margin-top: 0px;
|
margin-top: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
image-rendering: auto;
|
||||||
|
image-rendering: crisp-edges;
|
||||||
|
image-rendering: pixelated;
|
||||||
|
image-rendering: -webkit-optimize-contrast;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer img {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|||||||
32
tools/build-standalone.sh
Normal file
32
tools/build-standalone.sh
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||||
|
|
||||||
|
if [ ! -f "$REPO_ROOT/kewt.sh" ]; then
|
||||||
|
echo "kewt.sh not found. Run from the repository root or tools/."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
OUT_FILE="$REPO_ROOT/kewt"
|
||||||
|
|
||||||
|
cat << 'EOF' > "$OUT_FILE"
|
||||||
|
#!/bin/sh
|
||||||
|
tmpdir=$(mktemp -d "/tmp/kewt.XXXXXX")
|
||||||
|
trap 'rm -rf "$tmpdir"' EXIT HUP INT TERM
|
||||||
|
|
||||||
|
# Extract payload
|
||||||
|
sed '1,/^#==PAYLOAD==$/d' "$0" | tar -xz -C "$tmpdir"
|
||||||
|
|
||||||
|
# Pass control to the extracted script
|
||||||
|
exec "$tmpdir/kewt.sh" "$@"
|
||||||
|
|
||||||
|
#==PAYLOAD==
|
||||||
|
EOF
|
||||||
|
|
||||||
|
tar -cz -C "$REPO_ROOT" kewt.sh markdown.sh awk styles >> "$OUT_FILE"
|
||||||
|
|
||||||
|
chmod +x "$OUT_FILE"
|
||||||
|
|
||||||
|
echo "Generated standalone executable at $OUT_FILE"
|
||||||
Reference in New Issue
Block a user