📄 template.java
字号:
else {
if(wrapper == null) {
wrapper = getObjectWrapper();
}
try {
root = rootMap != null
? (TemplateHashModel)wrapper.wrap(rootMap)
: new SimpleHash(wrapper);
if(root == null) {
throw new IllegalArgumentException(wrapper.getClass().getName() + " converted " + rootMap.getClass().getName() + " to null.");
}
}
catch(ClassCastException e) {
throw new IllegalArgumentException(wrapper.getClass().getName() + " could not convert " + rootMap.getClass().getName() + " to a TemplateHashModel.");
}
}
Environment env = new Environment(this, root, out);
getConfiguration().doAutoImports(env);
getConfiguration().doAutoIncludes(env);
return env;
}
/**
* Same as <code>createProcessingEnvironment(rootMap, out, null)</code>.
* @see #createProcessingEnvironment(Object rootMap, Writer out, ObjectWrapper wrapper)
*/
public Environment createProcessingEnvironment(Object rootMap, Writer out)
throws TemplateException, IOException
{
return createProcessingEnvironment(rootMap, out, null);
}
/**
* Returns a string representing the raw template
* text in canonical form.
*/
public String toString() {
StringWriter sw = new StringWriter();
try {
dump(sw);
} catch (IOException ioe) {
throw new RuntimeException(ioe.getMessage());
}
return sw.toString();
}
/**
* The path of the template file relative to the directory what you use to store the templates.
* For example, if the real path of template is <tt>"/www/templates/community/forum.fm"</tt>,
* and you use "<tt>"/www/templates"</tt> as
* {@link Configuration#setDirectoryForTemplateLoading "directoryForTemplateLoading"},
* then <tt>name</tt> should be <tt>"community/forum.fm"</tt>. The <tt>name</tt> is used for example when you
* use <tt><include ...></tt> and you give a path that is relative to the current
* template, or in error messages when FreeMarker logs an error while it processes the template.
*/
public String getName() {
return name;
}
/**
* Returns the Configuration object associated with this template.
*/
public Configuration getConfiguration() {
return (Configuration) getParent();
}
/**
* Sets the character encoding to use for
* included files. Usually you don't set this value manually,
* instead it is assigned to the template upon loading.
*/
public void setEncoding(String encoding) {
this.encoding = encoding;
}
/**
* Returns the character encoding used for reading included files.
*/
public String getEncoding() {
return this.encoding;
}
/**
* Dump the raw template in canonical form.
*/
public void dump(PrintStream ps) {
ps.print(rootElement.getCanonicalForm());
}
/**
* Dump the raw template in canonical form.
*/
public void dump(Writer out) throws IOException {
out.write(rootElement.getCanonicalForm());
}
/**
* Called by code internally to maintain
* a table of macros
*/
public void addMacro(Macro macro) {
macros.put(macro.getName(), macro);
}
/**
* Called by code internally to maintain
* a list of imports
*/
public void addImport(LibraryLoad ll) {
imports.add(ll);
}
/**
* Returns the template source at the location
* specified by the coordinates given.
* @param beginColumn the first column of the requested source, 1-based
* @param beginLine the first line of the requested source, 1-based
* @param endColumn the last column of the requested source, 1-based
* @param endLine the last line of the requested source, 1-based
* @see freemarker.core.TemplateObject#getSource()
*/
public String getSource(int beginColumn,
int beginLine,
int endColumn,
int endLine)
{
// Our container is zero-based.
--beginLine;
--beginColumn;
--endColumn;
--endLine;
StringBuffer buf = new StringBuffer();
for (int i = beginLine ; i<=endLine; i++) {
if (i < lines.size()) {
buf.append(lines.get(i));
}
}
int lastLineLength = lines.get(endLine).toString().length();
int trailingCharsToDelete = lastLineLength - endColumn -1;
buf.delete(0, beginColumn);
buf.delete(buf.length() - trailingCharsToDelete, buf.length());
return buf.toString();
}
/**
* This is a helper class that builds up the line table
* info for us.
*/
private class LineTableBuilder extends FilterReader {
StringBuffer lineBuf = new StringBuffer();
int lastChar;
/**
* @param r the character stream to wrap
*/
LineTableBuilder(Reader r) {
super(r);
}
public int read() throws IOException {
int c = in.read();
handleChar(c);
return c;
}
public int read(char cbuf[], int off, int len) throws IOException {
int numchars = in.read(cbuf, off, len);
for (int i=off; i < off+numchars; i++) {
char c = cbuf[i];
handleChar(c);
}
return numchars;
}
public void close() throws IOException {
if (lineBuf.length() >0) {
lines.add(lineBuf.toString());
lineBuf.setLength(0);
}
super.close();
}
private void handleChar(int c) {
if (c == '\n' || c == '\r') {
if (lastChar == '\r' && c == '\n') { // CRLF under Windoze
int lastIndex = lines.size() -1;
String lastLine = (String) lines.get(lastIndex);
lines.set(lastIndex, lastLine + '\n');
} else {
lineBuf.append((char) c);
lines.add(lineBuf.toString());
lineBuf.setLength(0);
}
}
else if (c == '\t') {
int numSpaces = 8 - (lineBuf.length() %8);
for (int i=0; i<numSpaces; i++) {
lineBuf.append(' ');
}
}
else {
lineBuf.append((char) c);
}
lastChar = c;
}
}
/**
* @return the root TemplateElement object.
*/
public TemplateElement getRootTreeNode() {
return rootElement;
}
public Map getMacros() {
return macros;
}
public List getImports() {
return imports;
}
/**
* This is used internally.
*/
public void addPrefixNSMapping(String prefix, String nsURI) {
if (nsURI.length() == 0) {
throw new IllegalArgumentException("Cannot map empty string URI");
}
if (prefix.length() == 0) {
throw new IllegalArgumentException("Cannot map empty string prefix");
}
if (prefix.equals(NO_NS_PREFIX)) {
throw new IllegalArgumentException("The prefix: " + prefix + " cannot be registered, it is reserved for special internal use.");
}
if (prefixToNamespaceURILookup.containsKey(prefix)) {
throw new IllegalArgumentException("The prefix: '" + prefix + "' was repeated. This is illegal.");
}
if (namespaceURIToPrefixLookup.containsKey(nsURI)) {
throw new IllegalArgumentException("The namespace URI: " + nsURI + " cannot be mapped to 2 different prefixes.");
}
if (prefix.equals(DEFAULT_NAMESPACE_PREFIX)) {
this.defaultNS = nsURI;
} else {
prefixToNamespaceURILookup.put(prefix, nsURI);
namespaceURIToPrefixLookup.put(nsURI, prefix);
}
}
public String getDefaultNS() {
return this.defaultNS;
}
/**
* @return the NamespaceUri mapped to this prefix in this template. (Or null if there is none.)
*/
public String getNamespaceForPrefix(String prefix) {
if (prefix.equals("")) {
return defaultNS == null ? "" : defaultNS;
}
return (String) prefixToNamespaceURILookup.get(prefix);
}
/**
* @return the prefix mapped to this nsURI in this template. (Or null if there is none.)
*/
public String getPrefixForNamespace(String nsURI) {
if (nsURI == null) {
return null;
}
if (nsURI.length() == 0) {
return defaultNS == null ? "" : NO_NS_PREFIX;
}
if (nsURI.equals(defaultNS)) {
return "";
}
return (String) namespaceURIToPrefixLookup.get(nsURI);
}
/**
* @return the prefixed name, based on the ns_prefixes defined
* in this template's header for the local name and node namespace
* passed in as parameters.
*/
public String getPrefixedName(String localName, String nsURI) {
if (nsURI == null || nsURI.length() == 0) {
if (defaultNS != null) {
return NO_NS_PREFIX + ":" + localName;
} else {
return localName;
}
}
if (nsURI.equals(defaultNS)) {
return localName;
}
String prefix = getPrefixForNamespace(nsURI);
if (prefix == null) {
return null;
}
return prefix + ":" + localName;
}
/**
* @return an array of the elements containing the given column and line numbers.
* @param column the column
* @param line the line
*/
public TreePath containingElements(int column, int line) {
ArrayList elements = new ArrayList();
TemplateElement element = rootElement;
mainloop:
while (element.contains(column, line)) {
elements.add(element);
for (Enumeration enumeration = element.children(); enumeration.hasMoreElements();) {
TemplateElement elem = (TemplateElement) enumeration.nextElement();
if (elem.contains(column, line)) {
element = elem;
continue mainloop;
}
}
break;
}
if (elements == null || elements.isEmpty()) {
return null;
}
return new TreePath(elements.toArray());
}
static public class WrongEncodingException extends ParseException {
public String specifiedEncoding;
public WrongEncodingException(String specifiedEncoding) {
this.specifiedEncoding = specifiedEncoding;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -