Skip to content

Commit 8766fa4

Browse files
authored
Merge pull request #66 from paulthom12345/feature/add-prefix-to-all-identifiers
Add prefix/suffix to ids generated
2 parents fa299a6 + 927a387 commit 8766fa4

4 files changed

Lines changed: 156 additions & 9 deletions

File tree

commonmark-ext-heading-anchor/src/main/java/org/commonmark/ext/heading/anchor/HeadingAnchorExtension.java

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,78 @@
2929
*/
3030
public class HeadingAnchorExtension implements HtmlRenderer.HtmlRendererExtension {
3131

32-
private HeadingAnchorExtension() {
32+
private final String defaultId;
33+
private final String idPrefix;
34+
private final String idSuffix;
35+
36+
private HeadingAnchorExtension(String defaultId, String idPrefix, String idSuffix) {
37+
this.defaultId = defaultId;
38+
this.idPrefix = idPrefix;
39+
this.idSuffix = idSuffix;
3340
}
3441

3542
public static Extension create() {
36-
return new HeadingAnchorExtension();
43+
return create(builder());
44+
}
45+
46+
private static Extension create(Builder builder) {
47+
return new HeadingAnchorExtension(builder.defaultId, builder.idPrefix, builder.idSuffix);
48+
}
49+
50+
public static Builder builder() {
51+
return new Builder();
3752
}
3853

3954
@Override
4055
public void extend(HtmlRenderer.Builder rendererBuilder) {
4156
rendererBuilder.attributeProviderFactory(new AttributeProviderFactory() {
4257
@Override
4358
public AttributeProvider create(AttributeProviderContext context) {
44-
return HeadingIdAttributeProvider.create();
59+
return HeadingIdAttributeProvider.create(defaultId, idPrefix, idSuffix);
4560
}
4661
});
4762
}
63+
64+
public static class Builder {
65+
private String defaultId;
66+
private String idPrefix;
67+
private String idSuffix;
68+
69+
public Builder() {
70+
defaultId = "id";
71+
idPrefix = "";
72+
idSuffix = "";
73+
}
74+
75+
/**
76+
* @param value Default value for the id to take if no generated id can be extracted. Default "id"
77+
* @return {@code this}
78+
*/
79+
public Builder defaultId(String value) {
80+
this.defaultId = value;
81+
return this;
82+
}
83+
84+
/**
85+
* @param value Set the value to be prepended to every id generated. Default ""
86+
* @return {@code this}
87+
*/
88+
public Builder idPrefix(String value) {
89+
this.idPrefix = value;
90+
return this;
91+
}
92+
93+
/**
94+
* @param value Set the value to be appended to every id generated. Default ""
95+
* @return
96+
*/
97+
public Builder idSuffix(String value) {
98+
this.idSuffix = value;
99+
return this;
100+
}
101+
102+
public Extension build() {
103+
return HeadingAnchorExtension.create(this);
104+
}
105+
}
48106
}

commonmark-ext-heading-anchor/src/main/java/org/commonmark/ext/heading/anchor/IdGenerator.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,14 @@
1313
public class IdGenerator {
1414
private final Pattern allowedCharacters = Pattern.compile("[\\w\\-_]+", Pattern.UNICODE_CHARACTER_CLASS);
1515
private final Map<String, Integer> identityMap;
16+
private final String prefix;
17+
private final String suffix;
1618
private String defaultIdentifier;
1719

1820
private IdGenerator(Builder builder) {
1921
this.defaultIdentifier = builder.defaultIdentifier;
22+
this.prefix = builder.prefix;
23+
this.suffix = builder.suffix;
2024
this.identityMap = new HashMap<>();
2125
}
2226

@@ -67,11 +71,11 @@ public String generateId(String text) {
6771

6872
if (!identityMap.containsKey(normalizedIdentity)) {
6973
identityMap.put(normalizedIdentity, 1);
70-
return normalizedIdentity;
74+
return prefix + normalizedIdentity + suffix;
7175
} else {
7276
int currentCount = identityMap.get(normalizedIdentity);
7377
identityMap.put(normalizedIdentity, currentCount + 1);
74-
return normalizedIdentity + "-" + currentCount;
78+
return prefix + normalizedIdentity + "-" + currentCount + suffix;
7579
}
7680
}
7781

@@ -95,6 +99,8 @@ private String normalizeText(String text) {
9599

96100
public static class Builder {
97101
private String defaultIdentifier = "id";
102+
private String prefix = "";
103+
private String suffix = "";
98104

99105
public IdGenerator build() {
100106
return new IdGenerator(this);
@@ -105,6 +111,25 @@ public IdGenerator build() {
105111
* @return {@code this}
106112
*/
107113
public Builder defaultId(String defaultId) {
114+
this.defaultIdentifier = defaultId;
115+
return this;
116+
}
117+
118+
/**
119+
* @param prefix the text to place before the generated identity
120+
* @return {@code this}
121+
*/
122+
public Builder prefix(String prefix) {
123+
this.prefix = prefix;
124+
return this;
125+
}
126+
127+
/**
128+
* @param suffix the text to place after the generated identity
129+
* @return {@code this}
130+
*/
131+
public Builder suffix(String suffix) {
132+
this.suffix = suffix;
108133
return this;
109134
}
110135
}

commonmark-ext-heading-anchor/src/main/java/org/commonmark/ext/heading/anchor/internal/HeadingIdAttributeProvider.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@ public class HeadingIdAttributeProvider implements AttributeProvider {
1212

1313
private final IdGenerator idGenerator;
1414

15-
private HeadingIdAttributeProvider() {
16-
idGenerator = IdGenerator.builder().defaultId("heading").build();
15+
private HeadingIdAttributeProvider(String defaultId, String prefix, String suffix) {
16+
idGenerator = IdGenerator.builder()
17+
.defaultId(defaultId)
18+
.prefix(prefix)
19+
.suffix(suffix)
20+
.build();
1721
}
1822

19-
public static HeadingIdAttributeProvider create() {
20-
return new HeadingIdAttributeProvider();
23+
public static HeadingIdAttributeProvider create(String defaultId, String prefix, String suffix) {
24+
return new HeadingIdAttributeProvider(defaultId, prefix, suffix);
2125
}
2226

2327
@Override
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.commonmark.ext.heading.anchor;
2+
3+
import java.util.Arrays;
4+
import java.util.Collections;
5+
import java.util.Set;
6+
7+
import org.commonmark.Extension;
8+
import org.commonmark.parser.Parser;
9+
import org.commonmark.renderer.html.HtmlRenderer;
10+
import org.junit.Test;
11+
12+
import static org.hamcrest.CoreMatchers.equalTo;
13+
import static org.hamcrest.MatcherAssert.assertThat;
14+
15+
public class HeadingAnchorConfigurationTest {
16+
17+
private static final Parser PARSER = Parser.builder().build();
18+
19+
private HtmlRenderer buildRenderer(String defaultId, String prefix, String suffix) {
20+
Extension ext = HeadingAnchorExtension.builder()
21+
.defaultId(defaultId)
22+
.idPrefix(prefix)
23+
.idSuffix(suffix)
24+
.build();
25+
return HtmlRenderer.builder()
26+
.extensions(Arrays.asList(ext))
27+
.build();
28+
}
29+
30+
@Test
31+
public void testDefaultConfigurationHasNoAdditions() {
32+
HtmlRenderer renderer = HtmlRenderer.builder()
33+
.extensions(Arrays.asList(HeadingAnchorExtension.create()))
34+
.build();
35+
assertThat(doRender(renderer, "# "), equalTo("<h1 id=\"id\"></h1>\n"));
36+
}
37+
38+
@Test
39+
public void testDefaultIdWhenNoTextOnHeader() {
40+
HtmlRenderer renderer = buildRenderer("defid", "", "");
41+
assertThat(doRender(renderer, "# "), equalTo("<h1 id=\"defid\"></h1>\n"));
42+
}
43+
44+
@Test
45+
public void testPrefixAddedToHeader() {
46+
HtmlRenderer renderer = buildRenderer("", "pre-", "");
47+
assertThat(doRender(renderer, "# text"), equalTo("<h1 id=\"pre-text\">text</h1>\n"));
48+
}
49+
50+
@Test
51+
public void testSuffixAddedToHeader() {
52+
HtmlRenderer renderer = buildRenderer("", "", "-post");
53+
assertThat(doRender(renderer, "# text"), equalTo("<h1 id=\"text-post\">text</h1>\n"));
54+
}
55+
56+
private String doRender(HtmlRenderer renderer, String text) {
57+
return renderer.render(PARSER.parse(text));
58+
}
59+
60+
}

0 commit comments

Comments
 (0)