Help for web.nav.render
Sample CLI
gway web.nav render
Full Code
def render(*, homes=None):
"""
Renders the sidebar navigation including search, home links, visited links, and a QR compass.
"""
cookies_ok = gw.web.app.is_enabled('web.cookies') and gw.web.cookies.check_consent()
gw.debug(f"Render nav with {homes=} {cookies_ok=}")
visited = []
if cookies_ok:
visited_cookie = gw.web.cookies.get("visited", "")
if visited_cookie:
visited = visited_cookie.split("|")
current_route = request.fullpath.strip("/")
current_title = (current_route.split("/")[-1] or "readme").replace('-', ' ').replace('_', ' ').title()
visited_set = set()
entries = []
for entry in visited:
if "=" not in entry:
continue
title, route = entry.split("=", 1)
canon_route = route.strip("/")
if canon_route not in visited_set:
entries.append((title, canon_route))
visited_set.add(canon_route)
home_routes = set()
if homes:
for home_title, home_route in homes:
home_routes.add(home_route.strip("/"))
if cookies_ok and current_route not in home_routes and current_route not in visited_set:
entries.append((current_title, current_route))
visited_set.add(current_route)
# --- Build HTML links ---
links = ""
if homes:
for home_title, home_route in homes:
route = home_route.strip("/")
is_current = ' class="current"' if route == current_route else ""
links += f'<li><a href="/{home_route}"{is_current}>{home_title.upper()}</a></li>'
if cookies_ok and entries:
visited_rendered = set()
for title, route in reversed(entries):
if route in home_routes or route in visited_rendered:
continue
visited_rendered.add(route)
is_current = ' class="current"' if route == current_route else ""
links += f'<li><a href="/{route}"{is_current}>{title}</a></li>'
elif not homes:
links += f'<li class="current">{current_title.upper()}</li>'
# --- Search box ---
search_box = '''
<form action="/site/help" method="get" class="nav">
<textarea name="topic" id="help-search"
placeholder="Search this GWAY"
class="help" rows="1"
autocomplete="off"
spellcheck="false"
style="overflow:hidden; resize:none; min-height:2.4em; max-height:10em;"
oninput="autoExpand(this)"
>{}</textarea>
</form>
'''.format(request.query.get("topic", ""))
# --- QR code for this page ---
compass = ""
try:
url = get_current_url()
qr_url = gw.qr.generate_url(url)
compass = f'''
<div class="compass">
<img src="{qr_url}" alt="QR Code" class="compass" />
</div>
'''
except Exception as e:
gw.debug(f"Could not generate QR compass: {e}")
gw.debug(f"Visited cookie raw: {gw.web.cookies.get('visited')}")
return f"<aside>{search_box}<ul>{links}</ul><br>{compass}</aside>"