#!/bin/bash # ============================================================================= # VibeTunnel Changelog to HTML Converter # ============================================================================= # # Converts specific version sections from CHANGELOG.md to HTML format for # inclusion in Sparkle appcast descriptions. Supports markdown formatting # including headers, lists, bold text, code, and links. # # USAGE: # ./scripts/changelog-to-html.sh [changelog_file] # # ARGUMENTS: # version Version to extract (e.g., "0.1") # changelog_file Path to changelog file (default: CHANGELOG.md) # # OUTPUT: # HTML formatted changelog section suitable for Sparkle appcast # # EXAMPLES: # ./scripts/changelog-to-html.sh 0.1 # ./scripts/changelog-to-html.sh 0.1 docs/CHANGELOG.md # # ============================================================================= set -euo pipefail VERSION="${1:-}" CHANGELOG_FILE="${2:-CHANGELOG.md}" if [ -z "$VERSION" ]; then echo "Usage: $0 [changelog_file]" echo "Example: $0 0.1 CHANGELOG.md" exit 1 fi if [ ! -f "$CHANGELOG_FILE" ]; then echo "Error: Changelog file '$CHANGELOG_FILE' not found" exit 1 fi # Function to convert markdown to basic HTML markdown_to_html() { local text="$1" # Convert headers text=$(echo "$text" | sed 's/^### \(.*\)$/

\1<\/h3>/') text=$(echo "$text" | sed 's/^## \(.*\)$/

\1<\/h2>/') # Convert bullet points with emoji support text=$(echo "$text" | sed 's/^- \*\*\([^*]*\)\*\*\(.*\)$/
  • \1<\/strong>\2<\/li>/') text=$(echo "$text" | sed 's/^- \([^*].*\)$/
  • \1<\/li>/') # Convert bold text text=$(echo "$text" | sed 's/\*\*\([^*]*\)\*\*/\\1\<\/strong\>/g') # Convert inline code text=$(echo "$text" | sed 's/`\([^`]*\)`/\1<\/code>/g') # Convert links [text](url) to text text=$(echo "$text" | sed 's/\[\([^]]*\)\](\([^)]*\))/\1<\/a>/g') echo "$text" } # Extract version section from changelog extract_version_section() { local version="$1" local file="$2" # Look for version header (supports [0.1] or ## 0.1 formats) # Extract from version header to next version header or end of file awk -v version="$version" ' BEGIN { found=0; print_section=0 } /^## \[/ && $0 ~ "\\[" version "\\]" { found=1; print_section=1; next } found && print_section && /^## / { print_section=0 } found && print_section { print } ' "$file" } # Main processing # Note: Debug output redirected to stderr to avoid polluting HTML output echo "Extracting changelog for version $VERSION..." >&2 # Extract the version section version_content=$(extract_version_section "$VERSION" "$CHANGELOG_FILE") if [ -z "$version_content" ]; then echo "Warning: No changelog section found for version $VERSION" >&2 echo "Using default content..." >&2 cat << EOF

    VibeTunnel $VERSION

    Latest version of VibeTunnel with new features and improvements.

    View full changelog

    EOF exit 0 fi # Convert to HTML # Note: Title is handled by the calling script (e.g., generate-appcast.sh) # Process line by line to handle lists properly in_list=false while IFS= read -r line; do if [[ "$line" =~ ^- ]]; then if [ "$in_list" = false ]; then echo "
      " in_list=true fi markdown_to_html "$line" else if [ "$in_list" = true ]; then echo "
    " in_list=false fi # Skip empty lines and date headers if [ -n "$line" ] && [[ ! "$line" =~ ^\[.*\].*[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then markdown_to_html "$line" fi fi done <<< "$version_content" # Close list if still open if [ "$in_list" = true ]; then echo "" fi # Add link to full changelog echo "

    View full changelog

    "