return null;
}
String prefix = getPrefix(key);
- if (callback.isLiveTemplateApplicable(prefix)) {
- if (!prefix.equals(key) && !callback.isTemplateContainsVars(prefix, ATTRS)) {
- return null;
- }
- }
- else if (prefix.indexOf('<') >= 0) {
+ if (!callback.isLiveTemplateApplicable(prefix) && prefix.indexOf('<') >= 0) {
return null;
}
result.add(new MyTemplateToken(key));
return result.toString();
}
- private static boolean invokeTemplate(String key, final CustomTemplateCallback callback, final TemplateInvokationListener listener) {
+ private static boolean prepareAndInvokeTemplate(String key,
+ final CustomTemplateCallback callback,
+ final TemplateInvokationListener listener) {
String templateKey = null;
String id = null;
final List<String> classes = new ArrayList<String>();
return startTemplate(templateKey, callback, listener, attributes.length() > 0 ? ' ' + attributes : null);
}
+ private static int findPlaceToInsertAttrs(@NotNull TemplateImpl template) {
+ String s = template.getString();
+ if (s.length() > 0) {
+ if (s.charAt(0) != '<') {
+ return -1;
+ }
+ int i = 1;
+ while (i < s.length() && !Character.isWhitespace(s.charAt(i)) && s.charAt(i) != '>') {
+ i++;
+ }
+ if (i == 1) {
+ return -1;
+ }
+ if (s.indexOf('>', i) >= i) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ @Nullable
+ private static TemplateImpl generateTemplateWithAttributes(String key, String attributes, CustomTemplateCallback callback) {
+ TemplateImpl template = callback.findApplicableTemplate(key);
+ assert template != null;
+ String templateString = template.getString();
+ int offset = findPlaceToInsertAttrs(template);
+ if (offset >= 0) {
+ String newTemplateString = templateString.substring(0, offset) + attributes + templateString.substring(offset);
+ TemplateImpl newTemplate = template.copy();
+ newTemplate.setString(newTemplateString);
+ return newTemplate;
+ }
+ return null;
+ }
+
private static boolean startTemplate(String key,
CustomTemplateCallback callback,
TemplateInvokationListener listener,
predefinedValues.put(ATTRS, attributes);
}
if (callback.isLiveTemplateApplicable(key)) {
+ if (attributes != null && !callback.templateContainsVars(key, ATTRS)) {
+ TemplateImpl newTemplate = generateTemplateWithAttributes(key, attributes, callback);
+ if (newTemplate != null) {
+ return callback.startTemplate(newTemplate, predefinedValues, listener);
+ }
+ }
return callback.startTemplate(key, predefinedValues, listener);
}
else {
}
}
};
- if (!invokeTemplate(templateKey, myCallback, listener)) {
+ if (!prepareAndInvokeTemplate(templateKey, myCallback, listener)) {
return false;
}
templateKey = null;
}
}
};
- if (!invokeTemplate(templateKey, myCallback, listener)) {
+ if (!prepareAndInvokeTemplate(templateKey, myCallback, listener)) {
return false;
}
return true;
}
}
};
- if (!invokeTemplate(templateKey, myCallback, listener)) {
+ if (!prepareAndInvokeTemplate(templateKey, myCallback, listener)) {
return false;
}
}
}
}
};
- if (!invokeTemplate(templateKey, myCallback, listener) || flag[0]) {
+ if (!prepareAndInvokeTemplate(templateKey, myCallback, listener) || flag[0]) {
return false;
}
}