Skip to content

Commit f22c146

Browse files
authored
support # in urls when appending preview parameter (#566)
1 parent 626ef5c commit f22c146

File tree

10 files changed

+61
-54
lines changed

10 files changed

+61
-54
lines changed

cms-api/src/main/java/com/condation/cms/api/utils/HTTPUtil.java

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
* <http://www.gnu.org/licenses/gpl-3.0.html>.
2222
* #L%
2323
*/
24-
2524
import com.condation.cms.api.SiteProperties;
2625
import com.condation.cms.api.feature.FeatureContainer;
2726
import com.condation.cms.api.feature.features.IsPreviewFeature;
@@ -43,12 +42,39 @@
4342
*/
4443
public class HTTPUtil {
4544

45+
public static String appendPreviewParameter(String url, final FeatureContainer featureContainer) {
46+
47+
// is external url
48+
if (url.startsWith("http") || url.startsWith("https")) {
49+
return url;
50+
}
51+
52+
String fragment = "";
53+
int fragmentIndex = url.indexOf('#');
54+
if (fragmentIndex >= 0) {
55+
fragment = url.substring(fragmentIndex);
56+
url = url.substring(0, fragmentIndex);
57+
}
58+
59+
if (featureContainer.has(IsPreviewFeature.class)) {
60+
var feature = featureContainer.get(IsPreviewFeature.class);
61+
if (url.contains("?")) {
62+
url += "&preview=" + feature.mode().getValue();
63+
} else {
64+
url += "?preview=" + feature.mode().getValue();
65+
}
66+
}
67+
68+
return url + fragment;
69+
}
70+
4671
/**
47-
* Adds the context according to the siteproperties and the preview to an url
48-
*
72+
* Adds the context according to the siteproperties and the preview to an
73+
* url
74+
*
4975
* @param url
5076
* @param featureContainer
51-
* @return
77+
* @return
5278
*/
5379
public static String modifyUrl(String url, final FeatureContainer featureContainer) {
5480

@@ -57,8 +83,16 @@ public static String modifyUrl(String url, final FeatureContainer featureContain
5783
return url;
5884
}
5985

60-
url = modifyUrl(url, featureContainer.get(SitePropertiesFeature.class).siteProperties());
61-
86+
// Fragment (#...) abtrennen, falls vorhanden
87+
String fragment = "";
88+
int fragmentIndex = url.indexOf('#');
89+
if (fragmentIndex >= 0) {
90+
fragment = url.substring(fragmentIndex); // inkl. #
91+
url = url.substring(0, fragmentIndex);
92+
}
93+
94+
url = prependContext(url, featureContainer.get(SitePropertiesFeature.class).siteProperties());
95+
6296
if (featureContainer.has(IsPreviewFeature.class)) {
6397
var feature = featureContainer.get(IsPreviewFeature.class);
6498
if (url.contains("?")) {
@@ -68,22 +102,25 @@ public static String modifyUrl(String url, final FeatureContainer featureContain
68102
}
69103
}
70104

71-
return url;
105+
return url + fragment;
72106
}
73107

74108
/**
75109
* Adds the context according to the siteproperties to an url
76-
*
110+
*
77111
* @param url
78112
* @param siteProperties
79-
* @return
113+
* @return
80114
*/
81-
public static String modifyUrl(String url, final SiteProperties siteProperties) {
115+
public static String prependContext(String url, final SiteProperties siteProperties) {
82116

83117
// is external url
84118
if (url.startsWith("http") || url.startsWith("https")) {
85119
return url;
86120
}
121+
if (url.startsWith("../")) {
122+
return url;
123+
}
87124

88125
var contextPath = siteProperties.contextPath();
89126
if (!"/".equals(contextPath)) {

cms-content/src/main/java/com/condation/cms/content/NodeProperties.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public static Map<String, Object> createNodeProperties (ContentNode node, SitePr
4545
Map<String, Object> properties = new HashMap<>();
4646

4747
var canonicalUrl = PathUtil.toURL(node .uri());
48-
canonicalUrl = HTTPUtil.modifyUrl(canonicalUrl, siteProperties);
48+
canonicalUrl = HTTPUtil.prependContext(canonicalUrl, siteProperties);
4949

5050
properties.put("url", canonicalUrl);
5151

cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/ImageLinkInlineRule.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.condation.cms.api.feature.features.IsPreviewFeature;
2626
import com.condation.cms.api.feature.features.SitePropertiesFeature;
2727
import com.condation.cms.api.request.RequestContextScope;
28+
import com.condation.cms.api.utils.HTTPUtil;
2829
import com.condation.cms.content.markdown.InlineBlock;
2930
import com.condation.cms.content.markdown.InlineElementRule;
3031
import java.util.regex.Pattern;
@@ -59,20 +60,7 @@ && isInternalUrl(href)) {
5960

6061
var requestContext = RequestContextScope.REQUEST_CONTEXT.get();
6162

62-
if (requestContext.has(SitePropertiesFeature.class)) {
63-
var contextPath = requestContext.get(SitePropertiesFeature.class).siteProperties().contextPath();
64-
if (!"/".equals(contextPath) && !href.startsWith(contextPath) && href.startsWith("/")) {
65-
href = contextPath + href;
66-
}
67-
}
68-
if (requestContext.has(IsPreviewFeature.class)) {
69-
var previewContext = requestContext.get(IsPreviewFeature.class);
70-
if (href.contains("?")) {
71-
href += "&preview=" + previewContext.mode().getValue();
72-
} else {
73-
href += "?preview=" + previewContext.mode().getValue();
74-
}
75-
}
63+
href = HTTPUtil.modifyUrl(href, requestContext);
7664
}
7765

7866
return new ImageLinkBlock(matcher.start(), matcher.end(), href, id, imageSrc, alt, title);

cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/LinkInlineRule.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.condation.cms.api.feature.features.IsPreviewFeature;
2727
import com.condation.cms.api.feature.features.SitePropertiesFeature;
2828
import com.condation.cms.api.request.RequestContextScope;
29+
import com.condation.cms.api.utils.HTTPUtil;
2930
import com.condation.cms.content.markdown.InlineBlock;
3031
import com.condation.cms.content.markdown.InlineElementRule;
3132
import java.util.regex.Pattern;
@@ -57,20 +58,7 @@ && isInternalUrl(href)) {
5758

5859
var requestContext = RequestContextScope.REQUEST_CONTEXT.get();
5960

60-
if (requestContext.has(SitePropertiesFeature.class)) {
61-
var contextPath = requestContext.get(SitePropertiesFeature.class).siteProperties().contextPath();
62-
if (!"/".equals(contextPath) && !href.startsWith(contextPath) && href.startsWith("/")) {
63-
href = contextPath + href;
64-
}
65-
}
66-
if (requestContext.has(IsPreviewFeature.class)) {
67-
var previewContext = requestContext.get(IsPreviewFeature.class);
68-
if (href.contains("?")) {
69-
href += "&preview=" + previewContext.mode().getValue();
70-
} else {
71-
href += "?preview=" + previewContext.mode().getValue();
72-
}
73-
}
61+
href = HTTPUtil.modifyUrl(href, requestContext);
7462
}
7563

7664
return new LinkBlock(matcher.start(), matcher.end(), href, id, text, title);

cms-content/src/main/java/com/condation/cms/content/template/functions/translation/NodeTranslations.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public List<TranslationDto> translations () {
6060

6161
locale = ServiceRegistry.getInstance().get(mapping.site(), SitePropertiesService.class).get().siteProperties().locale().getCountry().toLowerCase();
6262
} else if (mapping.language().equals(siteProperties.language())) {
63-
url = HTTPUtil.modifyUrl(
63+
url = HTTPUtil.prependContext(
6464
PathUtil.toURL(node.uri()),
6565
siteProperties);
6666
locale = siteProperties.locale().getCountry().toLowerCase();

cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/LinkInlineRuleTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public void test_relativ_linking() {
7575
@Test
7676
public void test_relativ_linking_with_context() {
7777

78-
Mockito.when(siteProperties.contextPath()).thenReturn("/de");
78+
Mockito.lenient().when(siteProperties.contextPath()).thenReturn("/de");
7979

8080
RequestContext requestContext = new RequestContext();
8181
requestContext.add(SitePropertiesFeature.class, new SitePropertiesFeature(siteProperties));

cms-core/src/main/java/com/condation/cms/core/serivce/impl/SiteLinkService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ public SiteLinkService (final Configuration configuration) {
4343

4444
public String managerDeepLink (String url) {
4545
var siteProperties = configuration.get(SiteConfiguration.class).siteProperties();
46-
url = HTTPUtil.modifyUrl(url, siteProperties);
46+
url = HTTPUtil.prependContext(url, siteProperties);
4747
String encodedUrl = URLEncoder.encode(url, StandardCharsets.UTF_8);
48-
var deepLink = HTTPUtil.modifyUrl("/manager/index.html?page=%s".formatted(encodedUrl), siteProperties);
48+
var deepLink = HTTPUtil.prependContext("/manager/index.html?page=%s".formatted(encodedUrl), siteProperties);
4949

5050
var baseUrl = siteProperties.baseUrl();
5151
if (baseUrl.endsWith("/")) {
@@ -57,6 +57,6 @@ public String managerDeepLink (String url) {
5757

5858
public String link (String url) {
5959
var siteProperties = configuration.get(SiteConfiguration.class).siteProperties();
60-
return HTTPUtil.modifyUrl(url, siteProperties);
60+
return HTTPUtil.prependContext(url, siteProperties);
6161
}
6262
}

modules/api-module/src/main/java/com/condation/cms/modules/system/api/helpers/NodeHelper.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.condation.cms.api.feature.features.ConfigurationFeature;
2727
import com.condation.cms.api.feature.features.IsPreviewFeature;
2828
import com.condation.cms.api.request.RequestContext;
29+
import com.condation.cms.api.utils.HTTPUtil;
2930
import com.condation.cms.filesystem.metadata.AbstractMetaData;
3031
import java.util.Collections;
3132
import java.util.Map;
@@ -69,14 +70,7 @@ public static Map<String, String> getLinks(String nodeUri, Request request) {
6970
nodeUri = "";
7071
}
7172

72-
if (requestContext.has(IsPreviewFeature.class)) {
73-
var feature = requestContext.get(IsPreviewFeature.class);
74-
if (nodeUri.contains("?")) {
75-
nodeUri += "&preview=" + feature.mode().getValue();
76-
} else {
77-
nodeUri += "?preview=" + feature.mode().getValue();
78-
}
79-
}
73+
HTTPUtil.appendPreviewParameter(nodeUri, requestContext);
8074

8175
return Map.of(
8276
"_self", "%sapi/v1/navigation/%s".formatted(contextPath, nodeUri),

modules/ui-module/src/main/java/com/condation/cms/modules/ui/http/JettyHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,6 @@ protected String managerBaseURL(FeatureContainer featureContainer) {
9191
}
9292

9393
protected String managerURL(String url, FeatureContainer featureContainer) {
94-
return HTTPUtil.modifyUrl(url, featureContainer.get(SitePropertiesFeature.class).siteProperties());
94+
return HTTPUtil.prependContext(url, featureContainer.get(SitePropertiesFeature.class).siteProperties());
9595
}
9696
}

modules/ui-module/src/main/java/com/condation/cms/modules/ui/utils/template/UILinkFunction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,6 @@ public class UILinkFunction {
3636
private final RequestContext requestContext;
3737

3838
public String createUrl (String url) {
39-
return HTTPUtil.modifyUrl(url, requestContext.get(SitePropertiesFeature.class).siteProperties());
39+
return HTTPUtil.prependContext(url, requestContext.get(SitePropertiesFeature.class).siteProperties());
4040
}
4141
}

0 commit comments

Comments
 (0)