From a5b292ee81f1cfd0cef711cfb591982caa9c9a57 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Sat, 9 May 2026 14:58:43 +0200 Subject: [PATCH] Dreaming of a universe without escape characters --- RNS/Utilities/rngit/highlight.py | 9 +++++---- RNS/Utilities/rngit/pages.py | 4 ++-- RNS/Utilities/rngit/server.py | 2 +- RNS/Utilities/rngit/util.py | 10 ++++++---- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/RNS/Utilities/rngit/highlight.py b/RNS/Utilities/rngit/highlight.py index 0f2fea6f..f5e7b369 100644 --- a/RNS/Utilities/rngit/highlight.py +++ b/RNS/Utilities/rngit/highlight.py @@ -165,15 +165,15 @@ class SyntaxHighlighter: except Exception as e: RNS.log(f"Pygments highlighting failed, falling back: {e}", RNS.LOG_WARNING) - return self._plain_text(content) + return self._plain_text(content).replace("\\", "\\\\") # TODO: Implement Python tokenize fallback for .py files. # For now, route to plain text if filename and filename.endswith(".py"): - return self._plain_text(content) + return self._plain_text(content).replace("\\", "\\\\") # Universal fallback - return self._plain_text(content) + return self._plain_text(content).replace("\\", "\\\\") def _highlight_pygments(self, content, filename=None, language=None): from pygments.lexers import get_lexer_for_filename, guess_lexer, get_lexer_by_name @@ -301,7 +301,8 @@ class MicronFormatter: return None @staticmethod - def _escape_value(value: str) -> str: return value.replace("`", "\\`") + def _escape_value(value): + return value.replace("\\", "\\\\").replace("`", "\\`") # Required by Pygments formatter API, returns None for Micron def get_style_defs(self, arg=None): return None diff --git a/RNS/Utilities/rngit/pages.py b/RNS/Utilities/rngit/pages.py index fbbc35c7..b8c84796 100644 --- a/RNS/Utilities/rngit/pages.py +++ b/RNS/Utilities/rngit/pages.py @@ -2095,8 +2095,8 @@ class NomadNetworkNode(): if text == None: return None else: return text.replace("\t", self.TAB_WIDTH) - def format_diff(self, diff_text: str) -> str: - lines = diff_text.split("\n") + def format_diff(self, diff_text): + lines = diff_text.replace("\\", "\\\\").split("\n") formatted_lines = [] for line in lines: diff --git a/RNS/Utilities/rngit/server.py b/RNS/Utilities/rngit/server.py index 733d3934..baf34f04 100644 --- a/RNS/Utilities/rngit/server.py +++ b/RNS/Utilities/rngit/server.py @@ -44,7 +44,7 @@ from tempfile import NamedTemporaryFile from RNS._version import __version__ from RNS.Utilities.rngit import APP_NAME from RNS.Utilities.rngit.pages import NomadNetworkNode -from RNS.Utilities.rngit.util import san_ref, san_sha +from RNS.Utilities.rngit.util import san_ref, san_refs, san_sha from RNS.vendor.configobj import ConfigObj from RNS.vendor import umsgpack as mp diff --git a/RNS/Utilities/rngit/util.py b/RNS/Utilities/rngit/util.py index 19590aec..c4acd981 100644 --- a/RNS/Utilities/rngit/util.py +++ b/RNS/Utilities/rngit/util.py @@ -152,6 +152,7 @@ class MarkdownToMicron: return w if w is not None and w >= 0 else len(text) def format_block(self, text, url_scope=None): + # text = text.replace("\\", "\\\\") # Now handled in format_line instead lines = text.split('\n') result_lines = [] in_code_block = False @@ -228,10 +229,6 @@ class MarkdownToMicron: for line in lines: is_fence, lang_hint = self._detect_code_fence(line) - if line.startswith("-") and not line.startswith("---") and not line.startswith("- "): line = f"\\{line}" - if line.startswith(">"): line = f"\\{line}" - if line.startswith("<"): line = f"\\{line}" - if is_fence: # Flush any pending structures before code fence flush_quote_buffer() @@ -300,6 +297,11 @@ class MarkdownToMicron: def format_line(self, line, mode="normal"): if mode == "codeblock": return self._escape_literals(line) + line = line.replace("\\", "\\\\") + + if line.startswith("-") and not line.startswith("---") and not line.startswith("- "): line = f"\\{line}" + if line.startswith("<"): line = f"\\{line}" + # if line.startswith(">"): line = f"\\{line}" # Now handled by blockquotes if self.HORIZONTAL_RULE_RE.match(line): return self._format_horizontal_rule()