欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過Java壓縮JavaScript代碼實(shí)例分享

 更新時(shí)間:2017年12月06日 16:03:05   作者:wgd7  
這篇文章主要介紹了通過Java壓縮JavaScript代碼實(shí)例分享,具有一定參考價(jià)值,需要的朋友可以了解下。

通過移除空行和注釋來壓縮 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();
    }
  }
}

總結(jié)

以上就是本文關(guān)于通過Java壓縮JavaScript代碼實(shí)例分享的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • Spring Security基于JWT實(shí)現(xiàn)SSO單點(diǎn)登錄詳解

    Spring Security基于JWT實(shí)現(xiàn)SSO單點(diǎn)登錄詳解

    這篇文章主要介紹了Spring Security基于JWT實(shí)現(xiàn)SSO單點(diǎn)登錄詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java鎖升級(jí)過程過程詳解

    java鎖升級(jí)過程過程詳解

    這篇文章主要介紹了Java鎖升級(jí)的實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • java對象持久化保存的方法詳解

    java對象持久化保存的方法詳解

    這篇文章主要介紹了java對象持久化保存的方法詳解,在java應(yīng)用開發(fā)的過程中,經(jīng)常遇到需要持久保存java對象的情況,比如:用戶信息、博客評(píng)論內(nèi)容等等,本文針對java對象的持久化保存方法進(jìn)行討論,簡述各個(gè)方法的優(yōu)劣,需要的朋友可以參考下
    2023-07-07
  • Spring mvc AJAX技術(shù)實(shí)現(xiàn)原理解析

    Spring mvc AJAX技術(shù)實(shí)現(xiàn)原理解析

    這篇文章主要介紹了Spring mvc AJAX技術(shù)實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Linux服務(wù)器Java進(jìn)程消失問題解決

    Linux服務(wù)器Java進(jìn)程消失問題解決

    這篇文章主要介紹了Linux服務(wù)器Java進(jìn)程消失問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java Mybatis一級(jí)緩存和二級(jí)緩存

    Java Mybatis一級(jí)緩存和二級(jí)緩存

    緩存是內(nèi)存當(dāng)中一塊存儲(chǔ)數(shù)據(jù)的區(qū)域,目的是提高查詢效率,降低服務(wù)器和數(shù)據(jù)庫的壓力,這篇文章主要介紹了Mybatis一級(jí)緩存和二級(jí)緩存,感興趣的同學(xué)可以參考閱讀本文
    2023-04-04
  • Java 如何判斷Integer類型的值是否相等

    Java 如何判斷Integer類型的值是否相等

    這篇文章主要介紹了Java 如何判斷Integer類型的值是否相等操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中 log4j日志級(jí)別配置詳解

    Java中 log4j日志級(jí)別配置詳解

    這篇文章主要介紹了Java中 log4j日志級(jí)別配置詳解,需要的朋友可以參考下
    2018-01-01
  • springboot如何根據(jù)配置屏蔽接口返回字段

    springboot如何根據(jù)配置屏蔽接口返回字段

    這篇文章主要介紹了springboot如何根據(jù)配置屏蔽接口返回字段問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java數(shù)據(jù)結(jié)構(gòu)之棧的詳解

    Java數(shù)據(jù)結(jié)構(gòu)之棧的詳解

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之棧簡單操作的相關(guān)資料,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09

最新評(píng)論