- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用这个压缩器:
#!/usr/bin/perl
use Getopt::Std;
use strict;
my %opts;
getopts('f:t:h', \%opts) || usage(1);
if ($opts{'h'}) {
usage();
exit;
}
if (!exists($opts{'f'}) || !exists($opts{'t'})) {
print STDERR "ERROR: You must supply an input file with -f and an output file with -t\n";
usage(1);
}
# actually perform the minimization
my $issame = 0;
if ($opts{'f'} eq $opts{'t'}) {
$issame = 1;
$opts{'t'} = $opts{'f'} . ".tmp$$";
}
open(INFILE, $opts{'f'}) or die "couldn't open the file '$opts{f}'";
open(OUTFILE, ">$opts{'t'}") or die "couldn't open the file '$opts{t}'";
minify(input => *INFILE, outfile => *OUTFILE);
close(INFILE);
close(OUTFILE);
if ($issame) {
rename($opts{'t'}, $opts{'f'});
}
sub usage {
print STDERR "USAGE: $0 -f INPUTFILE -t OUTPUTFILE\n";
exit($_[0] || 0);
}
# -----------------------------------------------------------------------------
sub isSpace {
my $x = shift;
return ($x eq ' ' || $x eq "\t");
}
sub isEndspace {
my $x = shift;
return ($x eq "\n" || $x eq "\r" || $x eq "\f");
}
sub isWhitespace {
my $x = shift;
return (isSpace($x) || isEndspace($x));
}
# whitespace characters before or after these characters can be removed.
sub isInfix {
my $x = shift;
return ($x eq '{' || $x eq '}' || $x eq ';' || $x eq ':');
}
# whitespace characters after these characters can be removed.
sub isPrefix {
my $x = shift;
return (isInfix($x));
}
# whitespace characters before these characters can removed.
sub isPostfix {
my $x = shift;
return (isInfix($x));
}
# -----------------------------------------------------------------------------
sub _get {
my $s = shift;
if ($s->{inputType} eq 'file') {
return getc($s->{input});
}
elsif ($s->{inputType} eq 'string') {
if ($s->{'inputPos'} < length($s->{input})) {
return substr($s->{input}, $s->{inputPos}++, 1);
}
else { # Simulate getc() when off the end of the input string.
return undef;
}
}
else {
die "no input";
}
}
sub _put {
my $s = shift;
my $x = shift;
my $outfile = ($s->{outfile});
if (defined($s->{outfile})) {
print $outfile $x;
}
else {
$s->{output} .= $x;
}
}
# -----------------------------------------------------------------------------
# print a
# new b
#
# i.e. print a and advance
sub action1 {
my $s = shift;
$s->{last} = $s->{a};
_put($s, $s->{a});
action2($s);
}
# move b to a
# new b
#
# i.e. delete a and advance
sub action2 {
my $s = shift;
$s->{a} = $s->{b};
$s->{b} = $s->{c};
$s->{c} = _get($s);
}
# -----------------------------------------------------------------------------
# put string literals
# when this sub is called, $s->{a} is on the opening delimiter character
sub putLiteral {
my $s = shift;
my $delimiter = $s->{a}; # ' or "
action1($s);
do {
while (defined($s->{a}) && $s->{a} eq '\\') { # escape character escapes only the next one character
action1($s);
action1($s);
}
action1($s);
} until ($s->{last} eq $delimiter || !defined($s->{a}));
if ($s->{last} ne $delimiter) { # ran off end of file before printing the closing delimiter
die 'unterminated ' . ($delimiter eq '\'' ? 'single quoted string' : 'double quoted string') . ' literal, stopped';
}
}
# -----------------------------------------------------------------------------
# If $s->{a} is a whitespace then collapse all following whitespace.
# If any of the whitespace is a new line then ensure $s->{a} is a new line
# when this function ends.
sub collapseWhitespace {
my $s = shift;
while (defined($s->{a}) && isWhitespace($s->{a}) &&
defined($s->{b}) && isWhitespace($s->{b})) {
if (isEndspace($s->{a}) || isEndspace($s->{b})) {
$s->{a} = "\n";
}
action2($s); # delete b
}
}
# Advance $s->{a} to non-whitespace or end of file.
# Doesn't print any of this whitespace.
sub skipWhitespace {
my $s = shift;
while (defined($s->{a}) && isWhitespace($s->{a})) {
action2($s);
}
}
# #s->{a} should be on whitespace when this function is called
sub preserveWhitespace {
my $s = shift;
collapseWhitespace($s);
if (defined($s->{a}) && defined($s->{b}) && !isPostfix($s->{b})) {
action1($s); # print the whitespace character
}
skipWhitespace($s);
}
# -----------------------------------------------------------------------------
sub minify {
my %h = @_;
# Immediately turn hash into a hash reference so that notation is the same in this function
# as others. Easier refactoring.
my $s = \%h; # hash reference for "state". This module is functional programming and the state is passed between functions.
# determine if the the input is a string or a file handle.
my $ref = \$s->{input};
if (defined($ref) && ref($ref) eq 'SCALAR'){
$s->{inputPos} = 0;
$s->{inputType} = 'string';
}
else {
$s->{inputType} = 'file';
}
# Determine if the output is to a string or a file.
if (!defined($s->{outfile})) {
$s->{output} = '';
}
# Print the copyright notice first
if ($s->{copyright}) {
_put($s, '/* ' . $s->{copyright} . ' */');
}
# Initialize the buffer.
do {
$s->{a} = _get($s);
} while (defined($s->{a}) && isWhitespace($s->{a}));
$s->{b} = _get($s);
$s->{c} = _get($s);
$s->{last} = undef;
# local variables
my $macIeCommentHackFlag = 0; # marks if a have recently seen a comment with an escaped close like this /* foo \*/
# and have not yet seen a regular comment to close this like /* bar */
while (defined($s->{a})) { # on this line $s->{a} should always be a non-whitespace character or undef (i.e. end of file)
if (isWhitespace($s->{a})) { # check that this program is running correctly
die 'minifier bug: minify while loop starting with whitespace, stopped';
}
# Each branch handles trailing whitespace and ensures $s->{a} is on non-whitespace or undef when branch finishes
if ($s->{a} eq '/' && defined($s->{b}) && $s->{b} eq '*') { # a comment
do {
action2($s); # advance buffer by one
# if a is \, b is *, c is /, hack flag false
# Mac/IE hack start
# set hack flag true
# print /*\*/
if ($s->{a} eq '\\' &&
defined($s->{b}) && $s->{b} eq '*' &&
defined($s->{c}) && $s->{c} eq '/' &&
!$macIeCommentHackFlag) {
$macIeCommentHackFlag = 1;
_put($s, '/*\\*/');
$s->{last} = '/';
}
# if a is not \, b is *, c is /, hack flag true
# Mac/IE hack end
# set hack flag false
# print /**/
if ($s->{a} ne '\\' &&
defined($s->{b}) && $s->{b} eq '*' &&
defined($s->{c}) && $s->{c} eq '/' &&
$macIeCommentHackFlag) {
$macIeCommentHackFlag = 0;
_put($s, '/**/');
$s->{last} = '/';
}
} until (!defined($s->{b}) || ($s->{a} eq '*' && $s->{b} eq '/'));
if (defined($s->{b})) { # $s->{a} is asterisk and $s->{b} is forward slash
action2($s); # the *
$s->{a} = ' '; # the /
skipWhitespace($s);
}
else {
die 'unterminated comment, stopped';
}
}
elsif ($s->{a} eq '\'' || $s->{a} eq '"') {
putLiteral($s);
if (defined($s->{a}) && isWhitespace($s->{a})) {
preserveWhitespace($s); # can this be skipWhitespace?
}
}
elsif (isPrefix($s->{a})) {
action1($s);
skipWhitespace($s);
}
else { # anything else just prints
action1($s);
if (defined($s->{a}) && isWhitespace($s->{a})) {
preserveWhitespace($s);
}
}
}
if (!defined($s->{outfile})) {
return $s->{output};
}
}
1;
... 但它不适用于多个选择器。所以这个:
#id h3,
#id tag {
property:value;
}
tag1,
tag2,
tag3 {
property:value;
}
转换为:
#id h3,
#id tag{property:value;}tag1,
tag2,
tag3{property:value;}
如您所见,换行符(在#id h3 之后)保持原样,但它不应该保持原样。
我应该添加什么才能完成这项工作。
谢谢!
最佳答案
您应该能够简单地修改 isInfix 函数:
# whitespace characters before or after these characters can be removed.
sub isInfix {
my $x = shift;
return ($x eq '{' || $x eq '}' || $x eq ';' || $x eq ':' || $x eq ',');
}
关于css - Minifier 无法识别回车,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8860001/
我的 js 文件中有这样的行 console.log('FunctionName()'); 默认的 Ajax Minifier 设置不会从 .min.js 输出中删除这些行。 我在这个讨论中注意到一个
我使用 uglifyJS 缩小了 Javascript 和 CSS 文件,磁盘上的文件大小已大大减小。但在使用 Chrome 开发者工具检查网络选项卡中加载资源的总时间时,我发现没有区别。那么缩小真的
我正在探索将单个流文件传输到自定义处理器中的两个或多个关系的选项,我在文档中没有找到任何帮助,NIFI 支持此功能吗? 示例代码: session.transfer(flowFile, REL_SUC
我有一个 JS 文件,我正试图缩小它,但它遇到了一些问题。这是文件: $(document).ready(function () { function DisplayMessage(message,
我能找到的几乎所有 CSS 压缩器基本上都是去除空格的正则表达式。有没有更聪明的 CSS 压缩器?比如合并相似的选择器/属性等? 最佳答案 您可以在 Google 上搜索“CSS 优化器”或“CSS
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improv
我正在使用这个压缩器: #!/usr/bin/perl use Getopt::Std; use strict; my %opts; getopts('f:t:h', \%opts) || usage
我正在尝试编写一个可用于根据文件类型缩小 html、css 和 js 的 minify 函数。我想将现有的 gulp 插件用于这 3 个缩小过程来进行实际的缩小。我遇到的问题是我不知道如何在单个黑胶唱
我正在努力成为一个好男孩,并且用口香糖最小化我的css。我目前正在使用gulp-sass(不是gulp-ruby-sass),它似乎没有内置的缩小功能。所以现在我正在使用gulp-minify-css
我想使用 Laravel Elixir 来缩小我的 css/files 文件。但我不想使用混合方法并将它们合并。我想要的只是从我原来的“custom.js”生成一个“custom.min.js”文件。
有没有办法告诉 UglifyJS 跳过特定的代码部分,也许使用这样的注释: // uglifyjs:skipStart filter = function(item){ /* some crazy f
我是 jquery 新手,我可以用它进行简单的编码。我想更多地了解这些文件“缩小”“未压缩”以及何时应该使用每个文件? 最佳答案 每个文件的缩小版本和压缩版本只是在具有相同功能的情况下缩小尺寸的版本。
可以在不添加 -min 后缀的情况下缩小 js 文件吗? 我想保留原来的名字。 gulp.task("js-external-release", function() { gulp.src(c
在 page1.html 上说我需要 mootools.js 和 main.js ......我猜这些工具应该生成一个缩小的 js 文件(比如 min1.js)。 然后在 page2.html 我需要
我最近从 require.js 迁移到 webpack,并且一些 node_module 内置了 .min 文件。当我使用 node_module 中的文件时,我只做 require('my-modu
我正在使用 libman.json 将客户端库从 cdnjs 拉到我项目的一个文件夹中。然后我想将这些库捆绑并缩小到一个 js 文件中,该文件将在 Web 应用程序中部署和引用。为此,我使用了一个名为
我下载了 cordova-minify 插件,它可以压缩我的 Cordova 应用程序 javascript 代码。我尝试运行命令: cordova build browser 我明白了 cordov
我正在构建一个 angular2 应用程序,并开始进行我的构建/缩小过程。我可以使用未缩小的单个 JS 文件在开发模式下成功构建和运行我的应用程序。但是,当我将它们构建为单个串联文件时,我的应用程序将
Minify对我来说工作正常,但在更改其中一个源文件后,我收到一个空白页面。刷新页面不会改变任何东西。没有缓存的刷新(Strg + F5)解决了这个问题。在没有缓存的情况下刷新一次后,我可以返回使用缓
我经常看到“缩小”这个词,但我似乎从未选择过“缩小”的脚本(即来自 jQuery 插件),但我想我应该这样做。如果我是对的,缩小意味着在不改变其功能的情况下从源代码中删除所有不必要的东西,那么为什么我
我是一名优秀的程序员,十分优秀!