snix/third_party/lix_forgejo/0002-lix-link-gerrit-cl-and-change-ids.patch
Florian Klink a52ea3675c feat(*): initialize new Snix infrastructure
Co-Authored-By: edef <edef@edef.eu>
Co-Authored-by: Ryan Lahfa <raito@lix.systems>
Change-Id: Ica1cda177a236814de900f50a8a61d288f58f519
2025-03-17 17:15:07 +00:00

113 lines
3.4 KiB
Diff

From c560d6e110377fb6f42e841a0bd35f80c0f2eb29 Mon Sep 17 00:00:00 2001
From: Jade Lovelace <software@lfcode.ca>
Date: Thu, 16 May 2024 19:56:25 -0700
Subject: [PATCH 2/2] lix: link gerrit cl/ and change-ids
This code is a bit dubious but you know, golang
Co-authored-by: Ryan Lahfa <raito@lix.systems>
---
modules/markup/html.go | 59 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 59 insertions(+)
diff --git a/modules/markup/html.go b/modules/markup/html.go
index 2e65827bf7..2d474077a5 100644
--- a/modules/markup/html.go
+++ b/modules/markup/html.go
@@ -50,6 +50,20 @@ var (
// so that abbreviated hash links can be used as well. This matches git and GitHub usability.
hashCurrentPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([0-9a-f]{7,64})(?:\s|$|\)|\]|[.,:](\s|$))`)
+ // Gerrit change ID pattern
+ changeIdPattern = GerritPattern{
+ urlMatch: 1,
+ displayMatch: 1,
+ pattern: regexp.MustCompile(`(?:\s|^|\(|\[)(I[0-9a-f]{8,40})(?:\s|$|\)|\]|[.,](\s|$))`),
+ }
+
+ // Gerrit cl/ pattern
+ clSlashPattern = GerritPattern{
+ urlMatch: 2,
+ displayMatch: 1,
+ pattern: regexp.MustCompile(`(?:^|[\s\]\[(){},.;:!?])(cl/([0-9]{0,6}))(?:$|[\s\]\[(){},.;:!?])`),
+ }
+
// shortLinkPattern matches short but difficult to parse [[name|link|arg=test]] syntax
shortLinkPattern = regexp.MustCompile(`\[\[(.*?)\]\](\w*)`)
@@ -77,6 +91,14 @@ var (
InlineCodeBlockRegex = regexp.MustCompile("`[^`]+`")
)
+type GerritPattern struct {
+ // The match group to put in the URL
+ urlMatch int
+ // The match group to render as the link
+ displayMatch int
+ pattern *regexp.Regexp
+}
+
// CSS class for action keywords (e.g. "closes: #1")
const keywordClass = "issue-keyword"
@@ -152,6 +174,7 @@ var defaultProcessors = []processor{
issueIndexPatternProcessor,
commitCrossReferencePatternProcessor,
hashCurrentPatternProcessor,
+ gerritCLPatternProcessor,
emailAddressProcessor,
emojiProcessor,
emojiShortCodeProcessor,
@@ -179,6 +202,7 @@ var commitMessageProcessors = []processor{
issueIndexPatternProcessor,
commitCrossReferencePatternProcessor,
hashCurrentPatternProcessor,
+ gerritCLPatternProcessor,
emailAddressProcessor,
emojiProcessor,
emojiShortCodeProcessor,
@@ -788,6 +812,41 @@ func shortLinkProcessor(ctx *RenderContext, node *html.Node) {
}
}
+func gerritCLPatternProcessor(ctx *RenderContext, node *html.Node) {
+ if ctx.Metas == nil || node == nil {
+ return
+ }
+
+ pats := []*GerritPattern{
+ &changeIdPattern,
+ &clSlashPattern,
+ }
+
+ next := node.NextSibling
+ for node != nil && node != next {
+ for _, pat := range pats {
+ m := pat.pattern.FindStringSubmatchIndex(node.Data)
+ if m == nil {
+ continue
+ }
+
+ linkPart := node.Data[m[pat.urlMatch*2]:m[pat.urlMatch*2+1]]
+ linkNamePart := node.Data[m[pat.displayMatch*2]:m[pat.displayMatch*2+1]]
+ link := util.URLJoin("https://cl.snix.dev/q", linkPart)
+ replaceContent(node, m[pat.displayMatch*2], m[pat.displayMatch*2+1], createCodeLink(link, linkNamePart, ""))
+ }
+
+ // FIXME: I don't understand how any of this stuff was supposed to work to
+ // begin with, since it seems like it returns if it doesn't just match in
+ // the first node???!
+ if node.NextSibling == nil {
+ return
+ }
+
+ node = node.NextSibling.NextSibling
+ }
+}
+
func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) {
if ctx.Metas == nil {
return
--
2.47.0