|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +# Configuration |
| 4 | +CONTENT_DIR="content" |
| 5 | +EXIT_CODE=0 |
| 6 | + |
| 7 | +echo "Starting link validation..." |
| 8 | + |
| 9 | +# Find all markdown files and verify links |
| 10 | +while read -r FILE; do |
| 11 | + # Extract internal links starting with /docs/ or /cn/docs/ |
| 12 | + # We look for [text](url) pattern where url starts with /docs/ or /cn/docs/ |
| 13 | + # Using grep to find all matching links in the file |
| 14 | + while read -r MATCH; do |
| 15 | + if [ -z "$MATCH" ]; then continue; fi |
| 16 | + |
| 17 | + # Extract URL from ](url) |
| 18 | + LINK=${MATCH#*](} |
| 19 | + LINK=${LINK%)} |
| 20 | + |
| 21 | + # Remove anchor and query parameters |
| 22 | + CLEAN_LINK=$(echo "$LINK" | cut -d'#' -f1 | cut -d'?' -f1) |
| 23 | + |
| 24 | + # Determine target file path based on language prefix |
| 25 | + if [[ "$CLEAN_LINK" == /docs/* ]]; then |
| 26 | + TARGET_PATH="content/en${CLEAN_LINK}" |
| 27 | + elif [[ "$CLEAN_LINK" == /cn/docs/* ]]; then |
| 28 | + TARGET_PATH="content${CLEAN_LINK}" |
| 29 | + else |
| 30 | + continue |
| 31 | + fi |
| 32 | + |
| 33 | + # Check for file existence variations |
| 34 | + FOUND=false |
| 35 | + |
| 36 | + # Check 1: As .md file |
| 37 | + if [[ -f "${TARGET_PATH}.md" ]]; then |
| 38 | + FOUND=true |
| 39 | + # Check 2: Exact file (if extension was included) |
| 40 | + elif [[ -f "$TARGET_PATH" ]]; then |
| 41 | + FOUND=true |
| 42 | + # Check 3: Directory index |
| 43 | + elif [[ -f "${TARGET_PATH}/_index.md" ]]; then |
| 44 | + FOUND=true |
| 45 | + # Check 4: Directory README (legacy) |
| 46 | + elif [[ -f "${TARGET_PATH}/README.md" ]]; then |
| 47 | + FOUND=true |
| 48 | + fi |
| 49 | + |
| 50 | + if [ "$FOUND" = false ]; then |
| 51 | + echo "Error: Broken link in $FILE" |
| 52 | + echo " Link: $LINK" |
| 53 | + echo " Target: $TARGET_PATH (and variants)" |
| 54 | + EXIT_CODE=1 |
| 55 | + fi |
| 56 | + done < <(grep -oE '\]\((/docs/|/cn/docs/)[^)]+\)' "$FILE") |
| 57 | +done < <(find "$CONTENT_DIR" -type f -name "*.md") |
| 58 | + |
| 59 | +if [ $EXIT_CODE -eq 0 ]; then |
| 60 | + echo "Link validation passed!" |
| 61 | +else |
| 62 | + echo "Link validation failed!" |
| 63 | +fi |
| 64 | + |
| 65 | +exit $EXIT_CODE |
0 commit comments