From 576ffc359c46a257e406d2ade4f0aeee6eb799c9 Mon Sep 17 00:00:00 2001 From: "Brian S. Stephan" Date: Sun, 15 Mar 2020 20:23:14 -0500 Subject: [PATCH] show some navigation on every page closes #1 --- incorporealcms/pages.py | 22 +++++++++++++++- incorporealcms/static/css/style.css | 25 ++++++++++++++++++- incorporealcms/templates/base.html | 6 +++++ .../instance/pages/subdir-with-title/index.md | 3 +++ .../instance/pages/subdir-with-title/page.md | 1 + tests/instance/pages/subdir/index.md | 1 + tests/instance/pages/subdir/page.md | 3 +++ tests/test_pages.py | 23 ++++++++++++++++- 8 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 tests/instance/pages/subdir-with-title/index.md create mode 100644 tests/instance/pages/subdir-with-title/page.md create mode 100644 tests/instance/pages/subdir/index.md create mode 100644 tests/instance/pages/subdir/page.md diff --git a/incorporealcms/pages.py b/incorporealcms/pages.py index 58274e0..3185896 100644 --- a/incorporealcms/pages.py +++ b/incorporealcms/pages.py @@ -18,6 +18,7 @@ md = markdown.Markdown(extensions=['meta']) def display_page(path): """Get the file contents of the requested path and render the file.""" resolved_path = resolve_page_file(path) + parent_navs = generate_parent_navs(resolved_path) logger.debug("received request for path '%s', resolved to '%s'", path, resolved_path) try: with app.open_instance_resource(resolved_path, 'r') as entry_file: @@ -31,7 +32,8 @@ def display_page(path): content = Markup(md.convert(entry)) logger.debug("file metadata: %s", md.Meta) title = " ".join(md.Meta.get('title')) if md.Meta.get('title') else "" - return render_template('base.html', title=title, content=content, mtime=mtime.strftime('%Y-%m-%d %H:%M:%S %Z')) + return render_template('base.html', title=title, content=content, navs=parent_navs, + mtime=mtime.strftime('%Y-%m-%d %H:%M:%S %Z')) def resolve_page_file(path): @@ -46,3 +48,21 @@ def resolve_page_file(path): path = f'{path}index' path = f'pages/{path}.md' return path + + +def generate_parent_navs(path): + """Create a series of paths/links to navigate up from the given path.""" + parent_dir = os.path.dirname(path) + if parent_dir == 'pages': + return [(app.config['TITLE_SUFFIX'], '/')] + elif path.endswith('index.md'): + # if we're on an index.md, don't link to ourselves as we're our own parent + return generate_parent_navs(parent_dir) + else: + parent_path = f'{parent_dir}/'.replace('pages/', '/', 1) + resolved_parent_path = resolve_page_file(parent_path) + with app.open_instance_resource(resolved_parent_path, 'r') as entry_file: + entry = entry_file.read() + _ = Markup(md.convert(entry)) + parent_name = " ".join(md.Meta.get('title')) if md.Meta.get('title') else os.path.basename(parent_dir) + return generate_parent_navs(parent_dir) + [(parent_name, parent_path)] diff --git a/incorporealcms/static/css/style.css b/incorporealcms/static/css/style.css index 8b122ed..9c645e7 100644 --- a/incorporealcms/static/css/style.css +++ b/incorporealcms/static/css/style.css @@ -1,9 +1,14 @@ html { font-family: sans-serif; - padding: 0 1em; + padding: 0; + padding-bottom: 16px; color: #222; } +body { + margin: 0; +} + h1,h2,h3,h4,h5,h6 { color: #811610; } @@ -36,8 +41,26 @@ a:active { border-bottom: 1px dotted #222; } +section.nav { + color: #666; + background: #eee; + font-size: 0.75em; + border-bottom: 1px solid #ccc; + padding: 0.25em 0.5em; +} + +section.nav a { + color: #666; + border-bottom: none; +} + +section.content { + padding: 0 1em; +} + footer { display: block; font-size: 75%; color: #999; + padding: 0 1em; } diff --git a/incorporealcms/templates/base.html b/incorporealcms/templates/base.html index 95e5756..7743e96 100644 --- a/incorporealcms/templates/base.html +++ b/incorporealcms/templates/base.html @@ -2,6 +2,12 @@ {{ title }}{% if title %} - {% endif %}{{ config.TITLE_SUFFIX }} +
{{ content }}
diff --git a/tests/instance/pages/subdir-with-title/index.md b/tests/instance/pages/subdir-with-title/index.md new file mode 100644 index 0000000..b7c88db --- /dev/null +++ b/tests/instance/pages/subdir-with-title/index.md @@ -0,0 +1,3 @@ +Title: SUB! + +# subdir-with-title diff --git a/tests/instance/pages/subdir-with-title/page.md b/tests/instance/pages/subdir-with-title/page.md new file mode 100644 index 0000000..b869f4d --- /dev/null +++ b/tests/instance/pages/subdir-with-title/page.md @@ -0,0 +1 @@ +test page diff --git a/tests/instance/pages/subdir/index.md b/tests/instance/pages/subdir/index.md new file mode 100644 index 0000000..ec67b83 --- /dev/null +++ b/tests/instance/pages/subdir/index.md @@ -0,0 +1 @@ +# another page diff --git a/tests/instance/pages/subdir/page.md b/tests/instance/pages/subdir/page.md new file mode 100644 index 0000000..9f50810 --- /dev/null +++ b/tests/instance/pages/subdir/page.md @@ -0,0 +1,3 @@ +Title: Page + +# hello diff --git a/tests/test_pages.py b/tests/test_pages.py index 1179f3d..f0a6f8f 100644 --- a/tests/test_pages.py +++ b/tests/test_pages.py @@ -1,7 +1,7 @@ """Test page views and helper methods.""" import re -from incorporealcms.pages import resolve_page_file +from incorporealcms.pages import generate_parent_navs, resolve_page_file def test_resolve_page_file_dir_to_index(): @@ -44,3 +44,24 @@ def test_page_has_modified_timestamp(client): response = client.get('/') assert response.status_code == 200 assert re.search(r'Last modified: ....-..-.. ..:..:.. ...', response.data.decode()) is not None + + +def test_generate_page_navs_index(app): + with app.app_context(): + assert generate_parent_navs('pages/index.md') == [('incorporeal.org', '/')] + + +def test_generate_page_navs_subdir_index(app): + with app.app_context(): + assert generate_parent_navs('pages/subdir/index.md') == [('incorporeal.org', '/')] + + +def test_generate_page_navs_subdir_real_page(app): + with app.app_context(): + assert generate_parent_navs('pages/subdir/page.md') == [('incorporeal.org', '/'), ('subdir', '/subdir/')] + + +def test_generate_page_navs_subdir_with_title_parsing_real_page(app): + with app.app_context(): + assert generate_parent_navs('pages/subdir-with-title/page.md') == [('incorporeal.org', '/'), + ('SUB!', '/subdir-with-title/')]