1 /*
2 * Copyright (c) 2011-2024 PrimeFaces Extensions
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 * THE SOFTWARE.
21 */
22 package org.primefaces.extensions.util;
23
24 import org.primefaces.util.EscapeUtils;
25
26 /**
27 * Builds a JavaScript var object or array string. A simple way to generalized a lot of code used in renderers.
28 *
29 * @author Mark Lassiter / Melloware
30 * @since 6.2
31 */
32 public class JavascriptVarBuilder {
33
34 private final StringBuilder sb = new StringBuilder();
35
36 private final boolean isObject;
37
38 private boolean firstValue = true;
39
40 private final boolean isVar;
41
42 /**
43 * Constructs an instance of the builder.
44 *
45 * @param varName the variable name
46 * @param isObject true if build an Object, false if an array.
47 */
48 public JavascriptVarBuilder(final String varName, final boolean isObject) {
49 this.isObject = isObject;
50 isVar = varName != null;
51 if (isVar) {
52 sb.append("var ");
53 sb.append(varName);
54 sb.append("=");
55 }
56 if (isObject) {
57 sb.append("{");
58 }
59 else {
60 sb.append("[");
61 }
62 }
63
64 /**
65 * Called internally to prepare for next value
66 */
67 private void next() {
68 if (firstValue) {
69 firstValue = false;
70 }
71 else {
72 sb.append(",");
73 }
74 }
75
76 /**
77 * Appends an Object name/value pair to the object.
78 *
79 * @param propertyName the property name
80 * @param propertyValue the property value
81 * @param quoted if true, the value is quoted and escaped.
82 * @return this builder
83 */
84 public JavascriptVarBuilder appendProperty(final String propertyName, final String propertyValue, final boolean quoted) {
85 next();
86 sb.append(propertyName);
87 sb.append(":");
88 appendText(propertyValue, quoted);
89 return this;
90 }
91
92 /**
93 * appends a property with the name "rYY_cXX" where YY is the row and XX is he column.
94 *
95 * @param row
96 * @param col
97 * @param propertyValue
98 * @param quoted
99 * @return
100 */
101 public JavascriptVarBuilder appendRowColProperty(final int row, final int col, final String propertyValue, final boolean quoted) {
102 return appendProperty("r" + row + "_c" + col, propertyValue, quoted);
103 }
104
105 /**
106 * Appends text to the var string
107 *
108 * @param value the value to append
109 * @param quoted if true, the value is quoted and escaped.
110 * @return this builder
111 */
112 public JavascriptVarBuilder appendText(final String value, final boolean quoted) {
113 if (quoted) {
114 sb.append("\"");
115 if (value != null) {
116 sb.append(EscapeUtils.forJavaScript(value));
117 }
118 sb.append("\"");
119 }
120 else if (value != null) {
121 sb.append(value);
122 }
123 return this;
124 }
125
126 /**
127 * Appends an array value.
128 *
129 * @param value
130 * @param quoted
131 * @return
132 */
133 public JavascriptVarBuilder appendArrayValue(final String value, final boolean quoted) {
134 next();
135 return appendText(value, quoted);
136 }
137
138 /**
139 * Closes the array or object.
140 *
141 * @return
142 */
143 public JavascriptVarBuilder closeVar() {
144 if (isObject) {
145 sb.append("}");
146 }
147 else {
148 sb.append("]");
149 }
150
151 if (isVar) {
152 sb.append(";");
153 }
154 return this;
155 }
156
157 /**
158 * Returns the string for the var.
159 */
160 @Override
161 public String toString() {
162 return sb.toString();
163 }
164 }