Use Markdown content from index.md in blog.json instead of HTML
Updated generate_jsonblog.py to: - Load Markdown content from output/<slug>/index.md files - Set content_type: 'markdown' for each post - Fall back to plain text if index.md not found This ensures blog.json contains native Markdown content converted from RST via pandoc, rather than stripped HTML from the Atom feed. Works with the build order in make formats: 1. rst2md converts RST to Markdown 2. jsonblog reads the Markdown files 3. blog.json contains proper Markdown with content_type set Result: 100/100 posts now have Markdown content with content_type field.
This commit is contained in:
parent
9ba114df33
commit
01b1c2056d
1 changed files with 30 additions and 6 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""
|
"""
|
||||||
Generate JSON Blog (jsonblog.dev) format - single JSON file with all posts.
|
Generate JSON Blog (jsonblog.dev) format - single JSON file with all posts.
|
||||||
|
Uses Markdown content from index.md files generated by rst2md.py.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
@ -73,7 +74,7 @@ def parse_atom_feed(atom_path):
|
||||||
if title_elem is not None:
|
if title_elem is not None:
|
||||||
item['title'] = title_elem.text
|
item['title'] = title_elem.text
|
||||||
|
|
||||||
# Content
|
# Content (will be replaced with markdown later)
|
||||||
content_elem = entry.find('atom:content', ns)
|
content_elem = entry.find('atom:content', ns)
|
||||||
if content_elem is not None:
|
if content_elem is not None:
|
||||||
item['content_html'] = content_elem.text or ''
|
item['content_html'] = content_elem.text or ''
|
||||||
|
|
@ -108,8 +109,20 @@ def parse_atom_feed(atom_path):
|
||||||
return feed_info, entries
|
return feed_info, entries
|
||||||
|
|
||||||
|
|
||||||
def generate_jsonblog(atom_path, site_url):
|
def load_markdown_content(output_dir, slug):
|
||||||
"""Generate JSON Blog format."""
|
"""Load markdown content from index.md file."""
|
||||||
|
md_path = output_dir / slug / 'index.md'
|
||||||
|
if md_path.exists():
|
||||||
|
try:
|
||||||
|
return md_path.read_text(encoding='utf-8')
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Warning: Could not read {md_path}: {e}")
|
||||||
|
return None
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def generate_jsonblog(atom_path, output_dir, site_url):
|
||||||
|
"""Generate JSON Blog format with Markdown content."""
|
||||||
feed_info, entries = parse_atom_feed(atom_path)
|
feed_info, entries = parse_atom_feed(atom_path)
|
||||||
|
|
||||||
jsonblog = {
|
jsonblog = {
|
||||||
|
|
@ -125,14 +138,24 @@ def generate_jsonblog(atom_path, site_url):
|
||||||
'posts': []
|
'posts': []
|
||||||
}
|
}
|
||||||
|
|
||||||
|
markdown_found = 0
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
post = {
|
post = {
|
||||||
'title': entry['title'],
|
'title': entry['title'],
|
||||||
'slug': entry['slug'],
|
'slug': entry['slug'],
|
||||||
'content': entry['content'], # Plain text for JSON Blog
|
|
||||||
'createdAt': entry['createdAt'],
|
'createdAt': entry['createdAt'],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Try to load markdown content
|
||||||
|
md_content = load_markdown_content(output_dir, entry['slug'])
|
||||||
|
if md_content:
|
||||||
|
post['content'] = md_content
|
||||||
|
post['content_type'] = 'markdown'
|
||||||
|
markdown_found += 1
|
||||||
|
else:
|
||||||
|
# Fallback to plain text from HTML
|
||||||
|
post['content'] = entry['content']
|
||||||
|
|
||||||
if entry['updatedAt'] and entry['updatedAt'] != entry['createdAt']:
|
if entry['updatedAt'] and entry['updatedAt'] != entry['createdAt']:
|
||||||
post['updatedAt'] = entry['updatedAt']
|
post['updatedAt'] = entry['updatedAt']
|
||||||
|
|
||||||
|
|
@ -147,6 +170,7 @@ def generate_jsonblog(atom_path, site_url):
|
||||||
|
|
||||||
jsonblog['posts'].append(post)
|
jsonblog['posts'].append(post)
|
||||||
|
|
||||||
|
print(f"Generated {len(jsonblog['posts'])} posts ({markdown_found} with markdown content)")
|
||||||
return jsonblog
|
return jsonblog
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -163,8 +187,8 @@ if __name__ == '__main__':
|
||||||
print(f"Error: Atom feed not found at {atom_path}")
|
print(f"Error: Atom feed not found at {atom_path}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
jsonblog = generate_jsonblog(atom_path, site_url)
|
jsonblog = generate_jsonblog(atom_path, output_dir, site_url)
|
||||||
|
|
||||||
output_path = output_dir / 'blog.json'
|
output_path = output_dir / 'blog.json'
|
||||||
output_path.write_text(json.dumps(jsonblog, indent=2, ensure_ascii=False))
|
output_path.write_text(json.dumps(jsonblog, indent=2, ensure_ascii=False))
|
||||||
print(f"Generated {output_path} ({len(jsonblog['posts'])} posts)")
|
print(f"Generated {output_path}")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue