def view_help(topic="", *args, **kwargs):
"""
Render dynamic help based on GWAY introspection and search-style links.
If there is an exact match in the search, show it at the top (highlighted).
"""
# TODO: Change the wat the help system works: Instead of just using the results of
# gw.gelp at all times, compliment this result with other information.
topic_in = topic or ""
topic = topic.replace(" ", "/").replace(".", "/").replace("-", "_") if topic else ""
parts = [p for p in topic.strip("/").split("/") if p]
if not parts:
help_info = gw.help()
title = "Available Projects"
content = "<ul>"
for project in help_info["Available Projects"]:
content += f'<li><a href="?topic={project}">{project}</a></li>'
content += "</ul>"
return f"<h1>{title}</h1>{content}"
elif len(parts) == 1:
project = parts[0]
help_info = gw.help(project)
title = f"Help Topics for <code>{project}</code>"
else:
*project_path, maybe_function = parts
obj = gw
for segment in project_path:
obj = getattr(obj, segment, None)
if obj is None:
return f"<h2>Not Found</h2><p>Project path invalid at <code>{segment}</code>.</p>"
project_str = ".".join(project_path)
if hasattr(obj, maybe_function):
function = maybe_function
help_info = gw.help(project_str, function, full=True)
full_name = f"{project_str}.{function}"
title = f"Help for <code>{full_name}</code>"
else:
help_info = gw.help(project_str)
full_name = f"{project_str}.{maybe_function}"
title = f"Help Topics for <code>{full_name}</code>"
if help_info is None:
return "<h2>Not Found</h2><p>No help found for the given input.</p>"
highlight_js = '''
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<script>
window.addEventListener('DOMContentLoaded',function(){
if(window.hljs){
document.querySelectorAll('pre code.python').forEach(el => { hljs.highlightElement(el); });
}
});
</script>
'''
# --- Exact match highlighting logic ---
# Only applies if help_info contains "Matches"
if "Matches" in help_info:
matches = help_info["Matches"]
exact_key = (topic_in.replace(" ", "/").replace(".", "/").replace("-", "_")).strip("/")
# Try to find an exact match (project, or project/function) in matches
def canonical_str(m):
p, f = m.get("Project", ""), m.get("Function", "")
return (f"{p}/{f}" if f else p).replace(".", "/").replace("-", "_")
exact = None
exact_idx = -1
for idx, m in enumerate(matches):
if canonical_str(m).lower() == exact_key.lower():
exact = m
exact_idx = idx
break
sections = []
# If found, show exact at top with highlight
if exact is not None:
sections.append('<div class="help-exact">' + _render_help_section(exact, use_query_links=True, highlight=True) + '</div>')
# Add separator if there are more matches
if len(matches) > 1:
sections.append('<hr class="help-sep">')
# Remove exact match from below
rest = [m for i, m in enumerate(matches) if i != exact_idx]
else:
rest = matches
for idx, match in enumerate(rest):
section_html = _render_help_section(match, use_query_links=True)
if idx < len(rest) - 1:
section_html += '<hr class="help-sep">'
sections.append(section_html)
multi = f"<div class='help-multi'>{''.join(sections)}</div>"
if "Full Code" in str(help_info):
multi += highlight_js
return f"<h1>{title}</h1>{multi}"
# Not a multi-match result: just render normally
body = _render_help_section(help_info, use_query_links=True)
if "Full Code" in str(help_info):
body += highlight_js
return f"<h1>{title}</h1>{body}"