Browse Source

jfinal 4.4

James 6 years ago
parent
commit
830274bbbf

+ 19 - 3
src/main/java/com/jfinal/template/Engine.java

@@ -293,12 +293,28 @@ public class Engine {
 	}
 	
 	/**
-	 * Add directive
+	 * 添加自定义指令
+	 * 
+	 * 建议添加自定义指令时明确指定 keepLineBlank 变量值,其规则如下:
+	 *   1:keepLineBlank 为 true 时, 该指令所在行的前后空白字符以及末尾字符 '\n' 将会被保留
+	 *      一般用于具有输出值的指令,例如 #date、#para 等指令
+	 *    
+	 *   2:keepLineBlank 为 false 时,该指令所在行的前后空白字符以及末尾字符 '\n' 将会被删除
+	 *      一般用于没有输出值的指令,例如 #for、#if、#else、#end 这种性质的指令
+	 * 
 	 * <pre>
-	 * 示例:
-	 * addDirective("now", NowDirective.class)
+	 * 	示例:
+	 * 	addDirective("now", NowDirective.class, true)
 	 * </pre>
 	 */
+	public Engine addDirective(String directiveName, Class<? extends Directive> directiveClass, boolean keepLineBlank) {
+		config.addDirective(directiveName, directiveClass, keepLineBlank);
+		return this;
+	}
+	
+	/**
+	 * 添加自定义指令,keepLineBlank 使用默认值
+	 */
 	public Engine addDirective(String directiveName, Class<? extends Directive> directiveClass) {
 		config.addDirective(directiveName, directiveClass);
 		return this;

+ 37 - 13
src/main/java/com/jfinal/template/EngineConfig.java

@@ -59,6 +59,9 @@ public class EngineConfig {
 	private Map<String, Class<? extends Directive>> directiveMap = new HashMap<String, Class<? extends Directive>>(64, 0.5F);
 	private SharedMethodKit sharedMethodKit = new SharedMethodKit();
 	
+	// 保留指令所在行空白字符的指令
+	private java.util.Set<String> keepLineBlankDirectives = new java.util.HashSet<>();
+	
 	private boolean devMode = false;
 	private boolean reloadModifiedSharedFunctionInDevMode = true;
 	private String baseTemplatePath = null;
@@ -66,14 +69,19 @@ public class EngineConfig {
 	private String datePattern = "yyyy-MM-dd HH:mm";
 	
 	public EngineConfig() {
+		// #() 与 #include(...) 系统内置指令需要配置
+		setKeepLineBlank("output", true);
+		setKeepLineBlank("include", true);
+		
 		// Add official directive of Template Engine
-		addDirective("render", RenderDirective.class);
-		addDirective("date", DateDirective.class);
-		addDirective("escape", EscapeDirective.class);
-		addDirective("string", StringDirective.class);
-		addDirective("random", RandomDirective.class);
-		addDirective("number", NumberDirective.class);
-		addDirective("call", CallDirective.class);
+		addDirective("render", RenderDirective.class, true);
+		addDirective("date", DateDirective.class, true);
+		addDirective("escape", EscapeDirective.class, true);
+		addDirective("random", RandomDirective.class, true);
+		addDirective("number", NumberDirective.class, true);
+		addDirective("call", CallDirective.class, true);
+		
+		addDirective("string", StringDirective.class, false);
 		
 		// Add official shared method of Template Engine
 		addSharedMethod(new SharedMethodLib());
@@ -318,12 +326,7 @@ public class EngineConfig {
 		this.reloadModifiedSharedFunctionInDevMode = reloadModifiedSharedFunctionInDevMode;
 	}
 	
-	@Deprecated
-	public void addDirective(String directiveName, Directive directive) {
-		addDirective(directiveName, directive.getClass());
-	}
-	
-	public synchronized void addDirective(String directiveName, Class<? extends Directive> directiveClass) {
+	public synchronized void addDirective(String directiveName, Class<? extends Directive> directiveClass, boolean keepLineBlank) {
 		if (StrKit.isBlank(directiveName)) {
 			throw new IllegalArgumentException("directive name can not be blank");
 		}
@@ -333,7 +336,15 @@ public class EngineConfig {
 		if (directiveMap.containsKey(directiveName)) {
 			throw new IllegalArgumentException("directive already exists : " + directiveName);
 		}
+		
 		directiveMap.put(directiveName, directiveClass);
+		if (keepLineBlank) {
+			keepLineBlankDirectives.add(directiveName);
+		}
+	}
+	
+	public void addDirective(String directiveName, Class<? extends Directive> directiveClass) {
+		addDirective(directiveName, directiveClass, false);
 	}
 	
 	public Class<? extends Directive> getDirective(String directiveName) {
@@ -342,6 +353,19 @@ public class EngineConfig {
 	
 	public void removeDirective(String directiveName) {
 		directiveMap.remove(directiveName);
+		keepLineBlankDirectives.remove(directiveName);
+	}
+	
+	public void setKeepLineBlank(String directiveName, boolean keepLineBlank) {
+		if (keepLineBlank) {
+			keepLineBlankDirectives.add(directiveName);
+		} else {
+			keepLineBlankDirectives.remove(directiveName);
+		}
+	}
+	
+	public boolean isKeepLineBlank(String directiveName) {
+		return keepLineBlankDirectives.contains(directiveName);
 	}
 	
 	/**