blob: f8dd7119c7b892f63d029938fa994233aa21ed0c [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.uibinder.rebind.model;
import com.google.gwt.uibinder.rebind.IndentedWriter;
import com.google.gwt.uibinder.rebind.Tokenator;
import com.google.gwt.uibinder.rebind.Tokenator.Resolver;
import java.util.ArrayList;
import java.util.List;
/**
* An individual SafeHtml template to be written by UiBinder.
*/
public class HtmlTemplate {
private final List<String> template = new ArrayList<String>();
private final String methodName;
private final ArrayList<HtmlTemplateArgument> methodArgs =
new ArrayList<HtmlTemplateArgument>();
private final HtmlTemplates templates;
public HtmlTemplate(String html, Tokenator tokenator, HtmlTemplates templates)
throws IllegalArgumentException {
if (html == null) {
throw new IllegalArgumentException("Template html cannot be null");
}
if (tokenator == null) {
throw new IllegalArgumentException("Template tokenator cannot be null");
}
if (templates == null) {
throw new IllegalArgumentException("HtmlTemplates container cannot be null");
}
this.templates = templates;
methodName = "html" + this.templates.nextTemplateId();
populateArgMap(html,tokenator);
template.add("@Template(\"" + addTemplatePlaceholders(html) + "\")");
template.add("SafeHtml " + methodName + "(" + getTemplateArgs() + ");");
template.add(" ");
}
public List<String> getTemplate() {
return template;
}
/**
* Writes all templates to the provided {@link IndentedWriter}.
*
* @param w the writer to write the template to
*/
public void writeTemplate(IndentedWriter w) {
for (String s : template) {
w.write(s);
}
}
/**
* Creates the template method invocation.
*
* @return String the template method call with parameters
*/
public String writeTemplateCall() {
return "template." + methodName + "(" + getSafeHtmlArgs()
+ ").asString()";
}
/**
* Replaces string tokens with {} placeholders for SafeHtml templating.
*
* @return the rendering string, with tokens replaced by {} placeholders
*/
private String addTemplatePlaceholders(String html) {
String rtn = Tokenator.detokenate(html, new Resolver() {
int tokenId = 0;
public String resolveToken(String token) {
return "{" + tokenId++ + "}";
}
});
return rtn;
}
/**
* Retrieves the arguments for SafeHtml template function call from
* the {@link Tokenator}.
*/
private String getSafeHtmlArgs() {
StringBuilder b = new StringBuilder();
for (HtmlTemplateArgument arg : methodArgs) {
if (b.length() > 0) {
b.append(", ");
}
b.append(arg.getArg());
}
return b.toString();
}
/**
* Creates the argument string for the generated SafeHtmlTemplate function.
*/
private String getTemplateArgs() {
StringBuilder b = new StringBuilder();
int i = 0;
for (HtmlTemplateArgument arg : methodArgs) {
if (b.length() > 0) {
b.append(", ");
}
b.append(arg.getType() + " arg" + i);
i++;
}
return b.toString();
}
private void populateArgMap(String s, Tokenator t) {
if (t != null) {
List<String> args = t.getOrderedValues(s);
for (String arg : args) {
if (templates.isSafeConstant(arg)) {
methodArgs.add(HtmlTemplateArgument.forHtml(arg));
} else {
methodArgs.add(HtmlTemplateArgument.forString(arg.substring(4,
arg.length() - 4)));
}
}
}
}
}