@@ -561,52 +561,53 @@ runs:
561
561
562
562
# Create JSON structure with better error handling
563
563
if command -v python3 &>/dev/null; then
564
- # Use Python for more reliable JSON handling
565
- python3 -c '
566
- import sys
567
- import json
568
- import os
569
- import re
570
-
571
- files_to_analyze = sys.stdin.read().strip().split("\n")
572
- doc_structure = {}
573
-
574
- for file_path in files_to_analyze :
575
- if not file_path or not file_path.endswith(".md") or not os.path.isfile(file_path) :
576
- continue
577
-
578
- try :
579
- with open(file_path, "r", encoding="utf-8") as f :
580
- content = f.read()
564
+ # Use the external Python script file for more reliable JSON handling
565
+ if [[ -f ".github/actions/docs-analysis/analyze_docs.py" ]]; then
566
+ cat "$FILES_TO_ANALYZE" | python3 .github/actions/docs-analysis/analyze_docs.py > .github/temp/doc_structure.json
567
+ else
568
+ echo "::warning::Could not find analyze_docs.py script, falling back to bash-only approach"
569
+ # Fallback to bash if Python isn't available
570
+ echo "{" > .github/temp/doc_structure.json
571
+ FIRST_FILE=true
581
572
582
- # Extract title (first h1)
583
- title_match = re.search(r"^# (.+)$", content, re.MULTILINE)
584
- title = title_match.group(1) if title_match else "Untitled"
585
-
586
- # Count headings
587
- h1_count = len(re.findall(r"^# ", content, re.MULTILINE))
588
- h2_count = len(re.findall(r"^## ", content, re.MULTILINE))
589
- h3_count = len(re.findall(r"^### ", content, re.MULTILINE))
590
-
591
- doc_structure[file_path] = {
592
- " title " : title,
593
- " headings " : {
594
- " h1 " : h1_count,
595
- " h2 " : h2_count,
596
- " h3 " : h3_count
597
- }
598
- }
599
-
600
- print(f"Analyzed {file_path} : H1={h1_count}, H2={h2_count}, H3={h3_count}, Title=\'{title}\'", file=sys.stderr)
601
- except Exception as e :
602
- print(f"Error analyzing {file_path} : {str(e)}", file=sys.stderr)
603
-
604
- # Write JSON output
605
- with open(".github/temp/doc_structure.json", "w", encoding="utf-8") as f :
606
- json.dump(doc_structure, f, indent=2)
607
-
608
- print(json.dumps(doc_structure))
609
- ' <<< "$FILES_TO_ANALYZE" > .github/temp/doc_structure.json
573
+ # Process each file
574
+ while IFS= read -r file; do
575
+ if [[ -n "$file" && -f "$file" && "$file" == *.md ]]; then
576
+ # Extract document title (first heading)
577
+ TITLE=$(head -50 "$file" | grep -E "^# " | head -1 | sed 's/^# //')
578
+
579
+ # Count headings at each level with better error handling
580
+ H1_COUNT=$(grep -c "^# " "$file" 2>/dev/null || echo "0")
581
+ H2_COUNT=$(grep -c "^## " "$file" 2>/dev/null || echo "0")
582
+ H3_COUNT=$(grep -c "^### " "$file" 2>/dev/null || echo "0")
583
+
584
+ # Skip separator for first file
585
+ if [[ "$FIRST_FILE" == "true" ]]; then
586
+ FIRST_FILE=false
587
+ else
588
+ echo "," >> .github/temp/doc_structure.json
589
+ fi
590
+
591
+ # Add to JSON structure - sanitize file for JSON
592
+ FILE_JSON=$(json_escape "$file")
593
+ TITLE_JSON=$(json_escape "${TITLE:-Untitled}")
594
+
595
+ echo " $FILE_JSON: {" >> .github/temp/doc_structure.json
596
+ echo " \"title\": $TITLE_JSON," >> .github/temp/doc_structure.json
597
+ echo " \"headings\": {" >> .github/temp/doc_structure.json
598
+ echo " \"h1\": $H1_COUNT," >> .github/temp/doc_structure.json
599
+ echo " \"h2\": $H2_COUNT," >> .github/temp/doc_structure.json
600
+ echo " \"h3\": $H3_COUNT" >> .github/temp/doc_structure.json
601
+ echo " }" >> .github/temp/doc_structure.json
602
+ echo " }" >> .github/temp/doc_structure.json
603
+
604
+ echo "Analyzed $file: H1=$H1_COUNT, H2=$H2_COUNT, H3=$H3_COUNT, Title='${TITLE:-Untitled}'"
605
+ fi
606
+ done <<< "$FILES_TO_ANALYZE"
607
+
608
+ # Close JSON object
609
+ echo "}" >> .github/temp/doc_structure.json
610
+ fi
610
611
else
611
612
# Fallback to bash if Python isn't available
612
613
echo "{" > .github/temp/doc_structure.json
@@ -699,11 +700,6 @@ print(json.dumps(doc_structure))
699
700
echo "$path" | sed 's/[;&|"`$]/\\&/g'
700
701
}
701
702
702
- # Enable debug output if requested
703
- if [[ "${{ inputs.debug-mode }}" == "true" ]]; then
704
- set -x
705
- fi
706
-
707
703
# Only run if we have docs changes
708
704
CHANGED_FILES="${{ steps.verify.outputs.changed_docs_files }}"
709
705
DIFF_TARGET="origin/${{ inputs.pr-ref }}"
0 commit comments