├── .gitignore ├── README.md ├── closure-compiler ├── COPYING ├── README └── compiler.jar ├── composer.json ├── samples ├── js │ ├── 1.9 │ │ └── jquery-1.9.1.js │ └── jquery-1.10.2.js ├── output │ └── .gitkeep └── sample.php ├── src └── tureki │ └── PhpCc.php └── tests └── .gitkeep /.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | 44 | # Build results 45 | 46 | [Dd]ebug/ 47 | [Rr]elease/ 48 | x64/ 49 | build/ 50 | [Bb]in/ 51 | [Oo]bj/ 52 | 53 | # MSTest test Results 54 | [Tt]est[Rr]esult*/ 55 | [Bb]uild[Ll]og.* 56 | 57 | *_i.c 58 | *_p.c 59 | *.ilk 60 | *.meta 61 | *.obj 62 | *.pch 63 | *.pdb 64 | *.pgc 65 | *.pgd 66 | *.rsp 67 | *.sbr 68 | *.tlb 69 | *.tli 70 | *.tlh 71 | *.tmp 72 | *.tmp_proj 73 | *.log 74 | *.vspscc 75 | *.vssscc 76 | .builds 77 | *.pidb 78 | *.log 79 | *.scc 80 | 81 | # Visual C++ cache files 82 | ipch/ 83 | *.aps 84 | *.ncb 85 | *.opensdf 86 | *.sdf 87 | *.cachefile 88 | 89 | # Visual Studio profiler 90 | *.psess 91 | *.vsp 92 | *.vspx 93 | 94 | # Guidance Automation Toolkit 95 | *.gpState 96 | 97 | # ReSharper is a .NET coding add-in 98 | _ReSharper*/ 99 | *.[Rr]e[Ss]harper 100 | 101 | # TeamCity is a build add-in 102 | _TeamCity* 103 | 104 | # DotCover is a Code Coverage Tool 105 | *.dotCover 106 | 107 | # NCrunch 108 | *.ncrunch* 109 | .*crunch*.local.xml 110 | 111 | # Installshield output folder 112 | [Ee]xpress/ 113 | 114 | # DocProject is a documentation generator add-in 115 | DocProject/buildhelp/ 116 | DocProject/Help/*.HxT 117 | DocProject/Help/*.HxC 118 | DocProject/Help/*.hhc 119 | DocProject/Help/*.hhk 120 | DocProject/Help/*.hhp 121 | DocProject/Help/Html2 122 | DocProject/Help/html 123 | 124 | # Click-Once directory 125 | publish/ 126 | 127 | # Publish Web Output 128 | *.Publish.xml 129 | *.pubxml 130 | 131 | # NuGet Packages Directory 132 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line 133 | #packages/ 134 | 135 | # Windows Azure Build Output 136 | csx 137 | *.build.csdef 138 | 139 | # Windows Store app package directory 140 | AppPackages/ 141 | 142 | # Others 143 | sql/ 144 | *.Cache 145 | ClientBin/ 146 | [Ss]tyle[Cc]op.* 147 | ~$* 148 | *~ 149 | *.dbmdl 150 | *.[Pp]ublish.xml 151 | *.pfx 152 | *.publishsettings 153 | 154 | # RIA/Silverlight projects 155 | Generated_Code/ 156 | 157 | # Backup & report files from converting an old project file to a newer 158 | # Visual Studio version. Backup files are not needed, because we have git ;-) 159 | _UpgradeReport_Files/ 160 | Backup*/ 161 | UpgradeLog*.XML 162 | UpgradeLog*.htm 163 | 164 | # SQL Server files 165 | App_Data/*.mdf 166 | App_Data/*.ldf 167 | 168 | ############# 169 | ## Windows detritus 170 | ############# 171 | 172 | # Windows image file caches 173 | Thumbs.db 174 | ehthumbs.db 175 | 176 | # Folder config file 177 | Desktop.ini 178 | 179 | # Recycle Bin used on file shares 180 | $RECYCLE.BIN/ 181 | 182 | # Mac crap 183 | .DS_Store 184 | 185 | 186 | ############# 187 | ## Python 188 | ############# 189 | 190 | *.py[co] 191 | 192 | # Packages 193 | *.egg 194 | *.egg-info 195 | dist/ 196 | build/ 197 | eggs/ 198 | parts/ 199 | var/ 200 | sdist/ 201 | develop-eggs/ 202 | .installed.cfg 203 | 204 | # Installer logs 205 | pip-log.txt 206 | 207 | # Unit test / coverage reports 208 | .coverage 209 | .tox 210 | 211 | #Translations 212 | *.mo 213 | 214 | #Mr Developer 215 | .mr.developer.cfg 216 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ##PHP Closure Compiler 2 | 3 | **phpcc** is a PHP Library to use Google Closure Compiler compress Javascript. 4 | You can view information about Google Closure Compiler on this [link](https://developers.google.com/closure/compiler/). 5 | 6 | 7 | 8 | ##Installation 9 | 10 | You can install the library with composer or manually. 11 | 12 | #### Composer 13 | 14 | Step 1. Edit your `composer.json`: 15 | 16 | ```json 17 | { 18 | "require": { 19 | "tureki/phpcc": ">=1.0.5" 20 | } 21 | } 22 | ``` 23 | 24 | Step 2. Install it: 25 | 26 | ```bash 27 | $ curl -sS https://getcomposer.org/installer | php 28 | $ php composer.phar install 29 | ``` 30 | 31 | #### Manually From Release 32 | 33 | Step 1. [Download the latest release](https://github.com/tureki/php-closure-compiler/releases) 34 | 35 | Step 2. Include the library: 36 | 37 | ```php 38 | require_once '[path to phpcc]/phpcc.php'; 39 | ``` 40 | 41 | 42 | 43 | ## How to use 44 | 45 | Download **phpcc** Library. and then require phpcc.class.php in your .php file. You can test sample.php in samples folder. 46 | 47 | ```php 48 | require '../src/phpcc.php'; 49 | 50 | $phpcc = new tureki\PhpCc(array( 51 | 'java_file' => 'YOUR JAVA FILE PATH', 52 | 'jar_file' => '../src/compiler/compiler.jar', 53 | 'output_path' => './output/', 54 | 'optimization' => 'SIMPLE_OPTIMIZATIONS' 55 | )); 56 | ``` 57 | 58 | 59 | 60 | ---- 61 | 62 | java_file is system java execute file path. 63 |
 64 | Example:
 65 | -   Linux:"/usr/lib/jvm/jre-1.6.0/bin/java"
 66 | -   Window7:"C:\Program Files (x86)\Java\jre6\bin\java"
 67 | 
68 | 69 | 70 | 71 | ---- 72 | 73 | jar_file is Google Closure Compiler jar file. Your can download latest version on this [link](http://code.google.com/p/closure-compiler/wiki/BinaryDownloads) 74 | 75 | 76 | 77 | ---- 78 | 79 | After setting. use help() method to test **phpcc**. 80 |
 81 | print_r($phpcc->help());
 82 | 
83 | 84 | 85 | 86 | ## How to compress 87 | 88 | Add jQuery file and combined compression to one file. 89 | ```php 90 | $ary_result = $phpcc 91 | ->add("js/jquery-1.10.2.js") 92 | ->add("js/1.9/jquery-1.9.1.js") 93 | ->exec("all.js"); 94 | print_r($ary_result); 95 | ``` 96 | 97 | 98 | 99 | ---- 100 | 101 | Set Directory path find .js file and combined compression to one file. 102 | ```php 103 | $ary_result = $phpcc 104 | ->setDir("./js") 105 | ->exec("all.js"); 106 | print_r($ary_result); 107 | ``` 108 | 109 | 110 | 111 | ---- 112 | 113 | Use single() can individual compression. 114 | ```php 115 | $ary_result = $phpcc 116 | ->add("js/jquery-1.10.2.js") 117 | ->add("js/1.9/jquery-1.9.1.js") 118 | ->single() 119 | ->exec(); 120 | print_r($ary_result); 121 | ``` 122 | ```php 123 | $ary_result = $phpcc 124 | ->setDir("./js") 125 | ->single() 126 | ->exec(); 127 | print_r($ary_result); 128 | ``` 129 | 130 | 131 | 132 | ---- 133 | 134 | You can also mixed. 135 | ```php 136 | $ary_result = $phpcc 137 | ->add("js/jquery-1.10.2.js") 138 | ->add("js/1.9/jquery-1.9.1.js") 139 | ->setDir("./js") 140 | ->single() 141 | ->exec(); 142 | print_r($ary_result); 143 | ``` 144 | 145 | 146 | 147 | ---- 148 | 149 | You can use param() add Closure Compiler command param. 150 | ```php 151 | $ary_result = $phpcc 152 | ->add("js/jquery-1.10.2.js") 153 | ->param("--angular_pass") 154 | ->param("--formatting","PRETTY_PRINT") 155 | ->exec("all.js"); 156 | print_r($ary_result); 157 | ``` 158 | 159 | 160 | 161 | ## Todo 162 | 163 | a. Add Unit Test 164 | b. Integrate CI 165 | 166 | ## Authors 167 | 168 | **tureki** 169 | 170 | + [http://github.com/tureki](http://github.com/tureki) 171 | 172 | 173 | 174 | ## Copyright and License 175 | 176 | Copyright 2013 tureki, under [MIT License](http://opensource.org/licenses/MIT). 177 | -------------------------------------------------------------------------------- /closure-compiler/COPYING: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /closure-compiler/README: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2009 The Closure Compiler Authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | // 18 | // Contents 19 | // 20 | 21 | The Closure Compiler performs checking, instrumentation, and 22 | optimizations on JavaScript code. The purpose of this README is to 23 | explain how to build and run the Closure Compiler. 24 | 25 | The Closure Compiler requires Java 6 or higher. 26 | http://www.java.com/ 27 | 28 | 29 | // 30 | // Building The Closure Compiler 31 | // 32 | 33 | There are three ways to get a Closure Compiler executable. 34 | 35 | 1) Use one we built for you. 36 | 37 | Pre-built Closure binaries can be found at 38 | http://code.google.com/p/closure-compiler/downloads/list 39 | 40 | 41 | 2) Check out the source and build it with Apache Ant. 42 | 43 | First, check out the full source tree of the Closure Compiler. There 44 | are instructions on how to do this at the project site. 45 | http://code.google.com/p/closure-compiler/source/checkout 46 | 47 | Apache Ant is a cross-platform build tool. 48 | http://ant.apache.org/ 49 | 50 | At the root of the source tree, there is an Ant file named 51 | build.xml. To use it, navigate to the same directory and type the 52 | command 53 | 54 | ant jar 55 | 56 | This will produce a jar file called "build/compiler.jar". 57 | 58 | 59 | 3) Check out the source and build it with Eclipse. 60 | 61 | Eclipse is a cross-platform IDE. 62 | http://www.eclipse.org/ 63 | 64 | Under Eclipse's File menu, click "New > Project ..." and create a 65 | "Java Project." You will see an options screen. Give the project a 66 | name, select "Create project from existing source," and choose the 67 | root of the checked-out source tree as the existing directory. Verify 68 | that you are using JRE version 6 or higher. 69 | 70 | Eclipse can use the build.xml file to discover rules. When you 71 | navigate to the build.xml file, you will see all the build rules in 72 | the "Outline" pane. Run the "jar" rule to build the compiler in 73 | build/compiler.jar. 74 | 75 | 76 | // 77 | // Running The Closure Compiler 78 | // 79 | 80 | Once you have the jar binary, running the Closure Compiler is straightforward. 81 | 82 | On the command line, type 83 | 84 | java -jar compiler.jar 85 | 86 | This starts the compiler in interactive mode. Type 87 | 88 | var x = 17 + 25; 89 | 90 | then hit "Enter", then hit "Ctrl-Z" (on Windows) or "Ctrl-D" (on Mac or Linux) 91 | and "Enter" again. The Compiler will respond: 92 | 93 | var x=42; 94 | 95 | The Closure Compiler has many options for reading input from a file, 96 | writing output to a file, checking your code, and running 97 | optimizations. To learn more, type 98 | 99 | java -jar compiler.jar --help 100 | 101 | You can read more detailed documentation about the many flags at 102 | http://code.google.com/closure/compiler/docs/gettingstarted_app.html 103 | 104 | 105 | // 106 | // Compiling Multiple Scripts 107 | // 108 | 109 | If you have multiple scripts, you should compile them all together with 110 | one compile command. 111 | 112 | java -jar compiler.jar --js=in1.js --js=in2.js ... --js_output_file=out.js 113 | 114 | The Closure Compiler will concatenate the files in the order they're 115 | passed at the command line. 116 | 117 | If you need to compile many, many scripts together, you may start to 118 | run into problems with managing dependencies between scripts. You 119 | should check out the Closure Library. It contains functions for 120 | enforcing dependencies between scripts, and a tool called calcdeps.py 121 | that knows how to give scripts to the Closure Compiler in the right 122 | order. 123 | 124 | http://code.google.com/p/closure-library/ 125 | 126 | // 127 | // Licensing 128 | // 129 | 130 | Unless otherwise stated, all source files are licensed under 131 | the Apache License, Version 2.0. 132 | 133 | 134 | ----- 135 | Code under: 136 | src/com/google/javascript/rhino 137 | test/com/google/javascript/rhino 138 | 139 | URL: http://www.mozilla.org/rhino 140 | Version: 1.5R3, with heavy modifications 141 | License: Netscape Public License and MPL / GPL dual license 142 | 143 | Description: A partial copy of Mozilla Rhino. Mozilla Rhino is an 144 | implementation of JavaScript for the JVM. The JavaScript parser and 145 | the parse tree data structures were extracted and modified 146 | significantly for use by Google's JavaScript compiler. 147 | 148 | Local Modifications: The packages have been renamespaced. All code not 149 | relevant to parsing has been removed. A JsDoc parser and static typing 150 | system have been added. 151 | 152 | 153 | ----- 154 | Code in: 155 | lib/rhino 156 | 157 | Rhino 158 | URL: http://www.mozilla.org/rhino 159 | Version: Trunk 160 | License: Netscape Public License and MPL / GPL dual license 161 | 162 | Description: Mozilla Rhino is an implementation of JavaScript for the JVM. 163 | 164 | Local Modifications: Minor changes to parsing JSDoc that usually get pushed 165 | up-stream to Rhino trunk. 166 | 167 | 168 | ----- 169 | Code in: 170 | lib/args4j.jar 171 | 172 | Args4j 173 | URL: https://args4j.dev.java.net/ 174 | Version: 2.0.16 175 | License: MIT 176 | 177 | Description: 178 | args4j is a small Java class library that makes it easy to parse command line 179 | options/arguments in your CUI application. 180 | 181 | Local Modifications: None. 182 | 183 | 184 | ----- 185 | Code in: 186 | lib/guava.jar 187 | 188 | Guava Libraries 189 | URL: http://code.google.com/p/guava-libraries/ 190 | Version: 14.0 191 | License: Apache License 2.0 192 | 193 | Description: Google's core Java libraries. 194 | 195 | Local Modifications: None. 196 | 197 | 198 | ----- 199 | Code in: 200 | lib/jsr305.jar 201 | 202 | Annotations for software defect detection 203 | URL: http://code.google.com/p/jsr-305/ 204 | Version: svn revision 47 205 | License: BSD License 206 | 207 | Description: Annotations for software defect detection. 208 | 209 | Local Modifications: None. 210 | 211 | 212 | ----- 213 | Code in: 214 | lib/jarjar.jar 215 | 216 | Jar Jar Links 217 | URL: http://jarjar.googlecode.com/ 218 | Version: 1.1 219 | License: Apache License 2.0 220 | 221 | Description: 222 | A utility for repackaging Java libraries. 223 | 224 | Local Modifications: None. 225 | 226 | 227 | ---- 228 | Code in: 229 | lib/junit.jar 230 | 231 | JUnit 232 | URL: http://sourceforge.net/projects/junit/ 233 | Version: 4.10 234 | License: Common Public License 1.0 235 | 236 | Description: A framework for writing and running automated tests in Java. 237 | 238 | Local Modifications: None. 239 | 240 | 241 | --- 242 | Code in: 243 | lib/protobuf-java.jar 244 | 245 | Protocol Buffers 246 | URL: http://code.google.com/p/protobuf/ 247 | Version: 2.4.1 248 | License: New BSD License 249 | 250 | Description: Supporting libraries for protocol buffers, 251 | an encoding of structured data. 252 | 253 | Local Modifications: None 254 | 255 | 256 | --- 257 | Code in: 258 | lib/ant.jar 259 | lib/ant-launcher.jar 260 | 261 | URL: http://ant.apache.org/bindownload.cgi 262 | Version: 1.8.1 263 | License: Apache License 2.0 264 | Description: 265 | Ant is a Java based build tool. In theory it is kind of like "make" 266 | without make's wrinkles and with the full portability of pure java code. 267 | 268 | Local Modifications: None 269 | 270 | 271 | --- 272 | Code in: 273 | lib/json.jar 274 | URL: http://json.org/java/index.html 275 | Version: JSON version 20090211 276 | License: MIT license 277 | Description: 278 | JSON is a set of java files for use in transmitting data in JSON format. 279 | 280 | Local Modifications: None 281 | 282 | --- 283 | Code in: 284 | tools/maven-ant-tasks-2.1.3.jar 285 | URL: http://maven.apache.org 286 | Version 2.1.3 287 | License: Apache License 2.0 288 | Description: 289 | Maven Ant tasks are used to manage dependencies and to install/deploy to 290 | maven repositories. 291 | 292 | Local Modifications: None 293 | -------------------------------------------------------------------------------- /closure-compiler/compiler.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tureki/php-closure-compiler/ecf933af4d1e8c2e0da085cb7963f4e4eaaa07e8/closure-compiler/compiler.jar -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tureki/phpcc", 3 | "description": "A PHP Library to use Google Closure Compiler compress Javascript ", 4 | "keywords": [ "php", "compress", "closure compiler" ], 5 | "type": "library", 6 | "license": "MIT", 7 | "support": { 8 | "issues": "https://github.com/tureki/php-closure-compiler/issues", 9 | "source": "https://github.com/tureki/php-closure-compiler" 10 | }, 11 | "authors": [{ 12 | "name": "tureki", 13 | "email": "tureki@me.com", 14 | "homepage": "https://github.com/tureki" 15 | }], 16 | "require": { 17 | "php": ">=5.3.0" 18 | }, 19 | "autoload": { 20 | "psr-4": { 21 | "tureki\\": "src/tureki/" 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /samples/output/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tureki/php-closure-compiler/ecf933af4d1e8c2e0da085cb7963f4e4eaaa07e8/samples/output/.gitkeep -------------------------------------------------------------------------------- /samples/sample.php: -------------------------------------------------------------------------------- 1 | 'YOUR_JAVA_FILE_PATH', 33 | 'output_path' => './output/', 34 | 'optimization' => 'SIMPLE_OPTIMIZATIONS', 35 | 'charset' => 'utf-8', 36 | )); 37 | 38 | /** 39 | * Test your phpcc setting. 40 | */ 41 | print_r($phpcc->help()); 42 | 43 | /** 44 | * Add jQuery file and combined compression 45 | */ 46 | // $ary_result = $phpcc 47 | // ->add("js/jquery-1.10.2.js") 48 | // ->add("js/1.9/jquery-1.9.1.js") 49 | // ->exec("all.js"); 50 | // print_r($ary_result); 51 | 52 | /** 53 | * Add jQuery file and individual compression 54 | */ 55 | // $phpcc->reset(); 56 | // $ary_result = $phpcc 57 | // ->add("js/jquery-1.10.2.js") 58 | // ->add("js/1.9/jquery-1.9.1.js") 59 | // ->single() 60 | // ->exec(); 61 | // print_r($ary_result); 62 | 63 | /** 64 | * Set Directory path find .js file and combined compression to one file. 65 | */ 66 | // $phpcc->reset(); 67 | // $ary_result = $phpcc 68 | // ->setDir("js") 69 | // ->exec("all.js"); 70 | // print_r($ary_result); 71 | 72 | /** 73 | * Set Directory path . Auto find js file and individual compression 74 | */ 75 | // $phpcc->reset(); 76 | // $ary_result = $phpcc 77 | // ->setDir("js") 78 | // ->single() 79 | // ->exec(); 80 | // print_r($ary_result); 81 | 82 | /** 83 | * Mixed 84 | */ 85 | // $phpcc->reset(); 86 | // $ary_result = $phpcc 87 | // ->setDir("js") 88 | // ->add("js/1.9/jquery-1.9.1.js") 89 | // ->exec(); 90 | // print_r($ary_result); 91 | 92 | /** 93 | * You can use param() add Closure Compiler command param. 94 | */ 95 | // $phpcc->reset(); 96 | // $ary_result = $phpcc 97 | // ->add("js/jquery-1.10.2.js") 98 | // ->param("--angular_pass") 99 | // ->param("--formatting","PRETTY_PRINT") 100 | // ->exec("all.js"); 101 | // print_r($ary_result); 102 | -------------------------------------------------------------------------------- /src/tureki/PhpCc.php: -------------------------------------------------------------------------------- 1 | options = array( 20 | 'java_file' => 'java', 21 | 'jar_file' => __DIR__.'/../../closure-compiler/compiler.jar', 22 | 'output_path' => '/', 23 | 'optimization' => 'SIMPLE_OPTIMIZATIONS', 24 | 'charset' => 'utf-8' 25 | ); 26 | 27 | $this->options = array_merge($this->options, $options); 28 | 29 | $this->reset(); 30 | } 31 | 32 | /** 33 | * Add javascript file to compiler list 34 | * 35 | * @param string $file 36 | * @return self 37 | */ 38 | public function add($file) 39 | { 40 | if (is_array($file)) { 41 | $this->js_files = array_merge($this->js_files, $file); 42 | } else { 43 | $this->js_files[] = $file; 44 | } 45 | 46 | return $this; 47 | } 48 | 49 | /** 50 | * Execute compiler. 51 | * 52 | * @param string $filename 53 | * @return self 54 | */ 55 | public function exec($filename = 'all.min.js') 56 | { 57 | $str_file = ''; 58 | 59 | if (substr($this->js_dir, -1)=="/") { 60 | $this->js_dir = substr($this->js_dir, 0, strlen($this->js_dir)-1); 61 | } 62 | 63 | if ($this->bol_single) { 64 | $ary_result = array(); 65 | 66 | $num_js = count($this->js_files); 67 | 68 | for ($i=0; $i < $num_js; $i++) { 69 | $str_file = ' --js ' . $this->js_files[$i]; 70 | 71 | $filename = basename($this->js_files[$i]); 72 | 73 | $ary_result[] = $this->_getArgv($str_file, $filename); 74 | } 75 | 76 | $num_js = count($this->js_files_dir); 77 | 78 | for ($i=0; $i < $num_js; $i++) { 79 | $str_file = ' --js ' . $this->js_files_dir[$i]; 80 | 81 | $filename = str_replace($this->js_dir, '', $this->js_files_dir[$i]); 82 | 83 | $ary_result[] = $this->_getArgv($str_file, $filename); 84 | } 85 | 86 | return $ary_result; 87 | } else { 88 | if (count($this->js_files_dir)>0) { 89 | $this->js_files = array_merge($this->js_files, $this->js_files_dir); 90 | } 91 | 92 | $this->js_files = array_values(array_unique($this->js_files)); 93 | 94 | $num_js = count($this->js_files); 95 | 96 | for ($i=0; $i < $num_js; $i++) { 97 | $str_file .= ' --js ' . $this->js_files[$i]; 98 | } 99 | 100 | return $this->_getArgv($str_file, $filename); 101 | } 102 | } 103 | 104 | /** 105 | * Help method will return "Closure Compiler --help" when setting success 106 | * 107 | * @return array 108 | */ 109 | public function help() 110 | { 111 | $str_cmd = $this->_getCmd() . ' --help'; 112 | 113 | return $this->_exec($str_cmd); 114 | } 115 | 116 | /** 117 | * Compress all js to one file. 118 | * 119 | * @return self 120 | */ 121 | public function merge() 122 | { 123 | $this->bol_single = false; 124 | 125 | return $this; 126 | } 127 | 128 | /** 129 | * Add command param. exp:--angular_pass 130 | * 131 | * @param string $param 132 | * @param string $value 133 | * @return self 134 | */ 135 | public function param($param, $value = null) 136 | { 137 | if ($value) { 138 | $str_param = $param ." ". $value; 139 | } else { 140 | $str_param = $param; 141 | } 142 | 143 | $this->shell_params[] = $str_param; 144 | 145 | return $this; 146 | } 147 | 148 | /** 149 | * Reset all setting. 150 | * 151 | * @return self 152 | */ 153 | public function reset() 154 | { 155 | $this->bol_single = false; 156 | 157 | $this->js_dir = ''; 158 | 159 | $this->js_files = array(); 160 | 161 | $this->js_files_dir = array(); 162 | 163 | $this->shell_params = array(); 164 | 165 | return $this; 166 | } 167 | 168 | /** 169 | * Set directory you want to compiler 170 | * 171 | * @param string $path 172 | * @param array $ext 173 | * @return class phpcc 174 | */ 175 | public function setDir($path, $ext = array('js')) 176 | { 177 | $this->js_dir = $path; 178 | 179 | $cls_objects = new RecursiveIteratorIterator( 180 | new RecursiveDirectoryIterator($path) 181 | ); 182 | 183 | foreach ($cls_objects as $str_name) { 184 | $str_filetype = pathinfo($str_name, PATHINFO_EXTENSION); 185 | 186 | if (in_array(strtolower($str_filetype), $ext)) { 187 | $this->js_files_dir[] = $str_name; 188 | } 189 | } 190 | 191 | return $this; 192 | } 193 | 194 | /** 195 | * Do not merge javascript files 196 | * 197 | * @return class phpcc 198 | */ 199 | public function single() 200 | { 201 | $this->bol_single = true; 202 | 203 | return $this; 204 | } 205 | 206 | private function _create($file_path) 207 | { 208 | if (!file_exists($file_path)) { 209 | $pathinfo = pathinfo($file_path); 210 | 211 | $path = $pathinfo["dirname"]; 212 | 213 | try { 214 | if (!file_exists($path) || !is_writeable($path)) { 215 | mkdir($path, 0777, true); 216 | touch($file_path); 217 | } 218 | return true; 219 | } catch (Exception $e) { 220 | return false; 221 | } 222 | } 223 | } 224 | 225 | private function _exec($str_cmd) 226 | { 227 | exec($str_cmd. ' 2>&1', $out, $status); 228 | 229 | return array( 230 | 'shell' => $str_cmd, 231 | 'out' => $out, 232 | 'status' => $status 233 | ); 234 | } 235 | 236 | private function _getArgv($str_file, $filename) 237 | { 238 | $opt = $this->options; 239 | 240 | $str_output = $opt["output_path"].$filename; 241 | 242 | $str_param = implode(" ", $this->shell_params); 243 | 244 | $str_cmd = $this->_getCmd(); 245 | 246 | $str_cmd .= ' '. $str_param.' '. $str_file; 247 | 248 | $this->_create($str_output); 249 | 250 | if (!empty($str_file)) { 251 | $str_cmd .= 252 | ' --compilation_level '.$opt['optimization']. 253 | ' --charset '.$opt['charset']. 254 | ' --js_output_file '.$str_output; 255 | } 256 | 257 | return $this->_exec($str_cmd); 258 | } 259 | 260 | private function _getCmd() 261 | { 262 | $opt = $this->options; 263 | 264 | $str_cmd = $opt['java_file'] . ' -jar ' . $opt['jar_file']; 265 | 266 | return $str_cmd; 267 | } 268 | } 269 | -------------------------------------------------------------------------------- /tests/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tureki/php-closure-compiler/ecf933af4d1e8c2e0da085cb7963f4e4eaaa07e8/tests/.gitkeep --------------------------------------------------------------------------------