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/') 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)