/**
* jsmin.php - Douglas Crockford의 JSMin을 PHP로 구현한 것입니다.
*
* 이것은 몇 가지만 사용하여 jsmin.c를 PHP로 직접 포팅한 것입니다
* PHP 관련 성능이 조정되었습니다. 또한 jsmin.c는 stdin과
에서 읽는 반면
* stdout으로 출력합니다. 이 라이브러리는 문자열을 입력으로 받아들이고 다른 문자열을 반환합니다
* 문자열을 출력합니다.
*
* PHP 5 이상이 필요합니다.
*
* 이로써
에 따라 이 버전의 라이브러리를 사용할 수 있는 권한이 부여됩니다.
* 다음 라이센스가 있는 jsmin.c와 동일한 용어:
*
* --
* 저작권 (c) 2002 Douglas Crockford (www.crockford.com)
*
*
사본을 얻는 모든 사람에게 무료로 허가가 부여됩니다.
* 이 소프트웨어 및 관련 문서 파일("소프트웨어")은
* 다음 권리를 포함하되 이에 국한되지 않는 제한 없는 소프트웨어
* 사본의 사용, 복사, 수정, 병합, 출판, 배포, 재라이센스 부여 및/또는 판매
* 소프트웨어를 제공하고 소프트웨어를 제공받은 사람이 다음을 수행할 수 있도록 허용합니다.
* 따라서 다음 조건이 적용됩니다:
*
* 위 저작권 고지와 본 허가 고지는 모든 콘텐츠에 포함됩니다
* 소프트웨어의 사본 또는 상당 부분.
*
* 소프트웨어는 악이 아닌 선을 위해 사용되어야 합니다.
*
* 소프트웨어는 어떠한 종류의 명시적 또는 명시적 보증 없이 "있는 그대로" 제공됩니다.
* 상품성 보증을 포함하되 이에 국한되지 않는 묵시적인 내용입니다.
* 특정 목적에 대한 적합성 및 비침해. 어떠한 경우에도
* 작성자 또는 저작권 보유자는 모든 청구, 손해 또는 기타 사항에 대해 책임을 집니다.
* 계약, 불법 행위 또는 기타 행위에서 발생하는 책임은 다음과 같습니다.
* 소프트웨어나
의 사용 또는 기타 거래와 관련되거나 이와 관련하여
* 소프트웨어.
* --
*
* @package JSMin
* @author 라이언 그로브
* @copyright 2002 더글라스 크록포드 (jsmin.c)
* @copyright 2008 라이언 그로브 (PHP 포트)
* @copyright 2012 아담 고포스 (업데이트)
* @license http://opensource.org/licenses/mit-license.php MIT 라이선스
* @version 1.1.2 (2012-05-01)
* @링크 https://github.com/rgrove/jsmin-php
*/
클래스 JSMin {
const ORD_LF = 10;
const ORD_SPACE = 32;
const ACTION_KEEP_A = 1;
const ACTION_DELETE_A = 2;
const ACTION_DELETE_A_B = 3;
보호된 $a = '';
보호된 $b = '';
보호된 $input = '';
보호된 $inputIndex = 0;
보호된 $inputLength = 0;
보호된 $lookAhead = null;
보호된 $output = '';
// -- 공개 정적 메소드 ------------------------------ -------
/**
* 자바스크립트 축소
*
* @uses __construct()
* @min()을 사용합니다
* @param string $js 축소할 Javascript
* @return 문자열
*/
공개 정적 함수 minify($js) {
$jsmin = 새로운 JSMin($js);
return $jsmin->min();
}
// -- 공개 인스턴스 메소드 ------------------------------ -----
/**
* 생성자
*
* @param string $input 축소할 Javascript
*/
공개 함수 __construct($input) {
$this->input = str_replace("rn", "n", $input);
$this->inputLength = strlen($this->input);
}
// -- 보호된 인스턴스 메서드 ------------------------------ --
/**
* 액션 - 뭔가를 해보세요! 수행할 작업은 $command 인수에 따라 결정됩니다.
*
* 액션은 문자열을 단일 문자로 처리합니다. 와!
* 액션 앞에 ( 또는 , 또는 =이 있으면 정규식으로 인식합니다.
*
* @next() 사용
* @는 get()을 사용합니다
* @throws JSMinException 파서 오류가 발견된 경우:
* - 종료되지 않은 문자열 리터럴
* - 정규 표현식 리터럴에 설정된 종료되지 않은 정규 표현식
* - 종료되지 않은 정규식 리터럴
* @param int $command 클래스 상수 중 하나:
* ACTION_KEEP_A 출력 A. B를 A에 복사하고 다음 B를 가져옵니다.
* ACTION_DELETE_A B를 A에 복사합니다. 다음 B를 가져옵니다. (A 삭제)
* ACTION_DELETE_A_B 다음 B를 가져옵니다. (B 삭제)
*/
보호된 함수 동작($command) {
스위치($명령) {
사례 자체::ACTION_KEEP_A:
$this->output .= $this->a;
사례 자체::ACTION_DELETE_A:
$this->a = $this->b;
if ($this->a === "'" || $this->a === '"') {
(;;) {
$this->output .= $this->a;
$this->a = $this->get();
if ($this->a === $this->b) {
휴식;
}
if (ord($this->a) <= self::ORD_LF) {
throw new JSMinException('종료되지 않은 문자열 리터럴.');
}
if ($this->a === '\') {
$this->output .= $this->a;
$this->a = $this->get();
}
}
}
사례 자체::ACTION_DELETE_A_B:
$this->b = $this->next();
if ($this->b === '/' && (
$this->a === '(' || $this->a === ',' || $this->a === '=' ||
$this->a === ':' || $this->a === '[' || $this->a === '!' ||
$this->a === '&' || $this->a === '|' || $this->a === '?' ||
$this->a === '{' || $this->a === '}' || $this->a === ';' ||
$this->a === "n" )) {
$this->output .= $this->a . $this->b;
(;;) {
$this->a = $this->get();
if ($this->a === '[') {
/*
정규식 [...] 세트 내부에는 '/' 자체가 포함될 수 있습니다. 예: 460행 근처의 mootools Form.Validator:
return Form.Validator.getValidator('IsEmpty').test(element) || (/^(?:[a-z0-9!#$%&'* /=?^_`{|}~-].?){0,63}[a-z0-9!#$%& '* /=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9 ])?.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|[(?:(?:25[0- 5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0- 4][0-9]|[01]?[0-9][0-9]?)])$/i).test(element.get('value'));
*/
(;;) {
$this->output .= $this->a;
$this->a = $this->get();
if ($this->a === ']') {
휴식;
} elseif ($this->a === '\') {
$this->output .= $this->a;
$this->a = $this->get();
} elseif (ord($this->a) <= self::ORD_LF) {
throw new JSMinException('정규식 리터럴에 설정된 종료되지 않은 정규식.');
}
}
} elseif ($this->a === '/') {
휴식;
} elseif ($this->a === '\') {
$this->output .= $this->a;
$this->a = $this->get();
} elseif (ord($this->a) <= self::ORD_LF) {
throw new JSMinException('종료되지 않은 정규식 리터럴.');
}
$this->output .= $this->a;
}
$this->b = $this->next();
}
}
}
/**
* 다음 문자를 가져옵니다. Ctrl 문자를 공백으로 변환하세요.
*
* @return 문자열|null
*/
보호된 함수 get() {
$c = $this->lookAhead;
$this->lookAhead = null;
if ($c === null) {
if ($this->inputIndex < $this->inputLength) {
$c = substr($this->input, $this->inputIndex, 1);
$this->inputIndex = 1;
} 그 밖의 {
$c = null;
}
}
if ($c === "r") {
"n"을 반환합니다.
}
if ($c === null || $c === "n" || ord($c) >= self::ORD_SPACE) {
$c;를 반환
}
'' 반환;
}
/**
* $c는 문자, 숫자, 밑줄, 달러 기호 또는 비ASCII 문자입니까?
*
* @return 부울
*/
보호된 함수 isAlphaNum($c) {
ord($c) > 126 || $c === '\' || preg_match('/^[w$]$/', $c) === 1;
}
/**
* 축소 수행, 결과 반환
*
* @액션()을 사용합니다
* @uses isAlphaNum()
* @는 get()을 사용합니다
* @uses peek()
* @return 문자열
*/
보호된 함수 min() {
if (0 == strncmp($this->peek(), "xef", 1)) {
$this->get();
$this->get();
$this->get();
}
$this->a = "n";
$this->action(self::ACTION_DELETE_A_B);
while ($this->a !== null) {
스위치 ($this->a) {
' ':
if ($this->isAlphaNum($this->b)) {
$this->action(self::ACTION_KEEP_A);
} 그 밖의 {
$this->action(self::ACTION_DELETE_A);
}
휴식;
사례 "n":
스위치($this->b) {
'{':
'[':
케이스 '(':
' ':
경우 '-':
케이스 '!':
'~' 경우:
$this->action(self::ACTION_KEEP_A);
휴식;
' ':
$this->action(self::ACTION_DELETE_A_B);
휴식;
기본값:
if ($this->isAlphaNum($this->b)) {
$this->action(self::ACTION_KEEP_A);
}
그렇지 않으면 {
$this->action(self::ACTION_DELETE_A);
}
}
휴식;
기본값:
스위치($this->b) {
' ':
if ($this->isAlphaNum($this->a)) {
$this->action(self::ACTION_KEEP_A);
휴식;
}
$this->action(self::ACTION_DELETE_A_B);
휴식;
사례 "n":
스위치 ($this->a) {
케이스 '}':
케이스 ']':
케이스 ')':
' ':
경우 '-':
케이스 '"':
케이스 "'":
$this->action(self::ACTION_KEEP_A);
휴식;
기본값:
if ($this->isAlphaNum($this->a)) {
$this->action(self::ACTION_KEEP_A);
}
그렇지 않으면 {
$this->action(self::ACTION_DELETE_A_B);
}
}
휴식;
기본값:
$this->action(self::ACTION_KEEP_A);
휴식;
}
}
}
$this->output;
을 반환하세요.
}
/**
* 설명을 건너뛰고 다음 문자를 가져옵니다. peek()을 사용하여 확인합니다
* '/' 뒤에 '/' 또는 '*'가 오는 경우.
*
* @는 get()을 사용합니다
* @uses peek()
* @throws JSMinException 종료되지 않은 댓글에 대해
* @return 문자열
*/
보호된 함수 next() {
$c = $this->get();
if ($c === '/') {
스위치($this->peek()) {
'/':
(;;) {
$c = $this->get();
if (ord($c) <= self::ORD_LF) {
$c;를 반환
}
}
경우 '*':
$this->get();
(;;) {
스위치($this->get()) {
경우 '*':
if ($this->peek() === '/') {
$this->get();
'' 반환;
}
휴식;
사례 null:
throw new JSMinException('종료되지 않은 주석.');
}
}
기본값:
$c 반환;
}
}
$c 반환
}
/**
* 다음 문자를 가져옵니다. Ctrl 문자인 경우 공백이나 개행 문자로 변환하세요.
*
* @는 get()을 사용합니다
* @return 문자열|null
*/
보호된 함수 peek() {
$this->lookAhead = $this->get();
$this->lookAhead;
반환
}
}
// --예외 -------------------------------- --- -----
클래스 JSMinException은 예외를 확장합니다. {}
?>
이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.