Made blobs renderable by adding rendering controls and rendering support for renderable file types using the built-in rendering of flow of the markdown renderer and micron's own rendering in micron-rendering clients. Reeeeeendeeeeer.

This commit is contained in:
Mark Qvist
2026-05-03 16:05:45 +02:00
parent 734eb53aa7
commit 83c9f2b10a
+38 -9
View File
@@ -84,6 +84,9 @@ class NomadNetworkNode():
CLR_DIM = "`F666"
CLR_DIM_H = "`F444"
RENDERABLE_EXTS = [".md", ".mu"]
RENDER_DEFAULT = [".md", ".mu"]
def __init__(self, owner=None):
if not owner: raise TypeError(f"Invalid owner {owner} for {self}")
@@ -408,7 +411,8 @@ class NomadNetworkNode():
# Breadcrumb navigation
breadcrumb_parts = [ self.m_link("Node", self.PATH_INDEX),
self.m_link(group_name, self.PATH_GROUP, g=group_name),
self.m_link(repo_name, self.PATH_REPO, g=group_name, r=repo_name) ]
self.m_link(repo_name, self.PATH_REPO, g=group_name, r=repo_name),
self.m_link("files", self.PATH_TREE, g=group_name, r=repo_name) ]
# Add path components to breadcrumb
if tree_path:
@@ -518,7 +522,11 @@ class NomadNetworkNode():
repo_name = data.get("var_r", "") if data else ""
ref = data.get("var_ref", "HEAD") if data else "HEAD"
file_path = data.get("var_path", "") if data else ""
render = data.get("var_render", "") if data else ""
raw = data.get("var_raw", "") if data else ""
file_path = urllib.parse.unquote_plus(file_path)
render = True if render else False
raw = True if raw else False
repo = self.get_accessible_repository(remote_identity, group_name, repo_name)
if not repo:
@@ -538,13 +546,21 @@ class NomadNetworkNode():
content = self.m_heading("Invalid Path", 1) + "\n\nNo file path specified.\n"
return self.render_template(content, st=st)
file_ext = os.path.splitext(file_path)[1].lower()
renderable = file_ext in self.RENDERABLE_EXTS
if not renderable: raw = True; render = False
else:
if raw: render = False
elif not render and file_ext in self.RENDER_DEFAULT: render = True; raw = False
content_parts = []
nav_parts = []
# Breadcrumb navigation
breadcrumb_parts = [ self.m_link("Node", self.PATH_INDEX),
self.m_link(group_name, self.PATH_GROUP, g=group_name),
self.m_link(repo_name, self.PATH_REPO, g=group_name, r=repo_name) ]
self.m_link(repo_name, self.PATH_REPO, g=group_name, r=repo_name),
self.m_link("files", self.PATH_TREE, g=group_name, r=repo_name) ]
# Add path components
path_components = file_path.strip("/").split("/")
@@ -557,6 +573,14 @@ class NomadNetworkNode():
breadcrumb = " / ".join(breadcrumb_parts)
nav_parts.append(breadcrumb + "\n")
if renderable:
sep = self.icon("sep")
rnd_link = self.m_link("View rendered", self.PATH_BLOB, g=group_name, r=repo_name, ref=ref, path=file_path, render="y")
raw_link = self.m_link("View raw", self.PATH_BLOB, g=group_name, r=repo_name, ref=ref, path=file_path, raw="y")
if render: render_controls = f"Displaying Rendered {sep} {raw_link}"
else: render_controls = f"Displaying Raw {sep} {rnd_link}"
nav_parts.append(f"\n{render_controls}\n")
# Get blob info
blob_info = self.get_blob_info(repo_path, resolved_ref, file_path)
@@ -584,16 +608,21 @@ class NomadNetworkNode():
content_parts.append(f"This file is {RNS.prettysize(size)}, which exceeds the display limit of {RNS.prettysize(self.BLOB_SIZE_LIMIT)}.\n")
else:
# Display file content
content = self.get_blob_content(repo_path, resolved_ref, file_path)
if content is not None:
if self.highlight_syntax:
highlighted = self.highlighter.highlight(content, file_path)
content_parts.append(highlighted)
if renderable and render:
if file_ext == ".mu": content_parts.append(f"{content}\n")
elif file_ext == ".md": content_parts.append(f"{self.mdc.format_block(content)}\n")
else : content_parts.append(f"`=\n{content}\n`=")
else:
content_parts.append(f"`=\n{content}\n`=")
else:
content_parts.append("Error reading file content.\n")
if self.highlight_syntax:
highlighted = self.highlighter.highlight(content, file_path)
content_parts.append(highlighted)
else: content_parts.append(f"`=\n{content}\n`=")
else: content_parts.append("Error reading file content.\n")
self.owner.view_succeeded(group_name, repo_name, remote_identity)
page_content = "".join(content_parts)