markdownViewer/app/routes/main.py
2025-03-22 02:13:26 +01:00

90 lines
3.6 KiB
Python

from flask import Blueprint, render_template, request, current_app, redirect, url_for, abort, flash
import os
from app.utils.file_handler import save_file, read_markdown_file, get_file_by_uri, load_uri_map, save_uri_map
from app.utils.utils import convert_markdown_to_html
main_bp = Blueprint('main', __name__)
@main_bp.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
delete_uri = request.form.get('delete_uri')
if delete_uri:
uri_map = load_uri_map()
if delete_uri in uri_map:
# Remove the document from the URI map
del uri_map[delete_uri]
save_uri_map(uri_map)
else:
flash(f'Document with URI "{delete_uri}" not found.')
return redirect(url_for('main.index'))
# List all available documents
uri_map = load_uri_map()
documents = [{'uri': uri, 'filename': info['filename']} for uri, info in uri_map.items()]
return render_template('index.html', documents=documents)
@main_bp.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
custom_uri = request.form.get('custom_uri', '').strip()
raw_url = request.form.get('raw_url', '').strip()
if raw_url:
# Handle raw URL input
try:
import requests
response = requests.get(raw_url)
if response.status_code == 200:
content = response.text
from io import BytesIO
file = BytesIO(content.encode('utf-8'))
filename = raw_url.split('/')[-1]
if not filename.endswith('.md'):
filename += '.md'
# Create a FileStorage-like object that save_file can handle
from werkzeug.datastructures import FileStorage
file = FileStorage(
stream=file,
filename=filename,
content_type='text/markdown'
)
uri, filename = save_file(file, custom_uri if custom_uri else None)
return redirect(url_for('main.view_file', uri=uri))
else:
flash('Could not fetch content from URL')
return redirect(request.url)
except Exception as e:
flash(f'Error fetching URL: {str(e)}')
return redirect(request.url)
elif 'file' in request.files:
file = request.files['file']
if file.filename == '':
flash('No file selected and no URL provided')
return redirect(request.url)
if file and file.filename.endswith('.md'):
uri, filename = save_file(file, custom_uri if custom_uri else None)
return redirect(url_for('main.view_file', uri=uri))
else:
flash('Only markdown files are allowed')
else:
flash('Please either upload a file or provide a URL')
return redirect(request.url)
return render_template('upload.html')
@main_bp.route('/view/<uri>')
def view_file(uri):
file_info = get_file_by_uri(uri)
if not file_info:
abort(404)
html_content = read_markdown_file(file_info['path'])
return render_template('viewer.html',
filename=file_info['filename'],
content=html_content,
uri=uri)