diff --git a/incorporealcms/__init__.py b/incorporealcms/__init__.py index 45ceb25..5e22c5d 100644 --- a/incorporealcms/__init__.py +++ b/incorporealcms/__init__.py @@ -3,6 +3,7 @@ import logging import os from logging.config import dictConfig +import markdown from flask import Flask, request, send_from_directory from ._version import get_versions @@ -31,6 +32,10 @@ def create_app(instance_path=None, test_config=None): logger.debug("instance path: %s", app.instance_path) + # initialize markdown parser from config, but include + # extensions our app depends on, like the meta extension + app.config['md'] = markdown.Markdown(extensions=app.config['MARKDOWN_EXTENSIONS'] + ['meta']) + @app.before_request def log_request(): logger.info("REQUEST: %s %s", request.method, request.path) diff --git a/incorporealcms/config.py b/incorporealcms/config.py index 77542c3..1964532 100644 --- a/incorporealcms/config.py +++ b/incorporealcms/config.py @@ -32,5 +32,7 @@ class Config(object): }, } + MARKDOWN_EXTENSIONS = ['meta', 'tables'] + TITLE_SUFFIX = 'incorporeal.org' MEDIA_DIR = 'media' diff --git a/incorporealcms/pages.py b/incorporealcms/pages.py index 761d5c2..7541307 100644 --- a/incorporealcms/pages.py +++ b/incorporealcms/pages.py @@ -3,7 +3,6 @@ import datetime import logging import os -import markdown from flask import Blueprint, Markup, abort from flask import current_app as app from flask import redirect, render_template @@ -12,7 +11,6 @@ from tzlocal import get_localzone logger = logging.getLogger(__name__) bp = Blueprint('pages', __name__, url_prefix='/') -md = markdown.Markdown(extensions=['meta', 'tables']) @bp.route('/', defaults={'path': 'index'}) @@ -34,9 +32,9 @@ def display_page(path): logger.warning("requested path '%s' (resolved path '%s') not found!", path, resolved_path) abort(404) else: - content = Markup(md.convert(entry)) - logger.debug("file metadata: %s", md.Meta) - title = " ".join(md.Meta.get('title')) if md.Meta.get('title') else "" + content = Markup(app.config['md'].convert(entry)) + logger.debug("file metadata: %s", app.config['md'].Meta) + title = " ".join(app.config['md'].Meta.get('title')) if app.config['md'].Meta.get('title') else "" return render_template('base.html', title=title, content=content, navs=parent_navs, mtime=mtime.strftime('%Y-%m-%d %H:%M:%S %Z')) @@ -86,6 +84,6 @@ def generate_parent_navs(path): else: with app.open_instance_resource(resolved_path, 'r') as entry_file: entry = entry_file.read() - _ = Markup(md.convert(entry)) - page_name = " ".join(md.Meta.get('title')) if md.Meta.get('title') else f'/{path}' + _ = Markup(app.config['md'].convert(entry)) + page_name = " ".join(app.config['md'].Meta.get('title')) if app.config['md'].Meta.get('title') else f'/{path}' return generate_parent_navs(parent_path) + [(page_name, f'/{path}')] diff --git a/tests/test_factory.py b/tests/test_factory.py index 06177a8..973e9b7 100644 --- a/tests/test_factory.py +++ b/tests/test_factory.py @@ -13,6 +13,32 @@ def test_config(): assert create_app(instance_path=instance_path, test_config={"TESTING": True}).testing +def test_markdown_meta_extension_always(): + """Test that the markdown meta extension is always loaded, even if not specified.""" + app = create_app(instance_path=os.path.join(HERE, 'instance'), + test_config={'MARKDOWN_EXTENSIONS': []}) + client = app.test_client() + response = client.get('/') + assert response.status_code == 200 + assert b'Index - incorporeal.org' in response.data + + +def test_extra_markdown_extensions_work(): + """Test we can load more extensions via config, and that they work.""" + app = create_app(instance_path=os.path.join(HERE, 'instance')) + client = app.test_client() + response = client.get('/mdash-or-triple-dash') + assert response.status_code == 200 + assert b'word --- word' in response.data + + app = create_app(instance_path=os.path.join(HERE, 'instance'), + test_config={'MARKDOWN_EXTENSIONS': ['smarty']}) + client = app.test_client() + response = client.get('/mdash-or-triple-dash') + assert response.status_code == 200 + assert b'word — word' in response.data + + def test_title_override(): """Test that a configuration with a specific title overrides the default.""" instance_path = os.path.join(HERE, 'instance')