/* Generated By:JavaCC: Do not edit this line. FMParserTokenManager.java */
package freemarker.core;
import freemarker.template.*;
import freemarker.template.utility.StringUtil;
import freemarker.template.utility.DeepUnwrap;
import java.io.*;
import java.util.*;
class FMParserTokenManager implements FMParserConstants
{
/**
The noparseTag is set when we enter
a block of text that the parser more or less ignores.
These are <noparse> and <comment>. This variable
tells us what the closing tag should be, and when
we hit that, we resume parsing. Note that with this
scheme, <comment> and <noparse> tags cannot nest
recursively, but it is not clear how important that is.
*/
String noparseTag;
/**
Keeps track of how deeply nested
we have the hash literals.
This is necessary since we need to be
able to distinguish the } used to close
a hash literal and the one used to
close a ${
*/
private int hashLiteralNesting;
private int parenthesisNesting;
private int bracketNesting;
private boolean inFTLHeader;
boolean strictEscapeSyntax,
onlyTextOutput,
altDirectiveSyntax,
autodetectTagSyntax,
directiveSyntaxEstablished,
inInvocation;
String templateName;
// This method checks if we are in a strict mode where all
// FreeMarker directives must start with <#
private void strictSyntaxCheck(Token tok, int newLexState) {
if (onlyTextOutput) {
tok.kind = PRINTABLE_CHARS;
return;
}
char firstChar = tok.image.charAt(0);
if (autodetectTagSyntax && !directiveSyntaxEstablished) {
altDirectiveSyntax = (firstChar == '[');
}
if ((firstChar == '[' && !altDirectiveSyntax) || (firstChar == '<' && altDirectiveSyntax)) {
tok.kind = PRINTABLE_CHARS;
return;
}
if (!strictEscapeSyntax) {
SwitchTo(newLexState);
return;
}
if (!altDirectiveSyntax) {
if (!tok.image.startsWith("<#") && !tok.image.startsWith("</#")) {
tok.kind = PRINTABLE_CHARS;
return;
}
}
directiveSyntaxEstablished = true;
SwitchTo(newLexState);
}
private void unifiedCall(Token tok) {
char firstChar = tok.image.charAt(0);
if (autodetectTagSyntax && !directiveSyntaxEstablished) {
altDirectiveSyntax = (firstChar == '[');
}
if (altDirectiveSyntax && firstChar == '<') {
tok.kind = PRINTABLE_CHARS;
return;
}
if (!altDirectiveSyntax && firstChar == '[') {
tok.kind = PRINTABLE_CHARS;
return;
}
directiveSyntaxEstablished = true;
SwitchTo(NO_SPACE_EXPRESSION);
}
private void unifiedCallEnd(Token tok) {
char firstChar = tok.image.charAt(0);
if (altDirectiveSyntax && firstChar == '<') {
tok.kind = PRINTABLE_CHARS;
return;
}
if (!altDirectiveSyntax && firstChar == '[') {
tok.kind = PRINTABLE_CHARS;
return;
}
}
private void closeBracket(Token tok) {
if (bracketNesting >0) {
--bracketNesting;
} else {
tok.kind=DIRECTIVE_END;
if (inFTLHeader) {
eatNewline();
inFTLHeader = false;
}
SwitchTo(DEFAULT);
}
}
private void eatNewline() {
int charsRead = 0;
try {
while (true) {
char c = input_stream.readChar();
++charsRead;
if (!Character.isWhitespace(c)) {
input_stream.backup(charsRead);
return;
} else if (c=='\r') {
char next = input_stream.readChar();
++charsRead;
if (next != '\n') {
input_stream.backup(1);
}
return;
} else if (c=='\n') {
return;
}
}
} catch (IOException ioe) {
input_stream.backup(charsRead);
}
}
private void ftlHeader(Token matchedToken) {
if (!directiveSyntaxEstablished) {
altDirectiveSyntax = matchedToken.image.charAt(0) == '[';
directiveSyntaxEstablished = true;
autodetectTagSyntax = false;
}
String img = matchedToken.image;
char firstChar = img.charAt(0);
char lastChar = img.charAt(img.length() -1);
if ((firstChar == '[' && !altDirectiveSyntax) || (firstChar == '<' && altDirectiveSyntax)) {
matchedToken.kind = PRINTABLE_CHARS;
}
if (matchedToken.kind != PRINTABLE_CHARS) {
if (lastChar != '>' && lastChar != ']') {
SwitchTo(FM_EXPRESSION);
inFTLHeader = true;
} else {
eatNewline();
}
}
}
public java.io.PrintStream debugStream = System.out;
public void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
private final int jjMoveStringLiteralDfa0_7()
{
return jjMoveNfa_7(0, 0);
}
private final void jjCheckNAdd(int state)
{
if (jjrounds[state] != jjround)
{
jjstateSet[jjnewStateCnt++] = state;
jjrounds[state] = jjround;
}
}
private final void jjAddStates(int start, int end)
{
do {
jjstateSet[jjnewStateCnt++] = jjnextStates[start];
} while (start++ != end);
}
private final void jjCheckNAddTwoStates(int state1, int state2)
{
jjCheckNAdd(state1);
jjCheckNAdd(state2);
}
private final void jjCheckNAddStates(int start, int end)
{
do {
jjCheckNAdd(jjnextStates[start]);
} while (start++ != end);
}
private final void jjCheckNAddStates(int start)
{
jjCheckNAdd(jjnextStates[start]);
jjCheckNAdd(jjnextStates[start + 1]);
}
static final long[] jjbitVec0 = {
0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
};
static final long[] jjbitVec2 = {
0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
};
private final int jjMoveNfa_7(int startState, int curPos)
{
int[] nextStates;
int startsAt = 0;
jjnewStateCnt = 13;
int i = 1;
jjstateSet[0] = startState;
int j, kind = 0x7fffffff;
for (;;)
{
if (++jjround == 0x7fffffff)
ReInitRounds();
if (curChar < 64)
{
long l = 1L << curChar;
MatchLoop: do
{
switch(jjstateSet[--i])
{
case 0:
if ((0xefffdfffffffffffL & l) != 0L)
{
if (kind > 131)
kind = 131;
jjCheckNAdd(6);
}
else if ((0x1000200000000000L & l) != 0L)
{
if (kind > 132)
kind = 132;
}
if (curChar == 45)
jjAddStates(0, 1);
else if (curChar == 60)
jjstateSet[jjnewStateCnt++] = 1;
break;
case 1:
if (curChar == 47)
jjCheckNAddTwoStates(2, 3);
break;
case 2:
if (curChar == 35)
jjCheckNAdd(3);
break;
case 4:
if ((0x100002600L & l) != 0L)
jjAddStates(2, 3);
break;
case 5:
if (curChar == 62 && kind > 130)
kind = 130;
break;
case 6:
if ((0xefffdfffffffffffL & l) == 0L)
break;
if (kind > 131)
kind = 131;
jjCheckNAdd(6);
break;
case 7:
if ((0x1000200000000000L & l) != 0L && kind > 132)
kind = 132;
break;
freemark官方插件2

FreeMarker 是一个强大的模板引擎,常用于Web开发中生成HTML页面。它与Java语言紧密集成,但设计上保持了与编程语言的分离,使得非程序员也能编写动态内容。"freemark官方插件2"很可能是FreeMarker的一个扩展或增强版,提供了更多的功能或者优化了性能,适用于那些需要更复杂模板逻辑的项目。
描述中的"freemark官方插件第二個包"可能是指该插件是官方发布的第二个版本,或者是系列插件中的第二个组件,意味着它在前一版本的基础上进行了更新和改进,可能修复了一些已知问题,增加了新特性,或者提升了用户体验。
标签"freemark官方插件2"再次强调了这是FreeMarker官方提供的插件,并且是系列中的第二个。官方插件通常具有较高的可靠性和与核心库的良好兼容性,开发者可以放心使用,因为它们会得到官方的支持和维护。
在压缩包子文件的文件名称列表中,我们看到"freemarker-2.3.13",这可能是FreeMarker的特定版本号。2.3.13可能代表着这个插件基于FreeMarker 2.3系列的第13次更新。每个版本号的变化通常对应着软件的更新迭代,包括但不限于新的功能、性能优化、错误修复以及对安全性的提升。
FreeMarker的核心概念包括模板(Template)、数据模型(Data Model)和模板语言(Template Language)。模板是HTML或其他格式的静态文件,其中包含可由FreeMarker解析和替换的特殊指令。数据模型是提供给模板的数据结构,可以是Java对象、集合、Map等。模板语言则定义了如何在模板中引用和操作这些数据。
在FreeMarker 2.3.13中,可能会有以下一些关键知识点:
1. **指令(Directives)**:例如`#if`, `#foreach`, `#include`等,用于控制流程和组合模板内容。
2. **变量表达式(Variable Expressions)**:用于在模板中访问数据模型中的值,如`${variable}`。
3. **内置函数(Built-in Methods)**:例如`html`, `url`等,用于对数据进行转换和处理。
4. **宏(Macros)**:类似于函数,可以复用模板代码片段。
5. **模板继承(Template Inheritance)**:通过`#extends`和`#block`实现模板的层次结构,提高代码重用。
6. **国际化支持(Internationalization)**:通过`#i18n`指令支持多语言环境。
7. **模板缓存(Template Caching)**:提高性能,避免每次都重新解析和编译模板。
8. **配置(Configuration)**:允许自定义FreeMarker的行为,例如错误处理策略、模板加载策略等。
了解并熟练掌握这些知识点,能帮助开发者更有效地利用FreeMarker 2.3.13及其官方插件2来构建动态内容生成系统,提升开发效率和应用性能。在实际项目中,应仔细阅读官方文档,学习每个新特性和改变,以便充分利用这个工具。同时,定期检查更新,确保使用的FreeMarker版本是最新的,以获得最新的功能和安全性更新。

snowver
- 粉丝: 32