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,132 @@
1
+ <?php
2
+ /**
3
+ * Class Minify_Controller_MinApp
4
+ * @package Minify
5
+ */
6
+
7
+ require_once 'Minify/Controller/Base.php';
8
+
9
+ /**
10
+ * Controller class for requests to /min/index.php
11
+ *
12
+ * @package Minify
13
+ * @author Stephen Clay <steve@mrclay.org>
14
+ */
15
+ class Minify_Controller_MinApp extends Minify_Controller_Base {
16
+
17
+ /**
18
+ * Set up groups of files as sources
19
+ *
20
+ * @param array $options controller and Minify options
21
+ * @return array Minify options
22
+ *
23
+ */
24
+ public function setupSources($options) {
25
+ // filter controller options
26
+ $cOptions = array_merge(
27
+ array(
28
+ 'allowDirs' => '//'
29
+ ,'groupsOnly' => false
30
+ ,'groups' => array()
31
+ ,'maxFiles' => 10
32
+ )
33
+ ,(isset($options['minApp']) ? $options['minApp'] : array())
34
+ );
35
+ unset($options['minApp']);
36
+ $sources = array();
37
+ if (isset($_GET['g'])) {
38
+ // try groups
39
+ if (! isset($cOptions['groups'][$_GET['g']])) {
40
+ $this->log("A group configuration for \"{$_GET['g']}\" was not set");
41
+ return $options;
42
+ }
43
+
44
+ $files = $cOptions['groups'][$_GET['g']];
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
+ foreach ($files as $file) {
52
+ if ($file instanceof Minify_Source) {
53
+ $sources[] = $file;
54
+ continue;
55
+ }
56
+ if (0 === strpos($file, '//')) {
57
+ $file = $_SERVER['DOCUMENT_ROOT'] . substr($file, 1);
58
+ }
59
+ $file = realpath($file);
60
+ if (is_file($file)) {
61
+ $sources[] = new Minify_Source(array(
62
+ 'filepath' => $file
63
+ ));
64
+ } else {
65
+ $this->log("The path \"{$file}\" could not be found (or was not a file)");
66
+ return $options;
67
+ }
68
+ }
69
+ } elseif (! $cOptions['groupsOnly'] && isset($_GET['f'])) {
70
+ // try user files
71
+ // The following restrictions are to limit the URLs that minify will
72
+ // respond to. Ideally there should be only one way to reference a file.
73
+ if (// verify at least one file, files are single comma separated,
74
+ // and are all same extension
75
+ ! preg_match('/^[^,]+\\.(css|js)(?:,[^,]+\\.\\1)*$/', $_GET['f'])
76
+ // no "//"
77
+ || strpos($_GET['f'], '//') !== false
78
+ // no "\"
79
+ || strpos($_GET['f'], '\\') !== false
80
+ // no "./"
81
+ || preg_match('/(?:^|[^\\.])\\.\\//', $_GET['f'])
82
+ ) {
83
+ $this->log("GET param 'f' invalid (see MinApp.php line 63)");
84
+ return $options;
85
+ }
86
+ $files = explode(',', $_GET['f']);
87
+ if (count($files) > $cOptions['maxFiles'] || $files != array_unique($files)) {
88
+ $this->log("Too many or duplicate files specified");
89
+ return $options;
90
+ }
91
+ if (isset($_GET['b'])) {
92
+ // check for validity
93
+ if (preg_match('@^[^/]+(?:/[^/]+)*$@', $_GET['b'])
94
+ && false === strpos($_GET['b'], '..')
95
+ && $_GET['b'] !== '.') {
96
+ // valid base
97
+ $base = "/{$_GET['b']}/";
98
+ } else {
99
+ $this->log("GET param 'b' invalid (see MinApp.php line 84)");
100
+ return $options;
101
+ }
102
+ } else {
103
+ $base = '/';
104
+ }
105
+ $allowDirs = array();
106
+ foreach ((array)$cOptions['allowDirs'] as $allowDir) {
107
+ $allowDirs[] = realpath(str_replace('//', $_SERVER['DOCUMENT_ROOT'] . '/', $allowDir));
108
+ }
109
+ foreach ($files as $file) {
110
+ $path = $_SERVER['DOCUMENT_ROOT'] . $base . $file;
111
+ $file = realpath($path);
112
+ if (false === $file) {
113
+ $this->log("Path \"{$path}\" failed realpath()");
114
+ return $options;
115
+ } elseif (! parent::_fileIsSafe($file, $allowDirs)) {
116
+ $this->log("Path \"{$path}\" failed Minify_Controller_Base::_fileIsSafe()");
117
+ return $options;
118
+ } else {
119
+ $sources[] = new Minify_Source(array(
120
+ 'filepath' => $file
121
+ ));
122
+ }
123
+ }
124
+ }
125
+ if ($sources) {
126
+ $this->sources = $sources;
127
+ } else {
128
+ $this->log("No sources to serve");
129
+ }
130
+ return $options;
131
+ }
132
+ }
@@ -0,0 +1,82 @@
1
+ <?php
2
+ /**
3
+ * Class Minify_Controller_Page
4
+ * @package Minify
5
+ */
6
+
7
+ require_once 'Minify/Controller/Base.php';
8
+
9
+ /**
10
+ * Controller class for serving a single HTML page
11
+ *
12
+ * @link http://code.google.com/p/minify/source/browse/trunk/web/examples/1/index.php#59
13
+ * @package Minify
14
+ * @author Stephen Clay <steve@mrclay.org>
15
+ */
16
+ class Minify_Controller_Page extends Minify_Controller_Base {
17
+
18
+ /**
19
+ * Set up source of HTML content
20
+ *
21
+ * @param array $options controller and Minify options
22
+ * @return array Minify options
23
+ *
24
+ * Controller options:
25
+ *
26
+ * 'content': (required) HTML markup
27
+ *
28
+ * 'id': (required) id of page (string for use in server-side caching)
29
+ *
30
+ * 'lastModifiedTime': timestamp of when this content changed. This
31
+ * is recommended to allow both server and client-side caching.
32
+ *
33
+ * 'minifyAll': should all CSS and Javascript blocks be individually
34
+ * minified? (default false)
35
+ *
36
+ * @todo Add 'file' option to read HTML file.
37
+ */
38
+ public function setupSources($options) {
39
+ if (isset($options['file'])) {
40
+ $sourceSpec = array(
41
+ 'filepath' => $options['file']
42
+ );
43
+ } else {
44
+ // strip controller options
45
+ $sourceSpec = array(
46
+ 'content' => $options['content']
47
+ ,'id' => $options['id']
48
+ );
49
+ unset($options['content'], $options['id']);
50
+ }
51
+ if (isset($options['minifyAll'])) {
52
+ // this will be the 2nd argument passed to Minify_HTML::minify()
53
+ $sourceSpec['minifyOptions'] = array(
54
+ 'cssMinifier' => array('Minify_CSS', 'minify')
55
+ ,'jsMinifier' => array('JSMin', 'minify')
56
+ );
57
+ $this->_loadCssJsMinifiers = true;
58
+ unset($options['minifyAll']);
59
+ }
60
+ $this->sources[] = new Minify_Source($sourceSpec);
61
+
62
+ $options['contentType'] = Minify::TYPE_HTML;
63
+ return $options;
64
+ }
65
+
66
+ protected $_loadCssJsMinifiers = false;
67
+
68
+ /**
69
+ * @see Minify_Controller_Base::loadMinifier()
70
+ */
71
+ public function loadMinifier($minifierCallback)
72
+ {
73
+ if ($this->_loadCssJsMinifiers) {
74
+ // Minify will not call for these so we must manually load
75
+ // them when Minify/HTML.php is called for.
76
+ require_once 'Minify/CSS.php';
77
+ require_once 'JSMin.php';
78
+ }
79
+ parent::loadMinifier($minifierCallback); // load Minify/HTML.php
80
+ }
81
+ }
82
+
@@ -0,0 +1,118 @@
1
+ <?php
2
+ /**
3
+ * Class Minify_Controller_Version1
4
+ * @package Minify
5
+ */
6
+
7
+ require_once 'Minify/Controller/Base.php';
8
+
9
+ /**
10
+ * Controller class for emulating version 1 of minify.php
11
+ *
12
+ * <code>
13
+ * Minify::serve('Version1');
14
+ * </code>
15
+ *
16
+ * @package Minify
17
+ * @author Stephen Clay <steve@mrclay.org>
18
+ */
19
+ class Minify_Controller_Version1 extends Minify_Controller_Base {
20
+
21
+ /**
22
+ * Set up groups of files as sources
23
+ *
24
+ * @param array $options controller and Minify options
25
+ * @return array Minify options
26
+ *
27
+ */
28
+ public function setupSources($options) {
29
+ self::_setupDefines();
30
+ if (MINIFY_USE_CACHE) {
31
+ $cacheDir = defined('MINIFY_CACHE_DIR')
32
+ ? MINIFY_CACHE_DIR
33
+ : '';
34
+ Minify::setCache($cacheDir);
35
+ }
36
+ $options['badRequestHeader'] = 'HTTP/1.0 404 Not Found';
37
+ $options['contentTypeCharset'] = MINIFY_ENCODING;
38
+
39
+ // The following restrictions are to limit the URLs that minify will
40
+ // respond to. Ideally there should be only one way to reference a file.
41
+ if (! isset($_GET['files'])
42
+ // verify at least one file, files are single comma separated,
43
+ // and are all same extension
44
+ || ! preg_match('/^[^,]+\\.(css|js)(,[^,]+\\.\\1)*$/', $_GET['files'], $m)
45
+ // no "//" (makes URL rewriting easier)
46
+ || strpos($_GET['files'], '//') !== false
47
+ // no "\"
48
+ || strpos($_GET['files'], '\\') !== false
49
+ // no "./"
50
+ || preg_match('/(?:^|[^\\.])\\.\\//', $_GET['files'])
51
+ ) {
52
+ return $options;
53
+ }
54
+ $extension = $m[1];
55
+
56
+ $files = explode(',', $_GET['files']);
57
+ if (count($files) > MINIFY_MAX_FILES) {
58
+ return $options;
59
+ }
60
+
61
+ // strings for prepending to relative/absolute paths
62
+ $prependRelPaths = dirname($_SERVER['SCRIPT_FILENAME'])
63
+ . DIRECTORY_SEPARATOR;
64
+ $prependAbsPaths = $_SERVER['DOCUMENT_ROOT'];
65
+
66
+ $sources = array();
67
+ $goodFiles = array();
68
+ $hasBadSource = false;
69
+
70
+ $allowDirs = isset($options['allowDirs'])
71
+ ? $options['allowDirs']
72
+ : MINIFY_BASE_DIR;
73
+
74
+ foreach ($files as $file) {
75
+ // prepend appropriate string for abs/rel paths
76
+ $file = ($file[0] === '/' ? $prependAbsPaths : $prependRelPaths) . $file;
77
+ // make sure a real file!
78
+ $file = realpath($file);
79
+ // don't allow unsafe or duplicate files
80
+ if (parent::_fileIsSafe($file, $allowDirs)
81
+ && !in_array($file, $goodFiles))
82
+ {
83
+ $goodFiles[] = $file;
84
+ $srcOptions = array(
85
+ 'filepath' => $file
86
+ );
87
+ $this->sources[] = new Minify_Source($srcOptions);
88
+ } else {
89
+ $hasBadSource = true;
90
+ break;
91
+ }
92
+ }
93
+ if ($hasBadSource) {
94
+ $this->sources = array();
95
+ }
96
+ if (! MINIFY_REWRITE_CSS_URLS) {
97
+ $options['rewriteCssUris'] = false;
98
+ }
99
+ return $options;
100
+ }
101
+
102
+ private static function _setupDefines()
103
+ {
104
+ $defaults = array(
105
+ 'MINIFY_BASE_DIR' => realpath($_SERVER['DOCUMENT_ROOT'])
106
+ ,'MINIFY_ENCODING' => 'utf-8'
107
+ ,'MINIFY_MAX_FILES' => 16
108
+ ,'MINIFY_REWRITE_CSS_URLS' => true
109
+ ,'MINIFY_USE_CACHE' => true
110
+ );
111
+ foreach ($defaults as $const => $val) {
112
+ if (! defined($const)) {
113
+ define($const, $val);
114
+ }
115
+ }
116
+ }
117
+ }
118
+
@@ -0,0 +1,245 @@
1
+ <?php
2
+ /**
3
+ * Class Minify_HTML
4
+ * @package Minify
5
+ */
6
+
7
+ /**
8
+ * Compress HTML
9
+ *
10
+ * This is a heavy regex-based removal of whitespace, unnecessary comments and
11
+ * tokens. IE conditional comments are preserved. There are also options to have
12
+ * STYLE and SCRIPT blocks compressed by callback functions.
13
+ *
14
+ * A test suite is available.
15
+ *
16
+ * @package Minify
17
+ * @author Stephen Clay <steve@mrclay.org>
18
+ */
19
+ class Minify_HTML {
20
+
21
+ /**
22
+ * "Minify" an HTML page
23
+ *
24
+ * @param string $html
25
+ *
26
+ * @param array $options
27
+ *
28
+ * 'cssMinifier' : (optional) callback function to process content of STYLE
29
+ * elements.
30
+ *
31
+ * 'jsMinifier' : (optional) callback function to process content of SCRIPT
32
+ * elements. Note: the type attribute is ignored.
33
+ *
34
+ * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If
35
+ * unset, minify will sniff for an XHTML doctype.
36
+ *
37
+ * @return string
38
+ */
39
+ public static function minify($html, $options = array()) {
40
+ $min = new Minify_HTML($html, $options);
41
+ return $min->process();
42
+ }
43
+
44
+
45
+ /**
46
+ * Create a minifier object
47
+ *
48
+ * @param string $html
49
+ *
50
+ * @param array $options
51
+ *
52
+ * 'cssMinifier' : (optional) callback function to process content of STYLE
53
+ * elements.
54
+ *
55
+ * 'jsMinifier' : (optional) callback function to process content of SCRIPT
56
+ * elements. Note: the type attribute is ignored.
57
+ *
58
+ * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If
59
+ * unset, minify will sniff for an XHTML doctype.
60
+ *
61
+ * @return null
62
+ */
63
+ public function __construct($html, $options = array())
64
+ {
65
+ $this->_html = str_replace("\r\n", "\n", trim($html));
66
+ if (isset($options['xhtml'])) {
67
+ $this->_isXhtml = (bool)$options['xhtml'];
68
+ }
69
+ if (isset($options['cssMinifier'])) {
70
+ $this->_cssMinifier = $options['cssMinifier'];
71
+ }
72
+ if (isset($options['jsMinifier'])) {
73
+ $this->_jsMinifier = $options['jsMinifier'];
74
+ }
75
+ }
76
+
77
+
78
+ /**
79
+ * Minify the markeup given in the constructor
80
+ *
81
+ * @return string
82
+ */
83
+ public function process()
84
+ {
85
+ if ($this->_isXhtml === null) {
86
+ $this->_isXhtml = (false !== strpos($this->_html, '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML'));
87
+ }
88
+
89
+ $this->_replacementHash = 'MINIFYHTML' . md5($_SERVER['REQUEST_TIME']);
90
+ $this->_placeholders = array();
91
+
92
+ // replace SCRIPTs (and minify) with placeholders
93
+ $this->_html = preg_replace_callback(
94
+ '/(\\s*)(<script\\b[^>]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i'
95
+ ,array($this, '_removeScriptCB')
96
+ ,$this->_html);
97
+
98
+ // replace STYLEs (and minify) with placeholders
99
+ $this->_html = preg_replace_callback(
100
+ '/\\s*(<style\\b[^>]*?>)([\\s\\S]*?)<\\/style>\\s*/i'
101
+ ,array($this, '_removeStyleCB')
102
+ ,$this->_html);
103
+
104
+ // remove HTML comments (not containing IE conditional comments).
105
+ $this->_html = preg_replace_callback(
106
+ '/<!--([\\s\\S]*?)-->/'
107
+ ,array($this, '_commentCB')
108
+ ,$this->_html);
109
+
110
+ // replace PREs with placeholders
111
+ $this->_html = preg_replace_callback('/\\s*(<pre\\b[^>]*?>[\\s\\S]*?<\\/pre>)\\s*/i'
112
+ ,array($this, '_removePreCB')
113
+ ,$this->_html);
114
+
115
+ // replace TEXTAREAs with placeholders
116
+ $this->_html = preg_replace_callback(
117
+ '/\\s*(<textarea\\b[^>]*?>[\\s\\S]*?<\\/textarea>)\\s*/i'
118
+ ,array($this, '_removeTextareaCB')
119
+ ,$this->_html);
120
+
121
+ // trim each line.
122
+ // @todo take into account attribute values that span multiple lines.
123
+ $this->_html = preg_replace('/^\\s+|\\s+$/m', '', $this->_html);
124
+
125
+ // remove ws around block/undisplayed elements
126
+ $this->_html = preg_replace('/\\s+(<\\/?(?:area|base(?:font)?|blockquote|body'
127
+ .'|caption|center|cite|col(?:group)?|dd|dir|div|dl|dt|fieldset|form'
128
+ .'|frame(?:set)?|h[1-6]|head|hr|html|legend|li|link|map|menu|meta'
129
+ .'|ol|opt(?:group|ion)|p|param|t(?:able|body|head|d|h||r|foot|itle)'
130
+ .'|ul)\\b[^>]*>)/i', '$1', $this->_html);
131
+
132
+ // remove ws outside of all elements
133
+ $this->_html = preg_replace_callback(
134
+ '/>([^<]+)</'
135
+ ,array($this, '_outsideTagCB')
136
+ ,$this->_html);
137
+
138
+ // use newlines before 1st attribute in open tags (to limit line lengths)
139
+ $this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/i', "$1\n$2", $this->_html);
140
+
141
+ // fill placeholders
142
+ $this->_html = str_replace(
143
+ array_keys($this->_placeholders)
144
+ ,array_values($this->_placeholders)
145
+ ,$this->_html
146
+ );
147
+ return $this->_html;
148
+ }
149
+
150
+ protected function _commentCB($m)
151
+ {
152
+ return (0 === strpos($m[1], '[') || false !== strpos($m[1], '<!['))
153
+ ? $m[0]
154
+ : '';
155
+ }
156
+
157
+ protected function _reservePlace($content)
158
+ {
159
+ $placeholder = '%' . $this->_replacementHash . count($this->_placeholders) . '%';
160
+ $this->_placeholders[$placeholder] = $content;
161
+ return $placeholder;
162
+ }
163
+
164
+ protected $_isXhtml = null;
165
+ protected $_replacementHash = null;
166
+ protected $_placeholders = array();
167
+ protected $_cssMinifier = null;
168
+ protected $_jsMinifier = null;
169
+
170
+ protected function _outsideTagCB($m)
171
+ {
172
+ return '>' . preg_replace('/^\\s+|\\s+$/', ' ', $m[1]) . '<';
173
+ }
174
+
175
+ protected function _removePreCB($m)
176
+ {
177
+ return $this->_reservePlace($m[1]);
178
+ }
179
+
180
+ protected function _removeTextareaCB($m)
181
+ {
182
+ return $this->_reservePlace($m[1]);
183
+ }
184
+
185
+ protected function _removeStyleCB($m)
186
+ {
187
+ $openStyle = $m[1];
188
+ $css = $m[2];
189
+ // remove HTML comments
190
+ $css = preg_replace('/(?:^\\s*<!--|-->\\s*$)/', '', $css);
191
+
192
+ // remove CDATA section markers
193
+ $css = $this->_removeCdata($css);
194
+
195
+ // minify
196
+ $minifier = $this->_cssMinifier
197
+ ? $this->_cssMinifier
198
+ : 'trim';
199
+ $css = call_user_func($minifier, $css);
200
+
201
+ return $this->_reservePlace($this->_needsCdata($css)
202
+ ? "{$openStyle}/*<![CDATA[*/{$css}/*]]>*/</style>"
203
+ : "{$openStyle}{$css}</style>"
204
+ );
205
+ }
206
+
207
+ protected function _removeScriptCB($m)
208
+ {
209
+ $openScript = $m[2];
210
+ $js = $m[3];
211
+
212
+ // whitespace surrounding? preserve at least one space
213
+ $ws1 = ($m[1] === '') ? '' : ' ';
214
+ $ws2 = ($m[4] === '') ? '' : ' ';
215
+
216
+ // remove HTML comments (and ending "//" if present)
217
+ $js = preg_replace('/(?:^\\s*<!--\\s*|\\s*(?:\\/\\/)?\\s*-->\\s*$)/', '', $js);
218
+
219
+ // remove CDATA section markers
220
+ $js = $this->_removeCdata($js);
221
+
222
+ // minify
223
+ $minifier = $this->_jsMinifier
224
+ ? $this->_jsMinifier
225
+ : 'trim';
226
+ $js = call_user_func($minifier, $js);
227
+
228
+ return $this->_reservePlace($this->_needsCdata($js)
229
+ ? "{$ws1}{$openScript}/*<![CDATA[*/{$js}/*]]>*/</script>{$ws2}"
230
+ : "{$ws1}{$openScript}{$js}</script>{$ws2}"
231
+ );
232
+ }
233
+
234
+ protected function _removeCdata($str)
235
+ {
236
+ return (false !== strpos($str, '<![CDATA['))
237
+ ? str_replace(array('<![CDATA[', ']]>'), '', $str)
238
+ : $str;
239
+ }
240
+
241
+ protected function _needsCdata($str)
242
+ {
243
+ return ($this->_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/', $str));
244
+ }
245
+ }