98 lines
3.0 KiB
Python
98 lines
3.0 KiB
Python
"""
|
|
Export operations for CodiMD CLI.
|
|
"""
|
|
|
|
import re
|
|
from typing import Optional
|
|
from pathlib import Path
|
|
|
|
from .client import CodiMDClient
|
|
|
|
|
|
class ExportManager:
|
|
"""Manager for export operations."""
|
|
|
|
def __init__(self, client: CodiMDClient):
|
|
self.client = client
|
|
|
|
def export_markdown(self, note_id: str, output_file: Optional[Path] = None) -> str:
|
|
"""Export note as markdown."""
|
|
response = self.client.get(f"/{note_id}/download")
|
|
|
|
if response.status_code == 404:
|
|
raise FileNotFoundError(f"Note not found: {note_id}")
|
|
if response.status_code == 403:
|
|
raise PermissionError("No permission to export this note")
|
|
if response.status_code != 200:
|
|
raise Exception(f"Failed to export markdown: {response.status_code}")
|
|
|
|
content = response.text
|
|
|
|
if output_file:
|
|
output_file.write_text(content)
|
|
return str(output_file)
|
|
|
|
return content
|
|
|
|
def export_pdf(self, note_id: str, output_file: Optional[Path] = None) -> bytes:
|
|
"""Export note as PDF."""
|
|
response = self.client.get(f"/{note_id}/pdf")
|
|
|
|
if response.status_code == 403:
|
|
raise PermissionError("PDF export disabled or no permission")
|
|
if response.status_code == 404:
|
|
raise FileNotFoundError(f"Note not found: {note_id}")
|
|
if response.status_code != 200:
|
|
raise Exception(f"Failed to export PDF: {response.status_code}")
|
|
|
|
content = response.content
|
|
|
|
if output_file:
|
|
output_file.write_bytes(content)
|
|
return str(output_file)
|
|
|
|
return content
|
|
|
|
def export_html(self, note_id: str, output_file: Optional[Path] = None) -> str:
|
|
"""Export note as HTML (published view)."""
|
|
# First publish the note
|
|
publish_response = self.client.get(f"/{note_id}/publish")
|
|
|
|
if publish_response.status_code != 200:
|
|
raise Exception(f"Failed to publish note: {publish_response.status_code}")
|
|
|
|
# Extract the short ID from the response
|
|
url = publish_response.url
|
|
short_id = url.rstrip("/").split("/")[-1]
|
|
|
|
# Get the published view
|
|
response = self.client.get(f"/s/{short_id}")
|
|
|
|
if response.status_code != 200:
|
|
raise Exception(f"Failed to export HTML: {response.status_code}")
|
|
|
|
content = response.text
|
|
|
|
if output_file:
|
|
output_file.write_text(content)
|
|
return str(output_file)
|
|
|
|
return content
|
|
|
|
def export_slide(self, note_id: str, output_file: Optional[Path] = None) -> str:
|
|
"""Export note as reveal.js slides."""
|
|
response = self.client.get(f"/{note_id}/slide")
|
|
|
|
if response.status_code == 404:
|
|
raise FileNotFoundError(f"Note not found: {note_id}")
|
|
if response.status_code != 200:
|
|
raise Exception(f"Failed to export slides: {response.status_code}")
|
|
|
|
content = response.text
|
|
|
|
if output_file:
|
|
output_file.write_text(content)
|
|
return str(output_file)
|
|
|
|
return content
|