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,157 @@
|
|
1
|
+
<?php
|
2
|
+
/**
|
3
|
+
* Class Minify_ImportProcessor
|
4
|
+
* @package Minify
|
5
|
+
*/
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Linearize a CSS/JS file by including content specified by CSS import
|
9
|
+
* declarations. In CSS files, relative URIs are fixed.
|
10
|
+
*
|
11
|
+
* @imports will be processed regardless of where they appear in the source
|
12
|
+
* files; i.e. @imports commented out or in string content will still be
|
13
|
+
* processed!
|
14
|
+
*
|
15
|
+
* This has a unit test but should be considered "experimental".
|
16
|
+
*
|
17
|
+
* @package Minify
|
18
|
+
* @author Stephen Clay <steve@mrclay.org>
|
19
|
+
*/
|
20
|
+
class Minify_ImportProcessor {
|
21
|
+
|
22
|
+
public static $filesIncluded = array();
|
23
|
+
|
24
|
+
public static function process($file)
|
25
|
+
{
|
26
|
+
self::$filesIncluded = array();
|
27
|
+
self::$_isCss = (strtolower(substr($file, -4)) === '.css');
|
28
|
+
$obj = new Minify_ImportProcessor(dirname($file));
|
29
|
+
return $obj->_getContent($file);
|
30
|
+
}
|
31
|
+
|
32
|
+
// allows callback funcs to know the current directory
|
33
|
+
private $_currentDir = null;
|
34
|
+
|
35
|
+
// allows _importCB to write the fetched content back to the obj
|
36
|
+
private $_importedContent = '';
|
37
|
+
|
38
|
+
private static $_isCss = null;
|
39
|
+
|
40
|
+
private function __construct($currentDir)
|
41
|
+
{
|
42
|
+
$this->_currentDir = $currentDir;
|
43
|
+
}
|
44
|
+
|
45
|
+
private function _getContent($file)
|
46
|
+
{
|
47
|
+
$file = realpath($file);
|
48
|
+
if (! $file
|
49
|
+
|| in_array($file, self::$filesIncluded)
|
50
|
+
|| false === ($content = @file_get_contents($file))
|
51
|
+
) {
|
52
|
+
// file missing, already included, or failed read
|
53
|
+
return '';
|
54
|
+
}
|
55
|
+
self::$filesIncluded[] = realpath($file);
|
56
|
+
$this->_currentDir = dirname($file);
|
57
|
+
|
58
|
+
// remove UTF-8 BOM if present
|
59
|
+
if (pack("CCC",0xef,0xbb,0xbf) === substr($content, 0, 3)) {
|
60
|
+
$content = substr($content, 3);
|
61
|
+
}
|
62
|
+
// ensure uniform EOLs
|
63
|
+
$content = str_replace("\r\n", "\n", $content);
|
64
|
+
|
65
|
+
// process @imports
|
66
|
+
$content = preg_replace_callback(
|
67
|
+
'/
|
68
|
+
@import\\s+
|
69
|
+
(?:url\\(\\s*)? # maybe url(
|
70
|
+
[\'"]? # maybe quote
|
71
|
+
(.*?) # 1 = URI
|
72
|
+
[\'"]? # maybe end quote
|
73
|
+
(?:\\s*\\))? # maybe )
|
74
|
+
([a-zA-Z,\\s]*)? # 2 = media list
|
75
|
+
; # end token
|
76
|
+
/x'
|
77
|
+
,array($this, '_importCB')
|
78
|
+
,$content
|
79
|
+
);
|
80
|
+
|
81
|
+
if (self::$_isCss) {
|
82
|
+
// rewrite remaining relative URIs
|
83
|
+
$content = preg_replace_callback(
|
84
|
+
'/url\\(\\s*([^\\)\\s]+)\\s*\\)/'
|
85
|
+
,array($this, '_urlCB')
|
86
|
+
,$content
|
87
|
+
);
|
88
|
+
}
|
89
|
+
|
90
|
+
return $this->_importedContent . $content;
|
91
|
+
}
|
92
|
+
|
93
|
+
private function _importCB($m)
|
94
|
+
{
|
95
|
+
$url = $m[1];
|
96
|
+
$mediaList = preg_replace('/\\s+/', '', $m[2]);
|
97
|
+
|
98
|
+
if (strpos($url, '://') > 0) {
|
99
|
+
// protocol, leave in place for CSS, comment for JS
|
100
|
+
return self::$_isCss
|
101
|
+
? $m[0]
|
102
|
+
: "/* Minify_ImportProcessor will not include remote content */";
|
103
|
+
}
|
104
|
+
if ('/' === $url[0]) {
|
105
|
+
// protocol-relative or root path
|
106
|
+
$url = ltrim($url, '/');
|
107
|
+
$file = realpath($_SERVER['DOCUMENT_ROOT']) . DIRECTORY_SEPARATOR
|
108
|
+
. strtr($url, '/', DIRECTORY_SEPARATOR);
|
109
|
+
} else {
|
110
|
+
// relative to current path
|
111
|
+
$file = $this->_currentDir . DIRECTORY_SEPARATOR
|
112
|
+
. strtr($url, '/', DIRECTORY_SEPARATOR);
|
113
|
+
}
|
114
|
+
$obj = new Minify_ImportProcessor(dirname($file));
|
115
|
+
$content = $obj->_getContent($file);
|
116
|
+
if ('' === $content) {
|
117
|
+
// failed. leave in place for CSS, comment for JS
|
118
|
+
return self::$_isCss
|
119
|
+
? $m[0]
|
120
|
+
: "/* Minify_ImportProcessor could not fetch '{$file}' */";;
|
121
|
+
}
|
122
|
+
return (!self::$_isCss || preg_match('@(?:^$|\\ball\\b)@', $mediaList))
|
123
|
+
? $content
|
124
|
+
: "@media {$mediaList} {\n{$content}\n}\n";
|
125
|
+
}
|
126
|
+
|
127
|
+
private function _urlCB($m)
|
128
|
+
{
|
129
|
+
// $m[1] is either quoted or not
|
130
|
+
$quote = ($m[1][0] === "'" || $m[1][0] === '"')
|
131
|
+
? $m[1][0]
|
132
|
+
: '';
|
133
|
+
$url = ($quote === '')
|
134
|
+
? $m[1]
|
135
|
+
: substr($m[1], 1, strlen($m[1]) - 2);
|
136
|
+
if ('/' !== $url[0]) {
|
137
|
+
if (strpos($url, '//') > 0) {
|
138
|
+
// probably starts with protocol, do not alter
|
139
|
+
} else {
|
140
|
+
// prepend path with current dir separator (OS-independent)
|
141
|
+
$path = $this->_currentDir
|
142
|
+
. DIRECTORY_SEPARATOR . strtr($url, '/', DIRECTORY_SEPARATOR);
|
143
|
+
// strip doc root
|
144
|
+
$path = substr($path, strlen(realpath($_SERVER['DOCUMENT_ROOT'])));
|
145
|
+
// fix to absolute URL
|
146
|
+
$url = strtr($path, '/\\', '//');
|
147
|
+
// remove /./ and /../ where possible
|
148
|
+
$url = str_replace('/./', '/', $url);
|
149
|
+
// inspired by patch from Oleg Cherniy
|
150
|
+
do {
|
151
|
+
$url = preg_replace('@/[^/]+/\\.\\./@', '/', $url, 1, $changed);
|
152
|
+
} while ($changed);
|
153
|
+
}
|
154
|
+
}
|
155
|
+
return "url({$quote}{$url}{$quote})";
|
156
|
+
}
|
157
|
+
}
|
@@ -0,0 +1,131 @@
|
|
1
|
+
<?php
|
2
|
+
/**
|
3
|
+
* Class Minify_Lines
|
4
|
+
* @package Minify
|
5
|
+
*/
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Add line numbers in C-style comments for easier debugging of combined content
|
9
|
+
*
|
10
|
+
* @package Minify
|
11
|
+
* @author Stephen Clay <steve@mrclay.org>
|
12
|
+
* @author Adam Pedersen (Issue 55 fix)
|
13
|
+
*/
|
14
|
+
class Minify_Lines {
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Add line numbers in C-style comments
|
18
|
+
*
|
19
|
+
* This uses a very basic parser easily fooled by comment tokens inside
|
20
|
+
* strings or regexes, but, otherwise, generally clean code will not be
|
21
|
+
* mangled. URI rewriting can also be performed.
|
22
|
+
*
|
23
|
+
* @param string $content
|
24
|
+
*
|
25
|
+
* @param array $options available options:
|
26
|
+
*
|
27
|
+
* 'id': (optional) string to identify file. E.g. file name/path
|
28
|
+
*
|
29
|
+
* 'currentDir': (default null) if given, this is assumed to be the
|
30
|
+
* directory of the current CSS file. Using this, minify will rewrite
|
31
|
+
* all relative URIs in import/url declarations to correctly point to
|
32
|
+
* the desired files, and prepend a comment with debugging information about
|
33
|
+
* this process.
|
34
|
+
*
|
35
|
+
* @return string
|
36
|
+
*/
|
37
|
+
public static function minify($content, $options = array())
|
38
|
+
{
|
39
|
+
$id = (isset($options['id']) && $options['id'])
|
40
|
+
? $options['id']
|
41
|
+
: '';
|
42
|
+
$content = str_replace("\r\n", "\n", $content);
|
43
|
+
$lines = explode("\n", $content);
|
44
|
+
$numLines = count($lines);
|
45
|
+
// determine left padding
|
46
|
+
$padTo = strlen($numLines);
|
47
|
+
$inComment = false;
|
48
|
+
$i = 0;
|
49
|
+
$newLines = array();
|
50
|
+
while (null !== ($line = array_shift($lines))) {
|
51
|
+
if (('' !== $id) && (0 == $i % 50)) {
|
52
|
+
array_push($newLines, '', "/* {$id} */", '');
|
53
|
+
}
|
54
|
+
++$i;
|
55
|
+
$newLines[] = self::_addNote($line, $i, $inComment, $padTo);
|
56
|
+
$inComment = self::_eolInComment($line, $inComment);
|
57
|
+
}
|
58
|
+
$content = implode("\n", $newLines) . "\n";
|
59
|
+
|
60
|
+
// check for desired URI rewriting
|
61
|
+
if (isset($options['currentDir'])) {
|
62
|
+
require_once 'Minify/CSS/UriRewriter.php';
|
63
|
+
Minify_CSS_UriRewriter::$debugText = '';
|
64
|
+
$content = Minify_CSS_UriRewriter::rewrite(
|
65
|
+
$content
|
66
|
+
,$options['currentDir']
|
67
|
+
,isset($options['docRoot']) ? $options['docRoot'] : $_SERVER['DOCUMENT_ROOT']
|
68
|
+
,isset($options['symlinks']) ? $options['symlinks'] : array()
|
69
|
+
);
|
70
|
+
$content = "/* Minify_CSS_UriRewriter::\$debugText\n\n"
|
71
|
+
. Minify_CSS_UriRewriter::$debugText . "*/\n"
|
72
|
+
. $content;
|
73
|
+
}
|
74
|
+
|
75
|
+
return $content;
|
76
|
+
}
|
77
|
+
|
78
|
+
/**
|
79
|
+
* Is the parser within a C-style comment at the end of this line?
|
80
|
+
*
|
81
|
+
* @param string $line current line of code
|
82
|
+
*
|
83
|
+
* @param bool $inComment was the parser in a comment at the
|
84
|
+
* beginning of the line?
|
85
|
+
*
|
86
|
+
* @return bool
|
87
|
+
*/
|
88
|
+
private static function _eolInComment($line, $inComment)
|
89
|
+
{
|
90
|
+
while (strlen($line)) {
|
91
|
+
$search = $inComment
|
92
|
+
? '*/'
|
93
|
+
: '/*';
|
94
|
+
$pos = strpos($line, $search);
|
95
|
+
if (false === $pos) {
|
96
|
+
return $inComment;
|
97
|
+
} else {
|
98
|
+
if ($pos == 0
|
99
|
+
|| ($inComment
|
100
|
+
? substr($line, $pos, 3)
|
101
|
+
: substr($line, $pos-1, 3)) != '*/*')
|
102
|
+
{
|
103
|
+
$inComment = ! $inComment;
|
104
|
+
}
|
105
|
+
$line = substr($line, $pos + 2);
|
106
|
+
}
|
107
|
+
}
|
108
|
+
return $inComment;
|
109
|
+
}
|
110
|
+
|
111
|
+
/**
|
112
|
+
* Prepend a comment (or note) to the given line
|
113
|
+
*
|
114
|
+
* @param string $line current line of code
|
115
|
+
*
|
116
|
+
* @param string $note content of note/comment
|
117
|
+
*
|
118
|
+
* @param bool $inComment was the parser in a comment at the
|
119
|
+
* beginning of the line?
|
120
|
+
*
|
121
|
+
* @param int $padTo minimum width of comment
|
122
|
+
*
|
123
|
+
* @return string
|
124
|
+
*/
|
125
|
+
private static function _addNote($line, $note, $inComment, $padTo)
|
126
|
+
{
|
127
|
+
return $inComment
|
128
|
+
? '/* ' . str_pad($note, $padTo, ' ', STR_PAD_RIGHT) . ' *| ' . $line
|
129
|
+
: '/* ' . str_pad($note, $padTo, ' ', STR_PAD_RIGHT) . ' */ ' . $line;
|
130
|
+
}
|
131
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
<?php
|
2
|
+
/**
|
3
|
+
* Class Minify_Logger
|
4
|
+
* @package Minify
|
5
|
+
*/
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Message logging class
|
9
|
+
*
|
10
|
+
* @package Minify
|
11
|
+
* @author Stephen Clay <steve@mrclay.org>
|
12
|
+
*/
|
13
|
+
class Minify_Logger {
|
14
|
+
|
15
|
+
/**
|
16
|
+
* Set logger object.
|
17
|
+
*
|
18
|
+
* The object should have a method "log" that accepts a value as 1st argument and
|
19
|
+
* an optional string label as the 2nd.
|
20
|
+
*
|
21
|
+
* @param mixed $obj or a "falsey" value to disable
|
22
|
+
* @return null
|
23
|
+
*/
|
24
|
+
public static function setLogger($obj = null) {
|
25
|
+
self::$_logger = $obj
|
26
|
+
? $obj
|
27
|
+
: null;
|
28
|
+
}
|
29
|
+
|
30
|
+
/**
|
31
|
+
* Pass a message to the logger (if set)
|
32
|
+
*
|
33
|
+
* @param string $msg message to log
|
34
|
+
* @return null
|
35
|
+
*/
|
36
|
+
public static function log($msg, $label = 'Minify') {
|
37
|
+
if (! self::$_logger) return;
|
38
|
+
self::$_logger->log($msg, $label);
|
39
|
+
}
|
40
|
+
|
41
|
+
/**
|
42
|
+
* @var mixed logger object (like FirePHP) or null (i.e. no logger available)
|
43
|
+
*/
|
44
|
+
private static $_logger = null;
|
45
|
+
}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<?php
|
2
|
+
/**
|
3
|
+
* Class Minify_Packer
|
4
|
+
*
|
5
|
+
* To use this class you must first download the PHP port of Packer
|
6
|
+
* and place the file "class.JavaScriptPacker.php" in /lib (or your
|
7
|
+
* include_path).
|
8
|
+
* @link http://joliclic.free.fr/php/javascript-packer/en/
|
9
|
+
*
|
10
|
+
* Be aware that, as long as HTTP encoding is used, scripts minified with JSMin
|
11
|
+
* will provide better client-side performance, as they need not be unpacked in
|
12
|
+
* client-side code.
|
13
|
+
*
|
14
|
+
* @package Minify
|
15
|
+
*/
|
16
|
+
|
17
|
+
if (false === (@include 'class.JavaScriptPacker.php')) {
|
18
|
+
trigger_error(
|
19
|
+
'The script "class.JavaScriptPacker.php" is required. Please see: http:'
|
20
|
+
.'//code.google.com/p/minify/source/browse/trunk/min/lib/Minify/Packer.php'
|
21
|
+
,E_USER_ERROR
|
22
|
+
);
|
23
|
+
}
|
24
|
+
|
25
|
+
/**
|
26
|
+
* Minify Javascript using Dean Edward's Packer
|
27
|
+
*
|
28
|
+
* @package Minify
|
29
|
+
*/
|
30
|
+
class Minify_Packer {
|
31
|
+
public static function minify($code, $options = array())
|
32
|
+
{
|
33
|
+
// @todo: set encoding options based on $options :)
|
34
|
+
$packer = new JavascriptPacker($code, 'Normal', true, false);
|
35
|
+
return trim($packer->pack());
|
36
|
+
}
|
37
|
+
}
|
@@ -0,0 +1,187 @@
|
|
1
|
+
<?php
|
2
|
+
/**
|
3
|
+
* Class Minify_Source
|
4
|
+
* @package Minify
|
5
|
+
*/
|
6
|
+
|
7
|
+
/**
|
8
|
+
* A content source to be minified by Minify.
|
9
|
+
*
|
10
|
+
* This allows per-source minification options and the mixing of files with
|
11
|
+
* content from other sources.
|
12
|
+
*
|
13
|
+
* @package Minify
|
14
|
+
* @author Stephen Clay <steve@mrclay.org>
|
15
|
+
*/
|
16
|
+
class Minify_Source {
|
17
|
+
|
18
|
+
/**
|
19
|
+
* @var int time of last modification
|
20
|
+
*/
|
21
|
+
public $lastModified = null;
|
22
|
+
|
23
|
+
/**
|
24
|
+
* @var callback minifier function specifically for this source.
|
25
|
+
*/
|
26
|
+
public $minifier = null;
|
27
|
+
|
28
|
+
/**
|
29
|
+
* @var array minification options specific to this source.
|
30
|
+
*/
|
31
|
+
public $minifyOptions = null;
|
32
|
+
|
33
|
+
/**
|
34
|
+
* @var string full path of file
|
35
|
+
*/
|
36
|
+
public $filepath = null;
|
37
|
+
|
38
|
+
/**
|
39
|
+
* @var string HTTP Content Type (Minify requires one of the constants Minify::TYPE_*)
|
40
|
+
*/
|
41
|
+
public $contentType = null;
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Create a Minify_Source
|
45
|
+
*
|
46
|
+
* In the $spec array(), you can either provide a 'filepath' to an existing
|
47
|
+
* file (existence will not be checked!) or give 'id' (unique string for
|
48
|
+
* the content), 'content' (the string content) and 'lastModified'
|
49
|
+
* (unixtime of last update).
|
50
|
+
*
|
51
|
+
* As a shortcut, the controller will replace "//" at the beginning
|
52
|
+
* of a filepath with $_SERVER['DOCUMENT_ROOT'] . '/'.
|
53
|
+
*
|
54
|
+
* @param array $spec options
|
55
|
+
*/
|
56
|
+
public function __construct($spec)
|
57
|
+
{
|
58
|
+
if (isset($spec['filepath'])) {
|
59
|
+
if (0 === strpos($spec['filepath'], '//')) {
|
60
|
+
$spec['filepath'] = $_SERVER['DOCUMENT_ROOT'] . substr($spec['filepath'], 1);
|
61
|
+
}
|
62
|
+
$segments = explode('.', $spec['filepath']);
|
63
|
+
$ext = strtolower(array_pop($segments));
|
64
|
+
switch ($ext) {
|
65
|
+
case 'js' : $this->contentType = 'application/x-javascript';
|
66
|
+
break;
|
67
|
+
case 'css' : $this->contentType = 'text/css';
|
68
|
+
break;
|
69
|
+
case 'htm' : // fallthrough
|
70
|
+
case 'html' : $this->contentType = 'text/html';
|
71
|
+
break;
|
72
|
+
}
|
73
|
+
$this->filepath = $spec['filepath'];
|
74
|
+
$this->_id = $spec['filepath'];
|
75
|
+
$this->lastModified = filemtime($spec['filepath'])
|
76
|
+
// offset for Windows uploaders with out of sync clocks
|
77
|
+
+ round(Minify::$uploaderHoursBehind * 3600);
|
78
|
+
} elseif (isset($spec['id'])) {
|
79
|
+
$this->_id = 'id::' . $spec['id'];
|
80
|
+
if (isset($spec['content'])) {
|
81
|
+
$this->_content = $spec['content'];
|
82
|
+
} else {
|
83
|
+
$this->_getContentFunc = $spec['getContentFunc'];
|
84
|
+
}
|
85
|
+
$this->lastModified = isset($spec['lastModified'])
|
86
|
+
? $spec['lastModified']
|
87
|
+
: time();
|
88
|
+
}
|
89
|
+
if (isset($spec['contentType'])) {
|
90
|
+
$this->contentType = $spec['contentType'];
|
91
|
+
}
|
92
|
+
if (isset($spec['minifier'])) {
|
93
|
+
$this->minifier = $spec['minifier'];
|
94
|
+
}
|
95
|
+
if (isset($spec['minifyOptions'])) {
|
96
|
+
$this->minifyOptions = $spec['minifyOptions'];
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
/**
|
101
|
+
* Get content
|
102
|
+
*
|
103
|
+
* @return string
|
104
|
+
*/
|
105
|
+
public function getContent()
|
106
|
+
{
|
107
|
+
$content = (null !== $this->filepath)
|
108
|
+
? file_get_contents($this->filepath)
|
109
|
+
: ((null !== $this->_content)
|
110
|
+
? $this->_content
|
111
|
+
: call_user_func($this->_getContentFunc, $this->_id)
|
112
|
+
);
|
113
|
+
// remove UTF-8 BOM if present
|
114
|
+
return (pack("CCC",0xef,0xbb,0xbf) === substr($content, 0, 3))
|
115
|
+
? substr($content, 3)
|
116
|
+
: $content;
|
117
|
+
}
|
118
|
+
|
119
|
+
/**
|
120
|
+
* Get id
|
121
|
+
*
|
122
|
+
* @return string
|
123
|
+
*/
|
124
|
+
public function getId()
|
125
|
+
{
|
126
|
+
return $this->_id;
|
127
|
+
}
|
128
|
+
|
129
|
+
/**
|
130
|
+
* Verifies a single minification call can handle all sources
|
131
|
+
*
|
132
|
+
* @param array $sources Minify_Source instances
|
133
|
+
*
|
134
|
+
* @return bool true iff there no sources with specific minifier preferences.
|
135
|
+
*/
|
136
|
+
public static function haveNoMinifyPrefs($sources)
|
137
|
+
{
|
138
|
+
foreach ($sources as $source) {
|
139
|
+
if (null !== $source->minifier
|
140
|
+
|| null !== $source->minifyOptions) {
|
141
|
+
return false;
|
142
|
+
}
|
143
|
+
}
|
144
|
+
return true;
|
145
|
+
}
|
146
|
+
|
147
|
+
/**
|
148
|
+
* Get unique string for a set of sources
|
149
|
+
*
|
150
|
+
* @param array $sources Minify_Source instances
|
151
|
+
*
|
152
|
+
* @return string
|
153
|
+
*/
|
154
|
+
public static function getDigest($sources)
|
155
|
+
{
|
156
|
+
foreach ($sources as $source) {
|
157
|
+
$info[] = array(
|
158
|
+
$source->_id, $source->minifier, $source->minifyOptions
|
159
|
+
);
|
160
|
+
}
|
161
|
+
return md5(serialize($info));
|
162
|
+
}
|
163
|
+
|
164
|
+
/**
|
165
|
+
* Get content type from a group of sources
|
166
|
+
*
|
167
|
+
* This is called if the user doesn't pass in a 'contentType' options
|
168
|
+
*
|
169
|
+
* @param array $sources Minify_Source instances
|
170
|
+
*
|
171
|
+
* @return string content type. e.g. 'text/css'
|
172
|
+
*/
|
173
|
+
public static function getContentType($sources)
|
174
|
+
{
|
175
|
+
foreach ($sources as $source) {
|
176
|
+
if ($source->contentType !== null) {
|
177
|
+
return $source->contentType;
|
178
|
+
}
|
179
|
+
}
|
180
|
+
return 'text/plain';
|
181
|
+
}
|
182
|
+
|
183
|
+
protected $_content = null;
|
184
|
+
protected $_getContentFunc = null;
|
185
|
+
protected $_id = null;
|
186
|
+
}
|
187
|
+
|