You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2020/06/12 06:13:16 UTC
[ofbiz-framework] branch trunk updated: Improved: Allow definition
of external style sheet in multi-block html template (OFBIZ-11819)
This is an automated email from the ASF dual-hosted git repository.
jamesyong pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
The following commit(s) were added to refs/heads/trunk by this push:
new 33deb94 Improved: Allow definition of external style sheet in multi-block html template (OFBIZ-11819)
33deb94 is described below
commit 33deb945018894613bdc928e0d164529695005ab
Author: James Yong <ja...@apache.org>
AuthorDate: Fri Jun 12 14:12:45 2020 +0800
Improved: Allow definition of external style sheet in multi-block html template (OFBIZ-11819)
External style sheet in html template will be extracted to layoutSettings.styleSheets when multi-block=true.
---
.../org/apache/ofbiz/widget/model/HtmlWidget.java | 18 +++++--
.../ofbiz/widget/model/ModelScreenWidget.java | 2 +-
.../widget/model/MultiBlockHtmlTemplateUtil.java | 62 +++++++++++++++-------
3 files changed, 57 insertions(+), 25 deletions(-)
diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java
index e03fe38..902cf8e 100644
--- a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java
+++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/HtmlWidget.java
@@ -186,8 +186,8 @@ public class HtmlWidget extends ModelScreenWidget {
}
}
- public static void renderHtmlTemplateMultiBlock(Appendable writer, FlexibleStringExpander locationExdr,
- Map<String, Object> context) throws IOException {
+ public static void renderHtmlTemplateWithMultiBlock(Appendable writer, FlexibleStringExpander locationExdr,
+ Map<String, Object> context) throws IOException {
String location = locationExdr.expandString(context);
StringWriter stringWriter = new StringWriter();
@@ -242,6 +242,16 @@ public class HtmlWidget extends ModelScreenWidget {
MultiBlockHtmlTemplateUtil.addScriptLinkForFoot(request, url);
}
}
+ Elements csslinkElements = doc.select("link");
+ if (csslinkElements != null && csslinkElements.size() > 0) {
+ for (org.jsoup.nodes.Element link : csslinkElements) {
+ String src = link.attr("href");
+ if (UtilValidate.isNotEmpty(src)) {
+ // remove external style sheet in the template that will be added to the html header
+ link.remove();
+ }
+ }
+ }
// the 'template' block
String body = doc.body().html();
@@ -273,7 +283,7 @@ public class HtmlWidget extends ModelScreenWidget {
urls.add(origLoc);
} else {
try {
- urls = MultiBlockHtmlTemplateUtil.getHtmlLinksFromHtmlTemplate(origLoc);
+ urls = MultiBlockHtmlTemplateUtil.extractHtmlLinksFromRawHtmlTemplate(origLoc);
} catch (IOException e) {
String errMsg = "Error getting html imports from template at location [" + origLoc + "]: " + e.toString();
Debug.logError(e, errMsg, MODULE);
@@ -295,7 +305,7 @@ public class HtmlWidget extends ModelScreenWidget {
public void renderWidgetString(Appendable writer, Map<String, Object> context, ScreenStringRenderer screenStringRenderer) throws IOException {
if (isMultiBlock()) {
- renderHtmlTemplateMultiBlock(writer, this.locationExdr, context);
+ renderHtmlTemplateWithMultiBlock(writer, this.locationExdr, context);
} else {
renderHtmlTemplate(writer, this.locationExdr, context);
}
diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelScreenWidget.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelScreenWidget.java
index e0914be..7867197 100644
--- a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelScreenWidget.java
+++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/ModelScreenWidget.java
@@ -288,7 +288,7 @@ public abstract class ModelScreenWidget extends ModelWidget {
AbstractModelAction.runSubActions(this.actions, context);
try {
- MultiBlockHtmlTemplateUtil.addLinksToLayoutSettings(context);
+ MultiBlockHtmlTemplateUtil.addLinksToLayoutSettingsWhenConditionsAreRight(context);
// section by definition do not themselves do anything, so this method will generally do nothing, but we'll call it anyway
screenStringRenderer.renderSectionBegin(writer, context, this);
diff --git a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/MultiBlockHtmlTemplateUtil.java b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/MultiBlockHtmlTemplateUtil.java
index 3181573..12dce33 100644
--- a/framework/widget/src/main/java/org/apache/ofbiz/widget/model/MultiBlockHtmlTemplateUtil.java
+++ b/framework/widget/src/main/java/org/apache/ofbiz/widget/model/MultiBlockHtmlTemplateUtil.java
@@ -135,11 +135,11 @@ public final class MultiBlockHtmlTemplateUtil {
}
/**
- * Get html import scr location from html template
+ * Get locations for external css link and external script from raw html template
* @param fileLocation Location to html template. Expression is not allowed.
* @return
*/
- public static Set<String> getHtmlLinksFromHtmlTemplate(String fileLocation) throws IOException {
+ public static Set<String> extractHtmlLinksFromRawHtmlTemplate(String fileLocation) throws IOException {
Set<String> imports = new LinkedHashSet<>();
String template = FileUtil.readString("UTF-8", FileUtil.getFile(fileLocation));
Document doc = Jsoup.parseBodyFragment(template);
@@ -150,11 +150,20 @@ public final class MultiBlockHtmlTemplateUtil {
if (UtilValidate.isNotEmpty(src)) {
String dataImport = script.attr("data-import");
if ("head".equals(dataImport)) {
- imports.add(src);
+ imports.add("script:" + src);
}
}
}
}
+ Elements csslinkElements = doc.select("link");
+ if (csslinkElements != null && csslinkElements.size() > 0) {
+ for (org.jsoup.nodes.Element link : csslinkElements) {
+ String src = link.attr("href");
+ if (UtilValidate.isNotEmpty(src)) {
+ imports.add("link:" + src);
+ }
+ }
+ }
return imports;
}
@@ -184,7 +193,7 @@ public final class MultiBlockHtmlTemplateUtil {
* @param context
* @throws IOException
*/
- public static void addLinksToLayoutSettings(final Map<String, Object> context) throws IOException {
+ public static void addLinksToLayoutSettingsWhenConditionsAreRight(final Map<String, Object> context) throws IOException {
HttpServletRequest request = (HttpServletRequest) context.get("request");
if (request == null) {
return;
@@ -194,8 +203,12 @@ public final class MultiBlockHtmlTemplateUtil {
if (UtilValidate.isEmpty(layoutSettings)) {
return;
}
- List<String> layoutSettingsJsList = UtilGenerics.cast(layoutSettings.get("javaScripts"));
- if (UtilValidate.isEmpty(layoutSettingsJsList)) {
+ List<String> layoutSettingsJavaScripts = UtilGenerics.cast(layoutSettings.get("javaScripts"));
+ if (UtilValidate.isEmpty(layoutSettingsJavaScripts)) {
+ return;
+ }
+ List<String> layoutSettingsStyleSheets = UtilGenerics.cast(layoutSettings.get("styleSheets"));
+ if (UtilValidate.isEmpty(layoutSettingsStyleSheets)) {
return;
}
// ensure initTheme.groovy has run.
@@ -228,7 +241,7 @@ public final class MultiBlockHtmlTemplateUtil {
if (url.contains("${")) {
String expandUrl = FlexibleStringExpander.expandString(url, context);
if (UtilValidate.isNotEmpty(expandUrl)) {
- htmlLinks.addAll(getHtmlLinksFromHtmlTemplate(expandUrl));
+ htmlLinks.addAll(extractHtmlLinksFromRawHtmlTemplate(expandUrl));
} else {
retryTemplateLocationExpressions.add(url);
}
@@ -241,12 +254,7 @@ public final class MultiBlockHtmlTemplateUtil {
}
}
if (UtilValidate.isNotEmpty(htmlLinks)) {
- // check url is not already in layoutSettings.javaScripts
- for (String url : htmlLinks) {
- if (!layoutSettingsJsList.contains(url)) {
- layoutSettingsJsList.add(url);
- }
- }
+ addLinksToLayoutSettings(htmlLinks, layoutSettingsJavaScripts, layoutSettingsStyleSheets);
}
if (UtilValidate.isEmpty(retryScreenLocHashNameExpressions) && UtilValidate.isEmpty(retryTemplateLocationExpressions)) {
request.setAttribute(HTML_LINKS_FOR_HEAD, true);
@@ -289,19 +297,14 @@ public final class MultiBlockHtmlTemplateUtil {
// we know url contains "${", so we expand the url
String expandUrl = FlexibleStringExpander.expandString(url, context);
if (UtilValidate.isNotEmpty(expandUrl)) {
- htmlLinks.addAll(getHtmlLinksFromHtmlTemplate(expandUrl));
+ htmlLinks.addAll(extractHtmlLinksFromRawHtmlTemplate(expandUrl));
it.remove();
}
}
}
if (UtilValidate.isNotEmpty(htmlLinks)) {
- // check url is not already in layoutSettings.javaScripts
- for (String url : htmlLinks) {
- if (!layoutSettingsJsList.contains(url)) {
- layoutSettingsJsList.add(url);
- }
- }
+ addLinksToLayoutSettings(htmlLinks, layoutSettingsJavaScripts, layoutSettingsStyleSheets);
}
if (UtilValidate.isEmpty(retryScreenLocHashNameExpressions) && UtilValidate.isEmpty(retryTemplateLocationExpressions)) {
request.setAttribute(HTML_LINKS_FOR_HEAD, true);
@@ -312,7 +315,26 @@ public final class MultiBlockHtmlTemplateUtil {
request.setAttribute(HTML_LINKS_FOR_HEAD, retry2);
}
}
+ }
+ private static void addLinksToLayoutSettings(Set<String> htmlLinks,
+ List<String> layoutSettingsJavaScripts,
+ List<String> layoutSettingsStyleSheets) {
+ for (String link : htmlLinks) {
+ if (link.startsWith("script:")) {
+ String url = link.substring(7);
+ // check url is not already in layoutSettings.javaScripts
+ if (!layoutSettingsJavaScripts.contains(url)) {
+ layoutSettingsJavaScripts.add(url);
+ }
+ } else if (link.startsWith("link:")) {
+ String url = link.substring(5);
+ // check url is not already in layoutSettings.styleSheets
+ if (!layoutSettingsStyleSheets.contains(url)) {
+ layoutSettingsStyleSheets.add(url);
+ }
+ }
+ }
}
/**