Skip to content
This repository was archived by the owner on Apr 22, 2020. It is now read-only.

Commit 4aceceb

Browse files
Better minification of regex preceder pattern, fixed misoptimization of keyword lists, and other minification tweaks.
1 parent db3a755 commit 4aceceb

File tree

7 files changed

+519
-398
lines changed

7 files changed

+519
-398
lines changed

Makefile

Lines changed: 65 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,31 @@
11
CLOSURE_COMPILER=java -jar closure-compiler/compiler.jar \
22
--warning_level VERBOSE \
33
--charset UTF-8 \
4-
--compilation_level ADVANCED_OPTIMIZATIONS \
5-
--output_wrapper '(function(){%output%})()'
4+
--language_in ECMASCRIPT5 \
5+
--compilation_level ADVANCED_OPTIMIZATIONS
66

77
YUI_COMPRESSOR=java -jar yui-compressor/yuicompressor-2.4.4.jar \
88
--charset UTF-8
99

10-
src/prettify.js: js-modules/*.js
11-
if [ -e $@ ]; then chmod +w $@; fi
12-
perl -e '\
10+
TAR_ROOT=distrib/google-code-prettify
11+
12+
all: src/prettify.js distrib
13+
14+
clean:
15+
rm -rf distrib.tstamp distrib src/prettify.js
16+
17+
src/prettify.js: js-modules/*.js js-modules/*.pl
18+
@if [ -e $@ ]; then chmod +w $@; fi
19+
@perl -e '\
1320
sub readInclude($$$$) {\
1421
my $$prefix = $$_[0];\
1522
my $$name = "js-modules/" . $$_[1];\
1623
my $$buf = "";\
17-
open(IN, "<$$name") or die "$$name: $$!";\
24+
if ($$name =~ /\.pl$$/) {\
25+
open(IN, "|perl $$name") or die "$$name: $$!";\
26+
} else {\
27+
open(IN, "<$$name") or die "$$name: $$!";\
28+
}\
1829
while (<IN>) {\
1930
$$buf .= "$$prefix$$_";\
2031
}\
@@ -24,33 +35,57 @@ src/prettify.js: js-modules/*.js
2435
js-modules/prettify.js \
2536
> src/prettify.js \
2637
|| rm src/prettify.js
27-
if [ -e $@ ]; then chmod -w $@; fi
38+
@if [ -e $@ ]; then chmod -w $@; fi
2839

29-
distrib: distrib.tstamp distrib/google-code-prettify-minimized.tgz
40+
distrib: distrib.tstamp distrib/google-code-prettify-minimized.tgz \
41+
distrib/google-code-prettify-minimized.tar.bz2
42+
@wc -c distrib/google-code-prettify-minimized.{tar.bz2,tgz} \
43+
| grep -v total
3044

3145
distrib.tstamp: src/*.js src/*.css
32-
mkdir -p distrib/google-code-prettify
33-
for f in src/*.css; do \
34-
$(YUI_COMPRESSOR) --type css $$f > distrib/google-code-prettify/$$(basename $$f); \
46+
@echo Compiling
47+
@mkdir -p $(TAR_ROOT)
48+
@for f in src/*.css; do \
49+
$(YUI_COMPRESSOR) --type css $$f \
50+
> $(TAR_ROOT)/$$(basename $$f); \
51+
wc -c $$f $(TAR_ROOT)/$$(basename $$f) \
52+
| grep -v total; \
3553
done
36-
$(CLOSURE_COMPILER) --js src/prettify.js --externs closure-compiler/console-externs.js \
37-
> distrib/google-code-prettify/prettify.js
38-
for f in src/lang*.js; do \
39-
$(CLOSURE_COMPILER) --js $$f --externs js-modules/externs.js \
40-
| perl -pe 's/\bPR\.PR_ATTRIB_NAME\b/"atn"/g; \
41-
s/\bPR\.PR_ATTRIB_VALUE\b/"atv"/g; \
42-
s/\bPR\.PR_COMMENT\b/"com"/g; \
43-
s/\bPR\.PR_DECLARATION\b/"dec"/g; \
44-
s/\bPR\.PR_KEYWORD\b/"kwd"/g; \
45-
s/\bPR\.PR_LITERAL\b/"lit"/g; \
46-
s/\bPR\.PR_PLAIN\b/"pln"/g; \
47-
s/\bPR\.PR_PUNCTUATION\b/"pun"/g; \
48-
s/\bPR\.PR_STRING\b/"str"/g; \
49-
s/\bPR\.PR_TAG\b/"tag"/g; \
50-
s/\bPR\.PR_TYPE\b/"typ"/g;' \
51-
> distrib/google-code-prettify/$$(basename $$f); \
54+
@$(CLOSURE_COMPILER) --js src/prettify.js \
55+
--externs closure-compiler/console-externs.js \
56+
| perl -e 'binmode STDIN, ":utf8";' -pe 's/\xA0/\\xa0/' \
57+
> $(TAR_ROOT)/prettify.js
58+
@wc -c src/prettify.js $(TAR_ROOT)/prettify.js \
59+
| grep -v total
60+
@for f in src/lang*.js; do \
61+
if [ $$f -nt $(TAR_ROOT)/$$(basename $$f) ]; then \
62+
$(CLOSURE_COMPILER) --js $$f --externs js-modules/externs.js \
63+
| perl -e 'binmode STDIN, ":utf8";' -pe 's/\xA0/\\xa0/' \
64+
| perl -pe 's/\bPR\.PR_ATTRIB_NAME\b/"atn"/g; \
65+
s/\bPR\.PR_ATTRIB_VALUE\b/"atv"/g; \
66+
s/\bPR\.PR_COMMENT\b/"com"/g; \
67+
s/\bPR\.PR_DECLARATION\b/"dec"/g; \
68+
s/\bPR\.PR_KEYWORD\b/"kwd"/g; \
69+
s/\bPR\.PR_LITERAL\b/"lit"/g; \
70+
s/\bPR\.PR_PLAIN\b/"pln"/g; \
71+
s/\bPR\.PR_PUNCTUATION\b/"pun"/g; \
72+
s/\bPR\.PR_STRING\b/"str"/g; \
73+
s/\bPR\.PR_TAG\b/"tag"/g; \
74+
s/\bPR\.PR_TYPE\b/"typ"/g;' \
75+
> $(TAR_ROOT)/$$(basename $$f); \
76+
wc -c $$f $(TAR_ROOT)/$$(basename $$f) \
77+
| grep -v total; \
78+
fi \
5279
done
53-
touch distrib.tstamp
80+
@touch distrib.tstamp
81+
82+
%.tgz: %.tar
83+
@gzip -c -9 $^ > $@
84+
85+
%.tar.bz2: %.tar
86+
@bzip2 -9f $^
5487

55-
distrib/google-code-prettify-minimized.tgz: distrib/google-code-prettify/*
56-
pushd distrib; tar cfz google-code-prettify-minimized.tgz google-code-prettify; popd
88+
distrib/google-code-prettify-minimized.tar: distrib.tstamp
89+
@pushd distrib >& /dev/null; \
90+
tar cf ../$@ google-code-prettify; \
91+
popd >& /dev/null

js-modules/combinePrefixPatterns.js

Lines changed: 44 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
/**
32
* Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
43
* matches the union of the sets of strings matched by the input RegExp.
@@ -24,22 +23,30 @@ function combinePrefixPatterns(regexs) {
2423
}
2524
}
2625

26+
var escapeCharToCodeUnit = {
27+
'b': 8,
28+
't': 9,
29+
'n': 0xa,
30+
'v': 0xb,
31+
'f': 0xc,
32+
'r': 0xd
33+
};
34+
2735
function decodeEscape(charsetPart) {
28-
if (charsetPart.charAt(0) !== '\\') { return charsetPart.charCodeAt(0); }
29-
switch (charsetPart.charAt(1)) {
30-
case 'b': return 8;
31-
case 't': return 9;
32-
case 'n': return 0xa;
33-
case 'v': return 0xb;
34-
case 'f': return 0xc;
35-
case 'r': return 0xd;
36-
case 'u': case 'x':
37-
return parseInt(charsetPart.substring(2), 16)
38-
|| charsetPart.charCodeAt(1);
39-
case '0': case '1': case '2': case '3': case '4':
40-
case '5': case '6': case '7':
41-
return parseInt(charsetPart.substring(1), 8);
42-
default: return charsetPart.charCodeAt(1);
36+
var cc0 = charsetPart.charCodeAt(0);
37+
if (cc0 !== 92 /* \\ */) {
38+
return cc0;
39+
}
40+
var c1 = charsetPart.charAt(1);
41+
cc0 = escapeCharToCodeUnit[c1];
42+
if (cc0) {
43+
return cc0;
44+
} else if ('0' <= c1 && c1 <= '7') {
45+
return parseInt(charsetPart.substring(1), 8);
46+
} else if (c1 === 'u' || c1 === 'x') {
47+
return parseInt(charsetPart.substring(2), 16);
48+
} else {
49+
return charsetPart.charCodeAt(1);
4350
}
4451
}
4552

@@ -70,30 +77,29 @@ function combinePrefixPatterns(regexs) {
7077
var inverse = charsetParts[0] === '^';
7178
for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
7279
var p = charsetParts[i];
73-
switch (p) {
74-
case '\\B': case '\\b':
75-
case '\\D': case '\\d':
76-
case '\\S': case '\\s':
77-
case '\\W': case '\\w':
78-
groups.push(p);
79-
continue;
80-
}
81-
var start = decodeEscape(p);
82-
var end;
83-
if (i + 2 < n && '-' === charsetParts[i + 1]) {
84-
end = decodeEscape(charsetParts[i + 2]);
85-
i += 2;
80+
if (/\\[bdsw]/i.test(p)) { // Don't muck with named groups.
81+
groups.push(p);
8682
} else {
87-
end = start;
88-
}
89-
ranges.push([start, end]);
90-
// If the range might intersect letters, then expand it.
91-
if (!(end < 65 || start > 122)) {
92-
if (!(end < 65 || start > 90)) {
93-
ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
83+
var start = decodeEscape(p);
84+
var end;
85+
if (i + 2 < n && '-' === charsetParts[i + 1]) {
86+
end = decodeEscape(charsetParts[i + 2]);
87+
i += 2;
88+
} else {
89+
end = start;
9490
}
95-
if (!(end < 97 || start > 122)) {
96-
ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
91+
ranges.push([start, end]);
92+
// If the range might intersect letters, then expand it.
93+
// This case handling is too simplistic.
94+
// It does not deal with non-latin case folding.
95+
// It works for latin source code identifiers though.
96+
if (!(end < 65 || start > 122)) {
97+
if (!(end < 65 || start > 90)) {
98+
ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
99+
}
100+
if (!(end < 97 || start > 122)) {
101+
ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
102+
}
97103
}
98104
}
99105
}

js-modules/extractSourceSpans.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
* It will produce the output:</p>
2121
* <pre>
2222
* {
23-
* source: "print 'Hello '\n + 'World';",
23+
* sourceCode: "print 'Hello '\n + 'World';",
2424
* // 1 2
2525
* // 012345678901234 5678901234567
2626
* spans: [0, #1, 6, #2, 14, #3, 15, #4]
@@ -93,7 +93,7 @@ function extractSourceSpans(node) {
9393
walk(node);
9494

9595
return {
96-
source: chunks.join('').replace(/\n$/, ''),
96+
sourceCode: chunks.join('').replace(/\n$/, ''),
9797
spans: spans
9898
};
9999
}

0 commit comments

Comments
 (0)