You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
6.4 KiB
214 lines
6.4 KiB
#!/bin/bash
|
|
|
|
# Setup Markdown Pre-commit Hooks
|
|
# This script installs pre-commit hooks that automatically fix markdown formatting
|
|
|
|
set -e
|
|
|
|
echo "🔧 Setting up Markdown Pre-commit Hooks..."
|
|
|
|
# Check if pre-commit is installed
|
|
if ! command -v pre-commit &> /dev/null; then
|
|
echo "📦 Installing pre-commit..."
|
|
pip install pre-commit
|
|
else
|
|
echo "✅ pre-commit already installed"
|
|
fi
|
|
|
|
# Create .pre-commit-config.yaml if it doesn't exist
|
|
if [ ! -f .pre-commit-config.yaml ]; then
|
|
echo "📝 Creating .pre-commit-config.yaml..."
|
|
cat > .pre-commit-config.yaml << 'EOF'
|
|
repos:
|
|
- repo: https://github.com/igorshubovych/markdownlint-cli
|
|
rev: v0.38.0
|
|
hooks:
|
|
- id: markdownlint
|
|
args: [--fix, --config, .markdownlint.json]
|
|
files: \.(md|mdc)$
|
|
description: "Auto-fix markdown formatting issues"
|
|
stages: [commit]
|
|
additional_dependencies: [markdownlint-cli]
|
|
|
|
- repo: local
|
|
hooks:
|
|
- id: markdown-format-check
|
|
name: Markdown Format Validation
|
|
entry: bash -c 'echo "Checking markdown files..." && npx markdownlint --config .markdownlint.json "$@"'
|
|
language: system
|
|
files: \.(md|mdc)$
|
|
stages: [commit]
|
|
description: "Validate markdown formatting"
|
|
pass_filenames: true
|
|
|
|
- repo: local
|
|
hooks:
|
|
- id: markdown-line-length
|
|
name: Markdown Line Length Check
|
|
entry: bash -c '
|
|
for file in "$@"; do
|
|
if [[ "$file" =~ \.(md|mdc)$ ]]; then
|
|
echo "Checking line length in $file..."
|
|
if grep -q ".\{81,\}" "$file"; then
|
|
echo "❌ Line length violations found in $file"
|
|
echo "Lines exceeding 80 characters:"
|
|
grep -n ".\{81,\}" "$file" | head -5
|
|
exit 1
|
|
fi
|
|
fi
|
|
done
|
|
'
|
|
language: system
|
|
files: \.(md|mdc)$
|
|
stages: [commit]
|
|
description: "Check markdown line length (80 chars max)"
|
|
pass_filenames: true
|
|
|
|
- repo: local
|
|
hooks:
|
|
- id: markdown-blank-lines
|
|
name: Markdown Blank Line Validation
|
|
entry: bash -c '
|
|
for file in "$@"; do
|
|
if [[ "$file" =~ \.(md|mdc)$ ]]; then
|
|
echo "Checking blank lines in $file..."
|
|
# Check for multiple consecutive blank lines
|
|
if grep -q "^$" "$file" && grep -A1 "^$" "$file" | grep -q "^$"; then
|
|
echo "❌ Multiple consecutive blank lines found in $file"
|
|
exit 1
|
|
fi
|
|
# Check for missing blank lines around headings
|
|
if grep -B1 "^##" "$file" | grep -v "^##" | grep -v "^$" | grep -v "^--"; then
|
|
echo "❌ Missing blank line before heading in $file"
|
|
exit 1
|
|
fi
|
|
fi
|
|
done
|
|
'
|
|
language: system
|
|
files: \.(md|mdc)$
|
|
stages: [commit]
|
|
description: "Validate markdown blank line formatting"
|
|
pass_filenames: true
|
|
EOF
|
|
echo "✅ Created .pre-commit-config.yaml"
|
|
else
|
|
echo "✅ .pre-commit-config.yaml already exists"
|
|
fi
|
|
|
|
# Install the pre-commit hooks
|
|
echo "🔗 Installing pre-commit hooks..."
|
|
pre-commit install
|
|
|
|
# Install markdownlint if not present
|
|
if ! command -v npx &> /dev/null; then
|
|
echo "📦 Installing Node.js dependencies..."
|
|
npm install --save-dev markdownlint-cli
|
|
else
|
|
if ! npx markdownlint --version &> /dev/null; then
|
|
echo "📦 Installing markdownlint-cli..."
|
|
npm install --save-dev markdownlint-cli
|
|
else
|
|
echo "✅ markdownlint-cli already available"
|
|
fi
|
|
fi
|
|
|
|
# Create a markdown auto-fix script
|
|
echo "📝 Creating markdown auto-fix script..."
|
|
cat > scripts/fix-markdown.sh << 'EOF'
|
|
#!/bin/bash
|
|
|
|
# Auto-fix markdown formatting issues
|
|
# Usage: ./scripts/fix-markdown.sh [file_or_directory]
|
|
|
|
set -e
|
|
|
|
FIX_MARKDOWN() {
|
|
local target="$1"
|
|
|
|
if [ -f "$target" ]; then
|
|
# Fix single file
|
|
if [[ "$target" =~ \.(md|mdc)$ ]]; then
|
|
echo "🔧 Fixing markdown formatting in $target..."
|
|
npx markdownlint --fix "$target" || true
|
|
fi
|
|
elif [ -d "$target" ]; then
|
|
# Fix all markdown files in directory
|
|
echo "🔧 Fixing markdown formatting in $target..."
|
|
find "$target" -name "*.md" -o -name "*.mdc" | while read -r file; do
|
|
echo " Processing $file..."
|
|
npx markdownlint --fix "$file" || true
|
|
done
|
|
else
|
|
echo "❌ Target $target not found"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Default to current directory if no target specified
|
|
TARGET="${1:-.}"
|
|
FIX_MARKDOWN "$TARGET"
|
|
|
|
echo "✅ Markdown formatting fixes applied!"
|
|
echo "💡 Run 'git diff' to see what was changed"
|
|
EOF
|
|
|
|
chmod +x scripts/fix-markdown.sh
|
|
|
|
# Create a markdown validation script
|
|
echo "📝 Creating markdown validation script..."
|
|
cat > scripts/validate-markdown.sh << 'EOF'
|
|
#!/bin/bash
|
|
|
|
# Validate markdown formatting without auto-fixing
|
|
# Usage: ./scripts/validate-markdown.sh [file_or_directory]
|
|
|
|
set -e
|
|
|
|
VALIDATE_MARKDOWN() {
|
|
local target="$1"
|
|
|
|
if [ -f "$target" ]; then
|
|
# Validate single file
|
|
if [[ "$target" =~ \.(md|mdc)$ ]]; then
|
|
echo "🔍 Validating markdown formatting in $target..."
|
|
npx markdownlint "$target"
|
|
fi
|
|
elif [ -d "$target" ]; then
|
|
# Validate all markdown files in directory
|
|
echo "🔍 Validating markdown formatting in $target..."
|
|
find "$target" -name "*.md" -o -name "*.mdc" | while read -r file; do
|
|
echo " Checking $file..."
|
|
npx markdownlint "$file" || true
|
|
done
|
|
else
|
|
echo "❌ Target $target not found"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Default to current directory if no target specified
|
|
TARGET="${1:-.}"
|
|
VALIDATE_MARKDOWN "$TARGET"
|
|
|
|
echo "✅ Markdown validation complete!"
|
|
EOF
|
|
|
|
chmod +x scripts/validate-markdown.sh
|
|
|
|
echo ""
|
|
echo "🎉 Markdown Pre-commit Hooks Setup Complete!"
|
|
echo ""
|
|
echo "📋 What was installed:"
|
|
echo " ✅ pre-commit hooks for automatic markdown formatting"
|
|
echo " ✅ .pre-commit-config.yaml with markdown rules"
|
|
echo " ✅ scripts/fix-markdown.sh for manual fixes"
|
|
echo " ✅ scripts/validate-markdown.sh for validation"
|
|
echo ""
|
|
echo "🚀 Usage:"
|
|
echo " • Hooks run automatically on commit"
|
|
echo " • Manual fix: ./scripts/fix-markdown.sh [file/dir]"
|
|
echo " • Manual check: ./scripts/validate-markdown.sh [file/dir]"
|
|
echo " • Test hooks: pre-commit run --all-files"
|
|
echo ""
|
|
echo "💡 The hooks will now automatically fix markdown issues before commits!"
|
|
|