栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

通过Java压缩JavaScript代码实例分享

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通过Java压缩JavaScript代码实例分享

通过移除空行和注释来压缩 Javascript 代码


public class JavascriptCompressor {
	private static final char LINE_FEED = '\n';
	private static final char CARRIAGE_RETURN = '\r';
	private static final char SPACE = ' ';
	private static final char TAB = '\t';
	
	public static String compress(String script) {
		JavascriptCompressor jsc = new JavascriptCompressor(script);
		return jsc.outputBuffer.toString();
	}
	
	private String script;
	
	private StringBuffer outputBuffer;
	
	private int pos;
	
	private char ch;
	
	private char lastAppend;
	
	private Boolean endReached;
	
	private Boolean contentAppendedAfterLastIdentifier = true;
	
	private JavascriptCompressor(String script) {
		this.script = script;
		outputBuffer = new StringBuffer(script.length());
		nextchar();
		while (!endReached) {
			if (Character.isJavaIdentifierStart(ch)) {
				renderIdentifier();
			} else if (ch == ' ') {
				skipWhiteSpace();
			} else if (isWhitespace()) {
				// Compress whitespace
				skipWhiteSpace();
			} else if ((ch == '"') || (ch == '\'')) {
 // Handle strings
 renderString();
      } else if (ch == '/') {
 // Handle comments
 nextChar();
 if (ch == '/') {
   nextChar();
   skipLineComment();
 } else if (ch == '*') {
   nextChar();
   skipBlockComment();
 } else {
   append('/');
 }
      } else {
 append(ch);
 nextChar();
      }
    }
  }
  
  private void append(char ch) {
    lastAppend = ch;
    outputBuffer.append(ch);
    contentAppendedAfterLastIdentifier = true;
  }
  
  private boolean isWhitespace() {
    return ch == CARRIAGE_RETURN || ch == SPACE || ch == TAB || ch == LINE_FEED;    
  }
  
  private void nextChar() {
    if (!endReached) {
      if (pos < script.length()) {
 ch = script.charAt(pos++);
      } else {
 endReached = true;
 ch = 0;
      }
    }
  }
  
  private void renderIdentifier() {
    if (!contentAppendedAfterLastIdentifier)
      append(SPACE);
    append(ch);
    nextChar();
    while (Character.isJavaIdentifierPart(ch)) {
      append(ch);
      nextChar();
    }
    contentAppendedAfterLastIdentifier = false;
  }
  
  private void renderString() {
    char startCh = ch; // Save quote char
    append(ch);
    nextChar();
    while (true) {
      if ((ch == LINE_FEED) || (ch == CARRIAGE_RETURN) || (endReached)) {
 // Javascript error: string not terminated
 return;
      } else {
 if (ch == '\\') {
   append(ch);
   nextChar();
   if ((ch == LINE_FEED) || (ch == CARRIAGE_RETURN) || (endReached)) {
     // Javascript error: string not terminated
     return;
   }
   append(ch);
   nextChar();
 } else {
   append(ch);
   if (ch == startCh) {
     nextChar();
     return;
   }
   nextChar();
 }
      }
    }
  }
  
  private void skipLineComment() {
    while ((ch != CARRIAGE_RETURN) && (ch != LINE_FEED)) {
      if (endReached) {
 return;
      }
      nextChar();
    }
  }
  
  private void skipBlockComment() {
    while (true) {
      if (endReached) {
 return;
      }
      if (ch == '*') {
 nextChar();
 if (ch == '/') {
   nextChar();
   return;
 }
      } else
 nextChar();
    }
  }
  
  private void rendernewline() {
    if (lastAppend != '\n' && lastAppend != '\r') {
      append('\n');
    }
  }
  
  private void skipWhiteSpace() {
    if (ch == LINE_FEED || ch == CARRIAGE_RETURN) {
      rendernewline();
    } else {
      append(ch);
    }
    nextChar();
    while (ch == LINE_FEED || ch == CARRIAGE_RETURN || ch == SPACE || ch == TAB) {
      if (ch == LINE_FEED || ch == CARRIAGE_RETURN) {
 rendernewline();
      }
      nextChar();
    }
  }
}

总结

以上就是本文关于通过Java压缩Javascript代码实例分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/142775.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号