Update documentation to reflect the latest link verification results, confirming no broken links found and achieving a 100% success rate. Revise multiple files to correct link paths for improved navigation, ensuring consistency across project management and FAQ documents. This update enhances the overall clarity and accessibility of the documentation.
This commit is contained in:
147
scripts/fix_root_references.py
Normal file
147
scripts/fix_root_references.py
Normal file
@@ -0,0 +1,147 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script to fix references from subdirectories to root-level files.
|
||||
Adds ../ prefix where needed for files in subdirectories.
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
# Root-level files that might be referenced
|
||||
ROOT_FILES = [
|
||||
'MASTER_INDEX.md',
|
||||
'QUICK_REFERENCE.md',
|
||||
'DOCUMENT_RELATIONSHIP_MAP.md',
|
||||
'GLOSSARY.md',
|
||||
'VERSION_CONTROL_POLICY.md',
|
||||
'EXECUTIVE_SUMMARY.md',
|
||||
'TIMELINE_VISUALIZATION.md',
|
||||
'QUALITY_VERIFICATION_REPORT.md',
|
||||
'RECOMMENDATIONS_AND_SUGGESTIONS.md',
|
||||
'GRADING_AND_SCORING_REPORT.md',
|
||||
'CROSS_REFERENCE_VERIFICATION_REPORT.md',
|
||||
'IMMEDIATE_NEXT_STEPS.md',
|
||||
'Template_System_Requirements.md',
|
||||
'RESOURCE_REQUIREMENTS_SUMMARY.md',
|
||||
'README.md',
|
||||
'NAVIGATION_GUIDE.md',
|
||||
]
|
||||
|
||||
# Directory references that need fixing
|
||||
DIR_REFS = [
|
||||
'QUICK_START_GUIDES/',
|
||||
'00_document_control/',
|
||||
'01_constitutional/',
|
||||
'02_statutory_code/',
|
||||
'03_governance/',
|
||||
'04_legal_regulatory/',
|
||||
'05_financial_reserve/',
|
||||
'06_cyber_sovereignty/',
|
||||
'07_member_integration/',
|
||||
'08_operational/',
|
||||
'09_intelligence_security/',
|
||||
'10_diplomatic_treaty/',
|
||||
'11_technical_specs/',
|
||||
'12_compliance_audit/',
|
||||
'13_emergency_contingency/',
|
||||
'csp_1113/',
|
||||
'gru_reserve_system/',
|
||||
'onboarding_package/',
|
||||
'visual_assets/',
|
||||
'formatted_book/',
|
||||
]
|
||||
|
||||
def fix_links_in_file(file_path, project_root):
|
||||
"""Fix links in a single file."""
|
||||
try:
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
original_content = content
|
||||
file_dir = os.path.dirname(file_path)
|
||||
rel_file_dir = os.path.relpath(file_dir, project_root)
|
||||
|
||||
# Only fix files in subdirectories (not root)
|
||||
if rel_file_dir == '.':
|
||||
return False
|
||||
|
||||
# Calculate how many ../ needed
|
||||
depth = len(rel_file_dir.split(os.sep))
|
||||
prefix = '../' * depth
|
||||
|
||||
# Fix references to root-level files
|
||||
for root_file in ROOT_FILES:
|
||||
# Pattern: [text](filename.md) or [text](./filename.md)
|
||||
patterns = [
|
||||
(r'(\[([^\]]+)\]\(\.?/)' + re.escape(root_file) + r'\))', f'\\1{prefix}{root_file}'),
|
||||
(r'(\[([^\]]+)\]\(\.?/)' + re.escape(root_file) + r'#([^)]+)\))', f'\\1{prefix}{root_file}#\\3'),
|
||||
(r'(\[([^\]]+)\]\(\.?/)' + re.escape(root_file) + r'\))', f'\\1{prefix}{root_file}'),
|
||||
]
|
||||
|
||||
# Simple filename reference (not already with path)
|
||||
simple_pattern = r'(\[([^\]]+)\]\(\.?/)' + re.escape(root_file) + r'([^)]*)\)'
|
||||
def replace_simple(match):
|
||||
link_text = match.group(2)
|
||||
suffix = match.group(3) if match.group(3) else ''
|
||||
return f'[{link_text}]({prefix}{root_file}{suffix})'
|
||||
|
||||
content = re.sub(simple_pattern, replace_simple, content)
|
||||
|
||||
# Also fix if it's just the filename without ./ or ../
|
||||
pattern = r'(\[([^\]]+)\]\(\.?/)' + re.escape(root_file) + r'([^)]*)\)'
|
||||
if not re.search(r'\.\.?/', pattern):
|
||||
content = re.sub(r'(\[([^\]]+)\]\(\.?/)' + re.escape(root_file) + r'([^)]*)\)',
|
||||
lambda m: f'[{m.group(2)}]({prefix}{root_file}{m.group(3)})', content)
|
||||
|
||||
# Fix directory references
|
||||
for dir_ref in DIR_REFS:
|
||||
# Pattern: [text](dirname/) or [text](./dirname/)
|
||||
pattern = r'(\[([^\]]+)\]\(\.?/)' + re.escape(dir_ref) + r'([^)]*)\)'
|
||||
def replace_dir(match):
|
||||
link_text = match.group(2)
|
||||
suffix = match.group(3) if match.group(3) else ''
|
||||
return f'[{link_text}]({prefix}{dir_ref}{suffix})'
|
||||
|
||||
content = re.sub(pattern, replace_dir, content)
|
||||
|
||||
if content != original_content:
|
||||
with open(file_path, 'w', encoding='utf-8') as f:
|
||||
f.write(content)
|
||||
return True
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"Error processing {file_path}: {e}")
|
||||
return False
|
||||
|
||||
def main():
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
# Find markdown files in subdirectories only
|
||||
md_files = []
|
||||
for root, dirs, files in os.walk(project_root):
|
||||
# Skip .git and other hidden directories
|
||||
dirs[:] = [d for d in dirs if d not in ['.git', 'node_modules', '__pycache__']]
|
||||
|
||||
# Skip root directory
|
||||
if root == project_root:
|
||||
continue
|
||||
|
||||
for file in files:
|
||||
if file.endswith('.md'):
|
||||
md_files.append(os.path.join(root, file))
|
||||
|
||||
print(f"Found {len(md_files)} markdown files in subdirectories")
|
||||
print("Fixing references to root-level files...")
|
||||
|
||||
fixed_count = 0
|
||||
for md_file in md_files:
|
||||
if fix_links_in_file(md_file, project_root):
|
||||
fixed_count += 1
|
||||
print(f"Fixed: {os.path.relpath(md_file, project_root)}")
|
||||
|
||||
print(f"\nFixed {fixed_count} files")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user