通过Java压缩JavaScript代码实例分享
2017-12-06 16:03
609 查看
通过移除空行和注释来压缩 JavaScript 代码
/** * This file is part of the Echo Web Application Framework (hereinafter \"Echo\"). * Copyright (C) 2002-2009 NextApp, Inc. * * Compresses a String containing JavaScript by removing comments and whitespace. */ 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\'; /** * Compresses a String containing JavaScript by removing comments and * whitespace. * * @param script the String to compress * @return a compressed version */ public static String compress(String script) { JavaScriptCompressor jsc = new JavaScriptCompressor(script); return jsc.outputBuffer.toString(); } /** Original JavaScript text. */ private String script; /** * Compressed output buffer. * This buffer may only be modified by invoking the <code>append()</code> * method. */ private StringBuffer outputBuffer; /** Current parser cursor position in original text. */ private int pos; /** Character at parser cursor position. */ private char ch; /** Last character appended to buffer. */ private char lastAppend; /** Flag indicating if end-of-buffer has been reached. */ private Boolean endReached; /** Flag indicating whether content has been appended after last identifier. */ private Boolean contentAppendedAfterLastIdentifier = true; /** * Creates a new <code>JavaScriptCompressor</code> instance. * * @param script */ 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(); } } } /** * Append character to output. * * @param ch the character to append */ private void append(char ch) { lastAppend = ch; outputBuffer.append(ch); contentAppendedAfterLastIdentifier = true; } /** * Determines if current character is whitespace. * * @return true if the character is whitespace */ private boolean isWhitespace() { return ch == CARRIAGE_RETURN || ch == SPACE || ch == TAB || ch == LINE_FEED; } /** * Load next character. */ private void nextChar() { if (!endReached) { if (pos < script.length()) { ch = script.charAt(pos++); } else { endReached = true; ch = 0; } } } /** * Adds an identifier to output. */ private void renderIdentifier() { if (!contentAppendedAfterLastIdentifier) append(SPACE); append(ch); nextChar(); while (Character.isJavaIdentifierPart(ch)) { append(ch); nextChar(); } contentAppendedAfterLastIdentifier = false; } /** * Adds quoted String starting at current character to output. */ 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(); } } } } /** * Moves cursor past a line comment. */ private void skipLineComment() { while ((ch != CARRIAGE_RETURN) && (ch != LINE_FEED)) { if (endReached) { return; } nextChar(); } } /** * Moves cursor past a block comment. */ private void skipBlockComment() { while (true) { if (endReached) { return; } if (ch == \'*\') { nextChar(); if (ch == \'/\') { nextChar(); return; } } else nextChar(); } } /** * Renders a new line character, provided previously rendered character * is not a newline. */ private void renderNewLine() { if (lastAppend != \'\\n\' && lastAppend != \'\\r\') { append(\'\\n\'); } } /** * Moves cursor past white space (including newlines). */ 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代码实例分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
您可能感兴趣的文章:
相关文章推荐
- 【Java】通过移除空行和注释来压缩 JavaScript 代码
- 意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提交的javascript代码! 不敢藏私,特与大家分
- 分享一段通过前端javascript脚本 启用/禁用超链接的代码
- 分享通过在java main函数中执行spring的代码
- 通过代理类实现java连接数据库(使用dao层操作数据)实例分享
- java随机动态生成汉字验证码图片的实例代码分享
- java文件重命名(文件批量重命名)实例程序代码分享
- Java建立Zip压缩文件的代码实例
- Cocos2d-x3.3RC0通过JNI调用Android的Java层代码,实现分享功能
- java计划任务调度框架quartz结合spring实现调度的配置实例代码分享
- 不依赖第三方jar包的通过java sax解析本地xml文件的实例代码
- 通过Java测试几种压缩算法的性能(附测试代码下载)
- 通过文档事件处理程序引入JavaScript脚本代码实例
- java实现的新浪微博分享代码实例
- javascript分页代码实例分享(js分页)
- 通过JavaScript打开网页方式进行分享-转最简单易用的开心网、人人网、新浪微博、腾讯微博、QQ空间分享代码
- Cocos2d-x游戏开发之Cocos2dx通过JNI调用Android的Java代码(webView实例)
- javascript中实现兼容JAVA的hashCode算法代码分享
- 意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提交的javascript代码! 不敢藏私,特与大家分
- 分享200多个javascript代码实例