Skip to content

Commit

Permalink
Merge pull request #1951 from scireum/feature/kba-expander-anchor
Browse files Browse the repository at this point in the history
Enhance KBA message expander to support linking to section via anchor
  • Loading branch information
sabieber authored Mar 13, 2024
2 parents 6c24e35 + 023ca69 commit 9956511
Showing 1 changed file with 27 additions and 21 deletions.
48 changes: 27 additions & 21 deletions src/main/java/sirius/biz/tycho/kb/KnowledgeBaseMessageExpander.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,42 +14,48 @@
import sirius.kernel.nls.NLS;
import sirius.web.controller.MessageExpander;

import javax.annotation.Nullable;
import java.util.Optional;
import java.util.regex.Pattern;

/**
* Expands blocks like <tt>kba:ABDCE</tt> or <tt>[... kba:ABDCE]</tt> into proper links to a {@link KnowledgeBaseEntry}.
* Expands blocks like <tt>kba:ABDCE#section-anchor</tt> or <tt>[... kba:ABDCE#section-anchor ...]</tt> into proper links to a {@link KnowledgeBaseEntry}.
*/
@Register
public class KnowledgeBaseMessageExpander implements MessageExpander {

private static final Pattern LOCKED_KBA_PATTERN =
Pattern.compile("\\[(.*?)kba:([a-zA-Z0-9]+)(#[a-zA-Z0-9-_]+)?(.*)]");
private static final Pattern KBA_PATTERN = Pattern.compile("kba:([a-zA-Z0-9]+)(#[a-zA-Z0-9-_]+)?");

private static final String EXPANDED_LINK_TEMPLATE = """
<span class="d-inline-flex flex-row align-items-baseline">
<i class="fa-solid fa-lightbulb"></i><a class="ps-1" href="/kba/%s/%s%s">%s</a>
</span>
""";

@Part
private KnowledgeBase knowledgeBase;

private static final Pattern LOCKED_KBA_PATTERN = Pattern.compile("\\[(.*?)kba:([a-zA-Z0-9]+)(.*)]");
private static final Pattern KBA_PATTERN = Pattern.compile("kba:([a-zA-Z0-9]+)");

@Override
public String expand(String message) {
message = LOCKED_KBA_PATTERN.matcher(message).replaceAll(match -> {
return knowledgeBase.resolve(NLS.getCurrentLanguage(), match.group(2), false).map(kba -> {
return match.group(1) + Strings.apply("""
<span class="d-inline-flex flex-row align-items-baseline">
<i class="fa-solid fa-lightbulb"></i><a class="ps-1" href="/kba/%s/%s">%s</a>
</span>
""",
kba.getLanguage(),
kba.getArticleId(),
kba.getTitle()) + match.group(3);
}).orElse("");
return knowledgeBase.resolve(NLS.getCurrentLanguage(), match.group(2), false)
.map(kba -> match.group(1) + renderTemplate(kba, match.group(3)) + match.group(4))
.orElse("");
});
return KBA_PATTERN.matcher(message).replaceAll(match -> {
return knowledgeBase.resolve(NLS.getCurrentLanguage(), match.group(1), true).map(kba -> {
return Strings.apply("""
<span class="d-inline-flex flex-row align-items-baseline">
<i class="fa-solid fa-lightbulb"></i><a class="ps-1" href="/kba/%s/%s">%s</a>
</span>
""", kba.getLanguage(), kba.getArticleId(), kba.getTitle());
}).orElse("kba:" + match.group());
return knowledgeBase.resolve(NLS.getCurrentLanguage(), match.group(1), true)
.map(kba -> renderTemplate(kba, match.group(2)))
.orElse("kba:" + match.group());
});
}

private static String renderTemplate(KnowledgeBaseArticle kba, @Nullable String anchor) {
return Strings.apply(EXPANDED_LINK_TEMPLATE,
kba.getLanguage(),
kba.getArticleId(),
Optional.ofNullable(anchor).orElse(""),
kba.getTitle());
}
}

0 comments on commit 9956511

Please sign in to comment.