bixbite 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (194) hide show
  1. data/LICENSE +20 -0
  2. data/README.markdown +49 -0
  3. data/VERSION +1 -0
  4. data/bin/bixbite +73 -0
  5. data/lib/bixbite.rb +13 -0
  6. data/lib/bixbite/command.rb +14 -0
  7. data/lib/bixbite/create.rb +76 -0
  8. data/template/Rakefile +25 -0
  9. data/template/assets/bixbite/Rakefile.rb +297 -0
  10. data/template/assets/naturaldocs/NaturalDocs/Config/Languages.txt +286 -0
  11. data/template/assets/naturaldocs/NaturalDocs/Config/Topics.txt +382 -0
  12. data/template/assets/naturaldocs/NaturalDocs/Help/customizinglanguages.html +52 -0
  13. data/template/assets/naturaldocs/NaturalDocs/Help/customizingtopics.html +74 -0
  14. data/template/assets/naturaldocs/NaturalDocs/Help/documenting.html +58 -0
  15. data/template/assets/naturaldocs/NaturalDocs/Help/documenting/reference.html +146 -0
  16. data/template/assets/naturaldocs/NaturalDocs/Help/documenting/walkthrough.html +180 -0
  17. data/template/assets/naturaldocs/NaturalDocs/Help/example/Default.css +528 -0
  18. data/template/assets/naturaldocs/NaturalDocs/Help/example/NaturalDocs.js +204 -0
  19. data/template/assets/naturaldocs/NaturalDocs/Help/examples.css +90 -0
  20. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/background.png +0 -0
  21. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/leftside.png +0 -0
  22. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/logo.png +0 -0
  23. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overbody.png +0 -0
  24. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overbodybg.png +0 -0
  25. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overleftmargin.png +0 -0
  26. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overmenu.png +0 -0
  27. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/overmenubg.png +0 -0
  28. data/template/assets/naturaldocs/NaturalDocs/Help/images/header/rightside.png +0 -0
  29. data/template/assets/naturaldocs/NaturalDocs/Help/images/logo.gif +0 -0
  30. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/about.png +0 -0
  31. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/background.png +0 -0
  32. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/bottomleft.png +0 -0
  33. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/bottomright.png +0 -0
  34. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/community.png +0 -0
  35. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/customizing.png +0 -0
  36. data/template/assets/naturaldocs/NaturalDocs/Help/images/menu/using.png +0 -0
  37. data/template/assets/naturaldocs/NaturalDocs/Help/index.html +9 -0
  38. data/template/assets/naturaldocs/NaturalDocs/Help/javascript/BrowserStyles.js +77 -0
  39. data/template/assets/naturaldocs/NaturalDocs/Help/javascript/PNGHandling.js +72 -0
  40. data/template/assets/naturaldocs/NaturalDocs/Help/keywords.html +38 -0
  41. data/template/assets/naturaldocs/NaturalDocs/Help/languages.html +32 -0
  42. data/template/assets/naturaldocs/NaturalDocs/Help/menu.html +79 -0
  43. data/template/assets/naturaldocs/NaturalDocs/Help/output.html +84 -0
  44. data/template/assets/naturaldocs/NaturalDocs/Help/running.html +40 -0
  45. data/template/assets/naturaldocs/NaturalDocs/Help/styles.css +290 -0
  46. data/template/assets/naturaldocs/NaturalDocs/Help/styles.html +52 -0
  47. data/template/assets/naturaldocs/NaturalDocs/Help/troubleshooting.html +18 -0
  48. data/template/assets/naturaldocs/NaturalDocs/Info/CSSGuide.txt +947 -0
  49. data/template/assets/naturaldocs/NaturalDocs/Info/File Parsing.txt +83 -0
  50. data/template/assets/naturaldocs/NaturalDocs/Info/HTMLTestCases.pm +269 -0
  51. data/template/assets/naturaldocs/NaturalDocs/Info/Languages.txt +107 -0
  52. data/template/assets/naturaldocs/NaturalDocs/Info/NDMarkup.txt +91 -0
  53. data/template/assets/naturaldocs/NaturalDocs/Info/Symbol Management.txt +59 -0
  54. data/template/assets/naturaldocs/NaturalDocs/Info/images/Logo.png +0 -0
  55. data/template/assets/naturaldocs/NaturalDocs/JavaScript/NaturalDocs.js +836 -0
  56. data/template/assets/naturaldocs/NaturalDocs/License-GPL.txt +341 -0
  57. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/BinaryFile.pm +294 -0
  58. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder.pm +280 -0
  59. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/Base.pm +348 -0
  60. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/FramedHTML.pm +345 -0
  61. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/HTML.pm +398 -0
  62. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Builder/HTMLBase.pm +3693 -0
  63. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ClassHierarchy.pm +860 -0
  64. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ClassHierarchy/Class.pm +412 -0
  65. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ClassHierarchy/File.pm +157 -0
  66. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ConfigFile.pm +497 -0
  67. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Constants.pm +165 -0
  68. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/DefineMembers.pm +100 -0
  69. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Error.pm +305 -0
  70. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/File.pm +540 -0
  71. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ImageReferenceTable.pm +383 -0
  72. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ImageReferenceTable/Reference.pm +44 -0
  73. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ImageReferenceTable/String.pm +110 -0
  74. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages.pm +1475 -0
  75. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/ActionScript.pm +1473 -0
  76. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Ada.pm +38 -0
  77. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Advanced.pm +828 -0
  78. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Advanced/Scope.pm +95 -0
  79. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Advanced/ScopeChange.pm +70 -0
  80. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Base.pm +832 -0
  81. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/CSharp.pm +1484 -0
  82. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/PLSQL.pm +319 -0
  83. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Pascal.pm +143 -0
  84. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Perl.pm +1370 -0
  85. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Prototype.pm +92 -0
  86. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Prototype/Parameter.pm +87 -0
  87. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Simple.pm +503 -0
  88. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Languages/Tcl.pm +219 -0
  89. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Menu.pm +3406 -0
  90. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Menu/Entry.pm +201 -0
  91. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/NDMarkup.pm +76 -0
  92. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser.pm +1331 -0
  93. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser/JavaDoc.pm +464 -0
  94. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser/Native.pm +1060 -0
  95. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Parser/ParsedTopic.pm +253 -0
  96. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Project.pm +1402 -0
  97. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Project/ImageFile.pm +160 -0
  98. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Project/SourceFile.pm +113 -0
  99. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/ReferenceString.pm +334 -0
  100. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Settings.pm +1418 -0
  101. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Settings/BuildTarget.pm +66 -0
  102. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB.pm +678 -0
  103. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/Extension.pm +84 -0
  104. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/File.pm +129 -0
  105. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/Item.pm +201 -0
  106. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/ItemDefinition.pm +45 -0
  107. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SourceDB/WatchedFileDefinitions.pm +159 -0
  108. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/StatusMessage.pm +102 -0
  109. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolString.pm +212 -0
  110. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable.pm +1984 -0
  111. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/File.pm +186 -0
  112. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/IndexElement.pm +522 -0
  113. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/Reference.pm +273 -0
  114. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/ReferenceTarget.pm +97 -0
  115. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/Symbol.pm +428 -0
  116. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/SymbolTable/SymbolDefinition.pm +96 -0
  117. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Topics.pm +1319 -0
  118. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Topics/Type.pm +151 -0
  119. data/template/assets/naturaldocs/NaturalDocs/Modules/NaturalDocs/Version.pm +384 -0
  120. data/template/assets/naturaldocs/NaturalDocs/NaturalDocs +400 -0
  121. data/template/assets/naturaldocs/NaturalDocs/NaturalDocs.bat +17 -0
  122. data/template/assets/naturaldocs/NaturalDocs/Styles/Default.css +767 -0
  123. data/template/assets/naturaldocs/NaturalDocs/Styles/Roman.css +765 -0
  124. data/template/assets/naturaldocs/NaturalDocs/Styles/Small.css +763 -0
  125. data/template/assets/utilities/pngout +0 -0
  126. data/template/deploy/public_html/.htaccess +0 -0
  127. data/template/documentation/js/.htaccess +0 -0
  128. data/template/src/html/.htaccess +76 -0
  129. data/template/src/html/css/cmn/global.css +96 -0
  130. data/template/src/html/css/cmn/ie.css +15 -0
  131. data/template/src/html/css/cmn/ie6.css +15 -0
  132. data/template/src/html/images/cmn/.htaccess +0 -0
  133. data/template/src/html/images/tmp/.htaccess +0 -0
  134. data/template/src/html/includes/debug.inc +5 -0
  135. data/template/src/html/includes/footer.inc +52 -0
  136. data/template/src/html/includes/header.inc +61 -0
  137. data/template/src/html/includes/html.inc +3 -0
  138. data/template/src/html/includes/namespace.inc +19 -0
  139. data/template/src/html/includes/page.inc +151 -0
  140. data/template/src/html/index.html +35 -0
  141. data/template/src/html/js/cmn/bootstrap.js +74 -0
  142. data/template/src/html/js/cmn/global.js +142 -0
  143. data/template/src/html/js/cmn/lib/LAB.js +348 -0
  144. data/template/src/html/min/.htaccess +4 -0
  145. data/template/src/html/min/MinifyCLI.php +19 -0
  146. data/template/src/html/min/README.txt +132 -0
  147. data/template/src/html/min/builder/_index.js +242 -0
  148. data/template/src/html/min/builder/bm.js +36 -0
  149. data/template/src/html/min/builder/index.php +182 -0
  150. data/template/src/html/min/builder/ocCheck.php +36 -0
  151. data/template/src/html/min/builder/rewriteTest.js +1 -0
  152. data/template/src/html/min/config.php +187 -0
  153. data/template/src/html/min/groupsConfig.php +34 -0
  154. data/template/src/html/min/index.php +66 -0
  155. data/template/src/html/min/lib/FirePHP.php +1370 -0
  156. data/template/src/html/min/lib/HTTP/ConditionalGet.php +348 -0
  157. data/template/src/html/min/lib/HTTP/Encoder.php +326 -0
  158. data/template/src/html/min/lib/JSMin.php +314 -0
  159. data/template/src/html/min/lib/JSMinPlus.php +1872 -0
  160. data/template/src/html/min/lib/Minify.php +532 -0
  161. data/template/src/html/min/lib/Minify/Build.php +103 -0
  162. data/template/src/html/min/lib/Minify/CSS.php +83 -0
  163. data/template/src/html/min/lib/Minify/CSS/Compressor.php +250 -0
  164. data/template/src/html/min/lib/Minify/CSS/UriRewriter.php +270 -0
  165. data/template/src/html/min/lib/Minify/Cache/APC.php +130 -0
  166. data/template/src/html/min/lib/Minify/Cache/File.php +125 -0
  167. data/template/src/html/min/lib/Minify/Cache/Memcache.php +137 -0
  168. data/template/src/html/min/lib/Minify/ClosureCompiler.php +85 -0
  169. data/template/src/html/min/lib/Minify/CommentPreserver.php +90 -0
  170. data/template/src/html/min/lib/Minify/Controller/Base.php +202 -0
  171. data/template/src/html/min/lib/Minify/Controller/Files.php +78 -0
  172. data/template/src/html/min/lib/Minify/Controller/Groups.php +94 -0
  173. data/template/src/html/min/lib/Minify/Controller/MinApp.php +132 -0
  174. data/template/src/html/min/lib/Minify/Controller/Page.php +82 -0
  175. data/template/src/html/min/lib/Minify/Controller/Version1.php +118 -0
  176. data/template/src/html/min/lib/Minify/HTML.php +245 -0
  177. data/template/src/html/min/lib/Minify/ImportProcessor.php +157 -0
  178. data/template/src/html/min/lib/Minify/Lines.php +131 -0
  179. data/template/src/html/min/lib/Minify/Logger.php +45 -0
  180. data/template/src/html/min/lib/Minify/Packer.php +37 -0
  181. data/template/src/html/min/lib/Minify/Source.php +187 -0
  182. data/template/src/html/min/lib/Minify/YUICompressor.php +139 -0
  183. data/template/src/html/min/lib/Solar/Dir.php +199 -0
  184. data/template/src/html/min/lib/closure-compiler.jar +0 -0
  185. data/template/src/html/min/lib/yuicompressor-2.4.2.jar +0 -0
  186. data/template/src/html/min/utils.php +90 -0
  187. data/template/src/templates/css/template.css +7 -0
  188. data/template/src/templates/js/template.js +72 -0
  189. data/template/src/templates/template.html +18 -0
  190. data/template/src/yaml/config.yml +46 -0
  191. data/template/src/yaml/deploy.yml +35 -0
  192. data/test/bixbite_test.rb +7 -0
  193. data/test/test_helper.rb +10 -0
  194. 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
+