Browse Source

添加压缩功能

James 5 years ago
parent
commit
10037b08ee

+ 36 - 0
src/main/java/com/jfinal/template/Engine.java

@@ -31,6 +31,7 @@ import com.jfinal.template.source.ClassPathSourceFactory;
 import com.jfinal.template.source.ISource;
 import com.jfinal.template.source.ISourceFactory;
 import com.jfinal.template.source.StringSource;
+import com.jfinal.template.stat.Compressor;
 import com.jfinal.template.stat.OutputDirectiveFactory;
 import com.jfinal.template.stat.Parser;
 import com.jfinal.template.stat.ast.Stat;
@@ -550,6 +551,41 @@ public class Engine {
 	}
 	
 	/**
+	 * 配置 Compressor 可对模板中的静态内容进行压缩
+	 * 
+	 * <pre>
+	 * 例如:
+	 *   engine.setCompressor(new Compressor('\n'));
+	 *   
+	 *  以上配置将使用分隔字符 '\n' 对压缩后的内容进行分隔,还可配置为 ' ':
+	 *    engine.setCompressor(new Compressor(' '));
+	 *  
+	 *  分隔字符配置为 '\n' 可支持 js 代码使用换行代替分号的情况
+	 * </pre>
+	 */
+	public Engine setCompressor(Compressor compressor) {
+		config.setCompressor(compressor);
+		return this;
+	}
+	
+	/**
+	 * 设置开启压缩功能
+	 * @param separator 压缩使用的分隔字符,常用配置值为 '\n' 与 ' '。
+	 *         其中配置 '\n' 在对 js 内容进行压缩时支持 js 代码中回车代替
+	 *         分号的情况
+	 */
+	public Engine setCompressorOn(char separator) {
+		return setCompressor(new Compressor(separator));
+	}
+	
+	/**
+	 * 设置开启压缩功能。separator 配置使用默认值 '\n'
+	 */
+	public Engine setCompressorOn() {
+		return setCompressor(new Compressor());
+	}
+	
+	/**
 	 * Engine 独立设置为 devMode 可以方便模板文件在修改后立即生效,
 	 * 但如果在 devMode 之下并不希望对 addSharedFunction(...),
 	 * 添加的模板进行是否被修改的检测可以通过此方法设置 false 参进去

+ 11 - 0
src/main/java/com/jfinal/template/EngineConfig.java

@@ -37,6 +37,7 @@ import com.jfinal.template.source.FileSourceFactory;
 import com.jfinal.template.source.ISource;
 import com.jfinal.template.source.ISourceFactory;
 import com.jfinal.template.source.StringSource;
+import com.jfinal.template.stat.Compressor;
 import com.jfinal.template.stat.Location;
 import com.jfinal.template.stat.OutputDirectiveFactory;
 import com.jfinal.template.stat.Parser;
@@ -52,6 +53,8 @@ public class EngineConfig {
 	
 	WriterBuffer writerBuffer = new WriterBuffer();
 	
+	Compressor compressor = null;
+	
 	private Map<String, Define> sharedFunctionMap = createSharedFunctionMap();		// new HashMap<String, Define>(512, 0.25F);
 	private List<ISource> sharedFunctionSourceList = new ArrayList<ISource>();		// for devMode only
 	
@@ -425,6 +428,14 @@ public class EngineConfig {
 	public SharedMethodKit getSharedMethodKit() {
 		return sharedMethodKit;
 	}
+	
+	public void setCompressor(Compressor compressor) {
+		this.compressor = compressor;
+	}
+	
+	public Compressor getCompressor() {
+		return compressor;
+	}
 }
 
 

+ 11 - 1
src/main/java/com/jfinal/template/stat/Lexer.java

@@ -38,11 +38,13 @@ class Lexer {
 	
 	String fileName;
 	Set<String> keepLineBlankDirectives;
+	Compressor compressor;
 	
 	List<Token> tokens = new ArrayList<Token>();
 	
-	public Lexer(StringBuilder content, String fileName, Set<String> keepLineBlankDirectives) {
+	public Lexer(StringBuilder content, String fileName, Set<String> keepLineBlankDirectives, Compressor compressor) {
 		this.keepLineBlankDirectives = keepLineBlankDirectives;
+		this.compressor = compressor;
 		
 		int len = content.length();
 		buf = new char[len + 1];
@@ -51,6 +53,10 @@ class Lexer {
 		this.fileName = fileName;
 	}
 	
+	public Lexer(StringBuilder content, String fileName, Set<String> keepLineBlankDirectives) {
+		this(content, fileName, keepLineBlankDirectives, null);
+	}
+	
 	/**
 	 * 进入每个扫描方法之前 peek() 处于可用状态,不需要 next()
 	 * 每个扫描方法内部是否要 next() 移动,取决定具体情况
@@ -473,6 +479,10 @@ class Lexer {
 			return ;
 		}
 		
+		if (compressor != null) {
+			text = compressor.compress(text);
+		}
+		
 		if (previousTextToken != null) {
 			previousTextToken.append(text);
 		} else {

+ 3 - 1
src/main/java/com/jfinal/template/stat/Parser.java

@@ -19,6 +19,7 @@ package com.jfinal.template.stat;
 import java.util.ArrayList;
 import java.util.List;
 import com.jfinal.template.Directive;
+import com.jfinal.template.EngineConfig;
 import com.jfinal.template.Env;
 import com.jfinal.template.expr.ExprParser;
 import com.jfinal.template.expr.ast.ExprList;
@@ -71,7 +72,8 @@ public class Parser {
 	}
 	
 	public StatList parse() {
-		tokenList = new Lexer(content, fileName, env.getEngineConfig().getKeepLineBlankDirectives()).scan();
+		EngineConfig ec = env.getEngineConfig();
+		tokenList = new Lexer(content, fileName, ec.getKeepLineBlankDirectives(), ec.getCompressor()).scan();
 		tokenList.add(EOF);
 		StatList statList = statList();
 		if (peek() != EOF) {