Kawai Wiki

Rev

Rev 113 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
93 soliveira 1
package org.kawai.tag.kcode;
2
 
3
import java.util.ArrayList;
4
import java.util.HashMap;
5
import java.util.List;
6
import java.util.Map;
7
 
8
import javax.servlet.jsp.JspException;
9
 
10
import org.kawai.model.Page;
11
import org.mentawai.tag.util.PrintTag;
12
 
13
public class KCodeHandler extends PrintTag {
14
 
15
        private static final Map<String, String> EMPTY_MAP = new HashMap<String, String>();
16
        private static final List<KCode> codes = new ArrayList<KCode>();
17
 
18
        public static void add(KCode code) {
19
                codes.add(code);
20
        }
21
 
113 soliveira 22
        public static void add(String tag) {
23
 
24
                String klassName = tag;
25
 
26
                try {
27
                        if (!klassName.contains(".")) {
28
                                klassName = "org.kawai.tag.kcode." + klassName;
29
                        }
30
 
31
                        Class<?> klass = Class.forName(klassName);
32
                        KCode code = (KCode) klass.newInstance();
33
                        add(code);
34
 
35
                } catch(Exception e) {
36
                        throw new RuntimeException("Cannot add kcode tag: " + tag + " / " + klassName);
37
                }
93 soliveira 38
        }
39
 
40
        private String name;
41
 
42
        public void setName(String name) {
43
                this.name = name;
44
        }
45
 
46
        @Override
47
        public String getStringToPrint() throws JspException {
48
 
49
                Page page = (Page) pageContext.findAttribute(name);
50
                if (page == null) {
51
                        throw new JspException("Cannot find page with name: " + name);
52
                }
53
 
54
                String body = page.getBody();
55
 
56
                for(KCode code : codes) {
57
                        String tag = code.getTag();
58
                        while(checkForTag(tag, body)) {
59
                                String[] parts = splitCodeBlock(tag, body, code.hasBody());
60
                                if (parts == null) {
61
                                        break;
62
                                }
63
                                Map<String, String> attributes = parseAttributes(parts[0]);
64
                                StringBuilder sb = new StringBuilder(1024 * 10);
65
                                sb.append(parts[1]);
66
                                sb.append(code.process(pageContext, attributes, parts[2]));
67
                                sb.append(parts[3]);
68
                                body = sb.toString();
69
                        }
70
                }
71
 
72
                return body;
73
        }
74
 
75
        private static final boolean checkForTag(String tag, String body) {
76
                int start = body.indexOf("[" + tag);
77
                if (start == -1) return false;
78
                int end = body.indexOf(']', start);
79
                return end != -1;
80
        }
81
 
82
        private static String[] splitCodeBlock(String tag, String body, boolean hasBody) {
83
 
84
                if (hasBody) {
85
 
86
                        int start = body.indexOf("[" + tag);
87
                        if (start == -1) return null;
88
                        int closingBracketIndex = body.indexOf("]", start);
89
                        if (closingBracketIndex == -1) return null;
90
                        int end = body.indexOf("[/" + tag + "]");
91
                        if (end > start) {
92
                                // body tag...
93
                                String part1 = "";
94
                                if (start > 0) {
95
                                        part1 = body.substring(0, start);
96
                                }
97
                                String part2 = "";
98
                                int len = ("[/" + tag + "]").length();
99
                                if (end < body.length() - len - 1) {
100
                                        part2 = body.substring(end + len, body.length());
101
                                }
102
                                String contents = "";
103
                                int contentsStart = body.indexOf("]", start) + 1;
104
                                int contentsEnd = end;
105
                                if (contentsEnd > contentsStart) {
106
                                        contents = body.substring(contentsStart, contentsEnd);
107
                                }
108
                                String tagAttributes = "";
109
                                len = ("[" + tag).length();
110
                                if (closingBracketIndex > start + len) {
111
                                        tagAttributes = body.substring(start + len, closingBracketIndex).trim();
112
                                }
113
 
114
                                return new String[] { tagAttributes, part1, contents, part2 };
115
                        }
116
 
117
                        return null;
118
 
119
                } else {
120
 
121
                        int start = body.indexOf("[" + tag);
122
                        if (start == -1) return null;
123
                        int closingBracketIndex = body.indexOf("/]", start);
124
                        if (closingBracketIndex == -1) return null;
125
                        int end = closingBracketIndex + 2;
126
                        if (end > start) {
127
                                String part1 = "";
128
                                if (start > 0) {
129
                                        part1 = body.substring(0, start);
130
                                }
131
                                String part2 = "";
132
                                if (end < body.length()) {
133
                                        part2 = body.substring(end, body.length());
134
                                }
135
                                String contents = null;
136
                                String tagAttributes = "";
137
                                int len = ("[" + tag).length();
138
                                if (closingBracketIndex > start + len) {
139
                                        tagAttributes = body.substring(start + len, closingBracketIndex).trim();
140
                                }
141
 
142
                                return new String[] { tagAttributes, part1, contents, part2 };
143
                        }
144
 
145
                        return null;
146
 
147
                }
148
        }
149
 
150
        private static Map<String, String> parseAttributes(String attrs) {
151
                if (attrs.trim().equals("")) return EMPTY_MAP;
152
                Map<String, String> map = new HashMap<String, String>();
96 soliveira 153
                String[] temp = attrs.split("\" +");
154
                for(int i = 0; i < temp.length; i++) {
155
                        String s = temp[i];
156
                        if (i != temp.length - 1) {
157
                                s = s + "\"";
158
                        }
93 soliveira 159
                        String[] temp2 = s.split("\\=");
96 soliveira 160
                        if (temp2.length == 2) {
161
                                String key = temp2[0];
162
                                String val = temp2[1];
163
                        if (val.startsWith("\"") && val.endsWith("\"")) {
164
                                val = val.substring(1, val.length() - 1);
165
                                map.put(key, val);
166
                        } else {
153 soliveira 167
                                if (val.startsWith("\"")) {
168
                                        val = val.substring(1);
169
                                }
170
                                map.put(key, val);
96 soliveira 171
                        }
93 soliveira 172
                        }
173
                }
174
                return map;
175
        }
176
 
177
        public static void main(String[] args) {
178
 
179
                String x1 = "house";
180
                String x2 = "home";
181
 
182
                String s = "aaaaaa [code a=\"asfadf\" bbb=\"asfasfffff\"]" + x1 + "[/code] bbbbb [code ]" + x2 + "[/code] cccccccccccc";
183
 
184
                String[] blocks = splitCodeBlock("code", s, true);
185
 
186
                for(String x : blocks) System.out.println("{" + x + "}");
187
 
188
                blocks = splitCodeBlock("code", blocks[3], true);
189
 
190
                for(String x : blocks) System.out.println("{" + x + "}");
191
 
192
                s = "aaaaaa [code flip=\"1\" flop=\"2\"   /]";
193
 
194
                blocks = splitCodeBlock("code", s, false);
195
 
196
                for(String x : blocks) System.out.println("{" + x + "}");
197
 
198
                s = "aaaaaa [code /]";
199
 
200
                blocks = splitCodeBlock("code", s, false);
201
 
202
                for(String x : blocks) System.out.println("{" + x + "}");
203
 
204
 
205
        }
206
}