]> juplo.de Git - maven-thymeleaf-skin/commitdiff
Clean up and align import-in-hugo.sh and import-in-astro.sh
authorKai Moritz <kai.milan.moritz@googlemail.com>
Tue, 16 Jun 2026 18:19:58 +0000 (18:19 +0000)
committerKai Moritz <kai.milan.moritz@googlemail.com>
Tue, 16 Jun 2026 18:19:58 +0000 (18:19 +0000)
Both scripts now share identical structure for argument parsing,
validation, JSON extraction, and the HTML file loop:
- CURRENT_BOOL variable (was: CURRENT converted to string in-place)
- jq-quoted TITLE_YAML for safe YAML output
- Skip files with no page entry (WARN + continue) in both scripts
- Consistent output messages (Content:/Static:/Routing:)
- Summary block at the end of both scripts

import-in-hugo.sh fixes:
- Remove debug output per file (echo "Found $FILE:", jq -C per entry)
- Fix URL bug in directory redirect pages ($URL was last HTML file's URL)
- Fix basename usage: basename "$SOURCE" not basename $SOURCE $SCRIPT_DIR
- Quote all variable expansions
- Fix inconsistent indentation in error blocks
- Redirect page HTML: use properly quoted echo with single/double quotes

import-in-astro.sh cleanup:
- Remove inline comments that belong in CLAUDE.md
- Simplify URL_BASE derivation to if/elif/else
- Remove ENTRY_ID intermediate variable (inline into printf directly)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
src/main/resources/import-in-astro.sh
src/main/resources/import-in-hugo.sh [changed mode: 0644->0755]

index 942504ef8bb1b50e95eeb748d239c475af9e566b..96b4d815081370b792666d97459d8b4aee9969b2 100755 (executable)
@@ -12,14 +12,16 @@ USAGE=$(
               (Default: artifactId from the Maven project metadata).
 --current   : [DEFAULT]
               Marks this version as the current (visible) release.
-              Content URL: /<project>/page.html
+              Content URL: /<project>/page.html, params.current=true
               Routing:     src/pages/<project>/
-              If <url> is given, it overrides the URL base (default: /<project>/).
---archived  : Marks this version as archived/snapshot (not visible by default).
-              Content URL: /projects/<project>/<version>/page.html
+              If <url> is given, it overrides the URL base.
+              Only one of --current and --archived can be used!
+--archived  : Marks this version as archived (not visible by default).
+              Content URL: /projects/<project>/<version>/page.html, params.current=false
               Routing:     src/pages/projects/<project>/<version>/
-              params.canonical points to the corresponding page of the current version.
+              params.canonical points to the corresponding current-version page.
               If <url> is given, it overrides the URL base.
+              Only one of --current and --archived can be used!
 --canonical : Explicitly sets the canonical URL base for --archived mode.
               Default: /<project>
               Only valid with --archived.
@@ -49,9 +51,6 @@ if [[ ! -f "$ASTRO_ROOT/package.json" ]]; then
   exit 1
 fi
 
-JSON=$(sed -n '/<script id="sili-json" type="application\/json">/,/<\/script>/p' "${SCRIPT_DIR}/index.html" | sed '1d;$d')
-echo "$JSON" | jq -C .
-
 while [[ $# -gt 0 ]]; do
   case "$1" in
     --project)
@@ -61,7 +60,7 @@ while [[ $# -gt 0 ]]; do
     --current)
       CURRENT=1
       if [[ $# -ge 2 && ! "$2" =~ ^-- ]]; then
-        URL_BASE="/${2%%/}"; URL_BASE="${URL_BASE//\/\//\/}"; shift 2
+        URL_BASE="/${2%%/}"; URL_BASE="${URL_BASE##//}"; shift 2
       else
         shift
       fi
@@ -69,14 +68,14 @@ while [[ $# -gt 0 ]]; do
     --archived)
       ARCHIVED=1
       if [[ $# -ge 2 && ! "$2" =~ ^-- ]]; then
-        URL_BASE="/${2%%/}"; URL_BASE="${URL_BASE//\/\//\/}"; shift 2
+        URL_BASE="/${2%%/}"; URL_BASE="${URL_BASE##//}"; shift 2
       else
         shift
       fi
       ;;
     --canonical)
       if [[ $# -lt 2 ]]; then echo "ERROR -- Parameter for --canonical is missing!"; exit 1; fi
-      CANONICAL="/${2%%/}"; CANONICAL="${CANONICAL//\/\//\/}"; shift 2
+      CANONICAL="/${2%%/}"; CANONICAL="${CANONICAL##//}"; shift 2
       ;;
     *)
       echo "ERROR -- Unknown parameter: $1"; echo; echo "$USAGE"; exit 1
@@ -97,17 +96,19 @@ if [[ "$CURRENT" -eq 0 && "$ARCHIVED" -eq 0 ]]; then
 fi
 [[ "$CURRENT" -eq 1 ]] && CURRENT_BOOL="true" || CURRENT_BOOL="false"
 
+JSON=$(sed -n '/<script id="sili-json" type="application\/json">/,/<\/script>/p' "${SCRIPT_DIR}/index.html" | sed '1d;$d')
+echo "$JSON" | jq -C .
+
 [[ -z "$PROJECT" ]] && PROJECT=$(echo "$JSON" | jq -r '.artifactId')
 VERSION=$(echo "$JSON" | jq -r '.version')
 
-if [[ -z "$URL_BASE" ]]; then
-  if [[ "$CURRENT_BOOL" == "true" ]]; then
-    URL_BASE="/$PROJECT"
-  else
-    URL_BASE="/projects/$PROJECT/$VERSION"
-  fi
+if [[ -n "$URL_BASE" ]]; then
+  URL_BASE="${URL_BASE%/}"
+elif [[ "$CURRENT_BOOL" == "true" ]]; then
+  URL_BASE="/$PROJECT"
+else
+  URL_BASE="/projects/$PROJECT/$VERSION"
 fi
-URL_BASE="${URL_BASE%/}"
 
 [[ -z "$CANONICAL" ]] && CANONICAL="/$PROJECT"
 CANONICAL="${CANONICAL%/}"
@@ -131,7 +132,7 @@ echo "URL base:  $URL_BASE"
 [[ "$CURRENT_BOOL" == "false" ]] && echo "Canonical: $CANONICAL"
 echo ""
 
-# Generated-doc subdirectory names (must match GENERATED_DOC_NAMES in projects.ts)
+# Known generated-doc dirs (must match GENERATED_DOC_NAMES in src/lib/projects.ts)
 GENERATED_DOC_DIRS="apidocs testapidocs xref xref-test"
 
 for SOURCE in $(find "$SCRIPT_DIR" -maxdepth 1 -mindepth 1 -type f -name '*.html'); do
@@ -145,12 +146,9 @@ for SOURCE in $(find "$SCRIPT_DIR" -maxdepth 1 -mindepth 1 -type f -name '*.html
 
   PAGE=$(echo "$PAGE_ENTRY" | jq '.value')
   WEIGHT=$(echo "$PAGE_ENTRY" | jq -r '.key')
-  # path field: pre-computed by site.vm as crumbs joined with .html→/ substitution
-  # e.g. "" for top-level, "project-reports/" for children of project-reports, etc.
   PATH_PREFIX=$(echo "$PAGE" | jq -r '.path')
   [[ -n "$PATH_PREFIX" && "${PATH_PREFIX: -1}" != "/" ]] && PATH_PREFIX="${PATH_PREFIX}/"
   NUM_CHILDS=$(echo "$PAGE" | jq '.childs | length')
-  # Use jq to produce a JSON/YAML-safe double-quoted title string
   TITLE_YAML=$(echo "$PAGE" | jq '.name')
 
   if [[ "$FILE" == "index.html" ]]; then
@@ -161,12 +159,10 @@ for SOURCE in $(find "$SCRIPT_DIR" -maxdepth 1 -mindepth 1 -type f -name '*.html
   else
     HREF="$FILE"
     if [[ "$NUM_CHILDS" -gt 0 ]]; then
-      # Section node: becomes a subdirectory with _index.html
       CONTENT_REL="${PATH_PREFIX}${HREF%.html}/_index.html"
     else
       CONTENT_REL="${PATH_PREFIX}${HREF}"
     fi
-    # URLs are always flat (no nesting) — mirrors Maven's own flat site structure
     PAGE_URL="${URL_BASE}/${HREF}"
     ROUTING_FILE="${HREF%.html}.html.astro"
     CANONICAL_URL="${CANONICAL}/${HREF}"
@@ -182,20 +178,14 @@ for SOURCE in $(find "$SCRIPT_DIR" -maxdepth 1 -mindepth 1 -type f -name '*.html
     echo "url: $PAGE_URL"
     echo "params:"
     echo "  current: $CURRENT_BOOL"
-    if [[ "$CURRENT_BOOL" == "false" ]]; then
-      echo "  canonical: $CANONICAL_URL"
-    fi
+    [[ "$CURRENT_BOOL" == "false" ]] && echo "  canonical: $CANONICAL_URL"
     echo "---"
-    # Extract body: strip the <h1 id="sili-title"> line (tail -n +2),
-    # and stop before the sili-json <script> block (only present in index.html).
     sed -n '/<script id="sili-json" type="application\/json">/q;p' "$SOURCE" \
       | tail -n +2
   } > "$CONTENT_TARGET"
 
-  # Convert relative generated-doc directory links to absolute URLs with explicit
-  # /index.html, because these dirs live under /projects/X/Y/ regardless of whether
-  # the containing page is served from the visible URL (/<project>/...) or the
-  # archived URL (/projects/X/Y/...), so relative links cannot work for both.
+  # Relative generated-doc dir links cannot work for both visible (/<project>/...)
+  # and archived (/projects/X/Y/...) page URLs, so rewrite them to absolute URLs.
   for dir in $GENERATED_DOC_DIRS; do
     sed -i \
       -e "s|href=\"${dir}/\"|href=\"/projects/${PROJECT}/${VERSION}/${dir}/index.html\"|g" \
@@ -208,29 +198,25 @@ for SOURCE in $(find "$SCRIPT_DIR" -maxdepth 1 -mindepth 1 -type f -name '*.html
   ROUTING_TARGET="$PAGES_BASE/$ROUTING_FILE"
   mkdir -p "$(dirname "$ROUTING_TARGET")"
 
-  ENTRY_ID="$PROJECT/$VERSION/$CONTENT_REL"
-
   {
     echo "---"
     printf "import ProjectPage from '%scomponents/ProjectPage.astro';\n" "$IMPORT_DEPTH"
     echo "---"
-    printf '<ProjectPage entryId="%s" />\n' "$ENTRY_ID"
+    printf '<ProjectPage entryId="%s" />\n' "$PROJECT/$VERSION/$CONTENT_REL"
   } > "$ROUTING_TARGET"
 
   echo "Routing:  $ROUTING_TARGET"
 done
 
-# Copy all subdirectories (apidocs, xref, css, images, …) to public/projects/X/Y/
-# generatedDocNodes() in projects.ts auto-detects the known ones as nav entries.
 mkdir -p "$PUBLIC_BASE"
 for DIR_PATH in $(find "$SCRIPT_DIR" -maxdepth 1 -mindepth 1 -type d); do
   DIR=$(basename "$DIR_PATH")
-  echo "Static:   $DIR_PATH → $PUBLIC_BASE/$DIR"
   cp -av "$DIR_PATH" "$PUBLIC_BASE/"
+  echo "Static:   $DIR_PATH → $PUBLIC_BASE/$DIR"
 done
 
 echo ""
 echo "Done! Imported $PROJECT $VERSION (current=$CURRENT_BOOL)"
-echo "  Content:  $CONTENT_BASE"
-echo "  Routing:  $PAGES_BASE"
-echo "  Static:   $PUBLIC_BASE"
+echo "  Content: $CONTENT_BASE"
+echo "  Routing: $PAGES_BASE"
+echo "  Static:  $PUBLIC_BASE"
old mode 100644 (file)
new mode 100755 (executable)
index a40e226..3ed56a4
@@ -2,36 +2,33 @@
 set -euo pipefail
 
 USAGE=$(
-  echo "Usage: $0 <HUGO_ROOT> [--base <path>] [--project <name>][ [ --current [<url>]] | [--archived [<url>] [--canonical <url>]] ]";
+  echo "Usage: $0 <HUGO_ROOT> [--base <path>] [--project <name>] [ [--current [<url>]] | [--archived [<url>] [--canonical <url>]] ]";
   cat << EOF
 
---base      : Specifies the base-path for the rendered site.
-              If not specifed, the site is rendered as a root section.
-              The artifact-id and the version are always added to the
-              path.
---project   : Specifies the name of the project for path and url
-              (Default: artifact-id of the maven-project).
-              artifact-id and the version (Default: "/").
+  Imports a Maven site generated with the sili-skin into a Hugo project.
+  Run this script from the Maven site output directory (where index.html lives).
+
+--base      : URL and content path prefix (default: none, project at root).
+              The project name and version are always appended.
+--project   : Overrides the project name used for URL and directory paths
+              (Default: artifactId from the Maven project metadata).
 --current   : [DEFAULT]
-              Sets "url: /<url>/<path_in_site>", "params.current=true"
-              and "params.canonical = <url>/<path_in_site>" in
-              front-matter.  If "<url>" is not specified,
-              "<path>/<project>/" is used as "<url>".
-              Only one of "--current" and "--archived" can be used!
---archived  : Sets "url: /<url>/<path_in_site>", "params.current=false"
-              and "params.canonical = <canonical>/<path_in_site>" in
-              front-matter.  If "<url>" is not specified,
-              "<path>/<project>/<version>" is used as "<url>"
-              If "<canonical>" is not specified explicitly,
-              "<path>/<project>" is used as "<canonical>"
-              Only one of "--current" and "--archived" can be used!
---canonical : Explicitly specifies "<canonical>" for "--archived".
-              Can only be specified when "--archived" is used!
+              Marks this version as the current (visible) release.
+              Content URL: <base>/<project>/page.html, params.current=true
+              If <url> is given, it overrides the URL base.
+              Only one of --current and --archived can be used!
+--archived  : Marks this version as archived (not visible by default).
+              Content URL: <base>/<project>/<version>/page.html, params.current=false
+              params.canonical points to the corresponding current-version page.
+              If <url> is given, it overrides the URL base.
+              Only one of --current and --archived can be used!
+--canonical : Explicitly sets the canonical URL base for --archived mode.
+              Default: <base>/<project>
+              Only valid with --archived.
 EOF
 )
 
-if [ $# -lt 1 ]
-then
+if [ $# -lt 1 ]; then
   echo "$USAGE"
   exit 1
 fi
@@ -41,6 +38,7 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
 HUGO_ROOT="${1%%/}"
 shift
 
+BASE=""
 PROJECT=""
 CURRENT=0
 ARCHIVED=0
@@ -48,216 +46,177 @@ URL_BASE=""
 CANONICAL=""
 
 command -v jq >/dev/null 2>&1 || { echo "ERROR -- jq is required"; exit 1; }
-
-JSON=$(sed -n '/<script id="sili-json" type="application\/json">/,/<\/script>/p' ${SCRIPT_DIR}/index.html | sed '1d;$d')
-
-BASE=""
+command -v perl >/dev/null 2>&1 || { echo "ERROR -- perl is required"; exit 1; }
 
 while [[ $# -gt 0 ]]; do
   case "$1" in
     --base)
-      if [[ $# -lt 2 ]]
-      then
-        echo "ERROR -- Parameter for --base is missing!"
-        exit 1
-      fi
-      BASE="${2%/}"
-      BASE="${BASE#/}"
-      if [[ -n "$BASE" ]]
-      then
-        BASE="/$BASE"
-      fi
+      if [[ $# -lt 2 ]]; then echo "ERROR -- Parameter for --base is missing!"; exit 1; fi
+      BASE="${2%/}"; BASE="${BASE#/}"
+      [[ -n "$BASE" ]] && BASE="/$BASE"
       shift 2
       ;;
     --project)
-      if [[ $# -lt 2 ]]
-      then
-        echo "ERROR -- Parameter for --project is missing!"
-        exit 1
-      fi
-      PROJECT="${2%%/}"
-      PROJECT="${PROJECT##/}"
-      shift 2
+      if [[ $# -lt 2 ]]; then echo "ERROR -- Parameter for --project is missing!"; exit 1; fi
+      PROJECT="${2%%/}"; PROJECT="${PROJECT##/}"; shift 2
       ;;
     --current)
       CURRENT=1
-      if [[ $# -lt 2 ]]
-      then
-        shift
+      if [[ $# -ge 2 && ! "$2" =~ ^-- ]]; then
+        URL_BASE="/${2%%/}"; URL_BASE="${URL_BASE##//}"; shift 2
       else
-        if [[ ! "$2" =~ ^-- ]]
-        then
-          URL_BASE="${2%%/}"
-          URL_BASE="${URL_BASE##/}"
-          URL_BASE="/$URL_BASE"
-          shift 2
-        else
-          shift
-        fi
+        shift
       fi
       ;;
     --archived)
       ARCHIVED=1
-      if [[ $# -lt 2 ]]
-      then
-        shift
+      if [[ $# -ge 2 && ! "$2" =~ ^-- ]]; then
+        URL_BASE="/${2%%/}"; URL_BASE="${URL_BASE##//}"; shift 2
       else
-        if [[ ! "$2" =~ ^-- ]]
-        then
-          URL_BASE="${2%%/}"
-          URL_BASE="${URL_BASE##/}"
-          URL_BASE="/$URL_BASE"
-          shift 2
-        else
-          shift
-        fi
+        shift
       fi
       ;;
     --canonical)
-      if [[ $# -lt 2 ]]
-      then
-        echo "ERROR -- Parameter for --canonical is missing!"
-        exit 1
-      fi
-      CANONICAL="${2%%/}"
-      CANONICAL="${CANONICAL##/}"
-      CANONICAL="/$CANONICAL"
-      shift 2
+      if [[ $# -lt 2 ]]; then echo "ERROR -- Parameter for --canonical is missing!"; exit 1; fi
+      CANONICAL="/${2%%/}"; CANONICAL="${CANONICAL##//}"; shift 2
       ;;
     *)
-      echo "ERROR -- Unknown parameter: $1"
-      echo
-      echo "$USAGE"
-      exit 1
+      echo "ERROR -- Unknown parameter: $1"; echo; echo "$USAGE"; exit 1
       ;;
   esac
 done
 
-if [[ "$CURRENT" -eq 1 && "$ARCHIVED" -eq 1 ]]
-then
-  echo "ERROR -- Only one of "--current" and "--archived" can be specified!"
-      echo
-      echo "$USAGE"
-  exit 1
+if [[ "$CURRENT" -eq 1 && "$ARCHIVED" -eq 1 ]]; then
+  echo "ERROR -- Only one of --current and --archived can be specified!"
+  echo; echo "$USAGE"; exit 1
 fi
-if [[ "$CURRENT" -eq 0 && "$ARCHIVED" -eq 0 ]]
-then
-  CURRENT=1
+if [[ -n "$CANONICAL" && "$ARCHIVED" -eq 0 ]]; then
+  echo "ERROR -- --canonical can only be used with --archived!"
+  echo; echo "$USAGE"; exit 1
 fi
-if [[ "$CURRENT" -eq 1 ]]
-then
-  CURRENT="true"
-else
-  CURRENT="false"
+if [[ "$CURRENT" -eq 0 && "$ARCHIVED" -eq 0 ]]; then
+  CURRENT=1
 fi
+[[ "$CURRENT" -eq 1 ]] && CURRENT_BOOL="true" || CURRENT_BOOL="false"
 
+JSON=$(sed -n '/<script id="sili-json" type="application\/json">/,/<\/script>/p' "${SCRIPT_DIR}/index.html" | sed '1d;$d')
 echo "$JSON" | jq -C .
 
-if [[ -z "$PROJECT" ]]
-then
-  PROJECT=$(echo "$JSON" | jq -r '.artifactId')
-fi
+[[ -z "$PROJECT" ]] && PROJECT=$(echo "$JSON" | jq -r '.artifactId')
 VERSION=$(echo "$JSON" | jq -r '.version')
 
 PATH_BASE="$BASE/$PROJECT/$VERSION"
 
-if [[ -n "$URL_BASE" ]]
-then
+if [[ -n "$URL_BASE" ]]; then
   URL_BASE="${URL_BASE%/}"
 else
   URL_BASE="$BASE/$PROJECT"
-  if [[ "$ARCHIVED" -eq 1 ]]
-  then
-    URL_BASE="$URL_BASE/$VERSION"
-  fi
+  [[ "$ARCHIVED" -eq 1 ]] && URL_BASE="$URL_BASE/$VERSION"
 fi
 
-if [[ -n "$CANONICAL" ]]
-then
-  CANONICAL="${CANONICAL%/}"
-else
-  CANONICAL="$BASE/$PROJECT"
-fi
+[[ -z "$CANONICAL" ]] && CANONICAL="$BASE/$PROJECT"
+CANONICAL="${CANONICAL%/}"
+
+echo ""
+echo "Project:   $PROJECT"
+echo "Version:   $VERSION"
+echo "Current:   $CURRENT_BOOL"
+echo "URL base:  $URL_BASE"
+[[ "$CURRENT_BOOL" == "false" ]] && echo "Canonical: $CANONICAL"
+echo ""
 
-for i in $(find "$SCRIPT_DIR" -maxdepth 1 -mindepth 1 -type f -name '*.html')
-do
-  SOURCE="$i"
-  FILE=$(basename $SOURCE $SCRIPT_DIR)
+for SOURCE in $(find "$SCRIPT_DIR" -maxdepth 1 -mindepth 1 -type f -name '*.html'); do
+  FILE=$(basename "$SOURCE")
   PAGE_ENTRY=$(echo "$JSON" | jq '.pages|to_entries[]|select(.value.href == "'"$FILE"'")')
-  echo -n "Found $FILE: "
-  echo "$PAGE_ENTRY" | jq -C .
-  PAGE=$(echo "$PAGE_ENTRY" | jq .value)
-  URL_PATH="/$(echo "$PAGE" | jq -r .path)"
-  if [[ "$FILE" == "index.html" ]]
-  then
-    TITLE=$(echo "$JSON" | jq -r .project)
-    URL="/"
-    mkdir -p "$HUGO_ROOT/content$PATH_BASE"
-    TARGET="$HUGO_ROOT/content$PATH_BASE/_index.html"
+
+  if [[ -z "$PAGE_ENTRY" ]]; then
+    echo "WARN: No page entry for $FILE — skipping"
+    continue
+  fi
+
+  PAGE=$(echo "$PAGE_ENTRY" | jq '.value')
+  WEIGHT=$(echo "$PAGE_ENTRY" | jq -r '.key')
+  PATH_PREFIX=$(echo "$PAGE" | jq -r '.path')
+  [[ -n "$PATH_PREFIX" && "${PATH_PREFIX: -1}" != "/" ]] && PATH_PREFIX="${PATH_PREFIX}/"
+  NUM_CHILDS=$(echo "$PAGE" | jq '.childs | length')
+  TITLE_YAML=$(echo "$PAGE" | jq '.name')
+
+  if [[ "$FILE" == "index.html" ]]; then
+    CONTENT_REL="_index.html"
+    PAGE_URL="${URL_BASE}/"
+    CANONICAL_URL="${CANONICAL}/"
   else
-    TITLE=$(echo "$PAGE" | jq -r .name)
-    URL="/$FILE"
-    NUM_CHILDS=$(echo "$PAGE" | jq -r '.childs|length')
-    if [[ "$NUM_CHILDS" == "" ]]
-    then
-      echo "ERROR -- Found no menu-entry for $FILE! Exiting..."
-      exit 0
-    fi
-    if [ "$NUM_CHILDS" -gt 0 ]
-    then
-      mkdir -p "$HUGO_ROOT/content$PATH_BASE$URL_PATH${FILE%.html}"
-      TARGET="$HUGO_ROOT/content$PATH_BASE$URL_PATH${FILE%.html}/_index.html"
+    HREF="$FILE"
+    if [[ "$NUM_CHILDS" -gt 0 ]]; then
+      CONTENT_REL="${PATH_PREFIX}${HREF%.html}/_index.html"
     else
-      mkdir -p "$HUGO_ROOT/content$PATH_BASE$URL_PATH"
-      TARGET="$HUGO_ROOT/content$PATH_BASE$URL_PATH$FILE"
+      CONTENT_REL="${PATH_PREFIX}${HREF}"
     fi
+    PAGE_URL="${URL_BASE}/${HREF}"
+    CANONICAL_URL="${CANONICAL}/${HREF}"
   fi
-  echo "Generating page $TARGET"
-  echo "---" > $TARGET
-  echo "title: $TITLE" >> $TARGET
-  echo "weight: $(echo "$PAGE_ENTRY" | jq -r .key)" >> $TARGET
-  echo "outputs:" >> $TARGET
-  echo "  - html" >> $TARGET
-  echo "url: $URL_BASE$URL" >> $TARGET
-  echo "layout: article" >> $TARGET
-  echo "params:" >> $TARGET
-  echo "  current: $CURRENT" >> $TARGET
-  echo "  canonical: $CANONICAL$URL" >> $TARGET
-  echo "---" >> $TARGET
-  sed -n '/<script id="sili-json" type="application\/json">/q;p' "$SOURCE" \
-  | tail -n +2 \
-  | perl -0777 -MHTML::Entities -pe 's#<pre\b[^>]*>(.*?)</pre>#"{{< highlight guess >}}\n".decode_entities($1)."\n{{< /highlight >}}"#gse' >> "$TARGET"
+
+  TARGET="$HUGO_ROOT/content$PATH_BASE/$CONTENT_REL"
+  mkdir -p "$(dirname "$TARGET")"
+
+  {
+    echo "---"
+    echo "title: $TITLE_YAML"
+    echo "weight: $WEIGHT"
+    echo "outputs:"
+    echo "  - html"
+    echo "url: $PAGE_URL"
+    echo "layout: article"
+    echo "params:"
+    echo "  current: $CURRENT_BOOL"
+    echo "  canonical: $CANONICAL_URL"
+    echo "---"
+    sed -n '/<script id="sili-json" type="application\/json">/q;p' "$SOURCE" \
+      | tail -n +2 \
+      | perl -0777 -MHTML::Entities -pe \
+          's#<pre\b[^>]*>(.*?)</pre>#"{{< highlight guess >}}\n".decode_entities($1)."\n{{< /highlight >}}"#gse'
+  } > "$TARGET"
+
+  echo "Content:  $TARGET"
 done
 
 mkdir -p "$HUGO_ROOT/static$URL_BASE"
-for i in $(find "$SCRIPT_DIR" -maxdepth 1 -mindepth 1 -type d)
-do
-  DIR=$(basename $i $SCRIPT_DIR)
-  echo "Copying additionally static content from $DIR"
-  cp -av "$i" "$HUGO_ROOT/static$URL_BASE"
+for DIR_PATH in $(find "$SCRIPT_DIR" -maxdepth 1 -mindepth 1 -type d); do
+  DIR=$(basename "$DIR_PATH")
+  cp -av "$DIR_PATH" "$HUGO_ROOT/static$URL_BASE/"
+  echo "Static:   $DIR_PATH → $HUGO_ROOT/static$URL_BASE/$DIR"
+
   PAGE_ENTRY=$(echo "$JSON" | jq '.pages|to_entries[]|select(.value.href|test("^'"$DIR"'/"))')
-  if [[ "$PAGE_ENTRY" != "" ]]
-  then
-    echo "$PAGE_ENTRY" | jq -C .
-    PAGE=$(echo "$PAGE_ENTRY" | jq .value)
-    URL_PATH=/$(echo "$PAGE" | jq -r .path)
-    TARGET="$HUGO_ROOT/content$PATH_BASE$URL_PATH$DIR"
-    mkdir -p "$HUGO_ROOT/content$PATH_BASE$URL_PATH$DIR"
-    TARGET="$TARGET/_index.html"
-    echo "Generating page $TARGET"
-    TITLE=$(echo "$PAGE" | jq -r .name)
-    WEIGHT=$(echo "$PAGE_ENTRY" | jq -r .key)
-    HREF=$(echo "$PAGE" | jq -r .href)
-    echo "---" > "$TARGET"
-    echo "title: $TITLE" >> "$TARGET"
-    echo "url: $URL_BASE$URL" >> $TARGET
-    echo "weight: $WEIGHT" >> "$TARGET"
-    echo "params:" >> "$TARGET"
-    echo "  current: $CURRENT" >> "$TARGET"
-    echo "  canonical: $CANONICAL$URL" >> "$TARGET"
-    echo "---" >> "$TARGET"
-    echo "<script type="text/javascript">window.location.replace('../../$HREF')</script>" >> "$TARGET"
-    echo "<noscript><p>JavaScript is deactivated.</p></noscript>" >> "$TARGET"
-    echo "<p><a href="../../$HREF">View $TITLE</a></p>" >> "$TARGET"
+  if [[ -n "$PAGE_ENTRY" ]]; then
+    PAGE=$(echo "$PAGE_ENTRY" | jq '.value')
+    WEIGHT=$(echo "$PAGE_ENTRY" | jq -r '.key')
+    HREF=$(echo "$PAGE" | jq -r '.href')
+    TITLE_YAML=$(echo "$PAGE" | jq '.name')
+    PATH_PREFIX=$(echo "$PAGE" | jq -r '.path')
+    [[ -n "$PATH_PREFIX" && "${PATH_PREFIX: -1}" != "/" ]] && PATH_PREFIX="${PATH_PREFIX}/"
+
+    TARGET="$HUGO_ROOT/content$PATH_BASE/${PATH_PREFIX}${DIR}/_index.html"
+    mkdir -p "$(dirname "$TARGET")"
+
+    {
+      echo "---"
+      echo "title: $TITLE_YAML"
+      echo "weight: $WEIGHT"
+      echo "url: $URL_BASE/$DIR/"
+      echo "params:"
+      echo "  current: $CURRENT_BOOL"
+      echo "  canonical: $CANONICAL/$DIR/"
+      echo "---"
+      echo '<script type="text/javascript">window.location.replace("'"../../$HREF"'")</script>'
+      echo '<noscript><p>JavaScript is deactivated.</p></noscript>'
+      echo '<p><a href="'"../../$HREF"'">View '"$DIR"'</a></p>'
+    } > "$TARGET"
+
+    echo "Redirect: $TARGET"
   fi
 done
+
+echo ""
+echo "Done! Imported $PROJECT $VERSION (current=$CURRENT_BOOL)"
+echo "  Content: $HUGO_ROOT/content$PATH_BASE"
+echo "  Static:  $HUGO_ROOT/static$URL_BASE"