James 5 年 前
コミット
081bb11a29
1 ファイル変更20 行追加22 行削除
  1. 20 22
      src/main/java/com/jfinal/template/stat/Compressor.java

+ 20 - 22
src/main/java/com/jfinal/template/stat/Compressor.java

@@ -22,7 +22,7 @@ package com.jfinal.template.stat;
  * 1:为追求性能极致,只压缩 Text 节点,所以压缩结果会存在一部分空白字符
  * 2:每次读取一行,按行进行压缩
  * 3:第一行左侧空白不压缩
- * 4:最后一行右侧空白不压缩(注意:最后一行以字符 '\n' 结尾时不算最后一行)
+ * 4:最后一行右侧空白不压缩(注意:最后一行以字符 '\n' 结尾时不算最后一行)
  * 5:第一行、最后一行以外的其它行左右侧都压缩
  * 6:文本之内的空白不压缩,例如字符串 "abc  def" 中的 "abc" 与 "def" 之间的空格不压缩
  * 7:压缩后内容的默认分隔字符为 '\n',对 js 语句缺少分号的支持更友好。还可配置为空格 ' ' 等分隔字符
@@ -46,29 +46,21 @@ public class Compressor {
 		
 		int begin = 0;
 		int forward = 0;
-		boolean compressLeft = false;	// 第一行不压缩左侧
+		int compressMode = 1;		// 1 表示第一行
 		while (forward < len) {
 			if (content.charAt(forward) == '\n') {
-				compressLine(content, begin, forward - 1, compressLeft, result);
+				compressLine(content, begin, forward - 1, compressMode, result);
 				
 				begin = forward + 1;
 				forward = begin;
-				compressLeft = true;
+				compressMode = 2;	// 2 表示中间行
 			} else {
 				forward++;
 			}
 		}
 		
-		// 最后一行压缩左侧空白
-		if (compressLeft) {
-			while (begin < len && content.charAt(begin) <= ' ') {
-				begin++;
-			}
-		}
-		// 最后一行不压缩右侧
-		for (int i = begin; i < len; i++) {
-			result.append(content.charAt(i));
-		}
+		compressMode = 3;			// 3 表示最后一行
+		compressLine(content, begin, forward - 1, compressMode, result);
 		
 		return result;
 	}
@@ -78,27 +70,33 @@ public class Compressor {
 	 * @param content 被处理行文本所在的 StringBuilder 对象
 	 * @param start 被处理行文本的开始下标
 	 * @param end 被处理行文本的结束下标(注意 end 下标所指向的字符被包含在处理的范围之内)
-	 * @param compressLeft 是否压缩左侧
+	 * @param compressMode 1 表示第一行,2 表示中间行,3 表示最后一行
 	 * @param result 存放压缩结果
 	 */
-	protected void compressLine(StringBuilder content, int start, int end, boolean compressLeft, StringBuilder result) {
-		// 压缩左侧空白
-		if (compressLeft) {
+	protected void compressLine(StringBuilder content, int start, int end, int compressMode, StringBuilder result) {
+		// 第一行不压缩左侧空白
+		if (compressMode != 1) {
 			while (start < end && content.charAt(start) <= ' ') {
 				start++;
 			}
 		}
 		
-		// 压缩右侧空白
-		while (end >= start && content.charAt(end) <= ' ') {
-			end--;
+		// 最后一行不压缩右侧空白
+		if (compressMode != 3) {
+			while (end >= start && content.charAt(end) <= ' ') {
+				end--;
+			}
 		}
 		
 		if (start <= end) {
 			for (int i = start; i <= end; i++) {
 				result.append(content.charAt(i));
 			}
-			result.append(separator);
+			
+			// 最后一行右侧未压缩,不能添加分隔字符。最后一行以 '\n' 结尾时 compressMode 一定不为 3
+			if (compressMode != 3) {
+				result.append(separator);
+			}
 		}
 	}
 }