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!"
							 | 
						|
								
							 |