1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.templatingkit.style;
35
36 import info.magnolia.jcr.util.NodeTypes;
37 import info.magnolia.jcr.util.NodeUtil;
38 import info.magnolia.module.templatingkit.templates.AbstractSTKTemplateModel;
39 import info.magnolia.module.templatingkit.templates.pages.STKPage;
40 import info.magnolia.module.templatingkit.templates.pages.STKPageModel;
41 import info.magnolia.rendering.model.RenderingModel;
42 import info.magnolia.rendering.template.TemplateDefinition;
43
44 import java.util.ArrayList;
45 import java.util.Collections;
46 import java.util.List;
47
48 import javax.jcr.Node;
49 import javax.jcr.RepositoryException;
50
51 import org.apache.commons.lang3.StringUtils;
52
53
54
55
56
57 public class CssSelectorBuilder {
58
59
60
61
62
63 @SuppressWarnings("rawtypes")
64 public String createCssSelector(AbstractSTKTemplateModel<? extends TemplateDefinition> model) {
65 final StringBuffer cssSelector = new StringBuffer();
66 RenderingModel<?> rootModelObj = model.getRoot();
67 if ((rootModelObj instanceof STKPageModel<?>)) {
68 final STKPageModel<?> rootModel = (STKPageModel<?>) rootModelObj;
69 final STKPage rootDef = rootModel.getDefinition();
70
71
72 final String bodyId = rootDef.getBodyID();
73 if (StringUtils.isNotEmpty(bodyId)) {
74 cssSelector.append("#").append(bodyId);
75 }
76
77
78 final String bodyClass = rootModel.getBodyClass();
79 if (StringUtils.isNotEmpty(bodyClass)) {
80 cssSelector.append(".").append(bodyClass);
81 }
82 }
83
84
85
86
87 Node page = model.getNode();
88 try {
89 while (!NodeUtil.isNodeType(page, NodeTypes.Page.NAME)) {
90 page = page.getParent();
91 }
92 } catch (RepositoryException e) {
93 throw new RuntimeException(e);
94 }
95 final String pathToPage = NodeUtil.getPathIfPossible(page);
96 final String pathInPage = NodeUtil.getPathIfPossible(model.getNode()).substring(pathToPage.length());
97 final String areaDivId = pathInPageToAreaId(pathInPage);
98 if (StringUtils.isNotEmpty(areaDivId)) {
99 if (cssSelector.length() > 0) {
100 cssSelector.append(" ");
101 }
102 cssSelector.append("#").append(areaDivId);
103 }
104
105 List<RenderingModel> models = new ArrayList<RenderingModel>();
106 for (RenderingModel current = model; current != rootModelObj; current = current.getParent()) {
107 models.add(current);
108 }
109 Collections.reverse(models);
110
111
112 for (RenderingModel currentModel : models) {
113 final String cssClass;
114 if (currentModel instanceof CssSelectorSupportRenderingModel) {
115 cssClass = ((CssSelectorSupportRenderingModel) currentModel).getCssClass();
116 } else {
117 final info.magnolia.rendering.template.RenderableDefinition definition = currentModel.getDefinition();
118 cssClass = (String) definition.getParameters().get("divClass");
119 }
120 if (StringUtils.isNotEmpty(cssClass)) {
121 if (cssSelector.length() > 0) {
122 cssSelector.append(" ");
123 }
124 cssSelector.append(".").append(cssClass.replace(" ", "."));
125 }
126 }
127 return cssSelector.toString();
128 }
129
130 protected String pathInPageToAreaId(final String pathInPage) {
131 final String areaDivId = StringUtils.substringBefore(StringUtils.removeStart(pathInPage, "/"), "/");
132 if (areaDivId.equals("opener")) {
133 return "main";
134 }
135
136
137 else if (areaDivId.equals("content")) {
138 return "main";
139 }
140 return areaDivId;
141 }
142
143 }