Remove manpage generation in favor of mdbook docs

The existing mdbook docs at /coreutils/docs/ already provide utility
documentation. Remove the redundant manpage HTML generation scripts
and templates.
This commit is contained in:
Sylvestre Ledru
2026-03-22 09:13:11 +01:00
parent 96cc48809d
commit f3ff4f42a3
5 changed files with 0 additions and 523 deletions
-119
View File
@@ -1,119 +0,0 @@
#!/bin/bash
# Build manpages for all languages
# Usage: build-all-manpages.sh <coreutils-dir> <output-dir> <templates-dir>
set -euo pipefail
COREUTILS_DIR="${1:?Usage: $0 <coreutils-dir> <output-dir> <templates-dir>}"
OUTPUT_DIR="${2:?}"
TEMPLATES_DIR="${3:?}"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
# Language config: lang-code -> LANG env value
declare -A LANG_MAP=(
[en]="en_US.UTF-8"
[fr]="fr_FR.UTF-8"
[de]="de_DE.UTF-8"
[es]="es_ES.UTF-8"
[it]="it_IT.UTF-8"
[pt]="pt_PT.UTF-8"
[pt-BR]="pt_BR.UTF-8"
[ja]="ja_JP.UTF-8"
[ko]="ko_KR.UTF-8"
[ru]="ru_RU.UTF-8"
[zh]="zh_CN.UTF-8"
[uk]="uk_UA.UTF-8"
[sv]="sv_SE.UTF-8"
[pl]="pl_PL.UTF-8"
[tr]="tr_TR.UTF-8"
[ar]="ar_SA.UTF-8"
[cs]="cs_CZ.UTF-8"
[da]="da_DK.UTF-8"
[id]="id_ID.UTF-8"
)
# manpage lang code -> tldr lang code (when they differ)
declare -A MANPAGE_TO_TLDR=(
[fr-FR]="fr"
[es-ES]="es"
[zh-Hans]="zh"
)
TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT
# Download tldr archives
echo "Downloading tldr archives..."
mkdir -p "$TMPDIR/tldr-archives"
curl -sfL "https://github.com/tldr-pages/tldr/releases/download/v2.3/tldr-pages.zip" \
-o "$TMPDIR/tldr-archives/en.zip" || true
for lang in fr de es it pt pt-BR ja ko ru zh uk sv pl tr ar cs da id; do
curl -sfL "https://github.com/tldr-pages/tldr/releases/download/v2.3/tldr-pages.${lang}.zip" \
-o "$TMPDIR/tldr-archives/${lang}.zip" || true
done
# Extract English tldr as fallback for untranslated pages
EN_TLDR_DIR="$TMPDIR/tldr-pages-en"
mkdir -p "$EN_TLDR_DIR"
if [ -f "$TMPDIR/tldr-archives/en.zip" ]; then
unzip -o "$TMPDIR/tldr-archives/en.zip" -d "$TMPDIR/tldr-extract-en" > /dev/null 2>&1 || true
find "$TMPDIR/tldr-extract-en" -name "*.md" -exec cp {} "$EN_TLDR_DIR/" \; 2>/dev/null || true
fi
# Build uudoc once (if not already built by the docs step)
make -C "$COREUTILS_DIR" build-uudoc 2>&1 | tail -1
# Generate and build manpages for each language
for lang in "${!LANG_MAP[@]}"; do
echo "=== Building $lang manpages ==="
# Determine the tldr/url lang code
tldr_lang="${MANPAGE_TO_TLDR[$lang]:-$lang}"
# Extract tldr pages for this language
tldr_dir="$TMPDIR/tldr-pages-${lang}"
mkdir -p "$tldr_dir"
if [ "$lang" != "en" ]; then
archive="$TMPDIR/tldr-archives/${tldr_lang}.zip"
if [ -f "$archive" ]; then
extract_dir="$TMPDIR/tldr-extract-${lang}"
unzip -o "$archive" -d "$extract_dir" > /dev/null 2>&1 || true
find "$extract_dir" -name "*.md" -exec cp {} "$tldr_dir/" \; 2>/dev/null || true
fi
else
tldr_dir="$EN_TLDR_DIR"
fi
# Generate manpages with the right locale (reuse already-built uudoc)
manpages_dir="$TMPDIR/manpages-${lang}"
cd "$COREUTILS_DIR"
if ! LANG="${LANG_MAP[$lang]}" make install-manpages DESTDIR="$manpages_dir" 2>&1; then
echo "WARNING: Failed to generate manpages for $lang, skipping"
continue
fi
cd - > /dev/null
# Determine output subdirectory
if [ "$lang" = "en" ]; then
out_subdir="$OUTPUT_DIR/en"
else
out_subdir="$OUTPUT_DIR/${tldr_lang}"
fi
# Skip if no manpages were generated
if ! ls "$manpages_dir"/usr/local/share/man/man*/*.1 > /dev/null 2>&1; then
echo "WARNING: No manpages found for $lang, skipping HTML generation"
continue
fi
# Build HTML (pass English tldr as fallback for non-English builds)
if [ "$lang" = "en" ]; then
"$SCRIPT_DIR/build-manpages.sh" "$manpages_dir" "$tldr_dir" "$out_subdir" "$TEMPLATES_DIR" "$tldr_lang"
else
"$SCRIPT_DIR/build-manpages.sh" "$manpages_dir" "$tldr_dir" "$out_subdir" "$TEMPLATES_DIR" "$tldr_lang" "$EN_TLDR_DIR"
fi
done
echo "All manpages built in $OUTPUT_DIR"
-129
View File
@@ -1,129 +0,0 @@
#!/bin/bash
# Build styled HTML manpages from man files
# Usage: build-manpages.sh <manpages-dir> <tldr-dir> <output-dir> <templates-dir> [lang] [fallback-tldr-dir]
set -euo pipefail
MANPAGES_DIR="${1:?Usage: $0 <manpages-dir> <tldr-dir> <output-dir> <templates-dir> [lang] [fallback-tldr-dir]}"
TLDR_DIR="${2:?}"
OUTPUT_DIR="${3:?}"
TEMPLATES_DIR="${4:?}"
LANG_CODE="${5:-en}"
FALLBACK_TLDR_DIR="${6:-}"
mkdir -p "$OUTPUT_DIR"
MANPAGE_TEMPLATE="$TEMPLATES_DIR/manpage.html"
INDEX_TEMPLATE="$TEMPLATES_DIR/manpage-index.html"
# Language display names
declare -A LANG_NAMES=(
[en]="English" [fr]="Français" [de]="Deutsch" [es]="Español"
[it]="Italiano" [pt]="Português" [pt-BR]="Português (Brasil)"
[ja]="日本語" [ko]="한국어" [ru]="Русский" [zh]="中文"
[uk]="Українська" [sv]="Svenska" [pl]="Polski" [tr]="Türkçe"
[ar]="العربية" [cs]="Čeština" [da]="Dansk" [id]="Bahasa Indonesia"
)
LANG_NAME="${LANG_NAMES[$LANG_CODE]:-$LANG_CODE}"
# Determine manpages base path
if [ "$LANG_CODE" = "en" ]; then
MANPAGES_PATH="manpages"
else
MANPAGES_PATH="manpages-${LANG_CODE}"
fi
# Helper: parse a tldr markdown file into HTML
parse_tldr() {
local file="$1"
local html=""
while IFS= read -r line; do
case "$line" in
"# "* | "> "* | "---" | "") ;;
"- "*)
desc="${line#- }"
html="$html<div class=\"tldr-example\"><p class=\"tldr-desc\">$desc</p>"
;;
'`'*'`')
cmd="${line#\`}"
cmd="${cmd%\`}"
cmd=$(echo "$cmd" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
html="$html<pre><code>$cmd</code></pre></div>"
;;
esac
done < "$file"
echo "$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"
fallback_file="${FALLBACK_TLDR_DIR:+$FALLBACK_TLDR_DIR/${name}.md}"
if [ -f "$tldr_file" ]; then
# Translated tldr available
tldr_html="<div class=\"tldr-section\"><h2>Examples (from tldr)</h2>"
tldr_html="$tldr_html$(parse_tldr "$tldr_file")"
tldr_html="$tldr_html</div>"
elif [ -n "$FALLBACK_TLDR_DIR" ] && [ -f "$fallback_file" ] && [ "$LANG_CODE" != "en" ]; then
# Fall back to English
tldr_html="<div class=\"tldr-section\"><h2>Examples (from tldr)</h2>"
tldr_html="$tldr_html<p class=\"tldr-untranslated\">These examples are not yet translated. <a href=\"https://github.com/tldr-pages/tldr/blob/main/CONTRIBUTING.md#translations\">Help translate them</a>.</p>"
tldr_html="$tldr_html$(parse_tldr "$fallback_file")"
tldr_html="$tldr_html</div>"
fi
# Apply template: split at placeholders, concatenate with content
content_line=$(grep -n '{{CONTENT}}' "$MANPAGE_TEMPLATE" | cut -d: -f1)
tldr_line=$(grep -n '{{TLDR}}' "$MANPAGE_TEMPLATE" | cut -d: -f1)
{
head -n $((content_line - 1)) "$MANPAGE_TEMPLATE" \
| sed "s|{{NAME}}|${name}|g" \
| sed "s|{{LANG_CODE}}|${LANG_CODE}|g" \
| sed "s|{{LANG_NAME}}|${LANG_NAME}|g" \
| sed "s|{{MANPAGES_PATH}}|${MANPAGES_PATH}|g"
echo "$man_content"
sed -n "$((content_line + 1)),$((tldr_line - 1))p" "$MANPAGE_TEMPLATE" \
| sed "s|{{NAME}}|${name}|g" \
| sed "s|{{LANG_CODE}}|${LANG_CODE}|g" \
| sed "s|{{LANG_NAME}}|${LANG_NAME}|g" \
| sed "s|{{MANPAGES_PATH}}|${MANPAGES_PATH}|g"
echo "$tldr_html"
tail -n +$((tldr_line + 1)) "$MANPAGE_TEMPLATE" \
| sed "s|{{NAME}}|${name}|g" \
| sed "s|{{LANG_CODE}}|${LANG_CODE}|g" \
| sed "s|{{LANG_NAME}}|${LANG_NAME}|g" \
| sed "s|{{MANPAGES_PATH}}|${MANPAGES_PATH}|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" \
| sed "s|{{LANG_CODE}}|${LANG_CODE}|g" \
| sed "s|{{LANG_NAME}}|${LANG_NAME}|g" \
| sed "s|{{MANPAGES_PATH}}|${MANPAGES_PATH}|g"
for name in $(echo $manpage_names | tr ' ' '\n' | sort); do
echo " <a href=\"${name}.html\" class=\"manpage-link\">${name}</a>"
done
tail -n +$((content_line + 1)) "$INDEX_TEMPLATE" \
| sed "s|{{LANG_CODE}}|${LANG_CODE}|g" \
| sed "s|{{LANG_NAME}}|${LANG_NAME}|g" \
| sed "s|{{MANPAGES_PATH}}|${MANPAGES_PATH}|g"
} > "$OUTPUT_DIR/index.html"
echo "Built $(echo $manpage_names | wc -w) manpages ($LANG_NAME) in $OUTPUT_DIR"
-53
View File
@@ -1,53 +0,0 @@
<!DOCTYPE html>
<html lang="{{LANG_CODE}}">
<head>
<meta charset="utf-8">
<title>uutils coreutils - Manual Pages ({{LANG_NAME}})</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; max-width: 1200px; margin: 0 auto; padding: 20px; }
h1 { color: #333; }
.breadcrumb { margin-bottom: 20px; }
.breadcrumb a { color: #007acc; text-decoration: none; }
.breadcrumb a:hover { text-decoration: underline; }
.manpage-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 15px; margin-top: 30px; }
.manpage-link { display: block; padding: 12px; background: #f5f5f5; border: 1px solid #ddd; border-radius: 5px; text-decoration: none; color: #333; text-align: center; font-family: monospace; font-weight: bold; font-size: 1.1em; transition: all 0.3s ease; }
.manpage-link:hover { background: #007acc; color: white; border-color: #007acc; transform: translateY(-2px); box-shadow: 0 2px 5px rgba(0,0,0,0.2); }
.lang-bar { margin-bottom: 15px; font-size: 0.85em; color: #666; }
.lang-bar a { color: #007acc; margin: 0 3px; }
.lang-bar .current { font-weight: bold; color: #333; }
@media (prefers-color-scheme: dark) {
body { background: #1a1a1a; color: #e0e0e0; }
h1 { color: #e0e0e0; }
.manpage-link { background: #2a2a2a; border-color: #444; color: #e0e0e0; }
.manpage-link:hover { background: #007acc; color: white; border-color: #007acc; }
.lang-bar { color: #999; }
.lang-bar .current { color: #e0e0e0; }
}
</style>
</head>
<body>
<div class="breadcrumb">
<a href="/">Home</a> /
<a href="/coreutils">Coreutils</a> /
<span>Manual Pages ({{LANG_NAME}})</span>
</div>
<div class="lang-bar">
<a href="/coreutils/manpages/">English</a> |
<a href="/coreutils/manpages-fr/">Français</a> |
<a href="/coreutils/manpages-de/">Deutsch</a> |
<a href="/coreutils/manpages-es/">Español</a> |
<a href="/coreutils/manpages-it/">Italiano</a> |
<a href="/coreutils/manpages-pt/">Português</a> |
<a href="/coreutils/manpages-ja/">日本語</a> |
<a href="/coreutils/manpages-ko/">한국어</a> |
<a href="/coreutils/manpages-ru/">Русский</a> |
<a href="/coreutils/manpages-zh/">中文</a> |
<a href="/coreutils/manpages-uk/">Українська</a>
</div>
<h1>Manual Pages ({{LANG_NAME}})</h1>
<p>Complete manual pages for all uutils coreutils commands. Click on any command to view its full documentation.</p>
<div class="manpage-grid">
{{LINKS}}
</div>
</body>
</html>
-75
View File
@@ -1,75 +0,0 @@
<!DOCTYPE html>
<html lang="{{LANG_CODE}}">
<head>
<meta charset="utf-8">
<title>{{NAME}}(1) - uutils coreutils ({{LANG_NAME}})</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; max-width: 900px; margin: 0 auto; padding: 20px; line-height: 1.6; color: #333; }
h1, h2 { color: #333; border-bottom: 1px solid #ddd; padding-bottom: 8px; }
a { color: #007acc; text-decoration: none; }
a:hover { text-decoration: underline; }
pre, code { background: #f5f5f5; border-radius: 3px; }
pre { padding: 12px; overflow-x: auto; border: 1px solid #ddd; }
code { padding: 2px 5px; }
dl dt { font-weight: bold; margin-top: 10px; }
dl dd { margin-left: 20px; }
.breadcrumb { margin-bottom: 0; }
.breadcrumb a { color: #007acc; }
.manpage-content { margin-top: 20px; }
.tldr-section { margin-top: 30px; padding: 20px; background: #f0f7ff; border: 1px solid #c0d8f0; border-radius: 8px; }
.tldr-section h2 { color: #005a9e; border-bottom: 1px solid #c0d8f0; }
.tldr-example { margin-bottom: 15px; }
.tldr-desc { margin-bottom: 5px; font-style: italic; color: #555; }
.tldr-example pre { background: #1e1e1e; color: #d4d4d4; border: none; }
.tldr-untranslated { font-style: italic; color: #888; margin-bottom: 12px; font-size: 0.9em; }
.top-bar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; }
.top-links { display: flex; gap: 15px; font-size: 0.9em; }
.top-links a { color: #007acc; }
.lang-bar { margin-bottom: 15px; font-size: 0.85em; color: #666; }
.lang-bar a { color: #007acc; margin: 0 3px; }
.lang-bar .current { font-weight: bold; color: #333; }
@media (prefers-color-scheme: dark) {
body { background: #1a1a1a; color: #e0e0e0; }
h1, h2 { color: #e0e0e0; border-bottom-color: #444; }
pre, code { background: #2a2a2a; }
pre { border-color: #444; }
.tldr-section { background: #1a2a3a; border-color: #2a4a6a; }
.tldr-section h2 { color: #6cb4ee; border-bottom-color: #2a4a6a; }
.tldr-desc { color: #aaa; }
.lang-bar { color: #999; }
.lang-bar .current { color: #e0e0e0; }
}
</style>
</head>
<body>
<div class="top-bar">
<div class="breadcrumb">
<a href="/">Home</a> /
<a href="/coreutils">Coreutils</a> /
<a href="/coreutils/{{MANPAGES_PATH}}/">Manual Pages</a> /
<span>{{NAME}}(1)</span>
</div>
<div class="top-links">
<a href="https://github.com/uutils/coreutils/tree/main/src/uu/{{NAME}}">Source code</a>
<a href="https://github.com/uutils/coreutils/issues/new?title={{NAME}}:%20&labels=bug">Report an issue</a>
</div>
</div>
<div class="lang-bar">
<a href="/coreutils/manpages/{{NAME}}.html">English</a> |
<a href="/coreutils/manpages-fr/{{NAME}}.html">Français</a> |
<a href="/coreutils/manpages-de/{{NAME}}.html">Deutsch</a> |
<a href="/coreutils/manpages-es/{{NAME}}.html">Español</a> |
<a href="/coreutils/manpages-it/{{NAME}}.html">Italiano</a> |
<a href="/coreutils/manpages-pt/{{NAME}}.html">Português</a> |
<a href="/coreutils/manpages-ja/{{NAME}}.html">日本語</a> |
<a href="/coreutils/manpages-ko/{{NAME}}.html">한국어</a> |
<a href="/coreutils/manpages-ru/{{NAME}}.html">Русский</a> |
<a href="/coreutils/manpages-zh/{{NAME}}.html">中文</a> |
<a href="/coreutils/manpages-uk/{{NAME}}.html">Українська</a>
</div>
<div class="manpage-content">
{{CONTENT}}
</div>
{{TLDR}}
</body>
</html>
-147
View File
@@ -1,147 +0,0 @@
{% extends "base.html" %}
{% block title %}
{{ page.title }} - {{ config.title }}
{% endblock title %}
{% block main %}
<style>
.manpage-container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.manpage-header {
margin-bottom: 30px;
}
.manpage-header h1 {
color: #333;
margin-bottom: 10px;
}
.manpage-description {
color: #666;
line-height: 1.6;
margin-bottom: 30px;
}
.manpage-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
gap: 15px;
margin-top: 30px;
}
.manpage-link {
display: block;
padding: 12px;
background: #f5f5f5;
border: 1px solid #ddd;
border-radius: 5px;
text-decoration: none;
color: #333;
transition: all 0.3s ease;
text-align: center;
}
.manpage-link:hover {
background: #007acc;
color: white;
border-color: #007acc;
transform: translateY(-2px);
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}
.manpage-name {
font-weight: bold;
font-family: monospace;
font-size: 1.1em;
}
.breadcrumb {
margin-bottom: 20px;
}
.breadcrumb a {
color: #007acc;
text-decoration: none;
}
.breadcrumb a:hover {
text-decoration: underline;
}
@media (prefers-color-scheme: dark) {
.manpage-header h1 {
color: #e0e0e0;
}
.manpage-link {
background: #2a2a2a;
border-color: #444;
color: #e0e0e0;
}
.manpage-link:hover {
background: #007acc;
color: white;
border-color: #007acc;
}
}
</style>
<div class="manpage-container">
<div class="breadcrumb">
<a href="/">Home</a> /
<a href="/{{ page.extra.project | default(value="coreutils") }}">{{ page.extra.project | default(value="Coreutils") | capitalize }}</a> /
<span>Manual Pages</span>
</div>
<div class="manpage-header">
<h1>{{ page.title }}</h1>
<p class="manpage-description">
{{ page.description | default(value="Complete manual pages for all uutils commands. Click on any command below to view its full documentation.") }}
</p>
</div>
<div class="manpage-grid">
{% if page.extra.manpages %}
{% for manpage in page.extra.manpages %}
<a href="{{ manpage.name }}.html" class="manpage-link">
<span class="manpage-name">{{ manpage.name }}</span>
</a>
{% endfor %}
{% else %}
<!-- This will be populated dynamically by the build process -->
<div id="manpage-list"></div>
{% endif %}
</div>
</div>
<script>
// If manpages weren't provided in the template data,
// try to load them dynamically from the current directory
if (!document.querySelector('.manpage-grid a')) {
fetch('./manpages.json')
.then(response => response.json())
.then(manpages => {
const grid = document.querySelector('.manpage-grid');
const listDiv = document.getElementById('manpage-list');
if (listDiv) {
listDiv.remove();
}
manpages.forEach(name => {
const link = document.createElement('a');
link.href = `${name}.html`;
link.className = 'manpage-link';
link.innerHTML = `<span class="manpage-name">${name}</span>`;
grid.appendChild(link);
});
})
.catch(err => console.error('Failed to load manpages list:', err));
}
</script>
{% endblock main %}