Added head and tail functions. They work with portals: {./Example.md

***portalname head 2}
This commit is contained in:
sarah committed 2026-09-21 18:52:35 +02:00
1 parent 82a728dc67
commit 778579c04f
1 file changed
+41 -1
+41 -1
View File
@@ -11,7 +11,9 @@ from Preview import ReadTextFile
PortalFileTypes = {"markdown", "text"}
MarkerPattern = re.compile(
r"\{(?:(?P<CrossPath>[^\s{}']+)\s+)?\*\*\*(?P<CrossName>[^\s*{}]+)\}"
r"\{(?:(?P<CrossPath>[^\s{}']+)\s+)?\*\*\*(?P<CrossName>[^\s*{}]+)"
r"(?:\s+(?P<CrossPipe>head|tail)\s+(?P<CrossPipeCount>\d+))?\}"
r"|\{(?P<PipePath>[^\s{}']+)\s+(?P<PipeMode>head|tail)\s+(?P<PipeCount>\d+)\}"
r"|\{(?P<LinePath>[^\s{}']+)\s+'(?P<LineNumber>\d+)'\}"
r"|\{\*\*(?P<LineName>[^\s*{}]+)\}"
r"|\{\*(?P<BlockName>[^\s*{}]+)\}"
@@ -188,6 +190,30 @@ def _ResolveCrossFileReference(
return _FindLocalDefinitions(Content).get(Name)
def _ApplyPipe(Text: str, Mode: str, Count: int) -> str:
Lines = Text.splitlines()
Selected = Lines[:Count] if Mode == "head" else Lines[-Count:] if Count > 0 else []
return "\n".join(Selected)
def _ResolveWholeFilePipe(
RootName: str,
RefererDirectory: str,
PathText: str,
Mode: str,
Count: int,
Username: str,
UserGroups: list[str],
) -> str | None:
TargetRelativePath = _NormalizeRelativePath(RefererDirectory, PathText)
Content = _ReadAccessiblePortalSource(RootName, TargetRelativePath, Username, UserGroups)
if Content is None:
return None
return _ApplyPipe(_ResolveLocalPortals(Content), Mode, Count)
def _ResolveLineNumberReference(
RootName: str,
RefererDirectory: str,
@@ -233,6 +259,20 @@ def ResolvePortals(
Username,
UserGroups,
)
if Replacement is not None and Match.group("CrossPipe"):
Replacement = _ApplyPipe(
Replacement, Match.group("CrossPipe"), int(Match.group("CrossPipeCount"))
)
elif Match.group("PipeMode"):
Replacement = _ResolveWholeFilePipe(
RootName,
RefererDirectory,
Match.group("PipePath"),
Match.group("PipeMode"),
int(Match.group("PipeCount")),
Username,
UserGroups,
)
elif Match.group("LineNumber"):
Replacement = _ResolveLineNumberReference(
RootName,