rewrite generate_parent_navs to work on resource paths
the old code was kind of impossible to understand by reading it, so this is hopefully considerably clearer
This commit is contained in:
parent
faf4a7f166
commit
1cef3b8196
@ -32,17 +32,18 @@ def display_page(path):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
with app.open_instance_resource(resolved_path, 'r') as entry_file:
|
with app.open_instance_resource(resolved_path, 'r') as entry_file:
|
||||||
parent_navs = generate_parent_navs(path)
|
|
||||||
mtime = datetime.datetime.fromtimestamp(os.path.getmtime(entry_file.name), get_localzone())
|
mtime = datetime.datetime.fromtimestamp(os.path.getmtime(entry_file.name), get_localzone())
|
||||||
entry = entry_file.read()
|
entry = entry_file.read()
|
||||||
except FileNotFoundError:
|
except OSError:
|
||||||
logger.warning("requested path '%s' (resolved path '%s') not found!", path, resolved_path)
|
logger.error("resolved path '%s' could not be opened!", resolved_path)
|
||||||
abort(404)
|
abort(500)
|
||||||
else:
|
else:
|
||||||
md = init_md()
|
md = init_md()
|
||||||
content = Markup(md.convert(entry))
|
content = Markup(md.convert(entry))
|
||||||
logger.debug("file metadata: %s", md.Meta)
|
logger.debug("file metadata: %s", md.Meta)
|
||||||
|
|
||||||
|
parent_navs = generate_parent_navs(resolved_path)
|
||||||
|
|
||||||
return render('base.html', title=get_meta_str(md, 'title'), description=get_meta_str(md, 'description'),
|
return render('base.html', title=get_meta_str(md, 'title'), description=get_meta_str(md, 'description'),
|
||||||
image=get_meta_str(md, 'image'), base_url=request.base_url, content=content, navs=parent_navs,
|
image=get_meta_str(md, 'image'), base_url=request.base_url, content=content, navs=parent_navs,
|
||||||
mtime=mtime.strftime('%Y-%m-%d %H:%M:%S %Z'))
|
mtime=mtime.strftime('%Y-%m-%d %H:%M:%S %Z'))
|
||||||
@ -135,22 +136,32 @@ def resolve_page_file(path):
|
|||||||
|
|
||||||
|
|
||||||
def generate_parent_navs(path):
|
def generate_parent_navs(path):
|
||||||
"""Create a series of paths/links to navigate up from the given path."""
|
"""Create a series of paths/links to navigate up from the given resource path."""
|
||||||
# derive additional path/location stuff based on path
|
if path == 'pages/index.md':
|
||||||
resolved_path = resolve_page_file(path)
|
# bail and return the title suffix (generally the domain name) as a terminal case
|
||||||
parent_dir = os.path.dirname(resolved_path)
|
|
||||||
parent_path = '/'.join(path[:-1].split('/')[:-1]) + '/'
|
|
||||||
|
|
||||||
logger.debug("path: '%s'; parent path: '%s'; resolved path: '%s'; parent dir: '%s'",
|
|
||||||
path, parent_path, resolved_path, parent_dir)
|
|
||||||
|
|
||||||
if path in ('index', '/'):
|
|
||||||
return [(app.config['TITLE_SUFFIX'], '/')]
|
return [(app.config['TITLE_SUFFIX'], '/')]
|
||||||
else:
|
else:
|
||||||
with app.open_instance_resource(resolved_path, 'r') as entry_file:
|
if path.endswith('index.md'):
|
||||||
entry = entry_file.read()
|
# index case: one dirname for foo/bar/index.md -> foo/bar, one for foo/bar -> foo
|
||||||
|
parent_resource_dir = os.path.dirname(os.path.dirname(path))
|
||||||
|
else:
|
||||||
|
# usual case: foo/buh.md -> foo
|
||||||
|
parent_resource_dir = os.path.dirname(path)
|
||||||
|
|
||||||
|
# generate the request path (i.e. what the link will be) for this path, and
|
||||||
|
# also the resource path of this parent (which is always a dir, so always index.md)
|
||||||
|
request_path = f'/{instance_resource_path_to_request_path(path)}'
|
||||||
|
parent_resource_path = os.path.join(parent_resource_dir, 'index.md')
|
||||||
|
|
||||||
|
logger.debug("resource path: '%s'; request path: '%s'; parent resource path: '%s'", path,
|
||||||
|
request_path, parent_resource_path)
|
||||||
|
|
||||||
# for issues regarding parser reuse (see lib.init_md) we reinitialize the parser here
|
# for issues regarding parser reuse (see lib.init_md) we reinitialize the parser here
|
||||||
md = init_md()
|
md = init_md()
|
||||||
|
|
||||||
|
# read the resource
|
||||||
|
with app.open_instance_resource(path, 'r') as entry_file:
|
||||||
|
entry = entry_file.read()
|
||||||
_ = Markup(md.convert(entry))
|
_ = Markup(md.convert(entry))
|
||||||
page_name = " ".join(md.Meta.get('title')) if md.Meta.get('title') else f'/{path}'
|
page_name = " ".join(md.Meta.get('title')) if md.Meta.get('title') else request_path
|
||||||
return generate_parent_navs(parent_path) + [(page_name, f'/{path}')]
|
return generate_parent_navs(parent_resource_path) + [(page_name, request_path)]
|
||||||
|
@ -24,32 +24,26 @@ def test_resolve_page_file_other_requests_fine():
|
|||||||
def test_generate_page_navs_index(app):
|
def test_generate_page_navs_index(app):
|
||||||
"""Test that the index page has navs to the root (itself)."""
|
"""Test that the index page has navs to the root (itself)."""
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
assert generate_parent_navs('/') == [('incorporeal.org', '/')]
|
assert generate_parent_navs('pages/index.md') == [('incorporeal.org', '/')]
|
||||||
|
|
||||||
|
|
||||||
def test_generate_page_navs_alternate_index(app):
|
|
||||||
"""Test that the index page (as a page, not a path) also has navs only to the root (by path)."""
|
|
||||||
with app.app_context():
|
|
||||||
assert generate_parent_navs('index') == [('incorporeal.org', '/')]
|
|
||||||
|
|
||||||
|
|
||||||
def test_generate_page_navs_subdir_index(app):
|
def test_generate_page_navs_subdir_index(app):
|
||||||
"""Test that dir pages have navs to the root and themselves."""
|
"""Test that dir pages have navs to the root and themselves."""
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
assert generate_parent_navs('subdir/') == [('incorporeal.org', '/'), ('/subdir/', '/subdir/')]
|
assert generate_parent_navs('pages/subdir/index.md') == [('incorporeal.org', '/'), ('/subdir/', '/subdir/')]
|
||||||
|
|
||||||
|
|
||||||
def test_generate_page_navs_subdir_real_page(app):
|
def test_generate_page_navs_subdir_real_page(app):
|
||||||
"""Test that real pages have navs to the root, their parent, and themselves."""
|
"""Test that real pages have navs to the root, their parent, and themselves."""
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
assert generate_parent_navs('subdir/page') == [('incorporeal.org', '/'), ('/subdir/', '/subdir/'),
|
assert generate_parent_navs('pages/subdir/page.md') == [('incorporeal.org', '/'), ('/subdir/', '/subdir/'),
|
||||||
('Page', '/subdir/page')]
|
('Page', '/subdir/page')]
|
||||||
|
|
||||||
|
|
||||||
def test_generate_page_navs_subdir_with_title_parsing_real_page(app):
|
def test_generate_page_navs_subdir_with_title_parsing_real_page(app):
|
||||||
"""Test that title metadata is used in the nav text."""
|
"""Test that title metadata is used in the nav text."""
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
assert generate_parent_navs('subdir-with-title/page') == [
|
assert generate_parent_navs('pages/subdir-with-title/page.md') == [
|
||||||
('incorporeal.org', '/'),
|
('incorporeal.org', '/'),
|
||||||
('SUB!', '/subdir-with-title/'),
|
('SUB!', '/subdir-with-title/'),
|
||||||
('/subdir-with-title/page', '/subdir-with-title/page')
|
('/subdir-with-title/page', '/subdir-with-title/page')
|
||||||
|
Loading…
Reference in New Issue
Block a user