fix: resolve md-render --edit functionality and add enhanced version tracking
Some checks failed
Test Suite / e2e-tests (push) Has been cancelled
Test Suite / performance-tests (push) Has been cancelled
Test Suite / code-quality (push) Has been cancelled
Test Suite / security-scan (push) Has been cancelled
Test Suite / test-summary (push) Has been cancelled
Test Suite / integration-tests (push) Has been cancelled
Test Suite / unit-tests (3.11) (push) Has been cancelled
Test Suite / unit-tests (3.12) (push) Has been cancelled
Some checks failed
Test Suite / e2e-tests (push) Has been cancelled
Test Suite / performance-tests (push) Has been cancelled
Test Suite / code-quality (push) Has been cancelled
Test Suite / security-scan (push) Has been cancelled
Test Suite / test-summary (push) Has been cancelled
Test Suite / integration-tests (push) Has been cancelled
Test Suite / unit-tests (3.11) (push) Has been cancelled
Test Suite / unit-tests (3.12) (push) Has been cancelled
This commit fixes the critical md-render --edit regression that was causing "blue box, no content" issues and adds comprehensive version tracking. Key fixes: - Fixed JavaScript newline escaping in f-string templates (\\n\\n not \\\\n\\\\n) - Restored proper content rendering with marked.js CDN and graceful fallback - Removed problematic validation logic that was blocking content display - Cleaned up html-inject-editing command and related experimental code Enhancements: - Added version display in edit mode header with git commit and timestamp - Enhanced version tracking to show local uncommitted changes with timestamps - Added comprehensive regression tests to prevent future breakage - Improved error handling and recovery mechanisms The md-render --edit functionality now works reliably with full version visibility. 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -617,9 +617,82 @@ class DocumentManager:
|
||||
# Edit mode status and error reporting section
|
||||
edit_mode_html = ""
|
||||
if edit_mode:
|
||||
# Get version info for header
|
||||
try:
|
||||
import markitect
|
||||
from pathlib import Path
|
||||
import subprocess
|
||||
|
||||
# Get base version
|
||||
version = "0.3.0" # fallback
|
||||
try:
|
||||
from importlib.metadata import version as get_version
|
||||
version = get_version('markitect')
|
||||
except:
|
||||
pass
|
||||
|
||||
# Get git commit with timestamp and local changes info
|
||||
git_info = ""
|
||||
try:
|
||||
repo_path = Path(__file__).parent.parent
|
||||
|
||||
# Get commit hash and timestamp
|
||||
result = subprocess.run(['git', 'rev-parse', '--short', 'HEAD'],
|
||||
capture_output=True, text=True, cwd=repo_path)
|
||||
if result.returncode == 0:
|
||||
commit_hash = result.stdout.strip()
|
||||
|
||||
# Get commit timestamp
|
||||
timestamp_result = subprocess.run(['git', 'show', '-s', '--format=%ci', 'HEAD'],
|
||||
capture_output=True, text=True, cwd=repo_path)
|
||||
commit_time = ""
|
||||
if timestamp_result.returncode == 0:
|
||||
from datetime import datetime
|
||||
# Parse git timestamp and format it nicely
|
||||
git_time = timestamp_result.stdout.strip()
|
||||
try:
|
||||
dt = datetime.fromisoformat(git_time.replace(' +', '+'))
|
||||
commit_time = f" ({dt.strftime('%Y-%m-%d %H:%M')})"
|
||||
except:
|
||||
pass
|
||||
|
||||
git_info = f"+{commit_hash}{commit_time}"
|
||||
|
||||
# Check for uncommitted changes
|
||||
status_result = subprocess.run(['git', 'status', '--porcelain'],
|
||||
capture_output=True, text=True, cwd=repo_path)
|
||||
if status_result.returncode == 0 and status_result.stdout.strip():
|
||||
# Get timestamp of most recent uncommitted change
|
||||
import os
|
||||
import glob
|
||||
|
||||
latest_change = 0
|
||||
for line in status_result.stdout.strip().split('\n'):
|
||||
if line.strip():
|
||||
# Extract filename (skip first 3 chars which are status indicators)
|
||||
filename = line[3:].strip()
|
||||
try:
|
||||
file_path = repo_path / filename
|
||||
if file_path.exists():
|
||||
mtime = os.path.getmtime(file_path)
|
||||
latest_change = max(latest_change, mtime)
|
||||
except:
|
||||
pass
|
||||
|
||||
if latest_change > 0:
|
||||
change_dt = datetime.fromtimestamp(latest_change)
|
||||
git_info += f" including local changes until {change_dt.strftime('%Y-%m-%d %H:%M')}"
|
||||
|
||||
except:
|
||||
pass
|
||||
|
||||
version_info = f"{version}{git_info}"
|
||||
except:
|
||||
version_info = "0.3.0"
|
||||
|
||||
edit_mode_html = f"""
|
||||
<div id="markitect-status" style="background: #e3f2fd; border-left: 4px solid #2196f3; padding: 12px; margin-bottom: 20px; font-family: monospace; font-size: 14px;">
|
||||
<div style="font-weight: bold; color: #1976d2;">📝 Markitect Edit Mode</div>
|
||||
<div style="font-weight: bold; color: #1976d2;">📝 Markitect Edit Mode <span style="font-weight: normal; color: #666;">v{version_info}</span></div>
|
||||
<div id="status-message" style="margin-top: 8px;">Loading edit capabilities...</div>
|
||||
<div id="error-details" style="display: none; background: #ffebee; border: 1px solid #f44336; padding: 8px; margin-top: 8px; border-radius: 4px;">
|
||||
<div style="font-weight: bold; color: #c62828;">❌ Edit Mode Failed</div>
|
||||
@@ -708,67 +781,6 @@ class DocumentManager:
|
||||
}}
|
||||
}}
|
||||
|
||||
// Enhanced error recovery utility
|
||||
function attemptErrorRecovery(error, context) {{
|
||||
console.warn('[MarkiTect] Attempting error recovery for:', context, error);
|
||||
|
||||
try {{
|
||||
// Try to ensure content is still visible
|
||||
const contentDiv = document.getElementById('markdown-content');
|
||||
if (contentDiv && !contentDiv.innerHTML.trim()) {{
|
||||
// Fallback content rendering
|
||||
const fallbackHtml = markdownContent
|
||||
.replace(/^# (.*$)/gim, '<h1>$1</h1>')
|
||||
.replace(/^## (.*$)/gim, '<h2>$1</h2>')
|
||||
.replace(/\\n\\n/g, '<br><br>')
|
||||
.replace(/\\n/g, '<br>');
|
||||
contentDiv.innerHTML = '<div style="white-space: pre-wrap;">' + fallbackHtml + '</div>';
|
||||
|
||||
reportEditModeError('Recovered with fallback rendering', 'Edit features disabled', 'warning');
|
||||
return true;
|
||||
}}
|
||||
}} catch (recoveryError) {{
|
||||
console.error('[MarkiTect] Recovery failed:', recoveryError);
|
||||
}}
|
||||
|
||||
return false;
|
||||
}}
|
||||
|
||||
// Validation utility for edit mode state
|
||||
function validateEditModeState() {{
|
||||
const issues = [];
|
||||
|
||||
// Check required elements
|
||||
if (!document.getElementById('markdown-content')) {{
|
||||
issues.push('Missing markdown-content container');
|
||||
}}
|
||||
|
||||
if (!document.getElementById('markitect-status')) {{
|
||||
issues.push('Missing status display');
|
||||
}}
|
||||
|
||||
// Check JavaScript dependencies
|
||||
if (typeof marked === 'undefined') {{
|
||||
issues.push('marked.js library not available');
|
||||
}}
|
||||
|
||||
if (typeof MARKITECT_EDIT_MODE === 'undefined') {{
|
||||
issues.push('Edit mode configuration missing');
|
||||
}}
|
||||
|
||||
// Check for MarkitectEditor
|
||||
if (typeof MarkitectEditor === 'undefined') {{
|
||||
issues.push('MarkitectEditor class not defined');
|
||||
}}
|
||||
|
||||
if (issues.length > 0) {{
|
||||
console.warn('[MarkiTect] Edit mode validation issues:', issues);
|
||||
reportEditModeError('Edit mode validation failed', issues.join(', '), 'warning');
|
||||
return false;
|
||||
}}
|
||||
|
||||
return true;
|
||||
}}
|
||||
|
||||
// Status update utility
|
||||
function updateStatus(message, isError = false) {{
|
||||
@@ -815,44 +827,19 @@ class DocumentManager:
|
||||
}}
|
||||
|
||||
// Step 2: Try to enhance with edit capabilities (if in edit mode)
|
||||
{'''if (typeof MARKITECT_EDIT_MODE !== 'undefined' && MARKITECT_EDIT_MODE) {{
|
||||
{'''if (typeof MARKITECT_EDIT_MODE !== 'undefined' && MARKITECT_EDIT_MODE) {
|
||||
updateStatus("Initializing edit capabilities...");
|
||||
|
||||
// Validate edit mode prerequisites
|
||||
if (!validateEditModeState()) {{
|
||||
if (!attemptErrorRecovery('validation failed', 'edit mode prerequisites')) {{
|
||||
return; // Stop here if recovery fails
|
||||
}}
|
||||
}}
|
||||
|
||||
try {{
|
||||
try {
|
||||
updateStatus("Creating editor instance...");
|
||||
markitectEditor = new MarkitectEditor();
|
||||
updateStatus("✓ Edit mode active - click any section to edit");
|
||||
console.log("✓ Edit mode initialized successfully");
|
||||
|
||||
// Final validation check
|
||||
setTimeout(() => {{
|
||||
const sections = document.querySelectorAll('.markitect-section-editable');
|
||||
if (sections.length === 0) {{
|
||||
reportEditModeError('No editable sections found', 'Content may not be compatible with edit mode', 'warning');
|
||||
}} else {{
|
||||
console.log(`[MarkiTect] Found ${{sections.length}} editable sections`);
|
||||
}}
|
||||
}}, 1000);
|
||||
|
||||
}} catch (error) {{
|
||||
} catch (error) {
|
||||
updateStatus("Edit mode failed to initialize", true);
|
||||
reportEditModeError("Edit mode initialization failed", error.message);
|
||||
console.error("Edit mode error:", error);
|
||||
|
||||
// Try error recovery
|
||||
if (attemptErrorRecovery(error, 'editor initialization')) {{
|
||||
reportEditModeError("Edit mode partially recovered", error.message, 'warning');
|
||||
}} else {{
|
||||
reportEditModeError("Edit mode initialization failed", error.message);
|
||||
}}
|
||||
}}
|
||||
}}''' if edit_mode else ''}
|
||||
}
|
||||
}''' if edit_mode else ''}
|
||||
}});
|
||||
|
||||
// Handle CDN loading errors
|
||||
|
||||
Reference in New Issue
Block a user