{"id":282,"date":"2012-12-30T01:21:19","date_gmt":"2012-12-30T01:21:19","guid":{"rendered":"6a9aeddfc689c1d0e3b9ccc3ab651bc5"},"modified":"2012-12-30T01:21:19","modified_gmt":"2012-12-30T01:21:19","slug":"","status":"publish","type":"post","link":"https:\/\/www.xiaobo.li\/notes\/archives\/282","title":{"rendered":"Automatic JavaScript and CSS Packer"},"content":{"rendered":"<h4 class=\"body\">Notes<\/h4>\n<div class=\"body\">\n<ul>\n<li>JavaScript packing only works with PHP5. If you're using PHP4 the scripts will still be merged into one file, but not packed.<\/li>\n<li>A sample .htaccess file is included in the zip. Rename it and drop it in js\/packed and css\/packed for improved performance.<\/li>\n<\/ul>\n<\/div>\n<p><\/p>\n<h4>Download<\/h4>\n<p>A zip of the code and .htaccess can be found here: <a href=\"http:\/\/github.com\/mcurry\/cakephp\/tree\/master\/helpers\/asset\">http:\/\/github.com\/mcurry\/cakephp\/tree\/master\/helpers\/asset<\/a>, as well as posted below.<\/p>\n<h4>Instructions<\/h4>\n<ol>\n<li>You'll need a working version of CakePHP 1.2 installed.<\/li>\n<li>Download jsmin 1.1.0 (<a href=\"http:\/\/code.google.com\/p\/jsmin-php\/\">http:\/\/code.google.com\/p\/jsmin-php\/<\/a>) or later and put it in vendors\/jsmin.<\/li>\n<li>Download CSSTidy 1.3 (<a href=\"http:\/\/csstidy.sourceforge.net\/\">http:\/\/csstidy.sourceforge.net\/<\/a>) or later and put the contents in vendors\/csstidy.<\/li>\n<li>Download\/copy+paste the helper and unzip it to app\/views\/helpers.<\/li>\n<li>Include the helper in any controller that will need it. Most likely you will put it in AppController so that it's available to all your controllers: <\/li>\n<\/ol>\n<p><\/p>\n<h4>Tips<\/h4>\n<ul>\n<li>Remember to set the inline option to false for JS and CSS in your layout if you want them to be packed with the view scripts.<\/li>\n<li>Setting DEBUG on will cause this helper to output the scripts the same way $scripts_for_layout would, effectifly turning it off while testing.<\/li>\n<li>If you get a JavaScript error with a packed version of a file it's most likely missing a semi-colon somewhere.<\/li>\n<li>Order is important. If you include script1 then script2 on one view and script2 then script1 on another, they will generate separate packed versions and will be treated by the browser as separate scripts. <\/li>\n<\/ul>\n<p><\/p>\n<h4><strong>Helper Class:<\/strong><\/h4>\n<p><code><span style=\"color:#000000;\"><span style=\"color:#0000bb;\"><span style=\"font-family:NSimsun;\">&lt;?php <br \/>\n<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/*<br \/>\n* Asset Packer CakePHP Component<br \/>\n* Copyright (c) 2008 Matt Curry<br \/>\n* www.PseudoCoder.com<br \/>\n* http:\/\/www.pseudocoder.com\/archives\/2007\/08\/08\/automatic-asset-packer-cakephp-helper<br \/>\n*<br \/>\n* @author mattc &lt;matt@pseudocoder.com&gt;<br \/>\n* @version 1.2<br \/>\n* @license MIT<br \/>\n*<br \/>\n*\/<\/p>\n<p><\/span><span style=\"color:#007700;\">class <\/span><span style=\"color:#0000bb;\">AssetHelper <\/span><span style=\"color:#007700;\">extends <\/span><span style=\"color:#0000bb;\">Helper <\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">{<br \/>\n<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/Cake debug = 0 packed js\/css returned. $this-&gt;debug doesn't do anything.<br \/>\n\/\/Cake debug &gt; 0, $this-&gt;debug = false essentially turns the helper off. js\/css not packed. Good for debugging your js\/css files.<br \/>\n\/\/Cake debug &gt; 0, $this-&gt;debug = true packed js\/css returned. Good for debugging this helper.<br \/>\n<\/span><span style=\"color:#007700;\">var <\/span><span style=\"color:#0000bb;\">$debug <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">false<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">;<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/there is a *minimal* perfomance hit associated with looking up the filemtimes<br \/>\n\/\/if you clean out your cached dir (as set below) on builds then you don't need this.<br \/>\n<\/span><span style=\"color:#007700;\">var <\/span><span style=\"color:#0000bb;\">$checkTS <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">true<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">;<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/the packed files are named by stringing together all the individual file names<br \/>\n\/\/this can generate really long names, so by setting this option to true<br \/>\n\/\/the long name is md5'd, producing a resonable length file name.<br \/>\n<\/span><span style=\"color:#007700;\">var <\/span><span style=\"color:#0000bb;\">$md5FileName <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">false<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">;<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/you can change this if you want to store the files in a different location.<br \/>\n\/\/this is relative to your webroot\/js and webroot\/css paths<br \/>\n<\/span><span style=\"color:#007700;\">var <\/span><span style=\"color:#0000bb;\">$cachePath <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#dd0000;\">'packed\/'<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">;<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/set the css compression level<br \/>\n\/\/options: default, low_compression, high_compression, highest_compression<br \/>\n\/\/default is no compression<br \/>\n\/\/I like high_compression because it still leaves the file readable.<br \/>\n<\/span><span style=\"color:#007700;\">var <\/span><span style=\"color:#0000bb;\">$cssCompression <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#dd0000;\">'high_compression'<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">;<\/p>\n<p>var <\/span><span style=\"color:#0000bb;\">$helpers <\/span><span style=\"color:#007700;\">= array(<\/span><span style=\"color:#dd0000;\">'Html'<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#dd0000;\">'Javascript'<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\nvar <\/span><span style=\"color:#0000bb;\">$viewScriptCount <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">0<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">;<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/flag so we know the view is done rendering and it's the layouts turn<br \/>\n<\/span><span style=\"color:#007700;\">function <\/span><span style=\"color:#0000bb;\">afterRender<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">() {<br \/>\n<\/span><span style=\"color:#0000bb;\">$view <\/span><span style=\"color:#007700;\">=&amp; <\/span><span style=\"color:#0000bb;\">ClassRegistry<\/span><span style=\"color:#007700;\">::<\/span><span style=\"color:#0000bb;\">getObject<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">'view'<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\n<\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">viewScriptCount <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">count<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$view<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">__scripts<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\n}<\/p>\n<p>function <\/span><span style=\"color:#0000bb;\">scripts_for_layout<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">() {<br \/>\n<\/span><span style=\"color:#0000bb;\">$view <\/span><span style=\"color:#007700;\">=&amp; <\/span><span style=\"color:#0000bb;\">ClassRegistry<\/span><span style=\"color:#007700;\">::<\/span><span style=\"color:#0000bb;\">getObject<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">'view'<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">);<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/nothing to do<br \/>\n<\/span><span style=\"color:#007700;\">if (!<\/span><span style=\"color:#0000bb;\">$view<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">__scripts<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">) {<br \/>\nreturn;<br \/>\n}<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/move the layout scripts to the front<br \/>\n<\/span><span style=\"color:#0000bb;\">$view<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">__scripts <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">array_merge<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">(<br \/>\n<\/span><span style=\"color:#0000bb;\">array_slice<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$view<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">__scripts<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">viewScriptCount<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">),<br \/>\n<\/span><span style=\"color:#0000bb;\">array_slice<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$view<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">__scripts<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">0<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">viewScriptCount<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">)<br \/>\n);<\/p>\n<p>\nif (<\/span><span style=\"color:#0000bb;\">Configure<\/span><span style=\"color:#007700;\">::<\/span><span style=\"color:#0000bb;\">read<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">'debug'<\/span><span style=\"color:#007700;\">) &amp;&amp; <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">debug <\/span><span style=\"color:#007700;\">== <\/span><span style=\"color:#0000bb;\">false<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">) {<br \/>\nreturn <\/span><span style=\"color:#0000bb;\">join<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">\"\\n\\t\"<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">$view<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">__scripts<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">);<br \/>\n}<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/split the scripts into js and css<br \/>\n<\/span><span style=\"color:#007700;\">foreach (<\/span><span style=\"color:#0000bb;\">$view<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">__scripts <\/span><span style=\"color:#007700;\">as <\/span><span style=\"color:#0000bb;\">$i <\/span><span style=\"color:#007700;\">=&gt; <\/span><span style=\"color:#0000bb;\">$script<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">) {<br \/>\nif (<\/span><span style=\"color:#0000bb;\">preg_match<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">'\/js\\\/(.*).js\/'<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">$script<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">$match<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">)) {<br \/>\n<\/span><span style=\"color:#0000bb;\">$temp <\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">= array();<br \/>\n<\/span><span style=\"color:#0000bb;\">$temp<\/span><span style=\"color:#007700;\">[<\/span><span style=\"color:#dd0000;\">'script'<\/span><span style=\"color:#007700;\">] = <\/span><span style=\"color:#0000bb;\">$match<\/span><span style=\"color:#007700;\">[<\/span><span style=\"color:#0000bb;\">1<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">];<br \/>\n<\/span><span style=\"color:#0000bb;\">$temp<\/span><span style=\"color:#007700;\">[<\/span><span style=\"color:#dd0000;\">'name'<\/span><span style=\"color:#007700;\">] = <\/span><span style=\"color:#0000bb;\">basename<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$match<\/span><span style=\"color:#007700;\">[<\/span><span style=\"color:#0000bb;\">1<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">]);<br \/>\n<\/span><span style=\"color:#0000bb;\">$js<\/span><span style=\"color:#007700;\">[] = <\/span><span style=\"color:#0000bb;\">$temp<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">;<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/remove the script since it will become part of the merged script<br \/>\n<\/span><span style=\"color:#007700;\">unset(<\/span><span style=\"color:#0000bb;\">$view<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">__scripts<\/span><span style=\"color:#007700;\">[<\/span><span style=\"color:#0000bb;\">$i<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">]);<br \/>\n} else if (<\/span><span style=\"color:#0000bb;\">preg_match<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">'\/css\\\/(.*).css\/'<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">$script<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">$match<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">)) {<br \/>\n<\/span><span style=\"color:#0000bb;\">$temp <\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">= array();<br \/>\n<\/span><span style=\"color:#0000bb;\">$temp<\/span><span style=\"color:#007700;\">[<\/span><span style=\"color:#dd0000;\">'script'<\/span><span style=\"color:#007700;\">] = <\/span><span style=\"color:#0000bb;\">$match<\/span><span style=\"color:#007700;\">[<\/span><span style=\"color:#0000bb;\">1<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">];<br \/>\n<\/span><span style=\"color:#0000bb;\">$temp<\/span><span style=\"color:#007700;\">[<\/span><span style=\"color:#dd0000;\">'name'<\/span><span style=\"color:#007700;\">] = <\/span><span style=\"color:#0000bb;\">basename<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$match<\/span><span style=\"color:#007700;\">[<\/span><span style=\"color:#0000bb;\">1<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">]);<br \/>\n<\/span><span style=\"color:#0000bb;\">$css<\/span><span style=\"color:#007700;\">[] = <\/span><span style=\"color:#0000bb;\">$temp<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">;<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/remove the script since it will become part of the merged script<br \/>\n<\/span><span style=\"color:#007700;\">unset(<\/span><span style=\"color:#0000bb;\">$view<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">__scripts<\/span><span style=\"color:#007700;\">[<\/span><span style=\"color:#0000bb;\">$i<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">]);<br \/>\n}<br \/>\n}<\/p>\n<p><\/span><span style=\"color:#0000bb;\">$scripts_for_layout <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#dd0000;\">''<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">;<br \/>\n<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/first the css<br \/>\n<\/span><span style=\"color:#007700;\">if (!empty(<\/span><span style=\"color:#0000bb;\">$css<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">)) {<br \/>\n<\/span><span style=\"color:#0000bb;\">$scripts_for_layout <\/span><span style=\"color:#007700;\">.= <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">Html<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">css<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">cachePath <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">process<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">'css'<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">$css<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">));<br \/>\n<\/span><span style=\"color:#0000bb;\">$scripts_for_layout <\/span><span style=\"color:#007700;\">.= <\/span><span style=\"color:#dd0000;\">\"\\n\\t\"<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">;<br \/>\n}<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/then the js<br \/>\n<\/span><span style=\"color:#007700;\">if (!empty(<\/span><span style=\"color:#0000bb;\">$js<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">)) {<br \/>\n<\/span><span style=\"color:#0000bb;\">$scripts_for_layout <\/span><span style=\"color:#007700;\">.= <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">Javascript<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">link<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">cachePath <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">process<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">'js'<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">$js<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">));<br \/>\n}<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/finally anything that was left over, usually codeBlocks<br \/>\n<\/span><span style=\"color:#0000bb;\">$scripts_for_layout <\/span><span style=\"color:#007700;\">.= <\/span><span style=\"color:#0000bb;\">join<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">\"\\n\\t\"<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">$view<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">__scripts<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<\/p>\n<p>return <\/span><span style=\"color:#0000bb;\">$scripts_for_layout<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">;<br \/>\n}<\/p>\n<p>\nfunction <\/span><span style=\"color:#0000bb;\">process<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$type<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">$data<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">) {<br \/>\nswitch (<\/span><span style=\"color:#0000bb;\">$type<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">) {<br \/>\ncase <\/span><span style=\"color:#dd0000;\">'js'<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">:<br \/>\n<\/span><span style=\"color:#0000bb;\">$path <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">JS<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">;<br \/>\nbreak;<br \/>\ncase <\/span><span style=\"color:#dd0000;\">'css'<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">:<br \/>\n<\/span><span style=\"color:#0000bb;\">$path <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">CSS<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">;<br \/>\nbreak;<br \/>\n}<\/p>\n<p><\/span><span style=\"color:#0000bb;\">$folder <\/span><span style=\"color:#007700;\">= new <\/span><span style=\"color:#0000bb;\">Folder<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">;<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/make sure the cache folder exists<br \/>\n<\/span><span style=\"color:#007700;\">if (<\/span><span style=\"color:#0000bb;\">$folder<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">create<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$path <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">cachePath<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#dd0000;\">\"777\"<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">)) {<br \/>\n<\/span><span style=\"color:#0000bb;\">trigger_error<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">'Could not create ' <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$path <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#0000bb;\">cachePath<br \/>\n<\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#dd0000;\">'. Please create it manually with 777 permissions'<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">E_USER_WARNING<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">);<br \/>\n}<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/check if the cached file exists<br \/>\n<\/span><span style=\"color:#0000bb;\">$names <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">Set<\/span><span style=\"color:#007700;\">::<\/span><span style=\"color:#0000bb;\">extract<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$data<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#dd0000;\">'{n}.name'<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\n<\/span><span style=\"color:#0000bb;\">$folder<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">cd<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$path <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">cachePath<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\n<\/span><span style=\"color:#0000bb;\">$fileName <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">$folder<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">find<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">__generateFileName<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$names<\/span><span style=\"color:#007700;\">) . <\/span><span style=\"color:#dd0000;\">'_([0-9]{10}).' <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$type<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\nif (<\/span><span style=\"color:#0000bb;\">$fileName<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">) {<br \/>\n<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/take the first file...really should only be one.<br \/>\n<\/span><span style=\"color:#0000bb;\">$fileName <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">$fileName<\/span><span style=\"color:#007700;\">[<\/span><span style=\"color:#0000bb;\">0<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">];<br \/>\n}<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/make sure all the pieces that went into the packed script<br \/>\n\/\/are OLDER then the packed version<br \/>\n<\/span><span style=\"color:#007700;\">if (<\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">checkTS <\/span><span style=\"color:#007700;\">&amp;&amp; <\/span><span style=\"color:#0000bb;\">$fileName<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">) {<br \/>\n<\/span><span style=\"color:#0000bb;\">$packed_ts <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">filemtime<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$path <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">cachePath <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$fileName<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<\/p>\n<p><\/span><span style=\"color:#0000bb;\">$latest_ts <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">0<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">;<br \/>\n<\/span><span style=\"color:#0000bb;\">$scripts <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">Set<\/span><span style=\"color:#007700;\">::<\/span><span style=\"color:#0000bb;\">extract<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$data<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#dd0000;\">'{n}.script'<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\nforeach(<\/span><span style=\"color:#0000bb;\">$scripts <\/span><span style=\"color:#007700;\">as <\/span><span style=\"color:#0000bb;\">$script<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">) {<br \/>\n<\/span><span style=\"color:#0000bb;\">$latest_ts <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">max<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$latest_ts<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">filemtime<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$path <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$script <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#dd0000;\">'.' <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$type<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">));<br \/>\n}<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/an original file is newer. need to rebuild<br \/>\n<\/span><span style=\"color:#007700;\">if (<\/span><span style=\"color:#0000bb;\">$latest_ts <\/span><span style=\"color:#007700;\">&gt; <\/span><span style=\"color:#0000bb;\">$packed_ts<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">) {<br \/>\n<\/span><span style=\"color:#0000bb;\">unlink<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$path <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">cachePath <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$fileName<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\n<\/span><span style=\"color:#0000bb;\">$fileName <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">null<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">;<br \/>\n}<br \/>\n}<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/file doesn't exist. create it.<br \/>\n<\/span><span style=\"color:#007700;\">if (!<\/span><span style=\"color:#0000bb;\">$fileName<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">) {<br \/>\n<\/span><span style=\"color:#0000bb;\">$ts <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">time<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">();<\/p>\n<p><\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/merge the script<br \/>\n<\/span><span style=\"color:#0000bb;\">$scriptBuffer <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#dd0000;\">''<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">;<br \/>\n<\/span><span style=\"color:#0000bb;\">$scripts <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">Set<\/span><span style=\"color:#007700;\">::<\/span><span style=\"color:#0000bb;\">extract<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$data<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#dd0000;\">'{n}.script'<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\nforeach(<\/span><span style=\"color:#0000bb;\">$scripts <\/span><span style=\"color:#007700;\">as <\/span><span style=\"color:#0000bb;\">$script<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">) {<br \/>\n<\/span><span style=\"color:#0000bb;\">$buffer <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">file_get_contents<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$path <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$script <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#dd0000;\">'.' <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$type<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<\/p>\n<p>switch (<\/span><span style=\"color:#0000bb;\">$type<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">) {<br \/>\ncase <\/span><span style=\"color:#dd0000;\">'js'<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">:<br \/>\n<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/jsmin only works with PHP5<br \/>\n<\/span><span style=\"color:#007700;\">if (<\/span><span style=\"color:#0000bb;\">PHP5<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">) {<br \/>\n<\/span><span style=\"color:#0000bb;\">vendor<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">'jsmin\/jsmin'<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\n<\/span><span style=\"color:#0000bb;\">$buffer <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">trim<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">JSMin<\/span><span style=\"color:#007700;\">::<\/span><span style=\"color:#0000bb;\">minify<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$buffer<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">));<br \/>\n}<br \/>\nbreak;<\/p>\n<p>case <\/span><span style=\"color:#dd0000;\">'css'<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">:<br \/>\n<\/span><span style=\"color:#0000bb;\">vendor<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">'csstidy\/class.csstidy'<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\n<\/span><span style=\"color:#0000bb;\">$tidy <\/span><span style=\"color:#007700;\">= new <\/span><span style=\"color:#0000bb;\">csstidy<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">();<br \/>\n<\/span><span style=\"color:#0000bb;\">$tidy<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">load_template<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">cssCompression<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\n<\/span><span style=\"color:#0000bb;\">$tidy<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">parse<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$buffer<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\n<\/span><span style=\"color:#0000bb;\">$buffer <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">$tidy<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">print<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">plain<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">();<br \/>\nbreak;<br \/>\n}<\/p>\n<p><\/span><span style=\"color:#0000bb;\">$scriptBuffer <\/span><span style=\"color:#007700;\">.= <\/span><span style=\"color:#dd0000;\">\"\\n\/* <\/span><span style=\"color:#0000bb;\">$script<\/span><span style=\"color:#dd0000;\">.<\/span><span style=\"color:#0000bb;\">$type<\/span><span style=\"color:#dd0000;\"> *\/\\n\" <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$buffer<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">;<br \/>\n}<\/p>\n<p>\n<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/write the file<br \/>\n<\/span><span style=\"color:#0000bb;\">$fileName <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">__generateFileName<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$names<\/span><span style=\"color:#007700;\">) . <\/span><span style=\"color:#dd0000;\">'_' <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$ts <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#dd0000;\">'.' <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$type<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">;<br \/>\n<\/span><span style=\"color:#0000bb;\">$file <\/span><span style=\"color:#007700;\">= new <\/span><span style=\"color:#0000bb;\">File<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$path <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">cachePath <\/span><span style=\"color:#007700;\">. <\/span><span style=\"color:#0000bb;\">$fileName<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\n<\/span><span style=\"color:#0000bb;\">$file<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">write<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">trim<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$scriptBuffer<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">));<br \/>\n}<\/p>\n<p>if (<\/span><span style=\"color:#0000bb;\">$type <\/span><span style=\"color:#007700;\">== <\/span><span style=\"color:#dd0000;\">'css'<\/span><\/span><span style=\"color:#007700;\"><span style=\"font-family:NSimsun;\">) {<br \/>\n<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#ff8000;\">\/\/$html-&gt;css doesn't check if the file already has<br \/>\n\/\/the .css extension and adds it automatically, so we need to remove it.<br \/>\n<\/span><span style=\"color:#0000bb;\">$fileName <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">str_replace<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">'.css'<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#dd0000;\">''<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">$fileName<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\n}<\/p>\n<p>return <\/span><span style=\"color:#0000bb;\">$fileName<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">;<br \/>\n}<\/p>\n<p>function <\/span><span style=\"color:#0000bb;\">__generateFileName<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$names<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">) {<br \/>\n<\/span><span style=\"color:#0000bb;\">$fileName <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">str_replace<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">'.'<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#dd0000;\">'-'<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">implode<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#dd0000;\">'_'<\/span><span style=\"color:#007700;\">, <\/span><span style=\"color:#0000bb;\">$names<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">));<\/p>\n<p>if (<\/span><span style=\"color:#0000bb;\">$this<\/span><span style=\"color:#007700;\">-&gt;<\/span><span style=\"color:#0000bb;\">md5FileName<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">) {<br \/>\n<\/span><span style=\"color:#0000bb;\">$fileName <\/span><span style=\"color:#007700;\">= <\/span><span style=\"color:#0000bb;\">md5<\/span><span style=\"color:#007700;\">(<\/span><span style=\"color:#0000bb;\">$fileName<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">);<br \/>\n}<\/p>\n<p>return <\/span><span style=\"color:#0000bb;\">$fileName<\/span><\/span><span style=\"font-family:NSimsun;\"><span style=\"color:#007700;\">;<br \/>\n}<br \/>\n}<br \/>\n<\/span><span style=\"color:#0000bb;\">?&gt;<\/span><\/span><\/span><\/code><\/p>\n<p><code><span style=\"color:#000000;\"><span style=\"font-family:NSimsun;\"><span style=\"color:#0000bb;\">link&nbsp;form : <a href=\"http:\/\/bakery.cakephp.org\/articles\/mattc\/2008\/10\/26\/automatic-javascript-and-css-packer\" target=\"_blank\">http:\/\/bakery.cakephp.org\/articles\/mattc\/2008\/10\/26\/automatic-javascript-and-css-packer<\/a><\/span><\/span><\/span><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<h4 class=\"body\">Notes<\/h4>\n<div class=\"body\">\n<ul>\n<li>JavaScript packing only works with PHP5. If you're using PHP4 the scripts will still be merged into one file, but not packed.<\/li>\n<li>A sample .htaccess file is included in the zip. Rename it and drop it in js\/packed and css\/packed for improved performance.<\/li>\n<\/ul>\n<\/div>\n<p><\/p>\n<h4>Download<\/h4>\n<p>A zip of the code and .htaccess can ... <a href=\"https:\/\/www.xiaobo.li\/notes\/archives\/282\">\u7ee7\u7eed\u9605\u8bfb <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[273],"tags":[],"class_list":["post-282","post","type-post","status-publish","format-standard","hentry","category-article"],"_links":{"self":[{"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/posts\/282","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/comments?post=282"}],"version-history":[{"count":0,"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/posts\/282\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/media?parent=282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/categories?post=282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/tags?post=282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}