bixbite 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +20 -0
- data/README.markdown +49 -0
- data/VERSION +1 -0
- data/bin/bixbite +73 -0
- data/lib/bixbite.rb +13 -0
- data/lib/bixbite/command.rb +14 -0
- data/lib/bixbite/create.rb +76 -0
- data/template/Rakefile +25 -0
- data/template/assets/bixbite/Rakefile.rb +297 -0
- data/template/assets/naturaldocs/NaturalDocs/Config/Languages.txt +286 -0
- data/template/assets/naturaldocs/NaturalDocs/Config/Topics.txt +382 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/customizinglanguages.html +52 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/customizingtopics.html +74 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/documenting.html +58 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/documenting/reference.html +146 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/documenting/walkthrough.html +180 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/example/Default.css +528 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/example/NaturalDocs.js +204 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/examples.css +90 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/background.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/leftside.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/logo.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overbody.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overbodybg.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overleftmargin.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overmenu.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overmenubg.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/header/rightside.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/logo.gif +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/about.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/background.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/bottomleft.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/bottomright.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/community.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/customizing.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/using.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/index.html +9 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/javascript/BrowserStyles.js +77 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/javascript/PNGHandling.js +72 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/keywords.html +38 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/languages.html +32 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/menu.html +79 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/output.html +84 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/running.html +40 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/styles.css +290 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/styles.html +52 -0
- data/template/assets/naturaldocs/NaturalDocs/Help/troubleshooting.html +18 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/CSSGuide.txt +947 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/File Parsing.txt +83 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/HTMLTestCases.pm +269 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/Languages.txt +107 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/NDMarkup.txt +91 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/Symbol Management.txt +59 -0
- data/template/assets/naturaldocs/NaturalDocs/Info/images/Logo.png +0 -0
- data/template/assets/naturaldocs/NaturalDocs/JavaScript/NaturalDocs.js +836 -0
- data/template/assets/naturaldocs/NaturalDocs/License-GPL.txt +341 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/BinaryFile.pm +294 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder.pm +280 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/Base.pm +348 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/FramedHTML.pm +345 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/HTML.pm +398 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/HTMLBase.pm +3693 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ClassHierarchy.pm +860 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ClassHierarchy/Class.pm +412 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ClassHierarchy/File.pm +157 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ConfigFile.pm +497 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Constants.pm +165 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/DefineMembers.pm +100 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Error.pm +305 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/File.pm +540 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ImageReferenceTable.pm +383 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ImageReferenceTable/Reference.pm +44 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ImageReferenceTable/String.pm +110 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages.pm +1475 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/ActionScript.pm +1473 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Ada.pm +38 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Advanced.pm +828 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Advanced/Scope.pm +95 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Advanced/ScopeChange.pm +70 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Base.pm +832 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/CSharp.pm +1484 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/PLSQL.pm +319 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Pascal.pm +143 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Perl.pm +1370 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Prototype.pm +92 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Prototype/Parameter.pm +87 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Simple.pm +503 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Tcl.pm +219 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Menu.pm +3406 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Menu/Entry.pm +201 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/NDMarkup.pm +76 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser.pm +1331 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser/JavaDoc.pm +464 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser/Native.pm +1060 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser/ParsedTopic.pm +253 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Project.pm +1402 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Project/ImageFile.pm +160 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Project/SourceFile.pm +113 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ReferenceString.pm +334 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Settings.pm +1418 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Settings/BuildTarget.pm +66 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB.pm +678 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/Extension.pm +84 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/File.pm +129 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/Item.pm +201 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/ItemDefinition.pm +45 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/WatchedFileDefinitions.pm +159 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/StatusMessage.pm +102 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolString.pm +212 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable.pm +1984 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/File.pm +186 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/IndexElement.pm +522 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/Reference.pm +273 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/ReferenceTarget.pm +97 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/Symbol.pm +428 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/SymbolDefinition.pm +96 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Topics.pm +1319 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Topics/Type.pm +151 -0
- data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Version.pm +384 -0
- data/template/assets/naturaldocs/NaturalDocs/NaturalDocs +400 -0
- data/template/assets/naturaldocs/NaturalDocs/NaturalDocs.bat +17 -0
- data/template/assets/naturaldocs/NaturalDocs/Styles/Default.css +767 -0
- data/template/assets/naturaldocs/NaturalDocs/Styles/Roman.css +765 -0
- data/template/assets/naturaldocs/NaturalDocs/Styles/Small.css +763 -0
- data/template/assets/utilities/pngout +0 -0
- data/template/deploy/public_html/.htaccess +0 -0
- data/template/documentation/js/.htaccess +0 -0
- data/template/src/html/.htaccess +76 -0
- data/template/src/html/css/cmn/global.css +96 -0
- data/template/src/html/css/cmn/ie.css +15 -0
- data/template/src/html/css/cmn/ie6.css +15 -0
- data/template/src/html/images/cmn/.htaccess +0 -0
- data/template/src/html/images/tmp/.htaccess +0 -0
- data/template/src/html/includes/debug.inc +5 -0
- data/template/src/html/includes/footer.inc +52 -0
- data/template/src/html/includes/header.inc +61 -0
- data/template/src/html/includes/html.inc +3 -0
- data/template/src/html/includes/namespace.inc +19 -0
- data/template/src/html/includes/page.inc +151 -0
- data/template/src/html/index.html +35 -0
- data/template/src/html/js/cmn/bootstrap.js +74 -0
- data/template/src/html/js/cmn/global.js +142 -0
- data/template/src/html/js/cmn/lib/LAB.js +348 -0
- data/template/src/html/min/.htaccess +4 -0
- data/template/src/html/min/MinifyCLI.php +19 -0
- data/template/src/html/min/README.txt +132 -0
- data/template/src/html/min/builder/_index.js +242 -0
- data/template/src/html/min/builder/bm.js +36 -0
- data/template/src/html/min/builder/index.php +182 -0
- data/template/src/html/min/builder/ocCheck.php +36 -0
- data/template/src/html/min/builder/rewriteTest.js +1 -0
- data/template/src/html/min/config.php +187 -0
- data/template/src/html/min/groupsConfig.php +34 -0
- data/template/src/html/min/index.php +66 -0
- data/template/src/html/min/lib/FirePHP.php +1370 -0
- data/template/src/html/min/lib/HTTP/ConditionalGet.php +348 -0
- data/template/src/html/min/lib/HTTP/Encoder.php +326 -0
- data/template/src/html/min/lib/JSMin.php +314 -0
- data/template/src/html/min/lib/JSMinPlus.php +1872 -0
- data/template/src/html/min/lib/Minify.php +532 -0
- data/template/src/html/min/lib/Minify/Build.php +103 -0
- data/template/src/html/min/lib/Minify/CSS.php +83 -0
- data/template/src/html/min/lib/Minify/CSS/Compressor.php +250 -0
- data/template/src/html/min/lib/Minify/CSS/UriRewriter.php +270 -0
- data/template/src/html/min/lib/Minify/Cache/APC.php +130 -0
- data/template/src/html/min/lib/Minify/Cache/File.php +125 -0
- data/template/src/html/min/lib/Minify/Cache/Memcache.php +137 -0
- data/template/src/html/min/lib/Minify/ClosureCompiler.php +85 -0
- data/template/src/html/min/lib/Minify/CommentPreserver.php +90 -0
- data/template/src/html/min/lib/Minify/Controller/Base.php +202 -0
- data/template/src/html/min/lib/Minify/Controller/Files.php +78 -0
- data/template/src/html/min/lib/Minify/Controller/Groups.php +94 -0
- data/template/src/html/min/lib/Minify/Controller/MinApp.php +132 -0
- data/template/src/html/min/lib/Minify/Controller/Page.php +82 -0
- data/template/src/html/min/lib/Minify/Controller/Version1.php +118 -0
- data/template/src/html/min/lib/Minify/HTML.php +245 -0
- data/template/src/html/min/lib/Minify/ImportProcessor.php +157 -0
- data/template/src/html/min/lib/Minify/Lines.php +131 -0
- data/template/src/html/min/lib/Minify/Logger.php +45 -0
- data/template/src/html/min/lib/Minify/Packer.php +37 -0
- data/template/src/html/min/lib/Minify/Source.php +187 -0
- data/template/src/html/min/lib/Minify/YUICompressor.php +139 -0
- data/template/src/html/min/lib/Solar/Dir.php +199 -0
- data/template/src/html/min/lib/closure-compiler.jar +0 -0
- data/template/src/html/min/lib/yuicompressor-2.4.2.jar +0 -0
- data/template/src/html/min/utils.php +90 -0
- data/template/src/templates/css/template.css +7 -0
- data/template/src/templates/js/template.js +72 -0
- data/template/src/templates/template.html +18 -0
- data/template/src/yaml/config.yml +46 -0
- data/template/src/yaml/deploy.yml +35 -0
- data/test/bixbite_test.rb +7 -0
- data/test/test_helper.rb +10 -0
- metadata +278 -0
@@ -0,0 +1,90 @@
|
|
1
|
+
<?php
|
2
|
+
/**
|
3
|
+
* Class Minify_CommentPreserver
|
4
|
+
* @package Minify
|
5
|
+
*/
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Process a string in pieces preserving C-style comments that begin with "/*!"
|
9
|
+
*
|
10
|
+
* @package Minify
|
11
|
+
* @author Stephen Clay <steve@mrclay.org>
|
12
|
+
*/
|
13
|
+
class Minify_CommentPreserver {
|
14
|
+
|
15
|
+
/**
|
16
|
+
* String to be prepended to each preserved comment
|
17
|
+
*
|
18
|
+
* @var string
|
19
|
+
*/
|
20
|
+
public static $prepend = "\n";
|
21
|
+
|
22
|
+
/**
|
23
|
+
* String to be appended to each preserved comment
|
24
|
+
*
|
25
|
+
* @var string
|
26
|
+
*/
|
27
|
+
public static $append = "\n";
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Process a string outside of C-style comments that begin with "/*!"
|
31
|
+
*
|
32
|
+
* On each non-empty string outside these comments, the given processor
|
33
|
+
* function will be called. The first "!" will be removed from the
|
34
|
+
* preserved comments, and the comments will be surrounded by
|
35
|
+
* Minify_CommentPreserver::$preprend and Minify_CommentPreserver::$append.
|
36
|
+
*
|
37
|
+
* @param string $content
|
38
|
+
* @param callback $processor function
|
39
|
+
* @param array $args array of extra arguments to pass to the processor
|
40
|
+
* function (default = array())
|
41
|
+
* @return string
|
42
|
+
*/
|
43
|
+
public static function process($content, $processor, $args = array())
|
44
|
+
{
|
45
|
+
$ret = '';
|
46
|
+
while (true) {
|
47
|
+
list($beforeComment, $comment, $afterComment) = self::_nextComment($content);
|
48
|
+
if ('' !== $beforeComment) {
|
49
|
+
$callArgs = $args;
|
50
|
+
array_unshift($callArgs, $beforeComment);
|
51
|
+
$ret .= call_user_func_array($processor, $callArgs);
|
52
|
+
}
|
53
|
+
if (false === $comment) {
|
54
|
+
break;
|
55
|
+
}
|
56
|
+
$ret .= $comment;
|
57
|
+
$content = $afterComment;
|
58
|
+
}
|
59
|
+
return $ret;
|
60
|
+
}
|
61
|
+
|
62
|
+
/**
|
63
|
+
* Extract comments that YUI Compressor preserves.
|
64
|
+
*
|
65
|
+
* @param string $in input
|
66
|
+
*
|
67
|
+
* @return array 3 elements are returned. If a YUI comment is found, the
|
68
|
+
* 2nd element is the comment and the 1st and 2nd are the surrounding
|
69
|
+
* strings. If no comment is found, the entire string is returned as the
|
70
|
+
* 1st element and the other two are false.
|
71
|
+
*/
|
72
|
+
private static function _nextComment($in)
|
73
|
+
{
|
74
|
+
if (
|
75
|
+
false === ($start = strpos($in, '/*!'))
|
76
|
+
|| false === ($end = strpos($in, '*/', $start + 3))
|
77
|
+
) {
|
78
|
+
return array($in, false, false);
|
79
|
+
}
|
80
|
+
$ret = array(
|
81
|
+
substr($in, 0, $start)
|
82
|
+
,self::$prepend . '/*' . substr($in, $start + 3, $end - $start - 1) . self::$append
|
83
|
+
);
|
84
|
+
$endChars = (strlen($in) - $end - 2);
|
85
|
+
$ret[] = (0 === $endChars)
|
86
|
+
? ''
|
87
|
+
: substr($in, -$endChars);
|
88
|
+
return $ret;
|
89
|
+
}
|
90
|
+
}
|
@@ -0,0 +1,202 @@
|
|
1
|
+
<?php
|
2
|
+
/**
|
3
|
+
* Class Minify_Controller_Base
|
4
|
+
* @package Minify
|
5
|
+
*/
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Base class for Minify controller
|
9
|
+
*
|
10
|
+
* The controller class validates a request and uses it to create sources
|
11
|
+
* for minification and set options like contentType. It's also responsible
|
12
|
+
* for loading minifier code upon request.
|
13
|
+
*
|
14
|
+
* @package Minify
|
15
|
+
* @author Stephen Clay <steve@mrclay.org>
|
16
|
+
*/
|
17
|
+
abstract class Minify_Controller_Base {
|
18
|
+
|
19
|
+
/**
|
20
|
+
* Setup controller sources and set an needed options for Minify::source
|
21
|
+
*
|
22
|
+
* You must override this method in your subclass controller to set
|
23
|
+
* $this->sources. If the request is NOT valid, make sure $this->sources
|
24
|
+
* is left an empty array. Then strip any controller-specific options from
|
25
|
+
* $options and return it. To serve files, $this->sources must be an array of
|
26
|
+
* Minify_Source objects.
|
27
|
+
*
|
28
|
+
* @param array $options controller and Minify options
|
29
|
+
*
|
30
|
+
* return array $options Minify::serve options
|
31
|
+
*/
|
32
|
+
abstract public function setupSources($options);
|
33
|
+
|
34
|
+
/**
|
35
|
+
* Get default Minify options for this controller.
|
36
|
+
*
|
37
|
+
* Override in subclass to change defaults
|
38
|
+
*
|
39
|
+
* @return array options for Minify
|
40
|
+
*/
|
41
|
+
public function getDefaultMinifyOptions() {
|
42
|
+
return array(
|
43
|
+
'isPublic' => true
|
44
|
+
,'encodeOutput' => function_exists('gzdeflate')
|
45
|
+
,'encodeMethod' => null // determine later
|
46
|
+
,'encodeLevel' => 9
|
47
|
+
,'minifierOptions' => array() // no minifier options
|
48
|
+
,'contentTypeCharset' => 'utf-8'
|
49
|
+
,'maxAge' => 1800 // 30 minutes
|
50
|
+
,'rewriteCssUris' => true
|
51
|
+
,'bubbleCssImports' => false
|
52
|
+
,'quiet' => false // serve() will send headers and output
|
53
|
+
,'debug' => false
|
54
|
+
|
55
|
+
// if you override this, the response code MUST be directly after
|
56
|
+
// the first space.
|
57
|
+
,'badRequestHeader' => 'HTTP/1.0 400 Bad Request'
|
58
|
+
|
59
|
+
// callback function to see/modify content of all sources
|
60
|
+
,'postprocessor' => null
|
61
|
+
// file to require to load preprocessor
|
62
|
+
,'postprocessorRequire' => null
|
63
|
+
);
|
64
|
+
}
|
65
|
+
|
66
|
+
/**
|
67
|
+
* Get default minifiers for this controller.
|
68
|
+
*
|
69
|
+
* Override in subclass to change defaults
|
70
|
+
*
|
71
|
+
* @return array minifier callbacks for common types
|
72
|
+
*/
|
73
|
+
public function getDefaultMinifers() {
|
74
|
+
$ret[Minify::TYPE_JS] = array('JSMin', 'minify');
|
75
|
+
$ret[Minify::TYPE_CSS] = array('Minify_CSS', 'minify');
|
76
|
+
$ret[Minify::TYPE_HTML] = array('Minify_HTML', 'minify');
|
77
|
+
return $ret;
|
78
|
+
}
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Load any code necessary to execute the given minifier callback.
|
82
|
+
*
|
83
|
+
* The controller is responsible for loading minification code on demand
|
84
|
+
* via this method. This built-in function will only load classes for
|
85
|
+
* static method callbacks where the class isn't already defined. It uses
|
86
|
+
* the PEAR convention, so, given array('Jimmy_Minifier', 'minCss'), this
|
87
|
+
* function will include 'Jimmy/Minifier.php'.
|
88
|
+
*
|
89
|
+
* If you need code loaded on demand and this doesn't suit you, you'll need
|
90
|
+
* to override this function in your subclass.
|
91
|
+
* @see Minify_Controller_Page::loadMinifier()
|
92
|
+
*
|
93
|
+
* @param callback $minifierCallback callback of minifier function
|
94
|
+
*
|
95
|
+
* @return null
|
96
|
+
*/
|
97
|
+
public function loadMinifier($minifierCallback)
|
98
|
+
{
|
99
|
+
if (is_array($minifierCallback)
|
100
|
+
&& is_string($minifierCallback[0])
|
101
|
+
&& !class_exists($minifierCallback[0], false)) {
|
102
|
+
|
103
|
+
require str_replace('_', '/', $minifierCallback[0]) . '.php';
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
107
|
+
/**
|
108
|
+
* Is a user-given file within an allowable directory, existing,
|
109
|
+
* and having an extension js/css/html/txt ?
|
110
|
+
*
|
111
|
+
* This is a convenience function for controllers that have to accept
|
112
|
+
* user-given paths
|
113
|
+
*
|
114
|
+
* @param string $file full file path (already processed by realpath())
|
115
|
+
*
|
116
|
+
* @param array $safeDirs directories where files are safe to serve. Files can also
|
117
|
+
* be in subdirectories of these directories.
|
118
|
+
*
|
119
|
+
* @return bool file is safe
|
120
|
+
*/
|
121
|
+
public static function _fileIsSafe($file, $safeDirs)
|
122
|
+
{
|
123
|
+
$pathOk = false;
|
124
|
+
foreach ((array)$safeDirs as $safeDir) {
|
125
|
+
if (strpos($file, $safeDir) === 0) {
|
126
|
+
$pathOk = true;
|
127
|
+
break;
|
128
|
+
}
|
129
|
+
}
|
130
|
+
$base = basename($file);
|
131
|
+
if (! $pathOk || ! is_file($file) || $base[0] === '.') {
|
132
|
+
return false;
|
133
|
+
}
|
134
|
+
list($revExt) = explode('.', strrev($base));
|
135
|
+
return in_array(strrev($revExt), array('js', 'css', 'html', 'txt'));
|
136
|
+
}
|
137
|
+
|
138
|
+
/**
|
139
|
+
* @var array instances of Minify_Source, which provide content and
|
140
|
+
* any individual minification needs.
|
141
|
+
*
|
142
|
+
* @see Minify_Source
|
143
|
+
*/
|
144
|
+
public $sources = array();
|
145
|
+
|
146
|
+
/**
|
147
|
+
* Mix in default controller options with user-given options
|
148
|
+
*
|
149
|
+
* @param array $options user options
|
150
|
+
*
|
151
|
+
* @return array mixed options
|
152
|
+
*/
|
153
|
+
public final function mixInDefaultOptions($options)
|
154
|
+
{
|
155
|
+
$ret = array_merge(
|
156
|
+
$this->getDefaultMinifyOptions(), $options
|
157
|
+
);
|
158
|
+
if (! isset($options['minifiers'])) {
|
159
|
+
$options['minifiers'] = array();
|
160
|
+
}
|
161
|
+
$ret['minifiers'] = array_merge(
|
162
|
+
$this->getDefaultMinifers(), $options['minifiers']
|
163
|
+
);
|
164
|
+
return $ret;
|
165
|
+
}
|
166
|
+
|
167
|
+
/**
|
168
|
+
* Analyze sources (if there are any) and set $options 'contentType'
|
169
|
+
* and 'lastModifiedTime' if they already aren't.
|
170
|
+
*
|
171
|
+
* @param array $options options for Minify
|
172
|
+
*
|
173
|
+
* @return array options for Minify
|
174
|
+
*/
|
175
|
+
public final function analyzeSources($options = array())
|
176
|
+
{
|
177
|
+
if ($this->sources) {
|
178
|
+
if (! isset($options['contentType'])) {
|
179
|
+
$options['contentType'] = Minify_Source::getContentType($this->sources);
|
180
|
+
}
|
181
|
+
// last modified is needed for caching, even if setExpires is set
|
182
|
+
if (! isset($options['lastModifiedTime'])) {
|
183
|
+
$max = 0;
|
184
|
+
foreach ($this->sources as $source) {
|
185
|
+
$max = max($source->lastModified, $max);
|
186
|
+
}
|
187
|
+
$options['lastModifiedTime'] = $max;
|
188
|
+
}
|
189
|
+
}
|
190
|
+
return $options;
|
191
|
+
}
|
192
|
+
|
193
|
+
/**
|
194
|
+
* Send message to the Minify logger
|
195
|
+
* @param string $msg
|
196
|
+
* @return null
|
197
|
+
*/
|
198
|
+
protected function log($msg) {
|
199
|
+
require_once 'Minify/Logger.php';
|
200
|
+
Minify_Logger::log($msg);
|
201
|
+
}
|
202
|
+
}
|
@@ -0,0 +1,78 @@
|
|
1
|
+
<?php
|
2
|
+
/**
|
3
|
+
* Class Minify_Controller_Files
|
4
|
+
* @package Minify
|
5
|
+
*/
|
6
|
+
|
7
|
+
require_once 'Minify/Controller/Base.php';
|
8
|
+
|
9
|
+
/**
|
10
|
+
* Controller class for minifying a set of files
|
11
|
+
*
|
12
|
+
* E.g. the following would serve the minified Javascript for a site
|
13
|
+
* <code>
|
14
|
+
* Minify::serve('Files', array(
|
15
|
+
* 'files' => array(
|
16
|
+
* '//js/jquery.js'
|
17
|
+
* ,'//js/plugins.js'
|
18
|
+
* ,'/home/username/file.js'
|
19
|
+
* )
|
20
|
+
* ));
|
21
|
+
* </code>
|
22
|
+
*
|
23
|
+
* As a shortcut, the controller will replace "//" at the beginning
|
24
|
+
* of a filename with $_SERVER['DOCUMENT_ROOT'] . '/'.
|
25
|
+
*
|
26
|
+
* @package Minify
|
27
|
+
* @author Stephen Clay <steve@mrclay.org>
|
28
|
+
*/
|
29
|
+
class Minify_Controller_Files extends Minify_Controller_Base {
|
30
|
+
|
31
|
+
/**
|
32
|
+
* Set up file sources
|
33
|
+
*
|
34
|
+
* @param array $options controller and Minify options
|
35
|
+
* @return array Minify options
|
36
|
+
*
|
37
|
+
* Controller options:
|
38
|
+
*
|
39
|
+
* 'files': (required) array of complete file paths, or a single path
|
40
|
+
*/
|
41
|
+
public function setupSources($options) {
|
42
|
+
// strip controller options
|
43
|
+
|
44
|
+
$files = $options['files'];
|
45
|
+
// if $files is a single object, casting will break it
|
46
|
+
if (is_object($files)) {
|
47
|
+
$files = array($files);
|
48
|
+
} elseif (! is_array($files)) {
|
49
|
+
$files = (array)$files;
|
50
|
+
}
|
51
|
+
unset($options['files']);
|
52
|
+
|
53
|
+
$sources = array();
|
54
|
+
foreach ($files as $file) {
|
55
|
+
if ($file instanceof Minify_Source) {
|
56
|
+
$sources[] = $file;
|
57
|
+
continue;
|
58
|
+
}
|
59
|
+
if (0 === strpos($file, '//')) {
|
60
|
+
$file = $_SERVER['DOCUMENT_ROOT'] . substr($file, 1);
|
61
|
+
}
|
62
|
+
$realPath = realpath($file);
|
63
|
+
if (is_file($realPath)) {
|
64
|
+
$sources[] = new Minify_Source(array(
|
65
|
+
'filepath' => $realPath
|
66
|
+
));
|
67
|
+
} else {
|
68
|
+
$this->log("The path \"{$file}\" could not be found (or was not a file)");
|
69
|
+
return $options;
|
70
|
+
}
|
71
|
+
}
|
72
|
+
if ($sources) {
|
73
|
+
$this->sources = $sources;
|
74
|
+
}
|
75
|
+
return $options;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
@@ -0,0 +1,94 @@
|
|
1
|
+
<?php
|
2
|
+
/**
|
3
|
+
* Class Minify_Controller_Groups
|
4
|
+
* @package Minify
|
5
|
+
*/
|
6
|
+
|
7
|
+
require_once 'Minify/Controller/Base.php';
|
8
|
+
|
9
|
+
/**
|
10
|
+
* Controller class for serving predetermined groups of minimized sets, selected
|
11
|
+
* by PATH_INFO
|
12
|
+
*
|
13
|
+
* <code>
|
14
|
+
* Minify::serve('Groups', array(
|
15
|
+
* 'groups' => array(
|
16
|
+
* 'css' => array('//css/type.css', '//css/layout.css')
|
17
|
+
* ,'js' => array('//js/jquery.js', '//js/site.js')
|
18
|
+
* )
|
19
|
+
* ));
|
20
|
+
* </code>
|
21
|
+
*
|
22
|
+
* If the above code were placed in /serve.php, it would enable the URLs
|
23
|
+
* /serve.php/js and /serve.php/css
|
24
|
+
*
|
25
|
+
* As a shortcut, the controller will replace "//" at the beginning
|
26
|
+
* of a filename with $_SERVER['DOCUMENT_ROOT'] . '/'.
|
27
|
+
*
|
28
|
+
* @package Minify
|
29
|
+
* @author Stephen Clay <steve@mrclay.org>
|
30
|
+
*/
|
31
|
+
class Minify_Controller_Groups extends Minify_Controller_Base {
|
32
|
+
|
33
|
+
/**
|
34
|
+
* Set up groups of files as sources
|
35
|
+
*
|
36
|
+
* @param array $options controller and Minify options
|
37
|
+
* @return array Minify options
|
38
|
+
*
|
39
|
+
* Controller options:
|
40
|
+
*
|
41
|
+
* 'groups': (required) array mapping PATH_INFO strings to arrays
|
42
|
+
* of complete file paths. @see Minify_Controller_Groups
|
43
|
+
*/
|
44
|
+
public function setupSources($options) {
|
45
|
+
// strip controller options
|
46
|
+
$groups = $options['groups'];
|
47
|
+
unset($options['groups']);
|
48
|
+
|
49
|
+
// mod_fcgid places PATH_INFO in ORIG_PATH_INFO
|
50
|
+
$pi = isset($_SERVER['ORIG_PATH_INFO'])
|
51
|
+
? substr($_SERVER['ORIG_PATH_INFO'], 1)
|
52
|
+
: (isset($_SERVER['PATH_INFO'])
|
53
|
+
? substr($_SERVER['PATH_INFO'], 1)
|
54
|
+
: false
|
55
|
+
);
|
56
|
+
if (false === $pi || ! isset($groups[$pi])) {
|
57
|
+
// no PATH_INFO or not a valid group
|
58
|
+
$this->log("Missing PATH_INFO or no group set for \"$pi\"");
|
59
|
+
return $options;
|
60
|
+
}
|
61
|
+
$sources = array();
|
62
|
+
|
63
|
+
$files = $groups[$pi];
|
64
|
+
// if $files is a single object, casting will break it
|
65
|
+
if (is_object($files)) {
|
66
|
+
$files = array($files);
|
67
|
+
} elseif (! is_array($files)) {
|
68
|
+
$files = (array)$files;
|
69
|
+
}
|
70
|
+
foreach ($files as $file) {
|
71
|
+
if ($file instanceof Minify_Source) {
|
72
|
+
$sources[] = $file;
|
73
|
+
continue;
|
74
|
+
}
|
75
|
+
if (0 === strpos($file, '//')) {
|
76
|
+
$file = $_SERVER['DOCUMENT_ROOT'] . substr($file, 1);
|
77
|
+
}
|
78
|
+
$realPath = realpath($file);
|
79
|
+
if (is_file($realPath)) {
|
80
|
+
$sources[] = new Minify_Source(array(
|
81
|
+
'filepath' => $realPath
|
82
|
+
));
|
83
|
+
} else {
|
84
|
+
$this->log("The path \"{$file}\" could not be found (or was not a file)");
|
85
|
+
return $options;
|
86
|
+
}
|
87
|
+
}
|
88
|
+
if ($sources) {
|
89
|
+
$this->sources = $sources;
|
90
|
+
}
|
91
|
+
return $options;
|
92
|
+
}
|
93
|
+
}
|
94
|
+
|