diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index e95dc5668..22a80680f 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -68,62 +68,14 @@ jobs: - name: Convert Manpages to HTML and Generate Index run: | - mkdir -p manpages-html + # Extract tldr pages for examples + mkdir -p tldr-pages + if [ -f coreutils/docs/tldr.zip ]; then + unzip -o coreutils/docs/tldr.zip -d tldr-extract + find tldr-extract -name "*.md" -exec cp {} tldr-pages/ \; + fi - # Convert manpages to HTML and collect names - manpage_names="" - for man in manpages/usr/local/share/man/man*/*.1; do - if [ -f "$man" ]; then - name=$(basename "$man" .1) - man2html -r "$man" > "manpages-html/${name}.html" - manpage_names="$manpage_names $name" - fi - done - - # Generate index.html with links to all manpages - cat > manpages-html/index.html << 'HEADER' - - - - - uutils coreutils - Manual Pages - - - - -

Manual Pages

-

Complete manual pages for all uutils coreutils commands. Click on any command to view its full documentation.

-
- HEADER - - for name in $(echo $manpage_names | tr ' ' '\n' | sort); do - echo " ${name}" >> manpages-html/index.html - done - - cat >> manpages-html/index.html << 'FOOTER' -
- - - FOOTER + uutils.github.io/scripts/build-manpages.sh manpages tldr-pages manpages-html uutils.github.io/templates - name: Build Findutils Docs run: | diff --git a/scripts/build-manpages.sh b/scripts/build-manpages.sh new file mode 100755 index 000000000..27bb97b04 --- /dev/null +++ b/scripts/build-manpages.sh @@ -0,0 +1,80 @@ +#!/bin/bash +# Build styled HTML manpages from man files +# Usage: build-manpages.sh + +set -euo pipefail + +MANPAGES_DIR="${1:?Usage: $0 }" +TLDR_DIR="${2:?}" +OUTPUT_DIR="${3:?}" +TEMPLATES_DIR="${4:?}" + +mkdir -p "$OUTPUT_DIR" + +MANPAGE_TEMPLATE="$TEMPLATES_DIR/manpage.html" +INDEX_TEMPLATE="$TEMPLATES_DIR/manpage-index.html" + +manpage_names="" + +for man in "$MANPAGES_DIR"/usr/local/share/man/man*/*.1; do + [ -f "$man" ] || continue + name=$(basename "$man" .1) + + # Convert manpage, strip man2html header and footer + man_content=$(man2html -r "$man" | sed '1,/^$/d' | sed '/This document was created by/,/<\/BODY>/d; /<\/HTML>/d') + + # Build tldr examples section + tldr_html="" + tldr_file="$TLDR_DIR/${name}.md" + if [ -f "$tldr_file" ]; then + tldr_html="

Examples (from tldr)

" + while IFS= read -r line; do + case "$line" in + "# "* | "> "* | "---" | "") ;; + "- "*) + desc="${line#- }" + tldr_html="$tldr_html

$desc

" + ;; + '`'*'`') + cmd="${line#\`}" + cmd="${cmd%\`}" + cmd=$(echo "$cmd" | sed 's/&/\&/g; s//\>/g') + tldr_html="$tldr_html
$cmd
" + ;; + esac + done < "$tldr_file" + tldr_html="$tldr_html
" + fi + + # Apply template: split at placeholders, concatenate with content + # Get line numbers of placeholders + content_line=$(grep -n '{{CONTENT}}' "$MANPAGE_TEMPLATE" | cut -d: -f1) + tldr_line=$(grep -n '{{TLDR}}' "$MANPAGE_TEMPLATE" | cut -d: -f1) + + { + # Before {{CONTENT}} + head -n $((content_line - 1)) "$MANPAGE_TEMPLATE" | sed "s|{{NAME}}|${name}|g" + # The manpage content + echo "$man_content" + # Between {{CONTENT}} and {{TLDR}} + sed -n "$((content_line + 1)),$((tldr_line - 1))p" "$MANPAGE_TEMPLATE" | sed "s|{{NAME}}|${name}|g" + # The tldr content + echo "$tldr_html" + # After {{TLDR}} + tail -n +$((tldr_line + 1)) "$MANPAGE_TEMPLATE" | sed "s|{{NAME}}|${name}|g" + } > "$OUTPUT_DIR/${name}.html" + + manpage_names="$manpage_names $name" +done + +# Build index page +content_line=$(grep -n '{{LINKS}}' "$INDEX_TEMPLATE" | cut -d: -f1) +{ + head -n $((content_line - 1)) "$INDEX_TEMPLATE" + for name in $(echo $manpage_names | tr ' ' '\n' | sort); do + echo " ${name}" + done + tail -n +$((content_line + 1)) "$INDEX_TEMPLATE" +} > "$OUTPUT_DIR/index.html" + +echo "Built $(echo $manpage_names | wc -w) manpages in $OUTPUT_DIR" diff --git a/templates/manpage-index.html b/templates/manpage-index.html new file mode 100644 index 000000000..28d0eab2e --- /dev/null +++ b/templates/manpage-index.html @@ -0,0 +1,35 @@ + + + + + uutils coreutils - Manual Pages + + + + +

Manual Pages

+

Complete manual pages for all uutils coreutils commands. Click on any command to view its full documentation.

+
+ {{LINKS}} +
+ + diff --git a/templates/manpage.html b/templates/manpage.html new file mode 100644 index 000000000..abf5b06e4 --- /dev/null +++ b/templates/manpage.html @@ -0,0 +1,56 @@ + + + + + {{NAME}}(1) - uutils coreutils + + + +
+ + +
+
+ {{CONTENT}} +
+ {{TLDR}} + +