bixbite 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+