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.lang.StringUtils;
52
53
54
55
56
57 public class CssSelectorBuilder {
58
59
60
61
62
63
64
65 @SuppressWarnings("rawtypes")
66 public String createCssSelector(AbstractSTKTemplateModel<? extends TemplateDefinition> model){
67 final StringBuffer cssSelector = new StringBuffer();
68 RenderingModel<?> rootModelObj = model.getRoot();
69 if((rootModelObj instanceof STKPageModel<?>)){
70 final STKPageModel<?> rootModel = (STKPageModel<?>) rootModelObj;
71 final STKPage rootDef = rootModel.getDefinition();
72
73
74 final String bodyId = rootDef.getBodyID();
75 if(StringUtils.isNotEmpty(bodyId)){
76 cssSelector.append("#").append(bodyId);
77 }
78
79
80 final String bodyClass = rootModel.getBodyClass();
81 if(StringUtils.isNotEmpty(bodyClass)){
82 cssSelector.append(".").append(bodyClass);
83 }
84 }
85
86
87
88
89 Node page = model.getNode();
90 try {
91 while(!NodeUtil.isNodeType(page, NodeTypes.Page.NAME)){
92 page = page.getParent();
93 }
94 }
95 catch (RepositoryException e) {
96 throw new RuntimeException(e);
97 }
98 final String pathToPage = NodeUtil.getPathIfPossible(page);
99 final String pathInPage = NodeUtil.getPathIfPossible(model.getNode()).substring(pathToPage.length());
100 final String areaDivId = pathInPageToAreaId(pathInPage);
101 if(StringUtils.isNotEmpty(areaDivId)){
102 if(cssSelector.length()>0) {
103 cssSelector.append(" ");
104 }
105 cssSelector.append("#").append(areaDivId);
106 }
107
108 List<RenderingModel> models = new ArrayList<RenderingModel>();
109 for (RenderingModel current = model; current != rootModelObj; current = current.getParent()) {
110 models.add(current);
111 }
112 Collections.reverse(models);
113
114
115 for (RenderingModel currentModel : models) {
116 final String cssClass;
117 if (currentModel instanceof CssSelectorSupportRenderingModel) {
118 cssClass = ((CssSelectorSupportRenderingModel) currentModel).getCssClass();
119 }
120 else{
121 final info.magnolia.rendering.template.RenderableDefinition definition = currentModel.getDefinition();
122 cssClass = (String) definition.getParameters().get("divClass");
123 }
124 if(StringUtils.isNotEmpty(cssClass)){
125 if(cssSelector.length()>0) {
126 cssSelector.append(" ");
127 }
128 cssSelector.append(".").append(cssClass.replace(" ", "."));
129 }
130 }
131 return cssSelector.toString();
132 }
133
134 protected String pathInPageToAreaId(final String pathInPage) {
135 final String areaDivId = StringUtils.substringBefore(StringUtils.removeStart(pathInPage, "/"), "/");
136 if(areaDivId.equals("opener")){
137 return "main";
138 }
139
140
141 else if(areaDivId.equals("content")){
142 return "main";
143 }
144 return areaDivId;
145 }
146
147 }