Compare commits

..

312 Commits
v1.0rc ... v2.0

Author SHA1 Message Date
Paul Irish
8bfbd13615 strip out dev only stuff for release v2.0 2011-08-10 00:42:45 -07:00
Paul Irish
1e79f7b7df update readme. :) 2011-08-10 00:17:59 -07:00
Paul Irish
c6dbb2892b appcache improvements. :) details below:
* reduce extra code via <isset>
* `manifest` becomes its own ant task now
* html files are populated into the manifest based on ant config
* add manifest attribute to the HTML tag via Ant. So only the config switch is neccessary
* appcache back to disabled by default. toggling it on in config/project.properties is all that's neccessary
2011-08-09 23:07:03 -07:00
Paul Irish
c996f0e685 manifest: js files now include path, correctly. manifest file now named manifest.appcache. 2011-08-09 22:09:45 -07:00
Paul Irish
f10f81a241 build script: manifest improvements (and others).. details:
manifest:
* use a manifest template from build/config/cache.appcache each time
* the only css we are dropping in is the style.css (SHA'd), no more
* we include all js/mylibs/bypass files and all js/libs/*.min.js files
* change default name of manifest to `cache.appcache` but im gonna change it to `manifest.appcache` next commit ;)
* state of repo temporarily includes a manifest but that will revert soon

other:
* rename libs-concat.js to mylibs-concat.js for logic's sake
* add @defer attribute to concated script
2011-08-09 21:59:47 -07:00
Paul Irish
00be05ad18 minor. whitespace in build script following manifest commit (with tabs! omg!) 2011-08-09 19:53:52 -07:00
Nicolas Gallagher
5fe1dda97c Make .hidden class more robust. Update a couple of helper class links to point to better and/or more up-to-date explanations. 2011-08-10 02:10:06 +02:00
calvin
113c98f849 excluding the mylibs directory was preventing minification/concatenation of libs. 2011-08-09 16:50:46 -07:00
Paul Irish
341992913b Merge pull request #652 from gmoulin/master
appcache manifest generation via Ant
2011-08-09 16:49:07 -07:00
Mathias Bynens
1c9145c9a7 Correct Modernizr reference in the test file. Fixes #662. Thanks @jaimie-van-santen! 2011-08-09 15:46:33 +03:00
Mathias Bynens
e13f5c4b37 Add a note saying php_flag expose_php Off should be moved to php.ini since it doesn’t work in .htaccess files. Closes #611. 2011-08-09 10:25:10 +03:00
Paul Irish
d9cc711ea1 google analytics now uses Modernizr.load/yepnope for great justice. fixes #542 2011-08-08 23:03:16 -07:00
Paul Irish
55a7fc2466 Merge pull request #646 from ngryman/master
generic rewrite rules (for virtual host context)
2011-08-08 22:52:06 -07:00
Paul Irish
99e140ded4 Merge pull request #659 from Zearin/patch-1
Mostly lots of <code> additions for consistency.  (I think it also
2011-08-08 08:34:37 -07:00
Tony
b77d30c2f0 Mostly lots of &lt;code&gt; additions for consistency. (I think it also enhances readability, so inline code snippets are obvious.) Few minor capitalization & typographical fixes. 2011-08-08 11:46:58 -03:00
Paul Irish
b191777977 @import inlining should skip anything starting with http.. fixes #657 2011-08-07 18:28:54 -07:00
Divya Manian
6241a72722 Fixing typo in .htaccess file 2011-08-07 18:23:52 -07:00
Paul Irish
2db692e752 build script. flexibility in @import syntax parsing. fixes #649 forreal forreal 2011-08-05 09:20:29 -07:00
Guillaume Moulin
6c5b7719a6 optionnal manifest declaration 2011-08-05 13:44:00 +02:00
Guillaume Moulin
a314d2a374 modifications for manifest awareness in build.xml
with variables in project.properties for handling manifest file name,
javascripts files names and stylesheets files names

the javascripts files will be replaced by the concatened and minified
version
idem for the stylesheets
2011-08-05 13:24:11 +02:00
Guillaume Moulin
a81061aa37 modifications for manifest awareness in build.xml
with variable in project.properties for handling manifest file name

the javascripts files replaced are those concatened and minified by the
build
idem for the stylesheets
2011-08-05 13:00:13 +02:00
Guillaume Moulin
0d4f6b5261 Merge remote-tracking branch 'upstream/master'
Conflicts resolved:
	build/build.xml
	index.html
2011-08-05 10:58:57 +02:00
Guillaume Moulin
a556e26cb5 changes for site.manifest awareness 2011-08-05 10:50:39 +02:00
Paul Irish
cde1dc4f5c build script. flexibility in @import syntax parsing. fixes #649 2011-08-04 17:13:23 -07:00
Paul Irish
601fbc59e4 build script. flexibility in @import syntax parsing. fixes #649 2011-08-04 16:41:53 -07:00
Paul Irish
28b1ca4b8c build script. slightly cleaner css comment style, because we can. credit: darktable, again. 2011-08-04 16:39:46 -07:00
Nicolas Gallagher
ce89a01bef Separate [hidden] from .hidden helper class. Slight tidy up of CSS comments and consistently use h5bp.com shorturl throughout the file 2011-08-03 10:44:29 +01:00
Nicolas Gallagher
7b95c57e2d Remove webkit-overflow-scrolling inserted after a merge. See #577 2011-08-03 09:34:55 +01:00
Nicolas Gallagher
44bc2bdbf2 Leave default webkit-tap-highlight-color in place. Modify vertical alignment of td. Add a:hover color. 2011-08-03 09:32:56 +01:00
Nicolas Gryman
00d8b84570 generic rewrite rules (working in virtual host context) 2011-08-02 18:12:28 +02:00
Paul Irish
458cd36309 build script. protect legacy stylesheets from being consumed and digested by the css-split task. thx darktable. 2011-08-01 23:43:52 -07:00
Paul Irish
586dc13ee3 build script. update @import regex for max compat. 2011-08-01 23:08:23 -07:00
Paul Irish
4238aed87d Merge branch 'css-split' 2011-08-01 22:49:13 -07:00
Paul Irish
a48bd3ebaf Merge branch 'css-split' of https://github.com/darktable/html5-boilerplate into css-split 2011-08-01 21:29:32 -07:00
calvin
19450d9d59 using ==|== syntax to mark export delimiters 2011-08-01 21:21:38 -07:00
calvin
7fca5a5adf using ==|== syntax to mark export delimiters 2011-08-01 21:20:59 -07:00
Paul Irish
7668263695 improved gzip detection for turtletappers. thx @bluesmoon and @marcelduran. fixes #624 2011-08-01 14:40:11 -07:00
Paul Irish
d15376de77 merge in latest darktable. 2011-08-01 13:20:59 -07:00
Mathias Bynens
413822acbc Update demo pages so they use the smaller viewport <meta>. 2011-08-01 15:03:18 +02:00
calvin
11158f1bc4 the css-split method was using @import syntax that isn't standard. 2011-07-31 22:50:25 -07:00
calvin
0b15ec7d6d now the "url" chunk of the @import is optional. 2011-07-31 22:29:19 -07:00
calvin
05d83fcfeb there was a rogue "url" in the replacement regexp. 2011-07-31 22:13:40 -07:00
Gavrisimo
53f28cf87d moved border rule to .ir ruleset 2011-08-01 11:53:58 +08:00
Gavrisimo
4c9e90e730 added small fix for buttons and inputs that have .ir class 2011-08-01 11:53:58 +08:00
Jonathan Fielding
c537194736 jQuery updated to 1.6.2 2011-08-01 11:53:58 +08:00
Rob Larsen
fd345072df Added a task to test for ant version and fail (with instructions) if it's below 1.8.2. 2011-08-01 11:53:57 +08:00
meleyal
51d121e79a fix formatting 2011-08-01 11:53:57 +08:00
meleyal
777f14fa93 remove redundant color rule 2011-08-01 11:53:57 +08:00
meleyal
0a7a6f82bf also use black for links when printing, refs #147 2011-08-01 11:53:57 +08:00
Robert Ros
2792309862 Use substring matching in gzip filter_module and re-enable gzip for some common MIME-types 2011-08-01 11:53:56 +08:00
Robert Ros
976fc0f9ba Workaround for broken regexes in mod_filter
More info: #549
Fixes: #441 #499 #535
2011-08-01 11:53:56 +08:00
darktable
aee2fa8f29 fixes issue where I was including the for task using a namespace 2011-07-31 20:41:05 -07:00
Paul Irish
73f6f66039 minor. buildscript whitespace. 2011-07-31 19:51:50 -07:00
Paul Irish
e7e087854b merged in darktable's css-split branch. 2011-07-31 19:05:13 -07:00
Paul Irish
b14b4a60d1 Normalize javascript mimetype to application/javascript. Reduces cruft. Thx @danbeam for the work. Fixes #485 2011-07-31 18:50:38 -07:00
Paul Irish
8b168ad3b1 Merge pull request #642 from roblarsen/master
two changes for issue  #615
2011-07-31 18:49:20 -07:00
Rob Larsen
f2f59b04ec added a quick example to the file.bypass.js explanation 2011-07-31 19:44:10 -04:00
Paul Irish
727ef92941 htmlcompressor up to 1.4.3 because he fixed #550, #641 for us. \o/ 2011-07-31 15:23:01 -07:00
Mathias Bynens
5c97f98709 Smaller viewport <meta> — 1 is the new 1.0. 2011-07-31 23:32:30 +03:00
Paul Irish
41246db22b build script: htmlcompressor preserves SSI comments by default. fixes #640, #503. 2011-07-31 12:06:15 -07:00
Rob Larsen
3611b4c4e0 issue 615 "files.bypass does not work." It was a case of unraveling where/when the scripts were getting copied over and changing the way, slightly, that the excluded file list was fed to the script. 2011-07-31 09:12:28 -04:00
Nicolas Gallagher
299291e6be Add defer where possible to demo page scripts. Ref #542 2011-07-31 11:26:32 +01:00
Nicolas Gallagher
0d1c066177 Update demo pages to use modernizr 2.0.6 custom build including respond.js 2011-07-31 11:01:32 +01:00
Paul Irish
ffb7b8e359 update to htmlcompressor 1.4.2. fixes #608 2011-07-30 20:11:42 -07:00
Paul Irish
401e66acb4 script defer added where possible. H5BP is now faster!! thx @beverloo. fixes #542 2011-07-30 20:05:07 -07:00
Paul Irish
e49793fdc9 upgrade modernizr to 2.0.6 custom build including respond.js. 2011-07-30 19:53:03 -07:00
Paul Irish
a36c13a732 update the (disabled) SSI for better windows compatibility. fixes #628. code from @aldomx. 2011-07-30 19:40:59 -07:00
Paul Irish
9a6433f92f Vary: User-Agent is no more. We send our X-UA-Compat to everyone, but only for html payloads.. fixes #414 2011-07-30 19:22:39 -07:00
Paul Irish
bd88d3e457 update htmlcompressor to 1.4.1 from 1.1. Outstanding issue upstream but tracked in #608 2011-07-30 19:21:29 -07:00
Paul Irish
58816dd249 golf down the size of @kirbysayshi's log() improvement. ref #498.
I steal log's apply method instead of reaching all the way into Function.prototype.apply.. timesaver and bytesaver. just really ugly.
And then a nasty ( omg ? ternary : action); as a statement. But hey.. sometimes you feel like a nut.

kirby, plz code review this. :p
tested in Chrome 14.
2011-07-30 17:32:47 -07:00
Paul Irish
8175a1c468 console.markTimeline() is now console.timeStamp(). http://webk.it/63317 2011-07-30 17:19:20 -07:00
Paul Irish
ebe10aef34 improve the console.log nerfing for ff3.6. thx @drewcovi. fixes #455 2011-07-30 17:19:20 -07:00
Paul Irish
e52f6af093 Merge pull request #498 from kirbysayshi/master
log() arguments are no longer wrapped in extraneous array
2011-07-30 17:19:04 -07:00
Nicolas Gallagher
559bc56768 Re-fix IE6/7 list-style:none problem. See #263 2011-07-30 15:56:26 +01:00
Mathias Bynens
78641b530f Change the short URL for more <head> tips to something that works in all browsers. Fixes #631. 2011-07-27 19:55:38 +03:00
Paul Irish
6fee66d751 more docs for php_flag html_errors Off. thx @leek. fixes #622 2011-07-23 19:25:54 -07:00
Shi Chuan
c23caaf1d8 #614 changed replace directory to intermediate 2011-07-24 01:24:03 +08:00
Paul Irish
b4229a4d49 Merge pull request #619 from Phize/patch/3
allow access from all domains for .ttc webfont.
2011-07-22 10:56:05 -07:00
Phize
3f3f95de4e allow access from all domains for .ttc webfont. 2011-07-23 02:08:21 +09:00
Phize
acdae81735 add settings for Atom. 2011-07-22 10:00:53 -07:00
Nicolas Gallagher
7f52ddf680 Reintroduce search input normalization. Avoids significant WebKit styling limitations. 2011-07-22 17:22:49 +01:00
Nicolas Gallagher
dc1604c697 Ensure IE6 applies styles for <audio>, <canvas>, and <video>; ensure modern browsers hide <audio> without controls 2011-07-20 20:38:37 +01:00
Nicolas Gallagher
d965db4c5e Add {background-color: transparent} to .ir helper class. Removes default background-color from elements like <button>. Ref #609 2011-07-20 14:56:51 +01:00
Nicolas Gallagher
f78016f555 Make HTML5 [hidden] attribute hide an element from screenreaders and browsers that support the attribute selector. Close #607 2011-07-20 14:27:48 +01:00
Mathias Bynens
c72a81c5e9 Use example.com instead of domain.com, as per RFC 2606. Fixes #613. 2011-07-20 02:03:51 -07:00
Mathias Bynens
639cb05ba0 Typo. Fixes #612. 2011-07-19 23:16:45 -07:00
Nicolas Gallagher
5416bcd103 Add {resize: vertical} to <textarea> 2011-07-16 11:46:46 +02:00
Divya Manian
37446e28af Merge pull request #599 from Gavrisimo/master
Fix buttons and inputs that have .ir class attached
2011-07-12 10:09:09 -07:00
Nicolas Gallagher
a709725b06 Set {overflow:auto} for <button> and <input> in <table> in IE6/7. Avoids numerous layout and whitespace issues that result from setting {overflow:visible} to fix the odd inner spacing of those form elements. 2011-07-12 14:00:11 +02:00
Nicolas Gallagher
d3dc77b211 Add link to CSS wiki in style.css. Close #575 2011-07-12 13:54:04 +02:00
Mathias Bynens
7db1acaeb5 Follow the H5BP coding style guidelines for quotes. http://h5bp.com/docs/#The-markup 2011-07-11 03:00:55 -07:00
Gavrisimo
29c7e128cd moved border rule to .ir ruleset 2011-07-09 21:32:23 +02:00
Gavrisimo
09a8c715cb added small fix for buttons and inputs that have .ir class 2011-07-09 20:53:16 +02:00
Divya Manian
536b6ace6b Merge pull request #595 from rros/master
Modify apache mod_deflate .htaccess triggers
2011-07-06 06:20:28 -07:00
Mathias Bynens
f4a43fd2e4 Merge pull request #596 from jonathan-fielding/master
jQuery Updated to 1.6.2
2011-07-06 04:17:30 -07:00
Jonathan Fielding
c80cc610e2 jQuery updated to 1.6.2 2011-07-06 12:15:11 +01:00
Robert Ros
fca04b1e3e Merge remote-tracking branch 'rmsr/master'
Conflicts:
	.htaccess
2011-07-06 00:48:08 +02:00
Divya Manian
e150d87944 updating csslint to latest version 2011-07-05 15:26:41 -07:00
Divya Manian
b131981d84 Now you can set images.bypass with a list of image files or folders within the img directory that you do not want to be optimized. Fixes #564 2011-07-04 13:56:44 -07:00
Divya Manian
d19dea0572 1. Added a bypass option that lets you bypass certain folders/files in mylibs dir. 2. Cleaned up the human error fix from yesterday to use if else conditions like rest of the targets. 3. Cleaned up usage of mylibs to refer to dir.js.mylibs everywhere 2011-07-04 12:54:51 -07:00
Divya Manian
f5e2524c96 Merge pull request #593 from roblarsen/master
Test for ant version to head off problems with ant < 1.8.2
2011-07-04 07:55:01 -07:00
Rob Larsen
3fb77e0cfa Added a task to test for ant version and fail (with instructions) if it's below 1.8.2. 2011-07-04 10:04:45 -04:00
Divya Manian
e3367bc021 removing concatinated css files from wherever they are linked to with link tag. Fixes #452 2011-07-04 01:42:37 -07:00
Divya Manian
e12930a242 removing unnecessary check on -clean for -invalid 2011-07-04 01:01:25 -07:00
Divya Manian
8e0864f509 with great trepidation I have tested this build conditions to make sure these values ., .., ./, ../, / for dir.publish do not result in a successful build. I have tested all the combinations. Fixes #393 2011-07-04 00:49:33 -07:00
Paul Irish
93f0e38c51 update chromeframe install to 1.0.3. thx @davidmurdoch. 2011-07-01 12:27:19 -04:00
Nicolas Gallagher
705493215e Merge pull request #586 from meleyal/print-styles
Use black for links when printing, refs #147
2011-07-01 09:13:48 -07:00
meleyal
02e749a3f4 fix formatting 2011-06-29 22:58:33 +02:00
meleyal
d9146777db remove redundant color rule 2011-06-29 22:52:19 +02:00
Paul Irish
f7da334d36 Merge pull request #589 from BrunoDeBarros/master
csslint without whitespace
2011-06-29 13:03:44 -07:00
Bruno De Barros
8628fef73e csslint
Does the same as https://github.com/paulirish/html5-boilerplate/pull/567 but without the whitespace, as per @paulirish's request.
2011-06-29 20:58:36 +01:00
meleyal
35872f2e58 also use black for links when printing, refs #147 2011-06-29 13:00:10 +02:00
Mike Almond
ddd7ae43a5 Updating TTF mimetype to fix Google Chrome warning 2011-06-28 20:46:08 -07:00
Divya Manian
954d45cbcb added vertical-align: middle to fix borders on image containers. Fixes #440 2011-06-28 20:29:49 -07:00
Paul Irish
f569ad9813 Merge pull request #585 from rros/master
Workaround for bug in mod_filter

Fixes #441. Fixes #499. Fixes #535.
Closes #549. (the grouping ticket)
Ref #576 (the similar PR)
2011-06-28 17:25:47 -07:00
Robert Ros
210fbe0947 Merge remote-tracking branch 'upstream/master' 2011-06-29 01:13:10 +02:00
Robert Ros
86581681eb Use substring matching in gzip filter_module and re-enable gzip for some common MIME-types 2011-06-29 01:12:12 +02:00
Paul Irish
26a391c60d Revert "Added native iOS inertia scrolling" Details below:
We had discussion here: fbfbbd5dad
and here: https://github.com/paulirish/html5-boilerplate/pull/577

And @irae's explanation helped clarify why this is a bad call as a default:
https://github.com/paulirish/html5-boilerplate/pull/577#issuecomment-1444977

Thanks everyone for weighing and sorry for jumping on the excitement train a bit too fast! :)

This reverts commit 14ba59535e.
Ref #577
2011-06-26 22:26:18 -07:00
darktable
b125225228 added css-split task to split a tagged css file into multiple files
added 'css-split' task to build.xml and changed style.css back to the main version, with "- h5bp-export: filename - " tags in it to allow automated splitting into root file with @imports and satellite files.
2011-06-26 13:15:14 -07:00
Nicolas Gallagher
b61671ccc6 Merge pull request #580 from thatcoolguy/master
Format svg ruleset the same way other rulesets are formatted
2011-06-26 09:43:17 -07:00
Frank
91f39213da changed svg formatting 2011-06-26 12:48:44 -03:00
darktable
036b1e5e4b more robust @import regexp. 2011-06-25 22:15:08 -07:00
darktable
401250356e swapped style.css for property name ${file.root.stylesheet}
swapped to property name to make the build process more flexible.
2011-06-25 20:08:14 -07:00
darktable
2d09367d64 another experimental method for concatenating css files
This build converts the @import statement in style.css to tags that are then swapped for the file contents.
It also converts the media types after the import to @media ... {} style tags.
2011-06-25 19:38:14 -07:00
darktable
0928889ddc new way to concat css files together
adding css/concat directory with the css files named in the order they should be included.
the build script then concats these files in alphabetical order and replaces their block with the concated file using the same method as the .js swap (looks for the surrounding comments).
2011-06-25 12:53:03 -07:00
Paul Irish
fbfbbd5dad Merge pull request #577 from joeybaker/master
Added native iOS inertia scrolling (avaliable in iOS5 beta2)
2011-06-25 12:28:32 -07:00
Joey Baker
14ba59535e Added native iOS inertia scrolling (avaliable in iOS5 beta2) 2011-06-25 12:11:28 -07:00
Robert Ros
6edd2cb9b2 Workaround for broken regexes in mod_filter
More info: #549
Fixes: #441 #499 #535
2011-06-25 11:55:11 +02:00
Mathias Bynens
5e26749118 Encourage people to send the X-UA-Compatible HTTP header instead of leaving it in the HTML, to avoid edge case issues. Fixes #378. 2011-06-24 12:00:32 -07:00
Paul Irish
b84c9aeb50 Merge pull request #573 from retlehs/master
protocol-relative URL for Chrome Frame install prompt
2011-06-23 22:39:52 -07:00
Ben Word
4c8e51a459 protocol-relative URL for the Chrome Frame install prompt 2011-06-23 23:08:35 -06:00
Paul Irish
8ace459e0e move chromeframe to bottom of page after the other scripts. also reference exact version # for higher expires headers. 2011-06-23 21:13:25 -07:00
Paul Irish
c03be7e137 Merge pull request #572 from adeelejaz/upstream
Prompt IE 6 users to install Chrome Frame. #495
2011-06-23 21:09:24 -07:00
Adeel Ejaz
bca1d30716 Prompt IE 6 users to install Chrome Frame. #495 2011-06-24 01:47:06 +01:00
Paul Irish
82c2125692 Merge pull request #570 from botskonet/master
very minor gitignore additions of textmate project folder, and older CVS folders
2011-06-23 09:20:48 -07:00
Mike Botsko
5572931889 adding back in lost sass_cache gitignore 2011-06-23 08:58:18 -07:00
Shi Chuan
b37d518d81 removed trailing slash redirects in htacess
a wiki page is created for people who want to use it: https://github.com/paulirish/html5-boilerplate/wiki/Proper-usage-of-trailing-slash-redirects
it is also under the Make it better section of the wiki https://github.com/paulirish/html5-boilerplate/wiki/Make-it-better
this has been discussed at many issues/tickets/mailinglist posts #493 #515
2011-06-23 22:57:34 +08:00
Paul Irish
d5d05a36cd if you type <input type=search> then you're getting a search input. ohmagawd. 2011-06-22 21:21:02 -07:00
Mike Botsko
94c63ee571 adding textmate project and CVS folders to gitignore 2011-06-22 15:21:35 -07:00
Nicolas Gallagher
b49ca17032 Add <svg> overflow fix for IE9. Group <img> and <svg> rules in an 'embedded content' section of CSS file. Add {cursor:pointer} to <label> element. 2011-06-21 18:53:11 +01:00
Nicolas Gallagher
6aba703c89 Add <img> and <svg> to elements.html 2011-06-21 18:49:34 +01:00
Nicolas Gallagher
73b878bf9e Merge branch 'master' of github.com:paulirish/html5-boilerplate 2011-06-21 00:36:34 +01:00
Nicolas Gallagher
ddaf66a515 Major: Now using css normalization instead of css reset + building up default styles
We're pulling in http://github.com/necolas/normalize.css/ developed by Nicolas Gallagher along with Jonathan Neal.

normalize.css retains useful browser defaults and includes several common fixes to improve cross-browser (desktop and mobile) styling consistency.

Lots of research has gone into normalize, verifying what are the default user agent styles provided by each browser. We can very specifically change only the ones we need to instead of the bulldozer approach.

Why this is great news:

* Who likes being so damn redudant and declaring: em, i { font-style: italic; }
* By using normalization instead of a reset + building up default styles, we use less styles and save bytes
* Less noise in your dev tools: when debugging, you don't have to trawl through every reset selector to reach the actual style that is causing the issue.
* More details here: http://necolas.github.com/normalize.css/

We're really happy to get user feedback on this, as we think style normalization is a better direction than resetting; and want to make sure you do too. :) Leave a comment here or in the Google Group: http://h5bp.com/group

Fixes #412
Fixes #500
Fixes #534
Closes #456

Links #566
2011-06-21 00:34:58 +01:00
Nicolas Gallagher
e9f342b91f Update HTML elements demo: reduce repetition, remove deprecated elements, add certain HTML5 elements, add more comprehensive collection of HTML5 input types, include different form markup styles, add form elements box-sizing test 2011-06-20 22:11:06 +01:00
Paul Irish
6d8a8ef805 Merge pull request #548 from darktable/master
minify css and js files that are not being concatenated and fix optipng reference.
2011-06-20 11:21:45 -07:00
Divya Manian
31025414e9 Merge pull request #568 from disusered/master
.htaccess comment normalization & ignore .sass-cache in Git
2011-06-20 09:58:41 -07:00
Carlos Rosquillas
4f2003b5fe Added SASS Cache to git exclusion list 2011-06-20 09:39:18 -07:00
Carlos Rosquillas
bfe9a84023 Modified htaccess for consistent capitalization and comment style 2011-06-20 09:35:34 -07:00
Nicolas Gallagher
929eeccc5f Add simpler escape for to demo html files 2011-06-19 23:42:14 +01:00
Paul Irish
2f370b8156 Merge pull request #565 from toddhgardner/patch-1
Added DOCTYPE so Eclipse and other IDE's do not complain about the lack o
2011-06-16 21:45:17 -07:00
toddhgardner
d97a2ff818 Added DOCTYPE so Eclipse and other IDE's do not complain about the lack of schema.
http://stackoverflow.com/questions/363768/disable-dtd-warning-for-ant-scripts-in-eclipse
2011-06-16 20:20:39 -07:00
Nicolas Gallagher
ff68f939b6 Merge branch 'master' of github.com:paulirish/html5-boilerplate 2011-06-15 23:12:45 +01:00
Nicolas Gallagher
1a54c57370 Remove unnecessary units from 0 values in box-shadow. Remove unnecessary h1-6 {font-weight:bold} declaration. Improve white-space consistency. 2011-06-15 23:12:01 +01:00
Mathias Bynens
0b5d68c0af Merge pull request #559 from rdeknijf/patch-1
typo
2011-06-14 08:31:06 -07:00
rdeknijf
bec3000690 typo 2011-06-14 08:25:26 -07:00
Nicolas Gallagher
bc1b720915 Switch to outline:0 for accesible focus treatment. Avoids Opera bug when combined with transitions. Also saves bytes. 2011-06-14 12:35:03 +01:00
Nicolas Gallagher
dab7d7ebc7 Merge pull request #557 from johnattebury/master
Correct comment typo
2011-06-12 03:11:10 -07:00
John Attebury
b4432895b5 typo 2011-06-12 00:32:35 -05:00
Mathias Bynens
7610e41dad Typo. 2011-06-08 11:29:16 -07:00
Mathias Bynens
b10c7c04c4 Simpler escape for </script>. See http://mths.be/etago for more information. 2011-06-07 13:32:25 -07:00
Paul Irish
83f3d6ab09 move tap-highlight to hang with the other hot pinks. 2011-06-06 19:17:47 -07:00
darktable
ef41c51637 updating windows optipng and jpegtran paths to include ${basedir} 2011-06-06 13:47:42 -07:00
darktable
a2c89c0964 removed duplicated block. 2011-06-06 10:18:15 -07:00
Calvin Rien
dc31d7c852 build doesn't fail in mylibs directory doesn't exist.
removed undefined property from css swap regexp.
2011-06-06 10:13:48 -07:00
Calvin Rien
e02dd35b51 minification affects all .css and .js files in /css and /js dirs,
not just the ones explicitly included in concatenation.

using a more flexible regexp to replace style.css in html files.
2011-06-06 10:00:20 -07:00
Audioname
452c2836b2 Merge branch 'master' of github.com:darktable/html5-boilerplate
Conflicts:
	build/build.xml
2011-06-06 09:49:13 -07:00
Audioname
2834081fac Merge https://github.com/paulirish/html5-boilerplate 2011-06-06 09:42:41 -07:00
Mathias Bynens
7f31896fd4 Add .gitattributes. 2011-06-06 08:51:25 +02:00
Divya Manian
9cba6fcae9 Merge pull request #547 from thatryan/patch-1
Removed comment stating closing media query comment was required for respond.js
2011-06-05 00:41:27 -07:00
Ryan
26463fe491 Removed comment stating closing media query comment was required for respond.js. 2011-06-05 00:39:04 -07:00
Mathias Bynens
0a3456758b Fix typo. 2011-06-04 06:06:25 -07:00
necolas
ab3abb63db Update Respond.js to improved, comment-free version. Remove the CSS comments that the old version of Respond required. 2011-06-02 18:48:21 +01:00
necolas
4504c11445 Update demo files to reference Modernizr 2.0 2011-06-02 18:44:29 +01:00
Mathias Bynens
695d2ca304 Encourage people to use a custom Modernizr build containing only the features they need for that particular project. 2011-06-02 01:43:38 -07:00
Mathias Bynens
7b37e95341 Merge pull request #543 from daylerees/master
Modernizr 2.0 Update.
2011-06-02 01:39:32 -07:00
Dayle Rees
7227e7fb27 Updated to Modernizr 2.0 Complete, Production minified. 2011-06-02 09:28:54 +01:00
darktable
fdbbc12871 merging from main 2011-05-31 20:48:42 -07:00
Paul Irish
bad4fb5288 build script: compress all images in subfolders, too. thx calvin rien. 2011-05-30 19:02:45 -07:00
darktable
d9f114c019 added gae.js_dir and gae.css_dir so that App Engine projects can have the correct directory names swapped in their templates.
added a second replace token statement so that "/css/style.css" gets swapped too.
2011-05-30 14:49:12 -07:00
darktable
5c93b03069 swapped "apply rm" for delete task. much faster.
change *.png and *.jpg to **/*.png and **/*.jpg so that optimize commands reach subdirectories.
2011-05-30 14:41:24 -07:00
Ryan Smith-Roberts
c7f763c966 mod_deflate trigger rules modifications
* Add gzip support for xhtml, rss, atom
* Move font & svg compression from FilesMatch to FilterProvider / AddOutputFilterByType
2011-05-28 13:04:07 -07:00
Paul Irish
c24b78462a Merge pull request #530 from brianblakely/patch-1
Issue 482: https://github.com/paulirish/html5-boilerplate/issues/482
2011-05-28 02:06:07 -07:00
brianblakely
3300a6847f Issue 482: https://github.com/paulirish/html5-boilerplate/issues/482 2011-05-27 22:09:28 -07:00
Audioname
347e0c0053 testing123 2011-05-26 15:20:47 -07:00
Audioname
1d0ec96931 Adding properties to project.properties so that
Google App Engine builds don't have "static"
prepended when swapping for minified versions.
2011-05-26 15:02:51 -07:00
Paul Irish
fdb8f6aced Merge pull request #527 from heff/master
Added additional mp4 extensions to MIME types
2011-05-26 11:41:52 -07:00
Steve Heffernan
a30e338dc5 Added m4a (Need it for IE9) and m4v (HandBrake default) MIME types. 2011-05-26 11:18:38 -07:00
Paul Irish
14608f44cf Merge pull request #421 from JoeMorgan/master
Added JSLint target to build script
2011-05-25 15:10:27 -07:00
necolas
cbbaaecc0e Add 'oldie' class to conditional <html> classnames. Fix #522 2011-05-24 20:53:51 +01:00
necolas
7f53f98ec7 Revert "Change our conditional comments around the HTML tag to use a single .oldie class."
This reverts commit e5e057e538.
2011-05-24 20:47:21 +01:00
Paul Irish
b4a91bda9f build script is compatible with php files now. it appears. fixes #392. thx robbyrice. 2011-05-20 14:13:23 -07:00
necolas
e5e057e538 Change our conditional comments around the HTML tag to use a single .oldie class.
http://mathiasbynens.be/notes/safe-css-hacks

We're doing this because that quadruple conditional comment <html> tag definition looks pretty scary and especially when combined with namespace augmenting stuff like Facebook's gross xmlns:fb="http://www.facebook.com/2008/fbml" bullshit.

We are trying to simplify the markup we use in H5BP and a combination of conditional classnames with IE-specific hacks would be much simpler than the markup bloat we currently have.

We'll target IE6 and IE7 specifically with attribute syntax hacks.
http://paulirish.com/2009/browser-specific-css-hacks/


    /* CLEAN NO HACKS */
    div { color: blue; }

    /* HACKS FOR IE */
    .oldie div {
      color: blue; /* IE 8 and below */
      *color: blue; /* IE 7 and below */
      _color: blue; /* IE 6 */
    }

    /* IE6, IE7 - star hack */
    .oldie div { *color: blue; }

    /* IE8 - winning hack */
    .oldie div { color: blue\0/; } /* must be last declaration in the selector's ruleset */

Using these attribute hacks by themselves does not change the selector specificity. If you've worked with a large, long-term codebase, you'll know managing your specificity wisely is critical. Also watch Nicole Sullivan's talks.
2011-05-20 01:32:42 +01:00
Divya Manian
362d0b78d3 Merge pull request #513 from barneycarroll/patch-1
Fix .ir fringe case failure when <br>s are used in the .ir text.
2011-05-19 10:53:22 -07:00
Barney Carroll
bb94ded9f3 Hard breaks in image-replaced text negate the negative text indent. This fix causes line breaks in image-replaced text not to be displayed, fixing the effect. 2011-05-19 08:53:00 -07:00
Shi Chuan
9ee01e94dc moved ETag removal configs closer 2011-05-19 15:10:34 +08:00
Paul Irish
91ff0b8fec Merge pull request #511 from gormus/patch-1
added Header unset ETag
2011-05-18 22:53:23 -07:00
Osman Gormus
1f94b05317 added Header unset ETag
In some servers setting "FileETag None" alone, is not enough. Removing header and setting it to None fixes the issue.
2011-05-18 22:45:11 -07:00
Paul Irish
648026d780 Tweaking our hot pink ::selection based on a suggestion from David Murdoch and research from Adam Diehm.
It is now #fe57a1, which is Festal (adj): pertaining to or befitting a feast, festival, holiday, or gala occasion.

Party!! Party in your webpage! With Festal!!!!

thx also to lexidecimal.com for putting a name to this damn thing and inspiring david to inspire others.
2011-05-18 12:09:51 -07:00
necolas
24f174de59 Fix incorrect paths to Modernizr and Respond in demo pages 2011-05-17 19:24:54 +01:00
necolas
1cec539712 Use minified CDN jQuery by default on demo pages 2011-05-17 19:24:08 +01:00
necolas
b6a8dec0e4 Further quote consistency changes 2011-05-17 19:23:11 +01:00
Paul Irish
0e1c7ba929 Use minified jQuery by default.
While I personally prefer developing with an unminified jQuery (as
it makes debugging easier) I understand that most people don't need that.

So the onus is now on more advanced developers to s/.min.js/.js/
Though they're safe with the build script which will switch the refs back to the min.

And everyone else will default to min'd js, regardless of if they use the
build script.

:)
2011-05-17 09:40:24 -07:00
Paul Irish
f467a7e84b minor whitespace. 2011-05-17 09:38:20 -07:00
Mathias Bynens
c5289aad2b Consistent quotes. Hat tip: @walker. 2011-05-17 09:20:08 -07:00
Paul Irish
4c3301b9cc Merge pull request #505 from jtokoph/master
Fixing broken link to wiki in the changelog
2011-05-16 14:04:23 -07:00
Jason Tokoph
e3d389a171 Fixed URL typo in the changelog 2011-05-16 13:36:59 -07:00
necolas
974d1e2d0b Merge branch 'master' of git://github.com/paulirish/html5-boilerplate 2011-05-15 19:25:58 +01:00
Paul Irish
3522122e31 Merge pull request #502 from sguolin/master
Build script compatibility with Netbeans
2011-05-15 10:59:41 -07:00
See Guo Lin
fb41ccd538 Improved build script compatibility with Netbeans IDE. 2011-05-15 19:15:23 +08:00
See Guo Lin
4bbbfc88de default.properties: added IDE generated files/folders to exclude from build script 2011-05-15 19:14:20 +08:00
See Guo Lin
0c9eec9b52 .gitignore: Filename case correction for Windows generated Thumb.db 2011-05-15 19:13:06 +08:00
necolas
5cad48ced5 Fix #374 2011-05-13 15:39:59 +01:00
necolas
8a3955dae6 Normalize <b> font-weight 2011-05-13 15:05:03 +01:00
necolas
59b993abe9 Update to jQuery 1.6.1 2011-05-13 15:04:11 +01:00
Shi Chuan
b0685726da fixes to pull requests 427 2011-05-13 19:54:50 +08:00
Drew Petersen
0e41abd9e2 formatting style correction 2011-05-12 13:02:27 -04:00
Drew Petersen
caab9d30bd don't wrap all args from log to console.log with array 2011-05-12 12:48:09 -04:00
Nicolas Gallagher
e10e3f04b4 Merge pull request #491 from jphustman/patch-3
typo line 41: buidling a development environment
2011-05-09 01:05:19 -07:00
Jeremey Hustman
98180a91f9 typo line 41: buidling a development environment 2011-05-08 17:50:23 -07:00
necolas
0e2062cb4a Add placeholder CSS MQs for mobile-first approach 2011-05-08 20:50:34 +01:00
necolas
7d792b6845 Add respond.js as part of shift to 'mobile first' approach 2011-05-08 20:42:41 +01:00
necolas
e65c1ad37f Remove icon links in demo files 2011-05-08 20:06:16 +01:00
Divya Manian
9c1188592a Editing the comment for adding touch icons 2011-05-08 11:29:52 -07:00
Divya Manian
1faa76a804 Merge pull request #490 from jamwil/touch-icons
Removing touch icon link tags and retaining only the comment.
2011-05-08 11:28:05 -07:00
James Williams
f4283547f8 Removed redundant icon links and cleaned up the comment 2011-05-08 10:30:16 -06:00
Mathias Bynens
2833b89914 Add Options +FollowSymlinks when RewriteEngine is used. Fixes #489. 2011-05-07 23:42:48 -07:00
James Williams
d284eac8fd Improved the comment. 2011-05-07 22:14:52 -06:00
James Williams
6a71a7e9d5 Added maximum touch-icon support as per http://mathiasbynens.be/notes/touch-icons#sizes 2011-05-07 21:58:28 -06:00
necolas
cf2ee8e826 Update demo tests file 2011-05-07 11:31:54 +01:00
necolas
ef83a0481e Update qunit test page to reference jQuery 1.6 2011-05-07 11:27:31 +01:00
necolas
758f2f4f4c Update elements.html template to match that of index.html 2011-05-07 11:13:37 +01:00
Nicolas Gallagher
e7089e8cf8 Merge pull request #484 from jsma/master
Removed reference to handheld.css
2011-05-05 15:36:58 -07:00
John-Scott Atlakson
8e36358c04 Removed reference to handheld.css now that this has been removed. 2011-05-05 15:32:48 -07:00
Divya Manian
496898500c Merge pull request #483 from jsma/master
Removed dd_belatedpng.js from index.html
2011-05-05 15:32:28 -07:00
John-Scott Atlakson
fe1d2a3f70 Removed dd_belatedpng.js from index.html now that the file has been removed from the project. 2011-05-05 15:24:58 -07:00
necolas
dbed4dacf7 Remove handheld.css and belatedpng fix 2011-05-05 19:04:35 +01:00
necolas
fd2a816d53 Change form element alignments; group and reduce repetition of form element selectors 2011-05-05 18:33:28 +01:00
necolas
a7361c1a13 Remove font:inherit from reset. Fix #451 2011-05-05 18:01:41 +01:00
Divya Manian
3180b3f3dd Merge pull request #439 from clemos/master
trailing slash redirections should be relative
2011-05-04 21:05:16 -07:00
slavic
1a398b3eaf some more security for php - turn off error display and turn on error logging 2011-05-05 11:17:03 +08:00
slavic
61557bbe09 some more security for php 2011-05-05 11:13:33 +08:00
Divya Manian
1d229e42d1 Merge pull request #480 from walker/master
jQuery 1.6 update
2011-05-04 19:39:02 -07:00
Mathias Bynens
d96d5b6c8b Merge pull request #481 from jsma/patch-1
Added Site Speed tracking for Google Analytics.
2011-05-04 12:52:24 -07:00
John-Scott Atlakson
7bc7e96d96 Added Site Speed tracking for Google Analytics.
See => http://www.google.com/support/analyticshelp/bin/answer.py?hl=en&answer=1205784&topic=1120718
2011-05-04 12:51:19 -07:00
Paul Irish
edd1da8572 Merge pull request #478 from Calvein/master.
Moved the ::selection declaration
2011-05-04 12:08:32 -07:00
walker
ffa8bc9438 Updated links for 1.6 2011-05-04 12:17:23 -04:00
walker
c1e3a7e6b4 jQuery 1.6 2011-05-04 11:42:06 -04:00
François Robichet
6ce2a0f9f9 You might tweak the ::selection's color too. 2011-05-04 02:11:53 -07:00
necolas
ac92ae7a5f Update micro clearfix method 2011-04-26 22:59:45 +01:00
Paul Irish
37462b1bcc Merged pull request #469 from leobetosouza/patch-1.
Allow blackberry to read vcards
2011-04-26 12:34:06 -07:00
leobetosouza
fc7d9e1ebb Allow blackberry to read vcards 2011-04-26 12:25:51 -07:00
Mathias Bynens
b2faa1fc3c Add img { max-width: 100%; } to print styles to prevent images from getting cut off.
Hat tip: http://twitter.com/dontcallmedom/status/40413256942235648
2011-04-25 13:18:46 -07:00
necolas
1b78ceb957 Add overflow:hidden to pseudo-elements for clearfix. Avoids edge case of space at top of body in Firefox. 2011-04-21 19:57:53 +01:00
necolas
9a9660b2f9 Tidied up link to clearfix explanation 2011-04-21 17:09:22 +01:00
necolas
5373835d17 Update clearfix to use 'micro' clearfix 2011-04-21 11:32:49 +01:00
Matthew Donoughe
7e5efcc23c change jpeg task so it doesn't run unnecessarily
on my computer, unlike the old warning said, jpegtran was being run even
if the image had not changed
2011-04-16 18:49:47 +00:00
Matthew Donoughe
a2274d1993 copy files last
This slightly simplifies copying because we don't have to exclude png,
jpeg, or html files from the copy stage.
2011-04-16 18:43:57 +00:00
Matthew Donoughe
a59a243eda dd_belatedpng should be dd_belatedpng.min
it comes preminified, and we don't need to minify it again

This also updates the html so that the script is not missing if the
unminified scripts are unavailable on the server

This commit requires a change to existing html files :/
2011-04-16 18:38:39 +00:00
Shi Chuan
c0d3d939d7 Merge remote branch 'danielfilho/master' 2011-04-16 14:54:44 +08:00
Patrick Hall
b62ca34b72 curly quotes hates us 2011-04-14 16:48:55 -07:00
Daniel Filho
5b0dd0f4df fixing the order of stylesheets on build.xml as suggested by @shichuan. Fixes #435 2011-04-14 16:37:03 -03:00
Divya Manian
6ee79bc4ba making nicolas comment less wordy 2011-04-14 12:20:55 -07:00
necolas
72bb744064 Group link styles. Group form styles. Simplify the way input, button, textarea normalisation is done 2011-04-15 03:03:34 +08:00
necolas
0e18366fc5 Add input and button padding fixes for IE and Firefox 2011-04-15 03:03:33 +08:00
AD7six
45cd0378d5 don't add the callee - unless you're going to use it 2011-04-15 01:14:28 +08:00
walker
24b0f14ca0 Added in jquery 1.5.2 2011-04-15 00:55:44 +08:00
Daniel Filho
0843a608eb Put the -strip-console.log right befor all js.* calls on build.xml 2011-04-13 19:07:55 -03:00
Clément
1cf9f7487f removed slash to allow relative redirections 2011-04-12 12:23:07 +02:00
necolas
d2acfe0654 Simplify the conditional comment containing code for IE 9+ and modern browsers 2011-04-09 23:58:31 +08:00
Matthew Donoughe
eab37feb45 fix the recursive concatination properly
don't minify scripts-concat and libs-concat and there won't be a
scripts-concat.min.js to include into the next scripts-concat.js
2011-04-09 05:17:43 +00:00
Matthew Donoughe
f1a8fbf649 don't include scripts-concat in scripts-concat
otherwise your scripts duplicate and pile up
2011-04-08 21:51:20 +00:00
Matthew Donoughe
043491dea5 fix imgcopy 2011-04-08 18:30:24 +00:00
Matthew Donoughe
b817d1758c work around OptiPNG #2671422
delete old optimized pngs because optipng does not support overwriting
2011-04-08 18:29:19 +00:00
Matthew Donoughe
a0ac99a4d9 optimize build process
Intermediate stages are stored in a new intermediate folder, and only
files that should be published are copied into the publish folder.

Files are not deleted at the beginning of every build, and files that
have already been processed will not be reprocessed unless the source
has changed.

Versioned files are referenced by a SHA-1 hash of the content rather
than a build number. This means that changing your HTML and rebuilding
will not cause your users to redownload the same CSS and Javascript, and
a reverted change may cause users to use a copy that was previously
downloaded. It may be better to use only part of the hash so the HTTP
request is shorter.

Cleaning must be done manually to delete unreferenced files, or you will
eventually fill your publish folder with unreferenced files. AFAIK this
is a very hard problem to solve properly with Ant because there's no
file dependency tree available to show which files are not products of
the current build. It's doable by creating a map from source to publish
and excluding those files while deleting everything from publish, but it
may be better to just delete the publish directory?

console.log statements are no longer commented out. The regular
expression responsible did not work properly if there were parenthesis
inside the console.log, and it put comments into the scripts that had
just been minimized, so they weren't really minimal anymore.
2011-04-07 23:10:28 +00:00
Matthew Donoughe
96d7b26406 change the source htaccess rather than updating it 2011-04-07 23:10:28 +00:00
Matthew Donoughe
c35755b8d6 try not to reoptimize the same images every time 2011-04-07 23:09:48 +00:00
Paul Irish
e3007f0b31 nerf the serverconfig manip by checking to make sure it exists. fixes #423 2011-04-07 13:38:30 -07:00
Joe Morgan
2d4ddfeca9 Added JSHint as separate target and added ability to configure options in the project.properites file 2011-04-05 11:48:26 -04:00
Joe Morgan
164dcab88b Added JSHint target (separate from JSLint, so users could call either without having to make edits to the properties file) 2011-04-05 10:53:51 -04:00
Joe Morgan
5ea8b6446b Added JSLint target to build script (runs independently on source JS, excludes *.min.js and libs/*.js files) 2011-04-05 09:15:48 -04:00
Joe Morgan
ce6878eeb4 added comment 2011-04-05 09:11:33 -04:00
Joe Morgan
7ef42605c2 added some globals for rhino functions 2011-04-05 09:09:18 -04:00
Joe Morgan
b736756a92 prettied up the JSLint code 2011-04-05 09:06:51 -04:00
Joe Morgan
3820568da4 added config options to jslint 2011-04-04 21:50:14 -04:00
Joe Morgan
ce7e249ae4 added jslint target 2011-04-04 21:40:49 -04:00
Paul Irish
8185bc313a Update htmlcompressor to 1.1 which uses the new yuicompressor for CSS. fixing a @media query bug (for inline style tags.) 2011-03-30 12:51:52 -07:00
Paul Irish
bb22ca66a8 Remove the cache-busting query parameters from the HTML. Details below:
In case you were wondering what ?v=2 was for.. read this:
http://html5boilerplate.com/docs/#Version-Control-with-Cachebusting

Query param revving is bad news:
http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/

Even though that warning is from 2008, I've confirmed with Souders (a few months ago)
that this is still a concern.

The build script automatically revs filenames for you, so this is taken care of.
If you need to manually cachebust, then feel free to add the query params yourself, but
be aware of the small consequences. It shouldn't be a regular thing. ;)
2011-03-30 08:26:45 -07:00
Mike Almond
5b6db9d0bd Disable directory browsing by default 2011-03-29 12:01:22 -07:00
Han Lin Yap
edf9c3fbdb httponly 2011-03-29 22:53:34 +08:00
Gregg Gajic
9b1a477b12 Fix typo in Changelog 2011-03-28 17:55:11 -05:00
Paul Irish
41c657a05a adjust attribution byline. 2011-03-26 16:54:40 -07:00
Samus_
b9341fe4ce protecting against git rev-parse silly behavior on unrecognized options 2011-03-25 23:25:50 -04:00
Samus_
91fa216839 protect commands from weird filenames 2011-03-25 22:55:25 -04:00
Paul Irish
e4edeff4fa Revert "Fixing input type="search" behaviour in Safari by John Lein http://diveintohtml5.org/forms.html thanks to MarcHaunschild and hoopyfrood fixes #396"
This reverts commit 4dc87b52c2.

Based on the conversation here:
https://github.com/paulirish/html5-boilerplate/commit/4dc87b52c2
2011-03-23 13:30:34 -07:00
Shi Chuan
4dc87b52c2 Fixing input type="search" behaviour in Safari by John Lein http://diveintohtml5.org/forms.html thanks to MarcHaunschild and hoopyfrood fixes #396 2011-03-24 00:33:24 +08:00
Shi Chuan
71880dee16 fixed missing letter t in properties files in build tool 2011-03-23 00:49:08 +08:00
Shi Chuan
5c9fa3a83d fixed typo styleshee to stylesheet in build default properties 2011-03-23 00:32:14 +08:00
alrra
19fec34e0d modified the 404 page (it can cause some problems in IE if the user decided to use the html5shiv: e.g.: http://i.imgur.com/iK5ad.png) 2011-03-22 21:49:55 +08:00
Paul Irish
50fb1a7870 update yuicompressor to 2.4.5. fixes media query minification issue.
Basically ...

@media screen and (max-width:980px){

was getting minified to

@media screen and(max-width:980px){

Which webkit was rejecting.. So.. now the updated yuicompressor leaves that space in place.
And all is well with the world.
<3z
2011-03-21 23:19:13 -07:00
Paul Irish
69039d03b9 build script: spruced up the echo messages to make it a little friendlier. 2011-03-20 18:47:13 -07:00
Paul Irish
2fedc604cc createproject shoudl also copy build and test folders. 2011-03-20 16:24:36 -07:00
Dmitry Gladkov
aa3068c8e0 fix createproject.sh directory copying 2011-03-20 15:54:37 -07:00
Paul Irish
7f73ae3d72 build script: go back to yuicompressor for CSS. php dependency is a little awkward. temporary goodbye to css @import inlining. :/ au revoir. 2011-03-20 10:23:53 -07:00
Paul Irish
94cb8195b7 build script: change search/replace to be a global task. 2011-03-20 10:20:27 -07:00
Divya Manian
5b4ddd3a58 updated read me with translators, contributors 2011-03-19 21:34:34 -07:00
Paul Irish
dc5379c0c9 delete build.properties. consider it vestigal. 2011-03-19 15:01:37 -07:00
Paul Irish
828141a41d build script: adjust images path in case folder structure is unique. 2011-03-19 15:01:36 -07:00
David Murdoch
d7d467e69e Replace single-quotes with double-quotes for consistency and to save a few extra bytes during GZIP/DEFLATE compression 2011-03-16 05:50:07 +08:00
jbueza
ff3ed8f402 Fixed demo elements page with whitespace fix. 2011-03-16 05:47:10 +08:00
Marcel Turi
caeb9138fc Description corrections for "Built-in filename-based cache busting" section. 2011-03-16 00:49:03 +08:00
Shi Chuan
17894ff685 added separate task prodcopy to handle buildkit and build with jpgtran 2011-03-08 01:23:23 +08:00
Paul Irish
a39f656d95 Revert " removing demo/ and readme temporarily to tag."
That was just temporary so i could tag the release.

This reverts commit f93c3a5b87.
2011-03-07 00:38:05 -08:00
58 changed files with 26736 additions and 6683 deletions

6
.gitignore vendored
View File

@@ -8,14 +8,16 @@
*.swp
*.vi
*~
*.sass-cache
# OS or Editor folders
.DS_Store
.cache
.project
.settings
.tmproj
nbproject
thumbs.db
Thumbs.db
# Dreamweaver added files
_notes
@@ -28,6 +30,8 @@ dwsync.xml
# Folders to ignore
.hg
.svn
.CVS
intermediate
publish
.idea

250
.htaccess
View File

@@ -25,18 +25,12 @@
# github.com/rails/rails/commit/123eb25#commitcomment-118920
# Use ChromeFrame if it's installed for a better experience for the poor IE folk
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
BrowserMatch MSIE ie
Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie
</IfModule>
</IfModule>
<IfModule mod_headers.c>
# Because X-UA-Compatible isn't sent to non-IE (to save header bytes),
# We need to inform proxies that content changes based on UA
Header append Vary User-Agent
# Cache control is set only if mod_headers is enabled, so that's unncessary to declare
Header set X-UA-Compatible "IE=Edge,chrome=1"
# mod_headers can't match by content-type, but we don't want to send this header on *everything*...
<FilesMatch "\.(js|css|gif|png|jpe?g|pdf|xml|oga|ogg|m4a|ogv|mp4|m4v|webm|svg|svgz|eot|ttf|otf|woff|ico|webp|appcache|manifest|htc|crx|xpi|safariextz|vcf)$" >
Header unset X-UA-Compatible
</FilesMatch>
</IfModule>
@@ -58,11 +52,11 @@
# Webfont access
# ----------------------------------------------------------------------
# allow access from all domains for webfonts
# alternatively you could only whitelist
# your subdomains like "sub.domain.com"
# Allow access from all domains for webfonts.
# Alternatively you could only whitelist your
# subdomains like "subdomain.example.com".
<FilesMatch "\.(ttf|otf|eot|woff|font.css)$">
<FilesMatch "\.(ttf|ttc|otf|eot|woff|font.css)$">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
@@ -74,26 +68,34 @@
# Proper MIME type for all files
# ----------------------------------------------------------------------
# audio
AddType audio/ogg oga ogg
# video
# JavaScript
# Normalize to standard type (it's sniffed in IE anyways)
# tools.ietf.org/html/rfc4329#section-7.2
AddType application/javascript js
# Audio
AddType audio/ogg oga ogg
AddType audio/mp4 m4a
# Video
AddType video/ogg ogv
AddType video/mp4 mp4
AddType video/mp4 mp4 m4v
AddType video/webm webm
# Proper svg serving. Required for svg webfonts on iPad
# SVG.
# Required for svg webfonts on iPad
# twitter.com/FontSquirrel/status/14855840545
AddType image/svg+xml svg svgz
AddEncoding gzip svgz
# webfonts
# Webfonts
AddType application/vnd.ms-fontobject eot
AddType font/truetype ttf
AddType application/x-font-ttf ttf ttc
AddType font/opentype otf
AddType application/x-font-woff woff
# assorted types
# Assorted types
AddType image/x-icon ico
AddType image/webp webp
AddType text/cache-manifest appcache manifest
@@ -101,6 +103,7 @@ AddType text/x-component htc
AddType application/x-chrome-extension crx
AddType application/x-xpinstall xpi
AddType application/octet-stream safariextz
AddType text/x-vcard vcf
@@ -111,54 +114,69 @@ AddType application/octet-stream safariextz
# e.g. Inside of script.combined.js you could have
# <!--#include file="libs/jquery-1.5.0.min.js" -->
# <!--#include file="plugins/jquery.idletimer.js" -->
# and they would be included into this single file
# and they would be included into this single file.
# this is not in use in the boilerplate as it stands. you may
# choose to name your files in this way for this advantage
# or concatenate and minify them manually.
# This is not in use in the boilerplate as it stands. You may
# choose to name your files in this way for this advantage or
# concatenate and minify them manually.
# Disabled by default.
# <FilesMatch "\.combined\.(js|css)$">
# Options +Includes
# SetOutputFilter INCLUDES
# </FilesMatch>
#<FilesMatch "\.combined\.js$">
# Options +Includes
# AddOutputFilterByType INCLUDES application/javascript application/json
# SetOutputFilter INCLUDES
#</FilesMatch>
#<FilesMatch "\.combined\.css$">
# Options +Includes
# AddOutputFilterByType INCLUDES text/css
# SetOutputFilter INCLUDES
#</FilesMatch>
# ----------------------------------------------------------------------
# gzip compression
# Gzip compression
# ----------------------------------------------------------------------
<IfModule mod_deflate.c>
# force deflate for mangled headers developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping/
# Force deflate for mangled headers developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping/
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s,?\s(gzip|deflate)?|X{4,13}|~{4,13}|-{4,13})$ HAVE_Accept-Encoding
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
</IfModule>
</IfModule>
# html, txt, css, js, json, xml, htc:
# HTML, TXT, CSS, JavaScript, JSON, XML, HTC:
<IfModule filter_module>
FilterDeclare COMPRESS
FilterProvider COMPRESS DEFLATE resp=Content-Type /text/(html|css|javascript|plain|x(ml|-component))/
FilterProvider COMPRESS DEFLATE resp=Content-Type /application/(javascript|json|xml|x-javascript)/
FilterProvider COMPRESS DEFLATE resp=Content-Type $text/html
FilterProvider COMPRESS DEFLATE resp=Content-Type $text/css
FilterProvider COMPRESS DEFLATE resp=Content-Type $text/plain
FilterProvider COMPRESS DEFLATE resp=Content-Type $text/xml
FilterProvider COMPRESS DEFLATE resp=Content-Type $text/x-component
FilterProvider COMPRESS DEFLATE resp=Content-Type $application/javascript
FilterProvider COMPRESS DEFLATE resp=Content-Type $application/json
FilterProvider COMPRESS DEFLATE resp=Content-Type $application/xml
FilterProvider COMPRESS DEFLATE resp=Content-Type $application/xhtml+xml
FilterProvider COMPRESS DEFLATE resp=Content-Type $application/rss+xml
FilterProvider COMPRESS DEFLATE resp=Content-Type $application/atom+xml
FilterProvider COMPRESS DEFLATE resp=Content-Type $application/vnd.ms-fontobject
FilterProvider COMPRESS DEFLATE resp=Content-Type $image/svg+xml
FilterProvider COMPRESS DEFLATE resp=Content-Type $application/x-font-ttf
FilterProvider COMPRESS DEFLATE resp=Content-Type $font/opentype
FilterChain COMPRESS
FilterProtocol COMPRESS change=yes;byteranges=no
FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no
</IfModule>
<IfModule !mod_filter.c>
# Legacy versions of Apache
AddOutputFilterByType DEFLATE text/html text/plain text/css application/json
AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE text/xml application/xml text/x-component
AddOutputFilterByType DEFLATE application/xhtml+xml application/rss+xml application/atom+xml
AddOutputFilterByType DEFLATE image/svg+xml application/vnd.ms-fontobject application/x-font-ttf font/opentype
</IfModule>
# webfonts and svg:
<FilesMatch "\.(ttf|otf|eot|svg)$" >
SetOutputFilter DEFLATE
</FilesMatch>
</IfModule>
@@ -167,14 +185,14 @@ AddType application/octet-stream safariextz
# Expires headers (for better cache control)
# ----------------------------------------------------------------------
# these are pretty far-future expires headers
# they assume you control versioning with cachebusting query params like
# These are pretty far-future expires headers.
# They assume you control versioning with cachebusting query params like
# <script src="application.js?20100608">
# additionally, consider that outdated proxies may miscache
# Additionally, consider that outdated proxies may miscache
# www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/
# if you don't use filenames to version, lower the css and js to something like
# "access plus 1 week" or so
# If you don't use filenames to version, lower the CSS and JS to something like
# "access plus 1 week" or so.
<IfModule mod_expires.c>
ExpiresActive on
@@ -182,24 +200,25 @@ AddType application/octet-stream safariextz
# Perhaps better to whitelist expires rules? Perhaps.
ExpiresDefault "access plus 1 month"
# cache.appcache needs re-requests in FF 3.6 (thx Remy ~Introducing HTML5)
# cache.appcache needs re-requests in FF 3.6 (thanks Remy ~Introducing HTML5)
ExpiresByType text/cache-manifest "access plus 0 seconds"
# your document html
# Your document html
ExpiresByType text/html "access plus 0 seconds"
# data
# Data
ExpiresByType text/xml "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType application/json "access plus 0 seconds"
# rss feed
# Feed
ExpiresByType application/rss+xml "access plus 1 hour"
ExpiresByType application/atom+xml "access plus 1 hour"
# favicon (cannot be renamed)
# Favicon (cannot be renamed)
ExpiresByType image/x-icon "access plus 1 week"
# media: images, video, audio
# Media: images, video, audio
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
@@ -209,20 +228,19 @@ AddType application/octet-stream safariextz
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"
# htc files (css3pie)
# HTC files (css3pie)
ExpiresByType text/x-component "access plus 1 month"
# webfonts
# Webfonts
ExpiresByType font/truetype "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType application/x-font-woff "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
# css and javascript
ExpiresByType text/css "access plus 2 months"
ExpiresByType application/javascript "access plus 2 months"
ExpiresByType text/javascript "access plus 2 months"
# CSS and JavaScript
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
<IfModule mod_headers.c>
Header append Cache-Control "public"
@@ -236,6 +254,11 @@ AddType application/octet-stream safariextz
# ETag removal
# ----------------------------------------------------------------------
# FileETag None is not enough for every server.
<IfModule mod_headers.c>
Header unset ETag
</IfModule>
# Since we're sending far-future expires, we don't need ETags for
# static content.
# developer.yahoo.com/performance/rules.html#etags
@@ -278,8 +301,10 @@ FileETag None
# ----------------------------------------------------------------------
# Turning on the rewrite engine is necessary for the following rules and features.
# FollowSymLinks must be enabled for this to work.
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
</IfModule>
@@ -303,72 +328,36 @@ FileETag None
# ----------------------------------------------------------------------
# Option 1:
# Rewrite "www.domain.com -> domain.com"
# Rewrite "www.example.com -> example.com"
<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
</IfModule>
# ----------------------------------------------------------------------
# Option 2:
# To rewrite "domain.com -> www.domain.com" uncomment the following lines.
# To rewrite "example.com -> www.example.com" uncomment the following lines.
# Be aware that the following rule might not be a good idea if you
# use "real" subdomains for certain parts of your website.
# <IfModule mod_rewrite.c>
# RewriteCond %{HTTPS} !=on
# RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
# RewriteCond %{HTTP_HOST} (.+)$ [NC]
# RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
# RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# </IfModule>
# ----------------------------------------------------------------------
# Add/remove trailing slash to (non-file) URLs
# ----------------------------------------------------------------------
# Google treats URLs with and without trailing slashes separately.
# Forcing a trailing slash is usually preferred, but all that's really
# important is that one correctly redirects to the other.
# By default option 1 (force trailing slash) is activated.
# http://googlewebmastercentral.blogspot.com/2010/04/to-slash-or-not-to-slash.html
# http://www.alistapart.com/articles/slashforward/
# http://httpd.apache.org/docs/2.0/misc/rewriteguide.html#url Trailing Slash Problem
# ----------------------------------------------------------------------
# Option 1:
# Rewrite "domain.com/foo -> domain.com/foo/"
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/|#(.*))$
RewriteRule ^(.*)$ /$1/ [R=301,L]
</IfModule>
# ----------------------------------------------------------------------
# Option 2:
# Rewrite "domain.com/foo/ -> domain.com/foo"
#<IfModule mod_rewrite.c>
# RewriteRule ^(.*)/$ /$1 [R=301,L]
#</IfModule>
# ----------------------------------------------------------------------
# Built-in filename-based cache busting
# ----------------------------------------------------------------------
# If you're not using the build script to manage your filename version revving,
# you might want to consider enabling this, which will route requests for
# /css/all.20110203.css to /res/all.css
# /css/style.20110203.css to /css/style.css
# To understand why this is important and a better idea than all.css?v1231,
# read: github.com/paulirish/html5-boilerplate/wiki/Version-Control-with-Cachebusting
@@ -387,12 +376,12 @@ FileETag None
# ----------------------------------------------------------------------
# Rewrite secure requests properly to prevent SSL cert warnings, e.g. prevent
# https://www.domain.com when your cert only allows https://secure.domain.com
# https://www.example.com when your cert only allows https://secure.example.com
# Uncomment the following lines to use this feature.
# <IfModule mod_rewrite.c>
# RewriteCond %{SERVER_PORT} !^443
# RewriteRule (.*) https://example-domain-please-change-me.com/$1 [R=301,L]
# RewriteRule ^ https://example-domain-please-change-me.com%{REQUEST_URI} [R=301,L]
# </IfModule>
@@ -409,7 +398,7 @@ Options -MultiViews
# ----------------------------------------------------------------------
# custom 404 page
# Custom 404 page
# ----------------------------------------------------------------------
# You can add custom pages to handle 500 or 403 pretty easily, if you like.
@@ -421,11 +410,11 @@ ErrorDocument 404 /404.html
# UTF-8 encoding
# ----------------------------------------------------------------------
# use utf-8 encoding for anything served text/plain or text/html
# Use UTF-8 encoding for anything served text/plain or text/html
AddDefaultCharset utf-8
# force utf-8 for a number of file formats
AddCharset utf-8 .html .css .js .xml .json .rss
# Force UTF-8 for a number of file formats
AddCharset utf-8 .html .css .js .xml .json .rss .atom
@@ -443,7 +432,7 @@ AddCharset utf-8 .html .css .js .xml .json .rss
# "-Indexes" will have Apache block users from browsing folders without a default document
# Usually you should leave this activated, because you shouldn't allow everybody to surf through
# every folder on your server (which includes rather private places like CMS system folders).
# Options -Indexes
Options -Indexes
# Block access to "hidden" directories whose names begin with a period. This
@@ -470,6 +459,45 @@ AddCharset utf-8 .html .css .js .xml .json .rss
# php_flag register_globals Off
# Rename session cookie to something else, than PHPSESSID
# php_value session.name sid
# Do not show you are using PHP
# Note: Move this line to php.ini since it won't work in .htaccess
# php_flag expose_php Off
# Level of log detail - log all errors
# php_value error_reporting -1
# Write errors to log file
# php_flag log_errors On
# Do not display errors in browser (production - Off, development - On)
# php_flag display_errors Off
# Do not display startup errors (production - Off, development - On)
# php_flag display_startup_errors Off
# Format errors in plain text
# Note: Leave this setting 'On' for xdebug's var_dump() output
# php_flag html_errors Off
# Show multiple occurrence of error
# php_flag ignore_repeated_errors Off
# Show same errors from different sources
# php_flag ignore_repeated_source Off
# Size limit for error messages
# php_value log_errors_max_len 1024
# Don't precede error with string (doesn't accept empty string, use whitespace if you need)
# php_value error_prepend_string " "
# Don't prepend to error (doesn't accept empty string, use whitespace if you need)
# php_value error_append_string " "
# Increase cookie security
<IfModule php5_module>
php_value session.cookie_httponly true
</IfModule>

View File

@@ -1,32 +1,38 @@
<!doctype html>
<title>Page Not Found</title>
<style>
body { text-align: center;}
h1 { font-size: 50px; text-align: center }
span[frown] { transform: rotate(90deg); display:inline-block; color: #bbb; }
body { font: 20px Constantia, 'Hoefler Text', "Adobe Caslon Pro", Baskerville, Georgia, Times, serif; color: #999; text-shadow: 2px 2px 2px rgba(200, 200, 200, 0.5); }
::-moz-selection{ background:#FF5E99; color:#fff; }
::selection { background:#FF5E99; color:#fff; }
article {display:block; text-align: left; width: 500px; margin: 0 auto; }
a { color: rgb(36, 109, 56); text-decoration:none; }
a:hover { color: rgb(96, 73, 141) ; text-shadow: 2px 2px 2px rgba(36, 109, 56, 0.5); }
</style>
<article>
<h1>Not found <span frown>:(</span></h1>
<div>
<p>Sorry, but the page you were trying to view does not exist.</p>
<p>It looks like this was the result of either:</p>
<ul>
<li>a mistyped address</li>
<li>an out-of-date link</li>
</ul>
</div>
<script>
var GOOG_FIXURL_LANG = (navigator.language || '').slice(0,2),
GOOG_FIXURL_SITE = location.host;
</script>
<script src="http://linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js"></script>
</article>
<html>
<head>
<meta charset="utf-8">
<title>Page Not Found :(</title>
<style>
body { text-align: center;}
h1 { font-size: 50px; text-align: center }
span[frown] { transform: rotate(90deg); display:inline-block; color: #bbb; }
body { font: 20px Constantia, 'Hoefler Text', "Adobe Caslon Pro", Baskerville, Georgia, Times, serif; color: #999; text-shadow: 2px 2px 2px rgba(200, 200, 200, 0.5); }
::-moz-selection{ background:#FF5E99; color:#fff; }
::selection { background:#FF5E99; color:#fff; }
article {display:block; text-align: left; width: 500px; margin: 0 auto; }
a { color: rgb(36, 109, 56); text-decoration:none; }
a:hover { color: rgb(96, 73, 141) ; text-shadow: 2px 2px 2px rgba(36, 109, 56, 0.5); }
</style>
</head>
<body>
<article>
<h1>Not found <span frown>:(</span></h1>
<div>
<p>Sorry, but the page you were trying to view does not exist.</p>
<p>It looks like this was the result of either:</p>
<ul>
<li>a mistyped address</li>
<li>an out-of-date link</li>
</ul>
</div>
<script>
var GOOG_FIXURL_LANG = (navigator.language || '').slice(0,2),
GOOG_FIXURL_SITE = location.host;
</script>
<script src="http://linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js"></script>
</article>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +0,0 @@
# build.properties file defines overrides for default.properties
# Explanation: This file should be created by each user as and when he or she needs to override particular values.
# Consequently, it should not be placed under version control.

View File

@@ -9,6 +9,7 @@
# Directory Paths
#
dir.source = .
dir.intermediate = intermediate
dir.publish = publish
dir.build = build
dir.build.tools = ${dir.build}/tools
@@ -16,7 +17,7 @@ dir.test = test
dir.demo = demo
dir.js = js
dir.js.main = ${dir.js}
# scripts in the lib direcotry will only be minified, not concatenated together
# scripts in the lib directory will only be minified, not concatenated together
dir.js.libs = ${dir.js}/libs
dir.js.mylibs = ${dir.js}/mylibs
dir.css = css
@@ -29,7 +30,7 @@ dir.images = img
file.pages.default.include = index.html, 404.html
# You will need to include the property file.pages.include in your project.properties file
# and add any extra pages you want to be updated by the scripts in a comma separated lis
# and add any extra pages you want to be updated by the scripts in a comma separated list
# the server configuration you're going with. If you don't use apache,
@@ -40,24 +41,34 @@ file.serverconfig = .htaccess
#
# Files not to be copied over by the script to the publish directory
#
file.default.exclude = .gitignore, .project, .settings, README.markdown, README.md, ${dir.images}/*.jpg, **/.git/**, **/.svn/**, **/${dir.build}/**, **/${dir.test}/**, **/${dir.demo}/**
file.default.exclude = .gitignore, .project, .settings, README.markdown, README.md, **/.git/**, **/.svn/**, ${dir.test}/**, ${dir.demo}/**, ${dir.intermediate}/**, ${dir.publish}/**, ${dir.build}/**, **/nbproject/**, *.komodoproject, **/.komodotools/**, **/dwsync.xml, **_notes, **/.hg/**, **/.idea/**
# Declare the file.exclude property in your project.properties file if you want to exclude files / folders you have added
# Note: you cannot decalre an empty file.exclude property
# Note: you cannot declare an empty file.exclude property
#
# Bypass Optimization for these files
#
# file.default.js.bypass
# If set, these files will not be optimized (minifications, concatinations, image optimizations will not be applied)
# Note: you cannot declare an empty file.default.bypass property
#
# Default Styleshee
# Root Stylesheet
# this is the file that contains the @import directives
#
file.default.stylesheets = style.css
file.root.stylesheet = style.css
#
# Default Stylesheet
#
file.default.stylesheets =
#
# Script Optimisation
#
# If set, concat libraries with main scripts file, producing single script file
build.concat.scripts = true
# If set, delete minified but unconcatted files.
build.delete.unoptimized = true
#
@@ -67,14 +78,28 @@ images.strip.metadata = true
# Seting this to true will strip the metadata from all jpeg files.
# YOU SHOULD ONLY DO THIS IF YOU OWN THE COPYRIGHT TO ALL THE IMAGES IN THE BUILD
#
# Bypass Optimization for these image files or folders
#
# images.default.bypass
# If set, these images will not be optimized
# Note: you cannot declare an empty images.default.bypass property
# Build Info
build.version.info = buildinfo.properties
build.scripts.dir = ${dir.build}/build-scripts
# Tools
tool.yuicompressor = yuicompressor-2.4.2.jar
tool.htmlcompressor = htmlcompressor-0.9.9.jar
tool.yuicompressor = yuicompressor-2.4.5.jar
tool.htmlcompressor = htmlcompressor-1.4.3.jar
tool.csscompressor = css-compressor/cli.php
tool.rhino = rhino.jar
tool.jslint = fulljslint.js
tool.jshint = fulljshint.js
tool.csslint = csslint-rhino.js
# Default Lint Utils Options
tool.jshint.opts = maxerr=25,eqeqeq=true
tool.jslint.opts = maxerr=25,evil=true,browser=true,eqeqeq=true,immed=true,newcap=true,nomen=true,es5=true,rhino=true,undef=true,white=false,devel=true
tool.csslint.opts =

View File

@@ -0,0 +1,20 @@
CACHE MANIFEST
# version xxxxxxxxx
CACHE:
# html files
# css files
# js files
FALLBACK:
NETWORK:
*

View File

@@ -1,11 +1,12 @@
# project.properties file defines overrides for default.properties
# Explanation: This file should be created by each user as and when he or she needs to override particular values.
# Consequently, it should not be placed under version control.
# Stylesheets
#
# Note: Stylesheets will be concatenated in the order they are listed in the file.stylesheets property (i.e. the las
# Note: Stylesheets will be concatenated in the order they are listed in the file.stylesheets property (i.e. the last
# file listed will be at the end of the concatenated file), so it probably makes sense to have the main style.css file
# as the first entry
# Example:
@@ -25,26 +26,46 @@ file.stylesheets =
file.pages =
# site manifest for offline
# this is the name of the manifest file you declared in the <html> tag
# Uncomment this line to enable appcache generation:
# file.manifest = manifest.appcache
# Excluded files and dirs
#
# Add any files or directories you add to the project and do not want to be copied to the publish directory as a
# comma separated lis
# comma separated list
# These files are ignored in addition to the default ones specified in default.properties.
file.exclude =
# Bypassed JavaScript files and dirs
#
# Add any files or folders within the mylibs directory that you want to be copied to the publish directory as a
# comma separated list
# These files will not be concatenated or minimized and will simply be copied over as is.
# Note: you cannot declare an empty file.bypass property, it would exclude the entire mylibs folder
# Example:
# file.js.bypass = widgets.js, gadgets.js, gidgets.js
# file.js.bypass =
# Specify an environment to build
#
# By Default, it builds a production environmen
# Set to dev if buidling a development environmen
# Set to test if building a test environmen
# By Default, it builds a production environment
# Set to dev if building a development environment
# Set to test if building a test environment
env =
#
# Bypass Optimization for these image files or folders
#
# images.bypass
# If set, these images will not be optimized
# Note: you cannot declare an empty images.bypass property, it would exclude the entire img folder from being optimized
# Directory Structure
#
# Override any directory paths specific to this projec
# Override any directory paths specific to this project
#
# dir.publish
# dir.js
@@ -53,3 +74,18 @@ env =
# dir.css
# dir.images
# Google App Engine Directory Structure
#
# Prevent "static/" being included in concated file paths.
#
# gae.css_dir = /css
# gae.js_dir = /js
# Override default JSHint Options (see http://jshint.com/ for description of options)
#tool.jshint.opts =
# Override default JSLint Options (see http://www.jslint.com/lint.html for description of options)
#tool.jslint.opts =
# Override default CSSLint Options (see http://csslint.net/about.html#settings for description of options)
#tool.csslint.opts =

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bash
#Generate a new project from your HTML5 Boilerplate repo clone
#Created 2010-10-13, Rick Waldron
#by: Rick Waldron & Michael Cetrulo
##first run
@@ -13,7 +13,15 @@
# $ ./createproject.sh
# find project root (also ensure script is ran from within repo)
src=$(git rev-parse --show-toplevel) || exit 1
src=$(git rev-parse --show-toplevel) || {
echo "try running the script from within html5-boilerplate directories." >&2
exit 1
}
[[ -d $src ]] || {
echo "fatal: could not determine html5-boilerplate's root directory." >&2
echo "try updating git." >&2
exit 1
}
# get a name for new project
while [[ -z $name ]]
@@ -28,13 +36,13 @@ then
echo "$dst exists"
else
#create new project
mkdir "$dst" || exit 1
mkdir -- "$dst" || exit 1
#sucess message
echo "Created Directory: $dst"
cd "$src"
cp -vr css/ js/ img/ *.html *.xml *.txt *.png *.ico .htaccess "$dst"
cd -- "$src"
cp -vr -- css js img build test *.html *.xml *.txt *.png *.ico .htaccess "$dst"
#sucess message
echo "Created Project: $dst"

View File

@@ -1,465 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
// Static dependencies, Subclasses loaded ondemand
require( dirname(__FILE__) . '/lib/Exception.php' );
require( dirname(__FILE__) . '/lib/Control.php' );
Class CSSCompression
{
/**
* CSSCompression Info
*
* @const (string) VERSION: Release version
* @const (string) DATE: Release date
*/
const VERSION = "[VERSION]";
const DATE = "[DATE]";
/**
* WARNING: This should ALWAYS BE FALSE in production
* When DEV is true, backdoor access to private methods is opened.
* Only used for unit testing and development.
*/
const DEV = true;
/**
* TOKEN is a special string that gets used as a marker within
* the compressor, and is removed before final output. Make sure
* this token is unique to your stylsheets.
*
* NOTE: This string gets used in regular expressions, and escaping
* won't help, so don't pick a complicated token.
*/
const TOKEN = "@____CSSCOMPRESSION_TOKEN____@";
/**
* The default set of options for every instance.
*/
public static $defaults = array(
// Converts long color names to short hex names
// (aliceblue -> #f0f8ff)
'color-long2hex' => true,
// Converts rgb colors to hex
// (rgb(159,80,98) -> #9F5062, rgb(100%) -> #FFFFFF)
'color-rgb2hex' => true,
// Converts long hex codes to short color names (#f5f5dc -> beige)
// Only works on latest browsers, careful when using
'color-hex2shortcolor' => false,
// Converts long hex codes to short hex codes
// (#44ff11 -> #4f1)
'color-hex2shorthex' => true,
// Converts hex codes to safe CSS Level 1 color names
// (#F00 -> red)
'color-hex2safe' => true,
// Converts font-weight names to numbers
// (bold -> 700)
'fontweight2num' => true,
// Removes zero decimals and 0 units
// (15.0px -> 15px || 0px -> 0)
'format-units' => true,
// Lowercases html tags from list
// (BODY -> body)
'lowercase-selectors' => true,
// Converts id and class attribute selectors, to their short selector counterpart
// (div[id=blah][class=moreblah] -> div#blah.moreblah)
'attr2selector' => true,
// Promotes nested id's to the front of the selector
// (body>div#elem p -> $elem p)
'strict-id' => false,
// Add space after pseudo selectors, for ie6
// (a:first-child{ -> a:first-child {)
'pseudo-space' => false,
// Compresses single defined multi-directional properties
// (margin: 15px 25px 15px 25px -> margin:15px 25px)
'directional-compress' => true,
// Combines multiply defined selectors and details
// (p{color:blue;} p{font-size:12pt} -> p{color:blue;font-size:12pt;})
// (p{color:blue;} a{color:blue;} -> p,a{color:blue;})
'organize' => true,
// Combines color/style/width properties
// (border-style:dashed;border-color:black;border-width:4px; -> border:4px dashed black)
'csw-combine' => true,
// Combines cue/pause properties
// (cue-before: url(before.au); cue-after: url(after.au) -> cue:url(before.au) url(after.au))
'auralcp-combine' => true,
// Combines margin/padding directionals
// (margin-top:10px;margin-right:5px;margin-bottom:4px;margin-left:1px; -> margin:10px 5px 4px 1px;)
'mp-combine' => true,
// Combines border directionals
// (border-top|right|bottom|left:1px solid black -> border:1px solid black)
'border-combine' => true,
// Combines font properties
// (font-size:12pt; font-family: arial; -> font:12pt arial)
'font-combine' => true,
// Combines background properties
// (background-color: black; background-image: url(bgimg.jpeg); -> background:black url(bgimg.jpeg))
'background-combine' => true,
// Combines list-style properties
// (list-style-type: round; list-style-position: outside -> list-style:round outside)
'list-combine' => true,
// Combines border-radius properties
// {
// border-top-left-radius: 10px;
// border-top-right-radius: 10px;
// border-bottom-right-radius: 10px;
// border-bottom-left-radius: 10px;
// }
// -> { border-radius: 10px; }
'border-radius-combine' => true,
// Removes the last semicolon of a property set
// ({margin: 2px; color: blue;} -> {margin: 2px; color: blue})
'unnecessary-semicolons' => true,
// Removes multiple declarations within the same rule set
'rm-multi-define' => true,
// Adds all unknown blocks to the top of the output in a comment strip
// Purely for bug reporting, but also useful to know what isn't being handled
'add-unknown' => true,
// Readibility of Compressed Output, Defaults to none
'readability' => 0,
);
/**
* Modes are predefined sets of configuration for referencing. When creating a mode, all options are set to true,
* and the mode array defines which options are to be false
*
* @mode safe: Safe mode does zero combinations or organizing. It's the best mode if you use a lot of hacks
* @mode sane: Sane mode does most combinations(multiple long hand notations to single shorthand),
* --- but still keeps most declarations in their place
* @mode small: Small mode reorganizes the whole sheet, combines as much as it can, and will break most comment hacks
* @mode full: Full mode does everything small does, but also converts hex codes to their short color name alternatives
*/
private static $modes = array(
'safe' => array(
'color-hex2shortcolor' => false,
'attr2selector' => false,
'strict-id' => false,
'organize' => false,
'csw-combine' => false,
'auralcp-combine' => false,
'mp-combine' => false,
'border-combine' => false,
'font-combine' => false,
'background-combine' => false,
'list-combine' => false,
'border-radius-combine' => false,
'rm-multi-define' => false,
),
'sane' => array(
'color-hex2shortcolor' => false,
'strict-id' => false,
'organize' => false,
'font-combine' => false,
'background-combine' => false,
'list-combine' => false,
'rm-multi-define' => false,
),
'small' => array(
'color-hex2shortcolor' => false,
'pseudo-space' => false,
),
'full' => array(
'pseudo-space' => false,
),
);
/**
* Readability Constants
*
* @param (int) READ_MAX: Maximum readability of output
* @param (int) READ_MED: Medium readability of output
* @param (int) READ_MIN: Minimal readability of output
* @param (int) READ_NONE: No readability of output (full compression into single line)
*/
const READ_MAX = 3;
const READ_MED = 2;
const READ_MIN = 1;
const READ_NONE = 0;
/**
* Static Helpers
*
* @instance express: Use a separate instance from singleton access
* @instance instance: Saved instance of CSSCompression
* @param (array) instances: Array of stored instances
* @param (array) rjson: Comment removal before json decoding
*/
private static $express;
private static $instance;
private static $instances = array();
private static $rjson = array(
'patterns' => array(
"/^(.*?){/s",
"/(\t|\s)+\/\/.*/",
),
'replacements' => array(
'{',
'',
),
);
/**
* Controller Instance
*/
private $Control;
/**
* Builds the subclasses, runs the compression if css passed, and merges options
*
* @param (string) css: CSS to compress on initialization if needed
* @param (array) options: Array of preferences to override the defaults
*/
public function __construct( $css = NULL, $options = NULL ) {
$this->Control = new CSSCompression_Control( $this );
// Autorun against css passed
if ( $css ) {
// Allow passing options/mode only
if ( is_array( $css ) || array_key_exists( $css, self::$modes ) ) {
$this->Control->Option->merge( $css );
}
else {
$this->Control->compress( $css, $options );
}
}
// Merge passed options
else if ( $options ) {
$this->Control->Option->merge( $options );
}
}
/**
* (Proxy function) Control access to properties
*
* - Getting stats/_mode/css returns the current value of that property
* - Getting options will return the current full options array
* - Getting anything else returns that current value in the options array or NULL
*
* @param (string) name: Name of property that you want to access
*/
public function __get( $name ) {
return $this->Control->get( $name );
}
/**
* (Proxy function) The setter method only allows
* access to setting values in the options array
*
* @param (string) name: Key name of the option you want to set
* @param (mixed) value: Value of the option you want to set
*/
public function __set( $name, $value ) {
return $this->Control->set( $name, $value );
}
/**
* (Proxy function) Merges a predefined set options
*
* @param (string) mode: Name of mode to use.
*/
public function mode( $mode = NULL ) {
return $this->Control->Option->merge( $mode );
}
/**
* Creates a new mode, or overwrites existing mode
*
* @param (mixed) mode: Name of the mode, or array of modes
* @param (array) config: Configuration of the mode
*/
public static function modes( $mode = NULL, $config = NULL ) {
if ( $mode === NULL ) {
return self::$modes;
}
else if ( is_array( $mode ) ) {
return array_merge( self::$modes, $mode );
}
else if ( $config === NULL ) {
return isset( self::$modes[ $mode ] ) ? self::$modes[ $mode ] : NULL;
}
else {
return self::$modes[ $mode ] = $config;
}
}
/**
* (Proxy function) Maintainable access to the options array
*
* - Passing no arguments returns the entire options array
* - Passing a single name argument returns the value for the option
* - Passing an array will merge the options with the array passed, for object like extension
* - Passing both a name and value, sets the value to the name key, and returns the value
*
* @param (mixed) name: The key name of the option
* @param (mixed) value: Value to set the option
*/
public function option( $name = NULL, $value = NULL ) {
return $this->Control->Option->option( $name, $value );
}
/**
* (Proxy function) Run compression on the sheet passed.
*
* @param (string) css: Stylesheet to be compressed
* @param (mixed) options: Array of options or mode to use.
*/
public function compress( $css = NULL, $options = NULL ) {
return $this->Control->compress( $css, $options );
}
/**
* Static access for direct compression
*
* @param (string) css: Stylesheet to be compressed
* @param (mixed) options: Array of options or mode to use.
*/
public static function express( $css = NULL, $options = NULL ) {
if ( ! self::$express ) {
self::$express = new CSSCompression();
}
self::$express->reset();
return self::$express->compress( $css, $options );
}
/**
* (Proxy Function) Cleans out compressor and it's subclasses to defaults
*
* @params none
*/
public function reset(){
return $this->Control->reset();
}
/**
* (Proxy Function) Cleans out class variables for next run
*
* @params none
*/
public function flush(){
return $this->Control->flush();
}
/**
* The Singleton access method (for those that want it)
*
* @param (string) name: Name of the stored instance
*/
public static function getInstance( $name = NULL ) {
if ( $name !== NULL ) {
if ( ! isset( self::$instances[ $name ] ) ) {
self::$instances[ $name ] = new self;
}
return self::$instances[ $name ];
}
else if ( ! self::$instance ) {
self::$instance = new self;
}
return self::$instance;
}
/**
* Reads JOSN based files, strips comments and converts to array
*
* @param (string) file: Filename
*/
public static function getJSON( $file ) {
// Assume helper file if full path not given
$file = $file[ 0 ] == '/' ? $file : dirname(__FILE__) . '/helpers/' . $file;
// Strip comments
$json = preg_replace( self::$rjson['patterns'], self::$rjson['replacements'], file_get_contents( $file ) );
// Decode json
$json = json_decode( $json, true );
// Check for errors
if ( $json === NULL ) {
$e = '';
// JSON Errors, taken directly from http://php.net/manual/en/function.json-last-error.php
switch( json_last_error() ) {
case JSON_ERROR_NONE:
$e = 'No error has occurred';
break;
case JSON_ERROR_DEPTH:
$e = 'The maximum stack depth has been exceeded';
break;
case JSON_ERROR_CTRL_CHAR:
$e = 'Control character error, possibly incorrectly encoded';
break;
case JSON_ERROR_STATE_MISMATCH:
$e = 'Invalid or malformed JSON';
break;
case JSON_ERROR_SYNTAX:
$e = 'Syntax error';
break;
case JSON_ERROR_UTF8:
$e = 'Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
$e = 'Unknown JSON Error';
break;
}
throw new CSSCompression_Exception( "JSON Error in $file: $e" );
}
// Good to go
return $json;
}
/**
* Backdoor access to subclasses
* ONLY FOR DEVELOPMENT/TESTING.
*
* @param (string) class: Name of the focus class
* @param (string) method: Method function to call
* @param (array) args: Array of arguments to pass in
*/
public function access( $class = NULL, $method = NULL, $args = NULL ) {
if ( ! self::DEV ) {
throw new CSSCompression_Exception( "CSSCompression is not in development mode." );
}
else if ( $class === NULL || $method === NULL || $args === NULL ) {
throw new CSSCompression_Exception( "Invalid Access Call." );
}
else if ( ! is_array( $args ) ) {
throw new CSSCompression_Exception( "Expecting array of arguments." );
}
return $this->Control->access( $class, $method, $args );
}
};
?>

View File

@@ -1,22 +0,0 @@
#
# CSS Compression [VERSION] Change Log
# [DATE]
# Corey Hart @ http://www.codenothing.com
#
# Compressor Additions
- Configuration Modes
- pseduo-space, add space between pseduo selectors and comma/brace for ie6
- removing leading 0 of a decimal, 0.633px -> .633px
- handling all At Rules (charsets,media,imports,font-family,etc..)
- handling ms filter paths
- More css hacks support, including box-modal hack
- attr2selector, Convert id=blah and class=blah attributes to their selector counterparts
- strict-id, removes all selectors up to the last id
- add-unknown, adds unknown blocks to top of output in a comment
# Codebase Changes
- Converted to subclass architecture, more modular.
- Using JSON based sandbox specs for focused unit tests.
- Helper conversion definitions(long2hex, hex2short) are now in JSON based files.
- Added benchmark/regression testing

View File

@@ -1,228 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
require( dirname(__FILE__) . '/CSSCompression.php' );
Class CSSCompression_Cli
{
/**
* Cli Patterns
*
* @param (CSSCompression instance) instance: CSSCompression instance
* @param (array) args: Array of command line arguments
* @param (array) options: Array of options read from cli arguments
* @param (boolean) imports: Read import paths from the filesystem, and inject them into the script
* @param (string) mode: Compression mode
* @param (string) cwd: Current working directory
* @param (string) content: CSS Sheets read
* @param (regex) rcss: Matches css file name extension
* @param (regex) rprefix: Matches absolute paths
* @param (regex) rmarker: Marking points in css files when parsing for imports
* @param (regex) rquote: Unescaped quote
* @param (regex) rsinglequote: Unescaped single quote
* @param (regex) rsemicolon: Unescaped semicolon
* @param (regex) rimporturl: Import statement in a url() wrapper
* @param (regex) rimportstr: Import statement in a string wrapper
* @param (regex) rabsolutepath: Absolute path checker for import urls
* @param (regex) rfsabsolutepath: Matches absolute paths for the file system
*/
private $instance;
private $args = array();
private $options = array();
private $files = array();
private $imports = true;
private $mode = 'safe';
private $cwd = '';
private $content = '';
private $rcss = "/\.css$/";
private $rchopfile= "/\/[^\/]*$/";
private $rmarker = "/(\/\*|\"|'|@import)/";
private $rquote = "/(?<!\\\)\"/";
private $rsinglequote = "/(?<!\\\)'/";
private $rsemicolon = "/(?<!\\\);/";
private $rimporturl = "/^@import url\(['\"]?(.*?)['\"]?\)/";
private $rimportstr = "/^@import ['\"](.*?)['\"]/";
private $rabsolutepath = "/^(https?:\/\/|\/)/";
private $rfsabsolutepath = "/^(\/|\~\/|\\\|[a-z]:(\\\|\/)?)/i";
/**
* Run the compression across files passed to cli
*
* @param (array) args: Array of argument passed over the command line
*/
public function __construct( $args = array() ) {
// Render arguments
$this->cwd = getcwd() . DIRECTORY_SEPARATOR;
$this->args = $args;
$this->read();
// Run the files through the css compressor
$this->render();
}
/**
* Reads the cli arguments and puts them in their place
*
* @params none
*/
private function read(){
while ( count( $this->args ) ) {
$arg = array_shift( $this->args );
// Adding contents of css files
if ( preg_match( $this->rcss, $arg ) ) {
// Handle absolute path prefixing
if ( ! preg_match( $this->rfsabsolutepath, $arg ) && strpos( $arg, $this->cwd ) === false) {
$path = $this->cwd . $arg;
}
else {
$path = $arg;
}
$this->content .= $this->imports( $path );
}
// Longhand options
else if ( substr( $arg, 0, 2 ) == '--' ) {
$parts = explode( '=', $arg, 2 );
$name = substr( $parts[ 0 ], 2 );
$value = isset( $parts[ 1 ] ) ? $parts[ 1 ] : true;
if ( $name == 'mode' ) {
$this->mode = $value;
}
else if ( $name == 'imports' ) {
$this->imports = true;
}
else {
// Argument value is passed as string,
// convert to boolean as needed
if ( $value == 'false' ) {
$value = false;
}
else if ( $value == 'true' ) {
$value = true;
}
else {
$value = intval( $value );
}
$this->options[ $name ] = $value;
}
}
// Shorthand options
else if ( substr( $arg, 0, 1 ) == '-' && strlen( $arg ) == 2 ) {
$char = substr( $arg, 1, 1 );
if ( $char == 'i' ) {
$this->imports = true;
}
}
}
}
/**
* Scans the css file for import defns
*
* @param (path) file: Path to the stylesheet passed as an argument
*/
private function imports( $file ) {
// Set the content and the directory of the stylesheet
$content = file_get_contents( $file );
$cwd = preg_replace( $this->rchopfile, '/', $file );
// Block import fixing if not set
if ( $this->imports === false ) {
return $content;
}
$pos = 0;
while ( preg_match( $this->rmarker, $content, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$marker = $match[ 1 ][ 0 ];
if ( $marker == '/*' ) {
if ( ( $pos = strpos( $content, '*/', $match[ 1 ][ 1 ] ) ) === false ) {
break;
}
}
else if ( $marker == '"' ) {
if ( preg_match( $this->rquote, $content, $m, PREG_OFFSET_CAPTURE, $match[ 1 ][ 1 ] + 1 ) ) {
$pos = $m[ 0 ][ 1 ] + 2;
}
else {
break;
}
}
else if ( $marker == "'" ) {
if ( preg_match( $this->rsinglequote, $content, $m, PREG_OFFSET_CAPTURE, $match[ 1 ][ 1 ] + 1 ) ) {
$pos = $m[ 0 ][ 1 ] + 2;
}
else {
break;
}
}
else if ( $marker == '@import' ) {
list ( $content, $pos ) = $this->inject( $content, $cwd, $match[ 1 ][ 1 ] );
}
else {
throw new CSSCompression_Exception( 'Unknown Import Error' );
}
}
return $content;
}
/**
* Replaces the import declaration with it's contents
*
* @param (string) content: Contents of the stylesheet
* @param (path) cwd: Directory of the current stylesheet
* @param (int) pos: Position of the import declaration
*/
private function inject( $content, $cwd, $pos ) {
if ( ! preg_match( $this->rsemicolon, $content, $m, PREG_OFFSET_CAPTURE, $pos ) ) {
throw new CSSCompression_Exception( "@import stmt at character position $pos, has no line-ending semicolon." );
}
$import = substr( $content, $pos, $m[ 0 ][ 1 ] + 1 - $pos );
// Check for valid import stmt, and replace into it the imports contents
if ( ( preg_match( $this->rimporturl, $import, $m ) || preg_match( $this->rimportstr, $import, $m ) ) &&
! preg_match( $this->rabsolutepath, $m[ 1 ] ) ) {
if ( ! file_exists( $cwd . $m[ 1 ] ) ) {
throw new CSSCompression_Exception( "Import Path '" . $cwd . $m[ 1 ] . "' not found." );
}
$content = substr_replace( $content, file_get_contents( $cwd . $m[ 1 ] ), $pos, strlen( $import ) );
}
else {
$pos += strlen( $import );
}
return array( $content, $pos );
}
/**
* Outputs the compression of the content read
*
* @params none
*/
private function render(){
$this->instance = new CSSCompression();
if ( $this->mode ) {
$this->instance->mode( $this->mode );
}
if ( $this->options ) {
$this->instance->option( $this->options );
}
echo $this->instance->compress( $this->content );
}
};
// Auto-initialize the cli script
new CSSCompression_Cli( $_SERVER['argv'] );
?>

View File

@@ -1,39 +0,0 @@
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
{
"#f0ffff":"azure",
"#f5f5dc":"beige",
"#ffe4c4":"bisque",
"#a52a2a":"brown",
"#ff7f50":"coral",
"#ffd700":"gold",
"#808080":"gray",
"#008000":"green",
"#4b0082":"indigo",
"#fffff0":"ivory",
"#f0e68c":"khaki",
"#faf0e6":"linen",
"#800000":"maroon",
"#000080":"navy",
"#808000":"olive",
"#ffa500":"orange",
"#da70d6":"orchid",
"#cd853f":"peru",
"#ffc0cb":"pink",
"#dda0dd":"plum",
"#800080":"purple",
"#ff0000":"red",
"#fa8072":"salmon",
"#a0522d":"sienna",
"#c0c0c0":"silver",
"#fffafa":"snow",
"#d2b48c":"tan",
"#008080":"teal",
"#ff6347":"tomato",
"#ee82ee":"violet",
"#f5deb3":"wheat",
"#f00":"red"
}

View File

@@ -1,16 +0,0 @@
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
{
"#808080":"gray",
"#008000":"green",
"#800000":"maroon",
"#000080":"navy",
"#808000":"olive",
"#ff0000":"red",
"#c0c0c0":"silver",
"#008080":"teal",
"#f00":"red"
}

View File

@@ -1,127 +0,0 @@
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
{
"aliceblue":"#f0f8ff",
"antiquewhite":"#faebd7",
"aquamarine":"#7fffd4",
"bisque":"#ffe4c4",
"black":"#000000",
"blanchedalmond":"#ffebcd",
"blueviolet":"#8a2be2",
"burlywood":"#deb887",
"cadetblue":"#5f9ea0",
"chartreuse":"#7fff00",
"chocolate":"#d2691e",
"coral":"#ff7f50",
"cornflowerblue":"#6495ed",
"cornsilk":"#fff8dc",
"crimson":"#dc143c",
"cyan":"#00ffff",
"darkblue":"#00008b",
"darkcyan":"#008b8b",
"darkgoldenrod":"#b8860b",
"darkgray":"#a9a9a9",
"darkgreen":"#006400",
"darkkhaki":"#bdb76b",
"darkmagenta":"#8b008b",
"darkolivegreen":"#556b2f",
"darkorange":"#ff8c00",
"darkorchid":"#9932cc",
"darkred":"#8b0000",
"darksalmon":"#e9967a",
"darkseagreen":"#8fbc8f",
"darkslateblue":"#483d8b",
"darkslategray":"#2f4f4f",
"darkturquoise":"#00ced1",
"darkviolet":"#9400d3",
"deeppink":"#ff1493",
"deepskyblue":"#00bfff",
"dimgray":"#696969",
"dodgerblue":"#1e90ff",
"firebrick":"#b22222",
"floralwhite":"#fffaf0",
"forestgreen":"#228b22",
"fuchsia":"#ff00ff",
"gainsboro":"#dcdcdc",
"ghostwhite":"#f8f8ff",
"goldenrod":"#daa520",
"green":"#008800",
"greenyellow":"#adff2f",
"honeydew":"#f0fff0",
"hotpink":"#ff69b4",
"indianred ":"#cd5c5c",
"indigo ":"#4b0082",
"lavender":"#e6e6fa",
"lavenderblush":"#fff0f5",
"lawngreen":"#7cfc00",
"lemonchiffon":"#fffacd",
"lightblue":"#add8e6",
"lightcoral":"#f08080",
"lightcyan":"#e0ffff",
"lightgoldenrodyellow":"#fafad2",
"lightgrey":"#d3d3d3",
"lightgreen":"#90ee90",
"lightpink":"#ffb6c1",
"lightsalmon":"#ffa07a",
"lightseagreen":"#20b2aa",
"lightskyblue":"#87cefa",
"lightslategray":"#778899",
"lightsteelblue":"#b0c4de",
"lightyellow":"#ffffe0",
"lime":"#00ff00",
"limegreen":"#32cd32",
"magenta":"#ff00ff",
"maroon":"#800000",
"mediumaquamarine":"#66cdaa",
"mediumblue":"#0000cd",
"mediumorchid":"#ba55d3",
"mediumpurple":"#9370d8",
"mediumseagreen":"#3cb371",
"mediumslateblue":"#7b68ee",
"mediumspringgreen":"#00fa9a",
"mediumturquoise":"#48d1cc",
"mediumvioletred":"#c71585",
"midnightblue":"#191970",
"mintcream":"#f5fffa",
"mistyrose":"#ffe4e1",
"moccasin":"#ffe4b5",
"navajowhite":"#ffdead",
"oldlace":"#fdf5e6",
"olivedrab":"#6b8e23",
"orange":"#ffa500",
"orangered":"#ff4500",
"orchid":"#da70d6",
"palegoldenrod":"#eee8aa",
"palegreen":"#98fb98",
"paleturquoise":"#afeeee",
"palevioletred":"#d87093",
"papayawhip":"#ffefd5",
"peachpuff":"#ffdab9",
"powderblue":"#b0e0e6",
"purple":"#800080",
"rosybrown":"#bc8f8f",
"royalblue":"#4169e1",
"saddlebrown":"#8b4513",
"salmon":"#fa8072",
"sandybrown":"#f4a460",
"seagreen":"#2e8b57",
"seashell":"#fff5ee",
"sienna":"#a0522d",
"silver":"#c0c0c0",
"skyblue":"#87ceeb",
"slateblue":"#6a5acd",
"slategray":"#708090",
"springgreen":"#00ff7f",
"steelblue":"#4682b4",
"thistle":"#d8bfd8",
"tomato":"#ff6347",
"turquoise":"#40e0d0",
"violet":"#ee82ee",
"white":"#ffffff",
"whitesmoke":"#f5f5f5",
"yellow":"#ffff00",
"yellowgreen":"#9acd32"
}

View File

@@ -1,218 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Cleanup
{
/**
* Cleanup patterns
*
* @class Control: Compression Controller
* @param (string) token: Copy of the injection token
* @param (regex) rtoken: Token regex built upon instantiation
* @param (array) options: Reference to options
* @param (regex) rsemi: Checks for last semit colon in details
* @param (regex) rsemicolon: Checks for semicolon without an escape '\' character before it
* @param (regex) rspace: Checks for space without an escape '\' character before it
* @param (regex) rcolon: Checks for colon without an escape '\' character before it
* @param (regex) rquote: Checks for quote (') without an escape '\' character before it
* @param (array) rescape: Array of patterns for groupings that should be escaped
* @param (array) escaped: Contains patterns and replacements for espaced characters
*/
private $Control;
private $token = '';
private $rtoken = '';
private $options = array();
private $rsemi = "/;$/";
private $rsemicolon = "/(?<!\\\);/";
private $rspace = "/(?<!\\\)\s/";
private $rcolon = "/(?<!\\\):/";
private $rquote = "/(?<!\\\)'/";
private $rescape = array(
"/((?<!\\\)\")(.*?)((?<!\\\)\")/",
"/((?<!\\\)')(.*?)((?<!\\\)')/",
"/(url\()(.*?)(\))/",
);
private $escaped = array(
'search' => array(
"\\:",
"\\;",
"\\}",
"\\{",
"\\@",
"\\!",
"\\,",
"\\>",
"\\+",
"\\~",
"\\/",
"\\*",
"\\.",
"\\=",
"\\#",
"\\r",
"\\n",
"\\t",
"\\ ",
),
'replace' => array(
":",
";",
"}",
"{",
"@",
"!",
",",
">",
"+",
"~",
"/",
"*",
".",
"=",
"#",
"\r",
"\n",
"\t",
" ",
),
);
/**
* Build the token regex based on defined token
*
* @param (class) control: CSSCompression Controller
*/
public function __construct( CSSCompression_Control $control ) {
$this->Control = $control;
$this->token = CSSCompression::TOKEN;
$this->options = &$control->Option->options;
// Have to build the token regexs after initialization
$this->rtoken = "/($this->token)(.*?)($this->token)/";
array_push( $this->rescape, $this->rtoken );
}
/**
* Central cleanup process, removes all injections
*
* @param (array) selectors: Array of selectors
* @param (array) details: Array of details
*/
public function cleanup( &$selectors, &$details ) {
foreach ( $details as $i => &$value ) {
// Auto skip sections
if ( isset( $selectors[ $i ] ) && strpos( $selectors[ $i ], $this->token ) === 0 ) {
continue;
}
// Removing dupes
if ( $this->options['rm-multi-define'] ) {
$value = $this->removeMultipleDefinitions( $value );
}
$value = $this->removeUnnecessarySemicolon( $value );
}
return array( $selectors, $details );
}
/**
* Removes '\' from possible splitter characters in URLs
*
* @param (string) css: Full css sheet
*/
public function removeInjections( $css ) {
// Remove escaped characters
foreach ( $this->rescape as $regex ) {
$pos = 0;
while ( preg_match( $regex, $css, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$value = $match[ 1 ][ 0 ]
. str_replace( $this->escaped['search'], $this->escaped['replace'], $match[ 2 ][ 0 ] )
. $match[ 3 ][ 0 ];
$css = substr_replace( $css, $value, $match[ 0 ][ 1 ], strlen( $match[ 0 ][ 0 ] ) );
$pos = $match[ 0 ][ 1 ] + strlen( $value ) + 1;
}
}
// Remove token injections
$pos = 0;
while ( preg_match( $this->rtoken, $css, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$value = $match[ 2 ][ 0 ];
if ( preg_match( $this->rspace, $value ) ) {
$quote = preg_match( $this->rquote, $value ) ? "\"" : "'";
$value = "$quote$value$quote";
$css = substr_replace( $css, $value, $match[ 0 ][ 1 ], strlen( $match[ 0 ][ 0 ] ) );
$pos = $match[ 0 ][ 1 ] + strlen( $value ) + 1;
}
else {
$css = substr_replace( $css, $value, $match[ 0 ][ 1 ], strlen( $match[ 0 ][ 0 ] ) );
$pos = $match[ 0 ][ 1 ] + strlen( $value ) + 1;
}
}
return $css;
}
/**
* Removes multiple definitions that were created during compression
*
* @param (string) val: CSS Selector Properties
*/
private function removeMultipleDefinitions( $val = '' ) {
$storage = array();
$arr = preg_split( $this->rsemicolon, $val );
foreach ( $arr as $x ) {
if ( $x ) {
list( $a, $b ) = preg_split( $this->rcolon, $x, 2 );
$storage[ $a ] = $b;
}
}
if ( $storage ) {
$val = '';
foreach ( $storage as $x => $y ) {
$val .= "$x:$y;";
}
}
// Return converted val
return $val;
}
/**
* Removes last semicolons on the final property of a set
*
* @param (string) value: rule set
*/
private function removeUnnecessarySemicolon( $value ) {
return preg_replace( $this->rsemi, '', $value );
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
if ( $method == 'cleanup' ) {
return $this->cleanup( $args[ 0 ], $args[ 1 ] );
}
else {
return call_user_func_array( array( $this, $method ), $args );
}
}
else {
throw new CSSCompression_Exception( "Unknown method in Cleanup Class - " . $method );
}
}
};
?>

View File

@@ -1,199 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Color
{
/**
* Color Patterns
*
* @class Control: Compression Controller
* @param (array) options: Reference to options array
* @param (regex) rrgb: Checks for rgb notation
* @param (regex) rhex: Checks for hex code
* @param (regex) rfullhex: Checks for full 6 character hex code
* @static (array) color2hex: Long color name to hex code conversions
* @static (array) hex2short: Hex code to short color name conversions
* @static (array) hex2short_safe: CSS Level 1 safe color names that are shorter than hex codes
* @static (array) files: List of static helpers with their class vars
*/
private $Control;
private $options = array();
private $rrgb = "/^rgb\((\d{1,3}\%?(,\d{1,3}\%?,\d{1,3}\%?)?)\)$/i";
private $rhex = "/^#([0-9a-f]{3}|[0-9a-f]{6})$/i";
private $rfullhex = "/^#([0-9a-f]{6})$/i";
private static $color2hex = array();
private static $hex2short = array();
private static $hex2short_safe = array();
private static $files = array(
'color2hex' => 'long2hex-colors.json',
'hex2short' => 'hex2short-colors.json',
'hex2short_safe' => 'hex2short-safe.json',
);
/**
* Stash a reference to the controller on each instantiation
* and install conversion helpers
*
* @param (class) control: CSSCompression Controller
*/
public function __construct( CSSCompression_Control $control ) {
$this->Control = $control;
$this->options = &$control->Option->options;
if ( ! self::$color2hex ) {
foreach ( self::$files as $v => $file ) {
self::$$v = CSSCompression::getJSON( $file );
}
}
}
/**
* Central handler for all color conversions.
*
* @param (string) val: Color to be parsed
*/
public function color( $val ) {
// Converts rgb values to hex codes
if ( $this->options['color-rgb2hex'] ) {
$val = $this->rgb2hex( $val );
}
// Convert long color names to hex codes
if ( $this->options['color-long2hex'] ) {
$val = $this->color2hex( $val );
}
// Ensure all hex codes are lowercase
if ( preg_match( $this->rhex, $val ) ) {
$val = strtolower( $val );
}
// Convert large hex codes to small codes
if ( $this->options['color-hex2shorthex'] ) {
$val = $this->hex2short( $val );
}
// Convert 6 digit hex codes to short color names
if ( $this->options['color-hex2shortcolor'] ) {
$val = $this->hex2color( $val );
}
// Convert safe css level1 color names
if ( $this->options['color-hex2safe'] ) {
$val = $this->hex2safe( $val );
}
return $val;
}
/**
* Converts rgb values to hex codes
*
* @param (string) val: Color to be converted
*/
private function rgb2hex( $val ) {
if ( ! preg_match( $this->rrgb, $val, $match ) ) {
return $val;
}
// locals
$hex = '0123456789abcdef';
$str = explode( ',', $match[ 1 ] );
$new = '';
// Incase rgb was defined with single val
if ( ! $str ) {
$str = array( $match[ 1 ] );
}
foreach ( $str as $x ) {
$x = strpos( $x, '%' ) !== false ? intval( ( intval( $x ) / 100 ) * 255 ) : intval( $x );
if ( $x > 255 ) {
$x = 255;
}
if ( $x < 0 ) {
$x = 0;
}
$new .= $hex[ ( $x - $x % 16 ) / 16 ];
$new .= $hex[ $x % 16 ];
}
// Repeat hex code to complete 6 digit hex requirement for single definitions
if ( count( $str ) == 1 ) {
$new .= $new . $new;
}
// Replace with hex value
return "#$new";
}
/**
* Convert long color names to hex codes
*
* @param (string) val: Color to be converted
*/
private function color2hex( $val ) {
return isset( self::$color2hex[ $val ] ) ? self::$color2hex[ $val ] : $val;
}
/**
* Convert large hex codes to small codes
*
* @param (string) val: Hex to be shortened
*/
private function hex2short( $val ) {
if ( ! preg_match( $this->rfullhex, $val, $match ) ) {
return $val;
}
// See if we can convert to 3 char hex
$hex = $match[ 1 ];
if ( $hex[ 0 ] == $hex[ 1 ] && $hex[ 2 ] == $hex[ 3 ] && $hex[ 4 ] == $hex[ 5 ] ) {
$val = '#' . $hex[ 0 ] . $hex[ 2 ] . $hex[ 4 ];
}
return $val;
}
/**
* Convert large hex codes to small codes
*
* @param (string) val: Color to be converted
*/
private function hex2color( $val ) {
return isset( self::$hex2short[ $val ] ) ? self::$hex2short[ $val ] : $val;
}
/**
* Convert large hex codes to small codes
*
* @param (string) val: Color to be converted
*/
private function hex2safe( $val ) {
return isset( self::$hex2short_safe[ $val ] ) ? self::$hex2short_safe[ $val ] : $val;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in Color Class - " . $method );
}
}
};
?>

View File

@@ -1,191 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Combine
{
/**
* Combine Patterns
*
* @class Control: Compression Controller
* @param (string) token: Copy of the injection token
* @param (array) options: Reference to options
* @param (regex) rspace: Checks for space without an escape '\' character before it
* @param (regex) rslash: Checks for unescaped slash character
* @param (regex) rimportant: Checking props for uncombinables
* @param (array) methods: List of options with their corresponding class
*/
private $Control;
private $token = '';
private $options = array();
private $rspace = "/(?<!\\\)\s/";
private $rslash = "/(?<!\\\)\//";
private $rimportant = "/inherit|\!important|\!ie|(?<!\\\)\s/i";
private $methods = array(
'csw-combine' => 'BorderOutline',
'border-radius-combine' => 'BorderRadius',
'border-combine' => 'Border',
'mp-combine' => 'MarginPadding',
'background-combine' => 'Background',
'auralcp-combine' => 'Aural',
'font-combine' => 'Font',
'list-combine' => 'List',
);
/**
* Sub Comination Classes
*
* @class BorderOutline: Handles Color/Style/With combinations of border/outline properties
* @class BorderRadius: Handles border-radius combinations
* @class Border: Handles normal border combinations
* @class MarginPadding: Handles margin/padding combinations
* @class Background: Handles background combinations
* @class Aural: Handles aural combinations
* @class Font: Handles font combinations
* @class List: Handles list combinations
* @param (array) subcombines: Array holding all subcombination classes
*/
public $BorderOutline;
public $BorderRadius;
public $Border;
public $MarginPadding;
public $Background;
public $Aural;
public $Font;
public $List;
private $subcombines = array(
'BorderOutline',
'BorderRadius',
'Border',
'MarginPadding',
'Background',
'Aural',
'Font',
'List',
);
/**
* Stash a reference to the controller on each instantiation
*
* @param (class) control: CSSCompression Controller
*/
public function __construct( CSSCompression_Control $control ) {
$this->Control = $control;
$this->token = CSSCompression::TOKEN;
$this->options = &$control->Option->options;
// Include classes if not already done so
if ( ! class_exists( "CSSCompression_Combine_Border", false ) ) {
$path = dirname(__FILE__) . '/Combine/';
foreach ( $this->subcombines as $class ) {
require( $path . $class . '.php' );
}
}
// Instantiate each sub combine
foreach ( $this->subcombines as $class ) {
$full = "CSSCompression_Combine_$class";
$this->$class = new $full( $control, $this );
}
}
/**
* Reads through each detailed package and checks for cross defn combinations
*
* @param (array) selectors: Array of selectors
* @param (array) details: Array of details
*/
public function combine( &$selectors = array(), &$details = array() ) {
foreach ( $details as $i => &$value ) {
if ( isset( $selectors[ $i ] ) && strpos( $selectors[ $i ], $this->token ) === 0 ) {
continue;
}
foreach ( $this->methods as $option => $class ) {
if ( $this->options[ $option ] ) {
$value = $this->$class->combine( $value );
}
}
}
return array( $selectors, $details );
}
/**
* Helper function to ensure flagged words don't get
* overridden
*
* @param (mixed) obj: Array/String of definitions to be checked
*/
public function checkUncombinables( $obj ) {
if ( is_array( $obj ) ) {
foreach ( $obj as $item ) {
if ( preg_match( $this->rimportant, $item ) ) {
return true;
}
}
return false;
}
else {
return preg_match( $this->rimportant, $obj );
}
}
/**
* Helper function to ensure all values of search array
* exist within the storage array
*
* @param (string) prop: CSS Property
* @param (array) storage: Array of definitions found
* @param (array) search: Array of definitions requred
*/
public function searchDefinitions( $prop, $storage, $search ) {
// Return if storage & search don't match
if ( count( $storage ) != count( $search ) ) {
return false;
}
$str = "$prop:";
foreach ( $search as $value ) {
if ( ! isset( $storage[ $value ] ) || $this->checkUncombinables( $storage[ $value ] ) ) {
return false;
}
$str .= $storage[ $value ] . ' ';
}
return trim( $str ) . ';';
}
/**
* Access to private methods for testing
*
* @param (string) subclass: Name of subclass to focus on
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $subclass, $method, $args ) {
if ( $subclass == 'Combine' ) {
if ( method_exists( $this, $method ) ) {
if ( $method == 'combine' ) {
return $this->combine( $args[ 0 ], $args[ 1 ] );
}
else {
return call_user_func_array( array( $this, $method ), $args );
}
}
else {
throw new CSSCompression_Exception( "Unknown method in Combine Class - " . $method );
}
}
else if ( in_array( $subclass, $this->subcombines ) ) {
return $this->$subclass->access( $method, $args );
}
else {
throw new CSSCompression_Exception( "Unknown Sub Combine Class - " . $subclass );
}
}
};
?>

View File

@@ -1,109 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Combine_Aural
{
/**
* Combine Patterns
*
* @class Control: Compression Controller
* @class Combine: Combine Controller
* @param (regex) raural: Aurual matching
*/
private $Control;
private $Combine;
private $raural = "/(^|(?<!\\\);)(cue|pause)-(before|after):(.*?)((?<!\\\);|$)/";
/**
* Stash a reference to the controller & combiner
*
* @param (class) control: CSSCompression Controller
* @param (class) combine: CSSCompression Combiner
*/
public function __construct( CSSCompression_Control $control, CSSCompression_Combine $combine ) {
$this->Control = $control;
$this->Combine = $combine;
}
/**
* Combines Aural properties (currently being depreciated in W3C Standards)
*
* @param (string) val: Rule Set
*/
public function combine( $val ) {
$storage = $this->storage( $val );
$pos = 0;
// Replace first occurance with it's prop, and remove all following occurances
while ( preg_match( $this->raural, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$prop = $match[ 2 ][ 0 ];
if ( isset( $storage[ $prop ] ) ) {
$colon = strlen( $match[ 1 ][ 0 ] );
$val = substr_replace( $val, $storage[ $prop ], $match[ 0 ][ 1 ] + $colon, strlen( $match[ 0 ][ 0 ] ) - $colon );
$pos = $match[ 0 ][ 1 ] + strlen( $storage[ $prop ] ) - $colon - 1;
$storage[ $prop ] = '';
}
else {
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] ) - 1;
}
}
// Return converted val
return $val;
}
/**
* Builds a storage object for iteration
*
* @param (string) val: Rule Set
*/
private function storage( $val ) {
$storage = array();
// Find all possible occurences and build the replacement
$pos = 0;
while ( preg_match( $this->raural, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
if ( ! isset( $storage[ $match[ 2 ][ 0 ] ] ) ) {
$storage[ $match[ 2 ][ 0 ] ] = array( $match[ 3 ][ 0 ] => $match[ 4 ][ 0 ] );
}
// Override double written properties
$storage[ $match[ 2 ][ 0 ] ][ $match[ 3 ][ 0 ] ] = $match[ 4 ][ 0 ];
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] ) - 1;
}
// Go through each tag for possible combination
foreach ( $storage as $tag => $arr ) {
// All three have to be defined
if ( count( $arr ) == 2 && ! $this->Combine->checkUncombinables( $arr ) ) {
$storage[ $tag ] = "$tag:" . $arr['before'] . ' ' . $arr['after'] . ';';
}
else {
unset( $storage[ $tag ] );
}
}
return $storage;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in Aural Class - " . $method );
}
}
};
?>

View File

@@ -1,107 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Combine_Background
{
/**
* Combine Patterns
*
* @class Control: Compression Controller
* @class Combine: Combine Controller
* @param (regex) rbackground: Background matching
* @param (array) groupings: List of background combinations
*/
private $Control;
private $Combine;
private $rbackground = "/(^|(?<!\\\);)background-(color|image|repeat|attachment|position):(.*?)((?<!\\\);|$)/";
private $groupings = array(
// With color
array( 'color', 'image', 'repeat', 'attachment', 'position' ),
array( 'color', 'image', 'attachment', 'position' ),
array( 'color', 'image', 'repeat', 'position' ),
array( 'color', 'image', 'repeat', 'attachment' ),
array( 'color', 'image', 'repeat' ),
array( 'color', 'image', 'attachment' ),
array( 'color', 'image', 'position' ),
array( 'color', 'image' ),
// Without Color
array( 'image', 'attachment', 'position' ),
array( 'image', 'repeat', 'position' ),
array( 'image', 'repeat', 'attachment' ),
array( 'image', 'repeat' ),
array( 'image', 'attachment' ),
array( 'image', 'position' ),
// Just Color/Image
array( 'image' ),
array( 'color' ),
);
/**
* Stash a reference to the controller & combiner
*
* @param (class) control: CSSCompression Controller
* @param (class) combine: CSSCompression Combiner
*/
public function __construct( CSSCompression_Control $control, CSSCompression_Combine $combine ) {
$this->Control = $control;
$this->Combine = $combine;
}
/**
* Combines multiple background props into single definition
*
* @param (string) val: Rule Set
*/
public function combine( $val ) {
$storage = array();
// Find all possible occurences and build the replacement
$pos = 0;
while ( preg_match( $this->rbackground, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$storage[ $match[ 2 ][ 0 ] ] = $match[ 3 ][ 0 ];
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] ) - 1;
}
// Run background checks and get replacement str
foreach ( $this->groupings as $props ) {
if ( $replace = $this->Combine->searchDefinitions( 'background', $storage, $props ) ) {
break;
}
}
// If replacement string found, run it on all declarations
if ( $replace ) {
$pos = 0;
while ( preg_match( $this->rbackground, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$colon = strlen( $match[ 1 ][ 0 ] );
$val = substr_replace( $val, $replace, $match[ 0 ][ 1 ] + $colon, strlen( $match[ 0 ][ 0 ] ) - $colon );
$pos = $match[ 0 ][ 1 ] + strlen( $replace ) - $colon - 1;
$replace = '';
}
}
// Return converted val
return $val;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in Background Class - " . $method );
}
}
};
?>

View File

@@ -1,98 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Combine_Border
{
/**
* Combine Patterns
*
* @class Control: Compression Controller
* @class Combine: Combine Controller
* @param (regex) rborder: Border matching
*/
private $Control;
private $Combine;
private $rborder = "/(^|(?<!\\\);)border-(top|right|bottom|left):(.*?)((?<!\\\);|$)/";
/**
* Stash a reference to the controller & combiner
*
* @param (class) control: CSSCompression Controller
* @param (class) combine: CSSCompression Combiner
*/
public function __construct( CSSCompression_Control $control, CSSCompression_Combine $combine ) {
$this->Control = $control;
$this->Combine = $combine;
}
/**
* Combines multiple border properties into single definition
*
* @param (string) val: Rule Set
*/
public function combine( $val ) {
if ( ( $replace = $this->replace( $val ) ) === false ) {
return $val;
}
// Rebuild the rule set with the combinations found
$pos = 0;
while ( preg_match( $this->rborder, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$colon = strlen( $match[ 1 ][ 0 ] );
$val = substr_replace( $val, $replace, $match[ 0 ][ 1 ] + $colon, strlen( $match[ 0 ][ 0 ] ) - $colon );
$pos = $match[ 0 ][ 1 ] + strlen( $replace ) - $colon - 1;
$replace = '';
}
// Return converted val
return $val;
}
/**
* Builds a replacement string
*
* @param (string) val: Rule Set
*/
private function replace( $val ) {
$storage = array();
// Find all possible occurences and build the replacement
$pos = 0;
while ( preg_match( $this->rborder, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
// Override double written properties
$storage[ $match[ 2 ][ 0 ] ] = $match[ 3 ][ 0 ];
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] ) - 1;
}
// All 4 have to be defined
if ( count( $storage ) == 4 &&
$storage['top'] == $storage['bottom'] &&
$storage['left'] == $storage['right'] &&
$storage['top'] == $storage['right'] ) {
return "border:" . $storage['top'] . ';';
}
return false;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in Border Class - " . $method );
}
}
};
?>

View File

@@ -1,109 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Combine_BorderOutline
{
/**
* Combine Patterns
*
* @class Control: Compression Controller
* @class Combine: Combine Controller
* @param (regex) rcsw: Border/Outline matching
*/
private $Control;
private $Combine;
private $rcsw = "/(^|(?<!\\\);)(border|border-top|border-bottom|border-left|border-right|outline)-(color|style|width):(.*?)((?<!\\\);|$)/";
/**
* Stash a reference to the controller & combiner
*
* @param (class) control: CSSCompression Controller
* @param (class) combine: CSSCompression Combiner
*/
public function __construct( CSSCompression_Control $control, CSSCompression_Combine $combine ) {
$this->Control = $control;
$this->Combine = $combine;
}
/**
* Combines color/style/width of border/outline properties
*
* @param (string) val: Rule Set
*/
public function combine( $val ) {
$storage = $this->storage( $val );
$pos = 0;
// Now rebuild the string replacing all instances
while ( preg_match( $this->rcsw, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$prop = $match[ 2 ][ 0 ];
if ( isset( $storage[ $prop ] ) ) {
$colon = strlen( $match[ 1 ][ 0 ] );
$val = substr_replace( $val, $storage[ $prop ], $match[ 0 ][ 1 ] + $colon, strlen( $match[ 0 ][ 0 ] ) - $colon );
$pos = $match[ 0 ][ 1 ] + strlen( $storage[ $prop ] ) - $colon - 1;
$storage[ $prop ] = '';
}
else {
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] ) - 1;
}
}
// Return converted val
return $val;
}
/**
* Builds a storage object for iteration
*
* @param (string) val: Rule Set
*/
private function storage( $val ) {
$storage = array();
$pos = 0;
// Find all possible occurences and build the replacement
while ( preg_match( $this->rcsw, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
if ( ! isset( $storage[ $match[ 2 ][ 0 ] ] ) ) {
$storage[ $match[ 2 ][ 0 ] ] = array( $match[ 3 ][ 0 ] => $match[ 4 ][ 0 ] );
}
// Override double written properties
$storage[ $match[ 2 ][ 0 ] ][ $match[ 3 ][ 0 ] ] = $match[ 4 ][ 0 ];
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] ) - 1;
}
// Go through each tag for possible combination
foreach ( $storage as $tag => $arr ) {
// All three have to be defined
if ( count( $arr ) == 3 && ! $this->Combine->checkUncombinables( $arr ) ) {
$storage[ $tag ] = "$tag:" . $arr['width'] . ' ' . $arr['style'] . ' ' . $arr['color'] . ';';
}
else {
unset( $storage[ $tag ] );
}
}
return $storage;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in BorderOutline Class - " . $method );
}
}
};
?>

View File

@@ -1,263 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Combine_BorderRadius
{
/**
* Combine Patterns
*
* @class Control: Compression Controller
* @class Combine: Combine Controller
* @param (regex) rspace: Checks for space without an escape '\' character before it
* @param (regex) rslash: Checks for unescaped slash character
* @param (array) borderRadius: Various border radii components
*/
private $Control;
private $Combine;
private $rspace = "/(?<!\\\)\s/";
private $rslash = "/(?<!\\\)\//";
private $borderRadius = array(
'css3' => array(
'mod' => '',
'base' => "/(^|(?<!\\\);)border-radius:(.*?)((?<!\\\);|$)/",
'full' => "/(^|(?<!\\\);)border-(top|bottom)-(left|right)-radius:(.*?)((?<!\\\);|$)/",
),
'moz' => array(
'mod' => '-moz-',
'base' => "/(^|(?<!\\\);)-moz-border-radius:(.*?)((?<!\\\);|$)/",
'full' => "/(^|(?<!\\\);)-moz-border-radius-(top|bottom)(left|right):(.*?)((?<!\\\);|$)/"
),
'webkit' => array(
'mod' => '-webkit-',
'base' => "/(^|(?<!\\\);)-webkit-border-radius:(.*?)((?<!\\\);|$)/",
'full' => "/(^|(?<!\\\);)-webkit-border-(top|bottom)-(left|right)-radius:(.*?)((?<!\\\);|$)/"
),
);
/**
* Stash a reference to the controller & combiner
*
* @param (class) control: CSSCompression Controller
* @param (class) combine: CSSCompression Combiner
*/
public function __construct( CSSCompression_Control $control, CSSCompression_Combine $combine ) {
$this->Control = $control;
$this->Combine = $combine;
}
/**
* Main handler to combine border-radii into a single rule
*
* @param (string) val: Rule Set
*/
public function combine( $val ) {
foreach ( $this->borderRadius as $regex ) {
$val = $this->fix( $val, $regex );
}
return $val;
}
/**
* Does the actual combining
*
* @param (string) val: Rule Set
*/
private function fix( $val, $regex ) {
$val = $this->base( $val, $regex );
$replace = $regex['mod'];
// Storage builder
if ( ( $storage = $this->storage( $val, $regex ) ) === false ) {
return $val;
}
// Setup horizontal/vertical radii
foreach ( $storage as $dir => &$config ) {
// Verticals are optional
if ( $dir == 'vertical' && ! $config['keep'] ) {
break;
}
// All 4 are the same
else if ( $config['top-left'] == $config['top-right'] &&
$config['top-right'] == $config['bottom-right'] &&
$config['bottom-right'] == $config['bottom-left'] ) {
$config['replace'] .= $config['top-left'];
}
// Opposites are the same
else if ( $config['top-left'] == $config['bottom-right'] && $config['top-right'] == $config['bottom-left'] ) {
$config['replace'] .= $config['top-left'] . ' ' . $config['top-right'];
}
// 3-point directional
else if ( $config['top-right'] == $config['bottom-left'] ) {
$config['replace'] .= $config['top-left'] . ' ' . $config['top-right'] . ' ' . $config['bottom-right'];
}
// none are the same, but can still use shorthand notation
else {
$config['replace'] .= $config['top-left'] . ' ' . $config['top-right'] . ' '
. $config['bottom-right'] . ' ' . $config['bottom-left'];
}
}
// Now rebuild the string replacing all instances of margin/padding if shorthand exists
$pos = 0;
$replace = $regex['mod'] . "border-radius:" . $storage['horizontal']['replace'] . $storage['vertical']['replace'] . ';';
while ( preg_match( $regex['full'], $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$colon = strlen( $match[ 1 ][ 0 ] );
$val = substr_replace( $val, $replace, $match[ 0 ][ 1 ] + $colon, strlen( $match[ 0 ][ 0 ] ) - $colon );
$pos = $match[ 0 ][ 1 ] + strlen( $replace ) - $colon - 1;
$replace = '';
}
// Return converted val
return $val;
}
/**
* Expands short handed border radius props for combination
*
* @param (string) val: Rule Set
*/
private function base( $val, $regex ) {
$pos = 0;
while ( preg_match( $regex['base'], $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$replace = '';
$colon = strlen( $match[ 1 ][ 0 ] );
$parts = preg_split( $this->rslash, trim( $match[ 2 ][ 0 ] ), 2 );
$positions = array(
'top-left' => 0,
'top-right' => 0,
'bottom-right' => 0,
'bottom-left' => 0,
);
$base = array(
'horizontal' => array(
'parts' => preg_split( $this->rspace, trim( $parts[ 0 ] ) ),
'pos' => $positions,
),
'vertical' => array(
'parts' => isset( $parts[ 1 ] ) ? preg_split( $this->rspace, trim( $parts[ 1 ] ) ) : '',
'pos' => $positions,
),
);
foreach ( $base as &$config ) {
// Skip uncombinables
if ( $this->Combine->checkUncombinables( $config['parts'] ) ) {
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] ) - 1;
continue 2;
}
// Might not have verticals
else if ( $config['parts'] === '' ) {
continue;
}
// Each position needs a value
switch ( count( $config['parts'] ) ) {
case 1:
$config['pos']['top-left'] = $config['pos']['top-right'] = $config['parts'][ 0 ];
$config['pos']['bottom-left'] = $config['pos']['bottom-right'] = $config['parts'][ 0 ];
break;
case 2:
$config['pos']['top-left'] = $config['pos']['bottom-right'] = $config['parts'][ 0 ];
$config['pos']['bottom-left'] = $config['pos']['top-right'] = $config['parts'][ 1 ];
break;
case 3:
$config['pos']['top-left'] = $config['parts'][ 0 ];
$config['pos']['bottom-left'] = $config['pos']['top-right'] = $config['parts'][ 1 ];
$config['pos']['bottom-right'] = $config['parts'][ 2 ];
break;
case 4:
$config['pos']['top-left'] = $config['parts'][ 0 ];
$config['pos']['top-right'] = $config['parts'][ 1 ];
$config['pos']['bottom-right'] = $config['parts'][ 2 ];
$config['pos']['bottom-left'] = $config['parts'][ 3 ];
break;
default:
continue 2;
}
}
// Build the replacement
foreach ( $positions as $p => $v ) {
if ( $regex['mod'] == '-moz-' ) {
$replace .= "-moz-border-radius-" . preg_replace( "/-/", '', $p ) . ":"
. $base['horizontal']['pos'][ $p ]
. ( $base['vertical']['parts'] === '' ? '' : ' ' . $base['vertical']['pos'][ $p ] )
. ';';
}
else {
$replace .= $regex['mod'] . "border-$p-radius:"
. $base['horizontal']['pos'][ $p ]
. ( $base['vertical']['parts'] === '' ? '' : ' ' . $base['vertical']['pos'][ $p ] )
. ';';
}
}
$pos += strlen( $replace );
$val = substr_replace( $val, $replace, $match[ 0 ][ 1 ] + $colon, strlen( $match[ 0 ][ 0 ] ) - $colon );
}
return $val;
}
/**
* Builds the storage object for border radius props
*
* @param (string) val: Rule Set
* @param (array) regex: Current border radius type checking props
*/
private function storage( $val, $regex ) {
$storage = array(
'horizontal' => array( 'replace' => '' ),
'vertical' => array( 'replace' => '', 'keep' => false ),
);
// Find all possible occurences of this border-radius type and mark their directional value
$pos = 0;
while ( preg_match( $regex['full'], $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] ) - 1;
$parts = preg_split( $this->rspace, $match[ 4 ][ 0 ], 2 );
$storage['horizontal'][ $match[ 2 ][ 0 ] . '-' . $match[ 3 ][ 0 ] ] = trim( $parts[ 0 ] );
if ( isset( $parts[ 1 ] ) ) {
$storage['vertical'][ $match[ 2 ][ 0 ] . '-' . $match[ 3 ][ 0 ] ] = trim( $parts[ 1 ] );
$storage['vertical']['keep'] = true;
$storage['vertical']['replace'] = '/';
}
else {
$storage['vertical'][ $match[ 2 ][ 0 ] . '-' . $match[ 3 ][ 0 ] ] = '0';
}
}
// Only combine if all 4 definitions are found (5 including replace)
if ( count( $storage['horizontal'] ) != 5 ||
$this->Combine->checkUncombinables( $storage['horizontal'] ) ||
$this->Combine->checkUncombinables( $storage['vertical'] ) ) {
return false;
}
return $storage;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in BorderRadius Class - " . $method );
}
}
};
?>

View File

@@ -1,125 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Combine_Font
{
/**
* Combine Patterns
*
* @class Control: Compression Controller
* @class Combine: Combine Controller
* @param (regex) rfont: Font matching
* @param (array) groupings: Set of font combinationals
*/
private $Control;
private $Combine;
private $rfont = "/(^|(?<!\\\);)(font|line)-(style|variant|weight|size|height|family):(.*?)((?<!\\\);|$)/";
private $groupings = array(
array( 'font-style', 'font-variant', 'font-weight', 'size/height', 'font-family' ),
array( 'font-style', 'font-variant', 'font-weight', 'font-size', 'font-family' ),
array( 'font-style', 'font-variant', 'size/height', 'font-family' ),
array( 'font-style', 'font-variant', 'font-size', 'font-family' ),
array( 'font-style', 'font-weight', 'size/height', 'font-family' ),
array( 'font-style', 'font-weight', 'font-size', 'font-family' ),
array( 'font-variant', 'font-weight', 'size/height', 'font-family' ),
array( 'font-variant', 'font-weight', 'font-size', 'font-family' ),
array( 'font-weight', 'size/height', 'font-family' ),
array( 'font-weight', 'font-size', 'font-family' ),
array( 'font-variant', 'size/height', 'font-family' ),
array( 'font-variant', 'font-size', 'font-family' ),
array( 'font-style', 'size/height', 'font-family' ),
array( 'font-style', 'font-size', 'font-family' ),
array( 'size/height', 'font-family' ),
array( 'font-size', 'font-family' ),
);
/**
* Stash a reference to the controller & combiner
*
* @param (class) control: CSSCompression Controller
* @param (class) combine: CSSCompression Combiner
*/
public function __construct( CSSCompression_Control $control, CSSCompression_Combine $combine ) {
$this->Control = $control;
$this->Combine = $combine;
}
/**
* Combines multiple font-definitions into single definition
*
* @param (string) val: Rule Set
*/
public function combine( $val ) {
$storage = $this->storage( $val );
// Loop through each property check and see if they can be replaced
foreach ( $this->groupings as $props ) {
if ( $replace = $this->Combine->searchDefinitions( 'font', $storage, $props ) ) {
break;
}
}
// If replacement string found, run it on all declarations
if ( $replace ) {
$pos = 0;
while ( preg_match( $this->rfont, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
if ( ! isset( $storage['line-height'] ) && stripos( $match[ 0 ][ 0 ], 'line-height') === 0 ) {
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] ) - 1;
continue;
}
$colon = strlen( $match[ 1 ][ 0 ] );
$val = substr_replace( $val, $replace, $match[ 0 ][ 1 ] + $colon, strlen( $match[ 0 ][ 0 ] ) - $colon );
$pos = $match[ 0 ][ 1 ] + strlen( $replace ) - $colon - 1;
$replace = '';
}
}
// Return converted val
return $val;
}
/**
* Builds a storage object for iteration
*
* @param (string) val: Rule Set
*/
private function storage( $val ) {
$storage = array();
// Find all possible occurences and build the replacement
$pos = 0;
while ( preg_match( $this->rfont, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$storage[ $match[ 2 ][ 0 ] . '-' . $match[ 3 ][ 0 ] ] = $match[ 4 ][ 0 ];
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] ) - 1;
}
// Combine font-size & line-height if possible
if ( isset( $storage['font-size'] ) && isset( $storage['line-height'] ) ) {
$storage['size/height'] = $storage['font-size'] . '/' . $storage['line-height'];
unset( $storage['font-size'], $storage['line-height'] );
}
return $storage;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in Font Class - " . $method );
}
}
};
?>

View File

@@ -1,104 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Combine_List
{
/**
* Combine Patterns
*
* @class Control: Compression Controller
* @class Combine: Combine Controller
* @param (regex) rlist: List style matching
* @param (array) groupings: Group of list combinationals
*/
private $Control;
private $Combine;
private $rlist = "/(^|(?<!\\\);)list-style-(type|position|image):(.*?)((?<!\\\);|$)/";
private $groupings = array(
array( 'type', 'position', 'image' ),
array( 'type', 'position' ),
array( 'type', 'image' ),
array( 'position', 'image' ),
array( 'type' ),
array( 'position' ),
array( 'image' ),
);
/**
* Stash a reference to the controller & combiner
*
* @param (class) control: CSSCompression Controller
* @param (class) combine: CSSCompression Combiner
*/
public function __construct( CSSCompression_Control $control, CSSCompression_Combine $combine ) {
$this->Control = $control;
$this->Combine = $combine;
}
/**
* Combines multiple list style props into single definition
*
* @param (string) val: Rule Set
*/
public function combine( $val ) {
// If replacement string found, run it on all declarations
if ( ( $replace = $this->replace( $val ) ) !== false ) {
$pos = 0;
while ( preg_match( $this->rlist, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$colon = strlen( $match[ 1 ][ 0 ] );
$val = substr_replace( $val, $replace, $match[ 0 ][ 1 ] + $colon, strlen( $match[ 0 ][ 0 ] ) - $colon );
$pos = $match[ 0 ][ 1 ] + strlen( $replace ) - $colon - 1;
$replace = '';
}
}
// Return converted val
return $val;
}
/**
* Build the replacement string for list props
*
* @param (string) val: Rule Set
*/
private function replace( $val ) {
$storage = array();
$pos = 0;
// Find all possible occurences and build the replacement
while ( preg_match( $this->rlist, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$storage[ $match[ 2 ][ 0 ] ] = $match[ 3 ][ 0 ];
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] ) - 1;
}
// Run background checks and get replacement str
foreach ( $this->groupings as $props ) {
if ( $replace = $this->Combine->searchDefinitions( 'list-style', $storage, $props ) ) {
return $replace;
}
}
return false;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in List Class - " . $method );
}
}
};
?>

View File

@@ -1,190 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Combine_MarginPadding
{
/**
* Combine Patterns
*
* @class Control: Compression Controller
* @class Combine: Combine Controller
* @param (regex) rspace: Checks for space without an escape '\' character before it
* @param (regex) rmp: Margin/Padding matching
* @param (regex) rmpbase: Margin/Padding base match
*/
private $Control;
private $Combine;
private $rspace = "/(?<!\\\)\s/";
private $rmp = "/(^|(?<!\\\);)(margin|padding)-(top|right|bottom|left):(.*?)((?<!\\\);|$)/";
private $rmpbase = "/(^|(?<!\\\);)(margin|padding):(.*?)((?<!\\\);|$)/";
/**
* Stash a reference to the controller & combiner
*
* @param (class) control: CSSCompression Controller
* @param (class) combine: CSSCompression Combiner
*/
public function __construct( CSSCompression_Control $control, CSSCompression_Combine $combine ) {
$this->Control = $control;
$this->Combine = $combine;
}
/**
* Combines multiple directional properties of
* margin/padding into single definition.
*
* @param (string) val: Rule Set
*/
public function combine( $val ) {
$val = $this->expand( $val );
$storage = $this->storage( $val );
$pos = 0;
// Now rebuild the string replacing all instances of margin/padding if shorthand exists
while ( preg_match( $this->rmp, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$prop = $match[ 2 ][ 0 ];
if ( isset( $storage[ $prop ] ) ) {
$colon = strlen( $match[ 1 ][ 0 ] );
$val = substr_replace( $val, $storage[ $prop ], $match[ 0 ][ 1 ] + $colon, strlen( $match[ 0 ][ 0 ] ) - $colon );
$pos = $match[ 0 ][ 1 ] + strlen( $storage[ $prop ] ) - $colon - 1;
$storage[ $prop ] = '';
}
else {
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] ) - 1;
}
}
// Return converted val
return $val;
}
/**
* Build the storage object for iteration
*
* @param (string) val: Rule Set
*/
private function storage( $val ) {
$storage = array();
$pos = 0;
// Find all possible occurences of margin/padding and mark their directional value
while ( preg_match( $this->rmp, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
if ( ! isset( $storage[ $match[ 2 ][ 0 ] ] ) ) {
$storage[ $match[ 2 ][ 0 ] ] = array( $match[ 3 ][ 0 ] => $match[ 4 ][ 0 ] );
}
// Override double written properties
$storage[ $match[ 2 ][ 0 ] ][ $match[ 3 ][ 0 ] ] = $match[ 4 ][ 0 ];
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] ) - 1;
}
// Go through each tag for possible combination
foreach ( $storage as $tag => $arr ) {
// Only combine if all 4 definitions are found
if ( count( $arr ) == 4 && ! $this->Combine->checkUncombinables( $arr ) ) {
// All 4 are the same
if ( $arr['top'] == $arr['bottom'] && $arr['left'] == $arr['right'] && $arr['top'] == $arr['left'] ) {
$storage[ $tag ] = "$tag:" . $arr['top'] . ';';
}
// Opposites are the same
else if ( $arr['top'] == $arr['bottom'] && $arr['left'] == $arr['right'] ) {
$storage[ $tag ] = "$tag:" . $arr['top'] . ' ' . $arr['left'] . ';';
}
// 3-point directional
else if ( $arr['right'] == $arr['left'] ) {
$storage[ $tag ] = "$tag:" . $arr['top'] . ' ' . $arr['right'] . ' ' . $arr['bottom'] . ';';
}
// none are the same, but can still use shorthand notation
else {
$storage[ $tag ] = "$tag:" . $arr['top'] . ' ' . $arr['right'] . ' ' . $arr['bottom'] . ' ' . $arr['left'] . ';';
}
}
else {
unset( $storage[ $tag ] );
}
}
return $storage;
}
/**
* Explodes shorthanded margin/padding properties for later combination
*
* @param (string) val: Rule set
*/
private function expand( $val ) {
$pos = 0;
while ( preg_match( $this->rmpbase, $val, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$replace = '';
$prop = $match[ 2 ][ 0 ];
$value = preg_split( $this->rspace, trim( $match[ 3 ][ 0 ] ) );
$positions = array(
'top' => 0,
'right' => 0,
'bottom' => 0,
'left' => 0
);
// Skip uncombinables
if ( $this->Combine->checkUncombinables( $value ) ) {
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] );
continue;
}
// Each position needs a value
switch ( count( $value ) ) {
case 1:
$positions['top'] = $positions['right'] = $positions['bottom'] = $positions['left'] = $value[ 0 ];
break;
case 2:
$positions['top'] = $positions['bottom'] = $value[ 0 ];
$positions['right'] = $positions['left'] = $value[ 1 ];
break;
case 3:
$positions['top'] = $value[ 0 ];
$positions['right'] = $positions['left'] = $value[ 1 ];
$positions['bottom'] = $value[ 2 ];
break;
case 4:
$positions['top'] = $value[ 0 ];
$positions['right'] = $value[ 1 ];
$positions['bottom'] = $value[ 2 ];
$positions['left'] = $value[ 3 ];
break;
default:
continue;
}
// Build the replacement
foreach ( $positions as $p => $v ) {
$replace .= "$prop-$p:$v;";
}
$colon = strlen( $match[ 1 ][ 0 ] );
$val = substr_replace( $val, $replace, $match[ 0 ][ 1 ] + $colon, strlen( $match[ 0 ][ 0 ] ) - $colon );
$pos = $match[ 0 ][ 1 ] + strlen( $replace ) - $colon - 1;
}
return $val;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in MarginPadding Class - " . $method );
}
}
};
?>

View File

@@ -1,212 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Compress
{
/**
* Trim Patterns
*
* @param (array) options: Reference to options
* @param (array) stats: Reference to stats
* @param (regex) rsemicolon: Checks for semicolon without an escape '\' character before it
* @param (regex) rcolon: Checks for colon without an escape '\' character before it
* @param (regex) rspace: Checks for space without an escape '\' character before it
*/
private $options = array();
private $stats = array();
private $rsemicolon = "/(?<!\\\);/";
private $rcolon = "/(?<!\\\):/";
private $rspace = "/(?<!\\\)\s/";
/**
* Other inner classes that get used within compression
*
* @class Control: Compression Controller
* @class Trim: Trim Instance
* @class Setup: Setup Instance
* @class Format: Formatting Instance
* @class Combine: Combine Instance
* @class Cleanup: Cleanup Instance
* @class Organize: Organize Instance
* @class Selectors: Selectors Instance
* @param (array) others: List of above classes for copying
*/
private $Control;
private $Trim;
private $Setup;
private $Format;
private $Combine;
private $Cleanup;
private $Organize;
private $Selectors;
private $others = array(
'Trim',
'Setup',
'Format',
'Combine',
'Cleanup',
'Organize',
'Selectors',
);
/**
* Stash a reference to the controller on each instantiation
*
* @param (class) control: CSSCompression Controller
*/
public function __construct( CSSCompression_Control $control ) {
$this->Control = $control;
$this->options = &$control->Option->options;
$this->stats = &$control->stats;
foreach ( $this->others as $class ) {
$this->$class = $control->$class;
}
}
/**
* Centralized function to run css compression.
*
* @param (string) css: Stylesheet to compresss
*/
public function compress( $css ) {
$setup = $this->setup( $css );
$setup = $this->rulesets( $setup );
$css = $this->readability( $setup );
// Attach plea to top of page with unknown blocks
if ( $this->options['add-unknown'] && count( $setup['unknown'] ) ) {
$css = "/*\nThere are unknown blocks in the sheet, please please please open an issue with your sheet attached to it:\n"
. "https://github.com/codenothing/css-compressor/issues\n"
. "Thank You --\n\n"
. implode( "\n", $setup['unknown'] )
. "\n*/\n"
. $css;
}
// Mark final file size
$this->stats['after']['size'] = strlen( $css = trim( $css ) );
// Return compressed css
return $css;
}
/**
* Runs css through initial setup handlers
*
* @param (string) css: Sheet to compress
*/
private function setup( $css ) {
// Initial stats
$this->stats['before']['time'] = microtime( true );
$this->stats['before']['size'] = strlen( $css );
// Initial trimming
$css = $this->Trim->trim( $css );
// Do a little tokenizing, compress each property individually
$setup = $this->Setup->setup( $css );
// Mark number of selectors pre-combine
$this->stats['before']['selectors'] = count( $setup['selectors'] );
return $setup;
}
/**
* Focus compressions on each rule set
*
* @param (array) setup: Array containing selectors and rule sets
*/
private function rulesets( $setup ) {
// Do selector specific compressions
$this->Selectors->selectors( $setup['selectors'] );
// Look at each group of properties as a whole, and compress/combine similiar definitions
$this->Combine->combine( $setup['selectors'], $setup['details'] );
// If order isn't important, run comination functions before and after compressions to catch all instances
// Be sure to prune before hand for higher chance of matching
if ( $this->options['organize'] ) {
$this->Cleanup->cleanup( $setup['selectors'], $setup['details'] );
$this->Organize->organize( $setup['selectors'], $setup['details'] );
$this->Combine->combine( $setup['selectors'], $setup['details'] );
}
// Do final maintenace work, remove injected property/values
$this->Cleanup->cleanup( $setup['selectors'], $setup['details'] );
// Run final counters before full cleanup
$this->finalCount( $setup['selectors'], $setup['details'] );
return $setup;
}
/**
* Runs final counts on selectors and props
*
* @param (array) selectors: Selector rules
* @param (array) details: Rule sets
*/
private function finalCount( $selectors, $details ) {
// Selectors and props
$this->stats['after']['selectors'] = count( $selectors );
foreach ( $details as $item ) {
$props = preg_split( $this->rsemicolon, $item );
// Make sure count is true
foreach ( $props as $k => $v ) {
if ( ! isset( $v ) || $v == '' ) {
unset( $props[ $k ] );
}
}
$this->stats['after']['props'] += count( $props );
}
// Final count for stats
$this->stats['after']['time'] = microtime( true );
}
/**
* Formats the compressed rule sets into a stylesheet
*
* @param (array) setup: Array containing selectors and rule sets
*/
private function readability( $setup ) {
// Format css to users preference
$css = $this->Format->readability( $this->options['readability'], $setup['selectors'], $setup['details'] );
// Intros
foreach ( $setup as $value ) {
if ( $value && is_string( $value ) ) {
$css = $value . $css;
}
}
// Remove escapables
$css = $this->Cleanup->removeInjections( $css );
return $css;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in Compress Class - " . $method );
}
}
};
?>

View File

@@ -1,236 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Control
{
/**
* Control Patterns
*
* @param (string) css: Holds compressed css string
* @param (string) mode: Current compression mode state
* @param (array) stats: Holds compression stats
* @param (array) getters: Array of accessible getters
*/
public $css = '';
public $mode = '';
public $stats = array();
private $getters = array(
'css',
'mode',
'stats',
);
/**
* Subclasses that do the ground work for this compressor
*
* @class CSSCompression: Public facing compression class
* @class Option: Option handling
* @class Trim: Does the initial trimming for the css
* @class Format: Formats the output
* @class Numeric: Handles numeric compression
* @class Color: Handles color compression
* @class Individuals: Runs compression algorithms on individual properties and values
* @class Selectors: Runs selector specific compressions
* @class Combine: Handles combining of various properties
* @class Organize: Reorganizes the sheet for futher compression
* @class Cleanup: Cleans out all injected characters during compression
* @class Compress: Central compression unit.
* @param (array) subclasses: Array holding all the subclasses for inlusion
*/
public $CSSCompression;
public $Option;
public $Trim;
public $Format;
public $Numeric;
public $Color;
public $Individuals;
public $Selectors;
public $Combine;
public $Organize;
public $Cleanup;
public $Setup;
public $Compress;
private $subclasses = array(
'Option',
'Trim',
'Format',
'Numeric',
'Color',
'Individuals',
'Selectors',
'Combine',
'Organize',
'Cleanup',
'Setup',
'Compress',
);
/**
* Pull in the Compression instance and build the subclasses
*
* @param (class) CSSCompression: CSSCompression Instance
*/
public function __construct( CSSCompression $CSSCompression ) {
$this->CSSCompression = $CSSCompression;
// Load all subclasses on demand
if ( ! class_exists( "CSSCompression_Option", false ) ) {
$path = dirname(__FILE__) . '/';
foreach ( $this->subclasses as $class ) {
require( $path . $class . '.php' );
}
}
// Initialize each subclass
foreach ( $this->subclasses as $class ) {
$full = "CSSCompression_$class";
$this->$class = new $full( $this );
}
}
/**
* Control access to properties
*
* - Getting stats/mode/css returns the current value of that property
* - Getting options will return the current full options array
* - Getting anything else returns that current value in the options array or NULL
*
* @param (string) name: Name of property that you want to access
*/
public function get( $name ) {
if ( in_array( $name, $this->getters ) ) {
return $this->$name;
}
else if ( $name == 'options' ) {
return $this->Option->options;
}
else {
return $this->Option->option( $name );
}
}
/**
* The setter method only allows access to setting values in the options array
*
* @param (string) name: Key name of the option you want to set
* @param (mixed) value: Value of the option you want to set
*/
public function set( $name, $value ) {
// Allow for passing array of options to merge into current ones
if ( $name === 'options' && is_array( $value ) ) {
return $this->Option->merge( $value );
}
else if ( isset( CSSCompression::$defaults[ $name ] ) ) {
return $this->Option->option( $name, $value );
}
else {
throw new CSSCompression_Exception( "Invalid Private Access to $name in CSSCompression." );
}
}
/**
* Merges a predefined set options
*
* @param (string) mode: Name of mode to use.
*/
public function mode( $mode = NULL ) {
return $this->Options->merge( $mode );
}
/**
* Resets options to their defaults, and flushes out variables
*
* @params none
*/
public function reset(){
$this->Option->reset();
return $this->flush();
}
/**
* Cleans out class variables for next run
*
* @params none
*/
public function flush(){
$this->css = '';
$this->stats = array(
'before' => array(
'props' => 0,
'selectors' => 0,
'size' => 0,
'time' => 0,
),
'after' => array(
'props' => 0,
'selectors' => 0,
'size' => 0,
'time' => 0,
),
);
return true;
}
/**
* Proxy to run Compression on the sheet passed. Handle options here.
*
* @param (string) css: Stylesheet to be compressed
* @param (mixed) options: Array of options or mode to use.
*/
public function compress( $css = NULL, $options = NULL ) {
// Flush out old stats and variables
$this->flush();
// If no additional options, just run compression
if ( $options === NULL ) {
return $this->css = $this->Compress->compress( $css );
}
// Store old params
$old = $this->mode == '__custom' ? $this->Option->option() : $this->mode;
$readability = $this->Option->option( 'readability' );
// Compress with new set of options
$this->Option->merge( $options );
$css = $this->Compress->compress( $css );
// Reset original options
$this->reset();
$this->Option->merge( $old );
// Return the compressed css
return $this->css = $css;
}
/**
* Backdoor access to subclasses
* ONLY FOR DEVELOPMENT/TESTING.
*
* @param (string) class: Name of the focus class
* @param (array) config: Contains name reference and test arguments
*/
public function access( $class, $method, $args ) {
if ( $class == 'Control' ) {
return call_user_func_array( array( $class, $method ), $args );
}
else if ( strpos( $class, '.' ) !== false ) {
$parts = explode( '.', $class );
$class = $parts[ 0 ];
$subclass = $parts[ 1 ];
return $this->$class->access( $subclass, $method, $args );
}
else if ( in_array( $class, $this->subclasses ) ) {
return $this->$class->access( $method, $args );
}
else {
throw new CSSCompression_Exception( "Unknown Class Access - " . $class );
}
}
};
?>

View File

@@ -1,32 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Exception extends Exception
{
/**
* Custom exception handler
*
* @param (string) message: Error message
* @param (int) code: Error code
* @instance (Exception Instance) previous: Previous exception
*/
public function __construct( $message = 'Unknown Exception', $code = 0, Exception $previous = NULL ) {
parent::__construct( $message, $code, $previous );
}
/**
* String version of this custom exception
*
* @params none
*/
public function __toString(){
return "CSSCompression Exception: [" . $this->code . "] " . $this->message . "\n";
}
};
?>

View File

@@ -1,187 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Format
{
/**
* Format Patterns
*
* @class Control: Compression Controller
* @param (string) token: Copy of the injection token
* @param (array) options: Reference to options
* @param (regex) rsemicolon: Checks for semicolon without an escape '\' character before it
* @param (regex) rcolon: Checks for colon without an escape '\' character before it
* @param (array) readability: Mapping to readability functions
*/
private $Control;
private $token = '';
private $options = array();
private $rsemicolon = "/(?<!\\\);/";
private $rcolon = "/(?<!\\\):/";
private $readability = array(
CSSCompression::READ_MAX => 'maximum',
CSSCompression::READ_MED => 'medium',
CSSCompression::READ_MIN => 'minimum',
CSSCompression::READ_NONE => 'none',
);
/**
* Stash a reference to the controller on each instantiation
*
* @param (class) control: CSSCompression Controller
*/
public function __construct( CSSCompression_Control $control ) {
$this->Control = $control;
$this->token = CSSCompression::TOKEN;
$this->options = &$control->Option->options;
}
/**
* Reformats compressed CSS into specified format
*
* @param (int) readability: Readability level of compressed output
* @param (array) selectors: Array of selectors
* @param (array) details: Array of declarations
*/
public function readability( $readability = CSSCompression::READ_NONE, $selectors = array(), $details = array() ) {
if ( isset( $this->readability[ $readability ] ) ) {
$fn = $this->readability[ $readability ];
return trim( $this->$fn( $selectors, $details ) );
}
else {
return 'Invalid Readability Value';
}
}
/**
* Returns maxium readability, breaking on every selector, brace, and property
*
* @param (array) selectors: Array of selectors
* @param (array) details: Array of declarations
*/
private function maximum( $selectors, $details ) {
$css = '';
foreach ( $selectors as $k => $v ) {
if ( strpos( $v, $this->token ) === 0 ) {
$css .= substr( $v, strlen( $this->token ) );
$css .= $details[ $k ];
continue;
}
else if ( ! $details[ $k ] || trim( $details[ $k ] ) == '' ) {
continue;
}
$v = str_replace( '>', ' > ', $v );
$v = str_replace( '+', ' + ', $v );
$v = str_replace( ',', ', ', $v );
$css .= "$v {\n";
$arr = preg_split( $this->rsemicolon, $details[ $k ] );
foreach ( $arr as $item ) {
if ( ! $item ) {
continue;
}
list( $prop, $val ) = preg_split( $this->rcolon, $item, 2 );
$css .= "\t$prop: $val;\n";
}
// Kill that last semicolon at users request
if ( $this->options['unnecessary-semicolons'] ) {
$css = preg_replace( "/;\n$/", "\n", $css );
}
$css .= "}\n\n";
}
return $css;
}
/**
* Returns medium readability, putting selectors and rule sets on new lines
*
* @param (array) selectors: Array of selectors
* @param (array) details: Array of declarations
*/
private function medium( $selectors, $details ) {
$css = '';
foreach ( $selectors as $k => $v ) {
if ( strpos( $v, $this->token ) === 0 ) {
$css .= substr( $v, strlen( $this->token ) );
$css .= $details[ $k ];
continue;
}
else if ( $details[ $k ] && $details[ $k ] != '' ) {
$css .= "$v {\n\t" . $details[ $k ] . "\n}\n";
}
}
return $css;
}
/**
* Returns minimum readability, breaking after every selector and it's rule set
*
* @param (array) selectors: Array of selectors
* @param (array) details: Array of declarations
*/
private function minimum( $selectors, $details ) {
$css = '';
foreach ( $selectors as $k => $v ) {
if ( strpos( $v, $this->token ) === 0 ) {
$css .= substr( $v, strlen( $this->token ) );
$css .= $details[ $k ];
continue;
}
else if ( $details[ $k ] && $details[ $k ] != '' ) {
$css .= "$v{" . $details[ $k ] . "}\n";
}
}
return $css;
}
/**
* Returns an unreadable, but fully compressed script
*
* @param (array) selectors: Array of selectors
* @param (array) details: Array of declarations
*/
private function none( $selectors, $details ) {
$css = '';
foreach ( $selectors as $k => $v ) {
if ( strpos( $v, $this->token ) === 0 ) {
$css .= substr( $v, strlen( $this->token ) );
$css .= $details[ $k ];
continue;
}
else if ( $details[ $k ] && $details[ $k ] != '' ) {
$css .= trim( "$v{" . $details[ $k ] . "}" );
}
}
return $css;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in Format Class - " . $method );
}
}
};
?>

View File

@@ -1,307 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Individuals
{
/**
* Individual patterns
*
* @class Control: Compression Controller
* @class Numeric: Numeric handler
* @class Color: Color Handler
* @param (array) options: Reference to options
* @param (regex) rdirectional: Properties that may have multiple directions
* @param (regex) rborderradius: Checks property for border-radius declaration
* @param (regex) rnoneprop: Properties that can have none as their value(will be converted to 0)
* @param (regex) rclip: Looks for rect grouping in clip declaration
* @param (regex) rsplitter: Checks font properties for font-size/line-height split
* @param (regex) rfilter: Special alpha filter for msie
* @param (regex) rspace: Checks for unescaped space
* @param (regex) rspace: Checks for unescaped slash
* @param (array) weights: Array of font-weight name conversions to their numeric counterpart
*/
private $Control;
private $Numeric;
private $Color;
private $options = array();
private $rdirectional = "/^(margin|padding|border-spacing)$/";
private $rborderradius = "/border[a-z-]*radius/";
private $rradiusfull = "/^(-moz-|-webkit-)?border-radius$/";
private $rnoneprop = "/^(border|background|border-(top|right|bottom|left))$/";
private $rclip = "/^rect\(\s*(\-?\d*\.?\d*?\w*)(,|\s)(\-?\d*\.?\d*?\w*)(,|\s)(\-?\d*\.?\d*?\w*)(,|\s)(\-?\d*\.?\d*?\w*)\s*\)$/";
private $rsplitter = "/(^|(?<!\\\)\s)([^\/ ]+)\/([^\/ ]+)((?<!\\\)\s|$)/";
private $rfilter = "/[\"']?PROGID\\\?:DXImageTransform\\\?.Microsoft\\\?.Alpha\(Opacity\\\?=(\d+\\\?\.?\d*)\)[\"']?/i";
private $rspace = "/(?<!\\\)\s/";
private $rslash = "/(?<!\\\)\//";
private $weights = array(
"normal" => 400,
"bold" => 700,
);
/**
* Stash a reference to the controller on each instantiation
*
* @param (class) control: CSSCompression Controller
*/
public function __construct( CSSCompression_Control $control ) {
$this->Control = $control;
$this->Numeric = $control->Numeric;
$this->Color = $control->Color;
$this->options = &$control->Option->options;
}
/**
* Runs special unit/directional compressions
*
* @param (string) prop: CSS Property
* @param (string) val: Value of CSS Property
*/
public function individuals( $prop, $val ) {
// Properties should always be lowercase
$prop = strtolower( $prop );
// Split up each definiton for color and numeric compressions
$parts = preg_split( $this->rspace, $val );
foreach ( $parts as &$v ) {
if ( ! $v || $v == '' ) {
continue;
}
// Remove uneeded decimals/units
if ( $this->options['format-units'] ) {
$v = $this->Numeric->numeric( $v );
}
// Color compression
$v = $this->Color->color( $v );
}
$val = trim( implode( ' ', $parts ) );
// Special border radius handling
if ( preg_match( $this->rborderradius, $prop ) ) {
$val = $this->borderRadius( $prop, $val );
}
// Remove uneeded side definitions if possible
else if ( $this->options['directional-compress'] && count( $parts ) > 1 && preg_match( $this->rdirectional, $prop ) ) {
$val = $this->directionals( strtolower( $val ) );
}
// Font-weight converter
if ( $this->options['fontweight2num'] && ( $prop == 'font-weight' || $prop == 'font' ) ) {
$val = $this->fontweight( $val );
}
// Special font value conversions
if ( $prop == 'font' ) {
$val = $this->font( $val );
}
// Special clip value compressions
if ( $prop == 'clip' ) {
$val = $this->clip( $val );
}
// None to 0 converter
$val = $this->none( $prop, $val );
// MSIE Filters
$val = $this->filter( $prop, $val );
// Return for list retrival
return array( $prop, $val );
}
/**
* Preps border radius for directional compression
*
* @param (string) prop: Property Declaration
* @param (string) val: Declaration Value
*/
private function borderRadius( $prop, $val ) {
if ( preg_match( $this->rslash, $val ) ) {
$parts = preg_split( $this->rslash, $val, 2 );
// We have to redo numeric compression because the slash may hav intruded
foreach ( $parts as &$row ) {
$p = preg_split( $this->rspace, $row );
foreach ( $p as &$v ) {
if ( ! $v || $v == '' ) {
continue;
}
// Remove uneeded decimals/units
if ( $this->options['format-units'] ) {
$v = $this->Numeric->numeric( $v );
}
}
$row = implode( ' ', $p );
if ( $this->options['directional-compress'] ) {
$row = $this->directionals( strtolower( $row ) );
}
}
$val = implode( '/', $parts );
}
else if ( $this->options['directional-compress'] && preg_match( $this->rradiusfull, $prop ) ) {
$val = $this->directionals( strtolower( $val ) );
}
return $val;
}
/**
* Finds directional compression on methods like margin/padding
*
* @param (string) val: Value of CSS Property
*/
private function directionals( $val ) {
// Split up each definiton
$direction = preg_split( $this->rspace, $val );
// 4 Direction reduction
$count = count( $direction );
if ( $count == 4 ) {
// All 4 sides are the same, combine into 1 definition
if ( $direction[ 0 ] == $direction[ 1 ] && $direction[ 2 ] == $direction[ 3 ] && $direction[ 0 ] == $direction[ 3 ] ) {
$direction = array( $direction[ 0 ] );
}
// top-bottom/left-right are the same, reduce definition
else if ( $direction[ 0 ] == $direction[ 2 ] && $direction[ 1 ] == $direction[ 3 ] ) {
$direction = array( $direction[ 0 ], $direction[ 1 ] );
}
// Only left-right are the same
else if ( $direction[ 1 ] == $direction[ 3 ] ) {
$direction = array( $direction[ 0 ], $direction[ 1 ], $direction[ 2 ] );
}
}
// 3 Direction reduction
else if ( $count == 3 ) {
// All directions are the same
if ( $direction[ 0 ] == $direction[ 1 ] && $direction[ 1 ] == $direction[ 2 ] ) {
$direction = array( $direction[ 0 ] );
}
// Only top(first) and bottom(last) are the same
else if ( $direction[ 0 ] == $direction[ 2 ] ) {
$direction = array( $direction[ 0 ], $direction[ 1 ] );
}
}
// 2 Direction reduction
// Both directions are the same, combine into single definition
else if ( $count == 2 && $direction[ 0 ] == $direction[ 1 ] ) {
$direction = array( $direction[ 0 ] );
}
// Return the combined version of the directions
// Single entries will just return
return implode( ' ', $direction );
}
/**
* Converts font-weight names to numbers
*
* @param (string) val: font-weight prop value
*/
private function fontweight( $val ) {
if ( preg_match( $this->rspace, $val ) ) {
$parts = preg_split( $this->rspace, $val );
foreach ( $parts as &$item ) {
$lower = strtolower( $item );
if ( isset( $this->weights[ $lower ] ) && $lower != 'normal' ) {
$item = $this->weights[ $lower ];
}
}
$val = implode( ' ', $parts );
}
else if ( isset( $this->weights[ strtolower( $val ) ] ) ) {
$val = $this->weights[ strtolower( $val ) ];
}
return $val;
}
/**
* Special font conversions
*
* @param (string) val: property value
*/
private function font( $val ) {
// Split out the font-size/line-height split and run through numerical handlers
if ( preg_match( $this->rsplitter, $val, $match, PREG_OFFSET_CAPTURE ) ) {
$size = $this->Numeric->numeric( $match[ 2 ][ 0 ] );
$height = $this->Numeric->numeric( $match[ 3 ][ 0 ] );
$concat = $match[ 1 ][ 0 ] . $size . '/' . $height . $match[ 4 ][ 0 ];
$val = substr_replace( $val, $concat, $match[ 0 ][ 1 ], strlen( $match[ 0 ][ 0 ] ) );
}
return $val;
}
/**
* Special clip conversions
*
* @param (string) val: property value
*/
private function clip( $val ) {
if ( preg_match( $this->rclip, $val, $match ) ) {
$positions = array( 1, 3, 5, 7 );
$clean = 'rect(';
foreach ( $positions as $pos ) {
if ( ! isset( $match[ $pos ] ) ) {
return $val;
}
$clean .= $this->Numeric->numeric( $match[ $pos ] ) . ( isset( $match[ $pos + 1 ] ) ? $match[ $pos + 1 ] : '' );
}
$val = $clean . ')';
}
return $val;
}
/**
* Convert none vals to 0
*
* @param (string) prop: Current Property
* @param (string) val: property value
*/
private function none( $prop, $val ) {
if ( preg_match( $this->rnoneprop, $prop ) && $val == 'none' ) {
$val = '0';
}
return $val;
}
/**
* MSIE Filter Conversion
*
* @param (string) prop: Current Property
* @param (string) val: property value
*/
private function filter( $prop, $val ) {
if ( preg_match( "/filter/", $prop ) ) {
$val = preg_replace( $this->rfilter, "alpha(opacity=$1)", $val );
}
return $val;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in Individuals Class - " . $method );
}
}
};
?>

View File

@@ -1,103 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Numeric
{
/**
* Numeric Patterns
*
* @class Control: Compression Controller
* @param (array) options: Reference to options
* @param (regex) rdecimal: Checks for zero decimal
* @param (regex) rzero: Checks for preceding 0 to decimal unit
* @param (regex) runit: Checks for suffix on 0 unit
*/
private $Control;
private $options = array();
private $rdecimal = "/^(\+|\-)?(\d*\.[1-9]*0*)(\%|[a-z]{2})$/i";
private $rzero = "/^(\+|\-)?0(\.\d+)(\%|[a-z]{2})?$/i";
private $runit = "/^0(\%|[a-z]{2})$/i";
/**
* Stash a reference to the controller on each instantiation
*
* @param (class) control: CSSCompression Controller
*/
public function __construct( CSSCompression_Control $control ) {
$this->Control = $control;
$this->options = &$control->Option->options;
}
/**
* Runs all numeric operations
*
* @param (string) str: Unit string
*/
public function numeric( $str ) {
$str = $this->decimal( $str );
$str = $this->zeroes( $str );
$str = $this->units( $str );
return $str;
}
/**
* Remove's unecessary decimal, ie 13.0px => 13px
*
* @param (string) str: Unit string
*/
private function decimal( $str ) {
if ( preg_match( $this->rdecimal, $str, $match ) ) {
$str = ( $match[ 1 ] == '-' ? '-' : '' ) . floatval( $match[ 2 ] ) . $match[ 3 ];
}
return $str;
}
/**
* Removes suffix from 0 unit, ie 0px; => 0;
*
* @param (string) str: Unit string
*/
private function units( $str ) {
if ( preg_match( $this->runit, $str, $match ) ) {
$str = '0';
}
return $str;
}
/**
* Removes leading zero in decimal, ie 0.33px => .33px
*
* @param (string) str: Unit string
*/
private function zeroes( $str ) {
if ( preg_match( $this->rzero, $str, $match ) ) {
$str = ( isset( $match[ 1 ] ) && $match[ 1 ] == '-' ? '-' : '' ) . $match[ 2 ] . ( isset( $match[ 3 ] ) ? $match[ 3 ] : '' );
}
return $str;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in Numeric Class - " . $method );
}
}
};
?>

View File

@@ -1,133 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Option
{
/**
* Option Patterns
*
* @class Control: Compression Controller
* @param (string) custom: Name of the custom mode
* @param (array) options: Instance settings
*/
private $Control;
private $custom = '__custom';
public $options = array();
/**
* Stash a reference to the controller on each instantiation
*
* @param (class) control: CSSCompression Controller
*/
public function __construct( CSSCompression_Control $control ) {
$this->Control = $control;
$this->options = CSSCompression::$defaults;
$control->mode = $this->custom;
}
/**
* Maintainable access to the options array
*
* - Passing no arguments returns the entire options array
* - Passing a single name argument returns the value for the option
* - Passing both a name and value, sets the value to the name key, and returns the value
* - Passing an array will merge the options with the array passed, for object like extension
*
* @param (mixed) name: The key name of the option
* @param (mixed) value: Value to set the option
*/
public function option( $name = NULL, $value = NULL ) {
if ( $name === NULL ) {
return $this->options;
}
else if ( is_array( $name ) ) {
return $this->merge( $name );
}
else if ( $value === NULL ) {
return isset( $this->options[ $name ] ) ? $this->options[ $name ] : NULL;
}
else {
// Readability doesn't signify custom settings
if ( $name != 'readability' ) {
$this->Control->mode = $this->custom;
}
return ( $this->options[ $name ] = $value );
}
}
/**
* Reset's the default options
*
* @params none;
*/
public function reset(){
// Reset and return the new options
return $this->options = CSSCompression::$defaults;
}
/**
* Extend like function to merge an array of preferences into
* the options array.
*
* @param (mixed) options: Array of preferences to merge into options
*/
public function merge( $options = array() ) {
$modes = CSSCompression::modes();
if ( $options && is_array( $options ) && count( $options ) ) {
$this->Control->mode = $this->custom;
foreach ( $this->options as $key => $value ) {
if ( ! isset( $options[ $key ] ) ) {
continue;
}
else if ( strtolower( $options[ $key ] ) == 'on' ) {
$this->options[ $key ] = true;
}
else if ( strtolower( $options[ $key ] ) == 'off' ) {
$this->options[ $key ] = false;
}
else {
$this->options[ $key ] = intval( $options[ $key ] );
}
}
}
else if ( $options && is_string( $options ) && array_key_exists( $options, $modes ) ) {
$this->Control->mode = $options;
// Default all to true, the mode has to force false
foreach ( $this->options as $key => $value ) {
if ( $key != 'readability' ) {
$this->options[ $key ] = true;
}
}
// Merge mode into options
foreach ( $modes[ $options ] as $key => $value ) {
$this->options[ $key ] = $value;
}
}
return $this->options;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in Option Class - " . $method );
}
}
};
?>

View File

@@ -1,149 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Organize
{
/**
* Organize Patterns
*
* @class Control: Compression Controller
* @param (array) options: Reference to options
* @param (regex) rsemicolon: Checks for semicolon without an escape '\' character before it
* @param (regex) rlastsemi: Checks for semicolon at the end of the string
*/
private $Control;
private $options = array();
private $rsemicolon = "/(?<!\\\);/";
private $rlastsemi = "/(?<!\\\);$/";
/**
* Stash a reference to the controller on each instantiation
*
* @param (class) control: CSSCompression Controller
*/
public function __construct( CSSCompression_Control $control ) {
$this->Control = $control;
$this->options = &$control->Option->options;
}
/**
* Look to see if we can combine selectors to reduce the number
* of definitions.
*
* @param (array) selectors: Array of selectors, map directly to details
* @param (array) details: Array of rule sets, map directly to selectors
*/
public function organize( &$selectors = array(), &$details = array() ) {
// Combining defns based on similar selectors
list ( $selectors, $details ) = $this->reduceSelectors( $selectors, $details );
// Combining defns based on similar details
list ( $selectors, $details ) = $this->reduceDetails( $selectors, $details );
// Return in package form
return array( $selectors, $details );
}
/**
* Combines multiply defined selectors by merging the rule sets,
* latter declarations overide declaratins at top of file
*
* @param (array) selectors: Array of selectors broken down by setup
* @param (array) details: Array of rule sets broken down by setup
*/
private function reduceSelectors( $selectors, $details ) {
$keys = array_keys( $selectors );
$max = array_pop( $keys ) + 1;
for ( $i = 0; $i < $max; $i++ ) {
if ( ! isset( $selectors[ $i ] ) ) {
continue;
}
for ( $k = $i + 1; $k < $max; $k++ ) {
if ( ! isset( $selectors[ $k ] ) ) {
continue;
}
if ( $selectors[ $i ] == $selectors[ $k ] ) {
// Prevent noticies
if ( ! isset( $details[ $i ] ) ) {
$details[ $i ] = '';
}
if ( ! isset( $details[ $k ] ) ) {
$details[ $k ] = '';
}
// We kill the last semicolon before organization, so account for that.
if ( $details[ $i ] != '' && $details[ $k ] != '' && ! preg_match( $this->rlastsemi, $details[ $i ] ) ) {
$details[ $i ] .= ';' . $details[ $k ];
}
else {
$details[ $i ] .= $details[ $k ];
}
// Remove the second part
unset( $selectors[ $k ], $details[ $k ] );
}
}
}
return array( $selectors, $details );
}
/**
* Combines multiply defined rule sets by merging the selectors
* in comma seperated format
*
* @param (array) selectors: Array of selectors broken down by setup
* @param (array) details: Array of rule sets broken down by setup
*/
private function reduceDetails( $selectors, $details ) {
$keys = array_keys( $selectors );
$max = array_pop( $keys ) + 1;
for ( $i = 0; $i < $max; $i++ ) {
if ( ! isset( $selectors[ $i ] ) ) {
continue;
}
$arr = preg_split( $this->rsemicolon, isset( $details[ $i ] ) ? $details[ $i ] : '' );
for ( $k = $i + 1; $k < $max; $k++ ) {
if ( ! isset( $selectors[ $k ] ) ) {
continue;
}
$match = preg_split( $this->rsemicolon, isset( $details[ $k ] ) ? $details[ $k ] : '' );
$x = array_diff( $arr, $match );
$y = array_diff( $match, $arr );
if ( count( $x ) < 1 && count( $y ) < 1 ) {
$selectors[ $i ] .= ',' . $selectors[ $k ];
unset( $details[ $k ], $selectors[ $k ] );
}
}
}
return array( $selectors, $details );
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in Organize Class - " . $method );
}
}
};
?>

View File

@@ -1,245 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Selectors
{
/**
* Selector patterns
*
* @class Control: Compression Controller
* @param (string) token: Copy of the injection token
* @param (regex) ridattr: ID Attribute matcher (combined with token)
* @param (regex) rclassattr: class Attribute matcher (combined with token)
* @param (array) options: Reference to options
* @param (regex) rmark: Stop points during selector parsing
* @param (regex) ridclassend: End of a id/class string
* @param (regex) rescapedspace: for replacement in class attributes
* @param (regex) rquote: Checks for the next quote character
* @param (regex) rcomma: looks for an unescaped comma character
* @param (regex) rspace: looks for an unescaped space character
* @param (regex) rid: looks for an unescaped hash character
* @param (regex) rpseudo: Add space after first-letter|line pseudo selector
* --- when it occurs before comma or rule set
*/
private $Control;
private $token = '';
private $ridattr = "";
private $rclassattr = "";
private $options = array();
private $rmark = "/(?<!\\\)(#|\.|=)/";
private $ridclassend = "/(?<!\\\)[:#>~\[\+\*\. ]/";
private $rquote = "/(?<!\\\)(\"|')?\]/";
private $rescapedspace = "/\\\ /";
private $rcomma = "/(?<!\\\),/";
private $rspace = "/(?<!\\\)\s/";
private $rid = "/(?<!\\\)#/";
private $rpseudo = "/:first-(letter|line)(,|$)/i";
/**
* Stash a reference to the controller on each instantiation
*
* @param (class) control: CSSCompression Controller
*/
public function __construct( CSSCompression_Control $control ) {
$this->Control = $control;
$this->token = CSSCompression::TOKEN;
$this->ridattr = "/\[id=$this->token(.*?)$this->token\]/";
$this->rclassattr = "/\[class=$this->token(.*?)$this->token\]/";
$this->options = &$control->Option->options;
}
/**
* Selector specific optimizations
*
* @param (array) selectors: Array of selectors
*/
public function selectors( &$selectors = array() ) {
foreach ( $selectors as &$selector ) {
// Auto ignore sections
if ( strpos( $selector, $this->token ) === 0 ) {
continue;
}
// Smart casing and token injection
$selector = $this->parse( $selector );
// Converting attr to shorthanded selectors
if ( $this->options['attr2selector'] ) {
// Use id hash instead of id attr
$selector = $this->idAttribute( $selector );
// Use class notation instead of class attr
$selector = $this->classAttribute( $selector );
}
// Remove everything before final id in a selector
if ( $this->options['strict-id'] ) {
$selector = $this->strictid( $selector );
}
// Get rid of possible repeated selectors
$selector = $this->repeats( $selector );
// Add space after pseudo selectors (so ie6 doesn't complain)
if ( $this->options['pseudo-space'] ) {
$selector = $this->pseudoSpace( $selector );
}
}
return $selectors;
}
/**
* Converts selectors like BODY => body, DIV => div
* and injects tokens wrappers for attribute values
*
* @param (string) selector: CSS Selector
*/
private function parse( $selector ) {
$clean = '';
$substr = '';
$pos = 0;
while ( preg_match( $this->rmark, $selector, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$substr = substr( $selector, $pos, $match[ 0 ][ 1 ] + 1 - $pos );
$clean .= $this->options['lowercase-selectors'] ? strtolower( $substr ) : $substr;
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 1 ][ 0 ] );
// Class or id match
if ( $match[ 1 ][ 0 ] == '#' || $match[ 1 ][ 0 ] == '.' ) {
if ( preg_match( $this->ridclassend, $selector, $m, PREG_OFFSET_CAPTURE, $pos ) ) {
$clean .= substr( $selector, $pos, $m[ 0 ][ 1 ] - $pos );
$pos = $m[ 0 ][ 1 ];
}
else {
$clean .= substr( $selector, $pos );
$pos = strlen( $selector );
break;
}
}
// Start of a string
else if ( preg_match( $this->rquote, $selector, $m, PREG_OFFSET_CAPTURE, $pos ) ) {
if ( $selector[ $pos ] == "\"" || $selector[ $pos ] == "'" ) {
$pos++;
}
$clean .= $this->token . substr( $selector, $pos, $m[ 0 ][ 1 ] - $pos ) . $this->token . ']';
$pos = $m[ 0 ][ 1 ] + strlen( $m[ 0 ][ 0 ] );
}
// No break points left
else {
$clean .= substr( $selector, $pos );
$pos = strlen( $selector );
break;
}
}
return $clean . ( $this->options['lowercase-selectors'] ? strtolower( substr( $selector, $pos ) ) : substr( $selector, $pos ) );
}
/**
* Convert [id=blah] attribute selectors into id form selector (#blah)
*
* @param (string) selector: CSS Selector
*/
private function idAttribute( $selector ) {
$pos = 0;
while ( preg_match( $this->ridattr, $selector, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
// Don't convert if space found (not valid hash selector)
if ( strpos( $match[ 1 ][ 0 ], ' ' ) !== false ) {
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] );
continue;
}
$selector = substr_replace( $selector, '#' . $match[ 1 ][ 0 ], $match[ 0 ][ 1 ], strlen( $match[ 0 ][ 0 ] ) );
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 1 ][ 0 ] ) + 1;
}
return $selector;
}
/**
* Convert [class=blah] attribute selectors into class form selector (.blah)
*
* @param (string) selector: CSS Selector
*/
private function classAttribute( $selector ) {
$pos = 0;
while ( preg_match( $this->rclassattr, $selector, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
// Don't convert if prescense of dot separator found
if ( strpos( $match[ 1 ][ 0 ], '.' ) !== false ) {
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 0 ][ 0 ] );
continue;
}
$replace = '.' . preg_replace( $this->rescapedspace, ".", $match[ 1 ][ 0 ] );
$selector = substr_replace( $selector, $replace, $match[ 0 ][ 1 ], strlen( $match[ 0 ][ 0 ] ) );
$pos = $match[ 0 ][ 1 ] + strlen( $match[ 1 ][ 0 ] ) + 1;
}
return $selector;
}
/**
* Promotes nested id's to the front of the selector
*
* @param (string) selector: CSS Selector
*/
private function strictid( $selector ) {
$parts = preg_split( $this->rcomma, $selector );
foreach ( $parts as &$s ) {
if ( preg_match( $this->rid, $s ) ) {
$p = preg_split( $this->rid, $s );
$s = '#' . array_pop( $p );
}
}
return implode( ',', $parts );
}
/**
* Removes repeated selectors that have been comma separated
*
* @param (string) selector: CSS Selector
*/
private function repeats( $selector ) {
$parts = preg_split( $this->rcomma, $selector );
$parts = array_flip( $parts );
$parts = array_flip( $parts );
return implode( ',', $parts );
}
/**
* Adds space after pseudo selector for ie6 like a:first-child{ => a:first-child {
*
* @param (string) selector: CSS Selector
*/
private function pseudoSpace( $selector ) {
return preg_replace( $this->rpseudo, ":first-$1 $2", $selector );
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
if ( $method == 'selectors' ) {
return $this->selectors( $args[ 0 ] );
}
else {
return call_user_func_array( array( $this, $method ), $args );
}
}
else {
throw new CSSCompression_Exception( "Unknown method in Selectors Class - " . $method );
}
}
};
?>

View File

@@ -1,292 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Setup
{
/**
* Trim Patterns
*
* @class Control: Compression Controller
* @class Individuals: Individuals Instance
* @instance instance: CSSCompression Instance
* @param (string) token: Copy of the injection token
* @param (array) options: Reference to options
* @param (array) stats: Reference to stats
* @param (regex) rsemicolon: Checks for semicolon without an escape '\' character before it
* @param (regex) rcolon: Checks for colon without an escape '\' character before it
* @param (regex) rbang: Checks for '!' without an escape '\' character before it
* @param (regex) rspacebank: Checks for an unescaped space before a bang character
* @param (regex) rliner: Matching known 1-line intros
* @param (regex) rnested: Matching known subsection handlers
* @param (regex) rurl: url wrapper matching
* @param (regex) rsinglequote: Checks for unescaped escaped single quote (mouthfull)
* @param (array) rsetup: Expanding stylesheet for semi-tokenizing
*/
private $Control;
private $Individuals;
private $instance;
private $token = '';
private $options = array();
private $stats = array();
private $rsemicolon = "/(?<!\\\);/";
private $rcolon = "/(?<!\\\):/";
private $rbang = "/(?<!\\\)\!/";
private $rspacebang = "/(?<!\\\)\s\!/";
private $rliner = "/^@(import|charset|namespace)/i";
private $rmedia = "/^@media/i";
private $rurl = "/url\((.*?)\)/";
private $rsinglequote = "/(?<!\\\)\\\'/";
private $rsetup = array(
'patterns' => array(
"/(?<!\\\){/",
"/(?<!\\\)}/",
"/(?<!\\\)@/",
"/(@(charset|import)[^;]*(?<!\\\);)/",
),
'replacements' => array(
"\n{\n",
"\n}\n",
"\n@",
"$1\n",
),
);
/**
* Stash a reference to the controller on each instantiation
*
* @param (class) control: CSSCompression Controller
*/
public function __construct( CSSCompression_Control $control ) {
$this->Control = $control;
$this->Individuals = $control->Individuals;
$this->token = CSSCompression::TOKEN;
$this->options = &$control->Option->options;
$this->stats = &$control->stats;
}
/**
* Setup selector and details arrays for compression methods
*
* @param (string) css: Trimed stylesheet
*/
public function setup( $css ) {
// Seperate the element from the elements details
$css = explode( "\n", preg_replace( $this->rsetup['patterns'], $this->rsetup['replacements'], $css ) );
$newline = $this->options['readability'] > CSSCompression::READ_NONE ? "\n" : '';
$setup = array(
'selectors' => array(),
'details' => array(),
'unknown' => array(),
'introliner' => '',
'namespace' => '',
'import' => '',
'charset' => '',
);
while ( count( $css ) ) {
$row = trim( array_shift( $css ) );
if ( $row == '' ) {
continue;
}
// Single block At-Rule set
else if ( $row[ 0 ] == '@' && $css[ 0 ] == '{' && trim( $css[ 1 ] ) != '' && $css[ 2 ] == '}' ) {
// Stash selector
array_push( $setup['selectors'], $row );
// Stash details (after the opening brace)
array_push( $setup['details'], $this->details( trim( $css[ 1 ] ) ) );
// drop the details from the stack
$css = array_slice( $css, 3 );
}
// Single line At-Rules (import/charset/namespace)
else if ( preg_match( $this->rliner, $row, $match ) ) {
$setup[ $match[ 1 ] ] .= $this->liner( $row ) . $newline;
}
// Nested At-Rule declaration blocks
else if ( $row[ 0 ] == '@' && $css[ 0 ] == '{' ) {
// Stash atrule as selector
array_push( $setup['selectors'], $this->token . $row );
// Stash details (after the opening brace)
array_push( $setup['details'], $this->nested( $css, preg_match( $this->rmedia, $row ) ) . $newline );
}
// Unknown single line At-Rules
else if ( $row[ 0 ] == '@' && substr( $row, -1 ) == ';' ) {
$setup[ 'introliner' ] .= $row . $newline;
}
// Declaration Block
else if ( count( $css ) >= 3 && $css[ 0 ] == '{' && $css[ 2 ] == '}' ) {
// Stash selector
array_push( $setup['selectors'], $row );
// Stash details (after the opening brace)
array_push( $setup['details'], $this->details( trim( $css[ 1 ] ) ) );
// drop the details from the stack
$css = array_slice( $css, 3 );
}
// Last catch, store unknown artifacts as selectors with a token
// and give it an empty rule set
else {
// Still add to unknown stack, for notification
array_push( $setup['unknown'], $row );
// Stash unknown artifacts as selectors with a token
array_push( $setup['selectors'], $this->token . $row );
// Give it an empty rule set
array_push( $setup['details'], '' );
}
}
return $setup;
}
/**
* Run nested elements through a separate instance of compression
*
* @param (array) css: Reference to the original css array
* @param (bool) organize: Whether or not to organize the subsection (only true for media sections)
*/
private function nested( &$css = array(), $organize = false ) {
$options = $this->options;
$left = 0;
$right = 0;
$row = '';
$independent = '';
$content = '';
$spacing = '';
$newline = $this->options['readability'] > CSSCompression::READ_NONE ? "\n" : '';
// Find the end of the nested section
while ( count( $css ) && ( $left < 1 || $left > $right ) ) {
$row = trim( array_shift( $css ) );
if ( $row == '' ) {
continue;
}
else if ( $row == '{' ) {
$left++;
}
else if ( $row == '}' ) {
$right++;
}
else if ( count( $css ) && substr( $row, 0, 1 ) != '@' && substr( $css[ 0 ], 0, 1 ) == '@' && substr( $row, -1 ) == ';' ) {
$independent .= $row;
continue;
}
$content .= $row;
}
// Ensure copy of instance exists
if ( ! $this->instance ) {
$this->instance = new CSSCompression();
}
// Fresh start
$this->instance->reset();
// Compress the nested section independently after removing the wrapping braces
// Also make sure to only organize media sections
if ( $options['organize'] == true && $organize == false ) {
$options['organize'] = false;
}
// Independent sections should be prepended to the next compressed section
$content = ( $independent == '' ? '' : $independent . $newline )
. $this->instance->compress( substr( $content, 1, -1 ), $options );
// Formatting for anything higher then 0 readability
if ( $newline == "\n" ) {
$content = "\n\t" . str_replace( "\n", "\n\t", $content ) . "\n";
$spacing = $this->options['readability'] > CSSCompression::READ_MIN ? ' ' : '';
}
// Stash the compressed nested script
return "$spacing{" . $content . "}$newline";
}
/**
* Converts import/namespace urls into strings
*
* @param (string) row: At-rule
*/
private function liner( $row ) {
$pos = 0;
while ( preg_match( $this->rurl, $row, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
$quote = preg_match( $this->rsinglequote, $match[ 1 ][ 0 ] ) ? '"' : "'";
$replace = $quote . $match[ 1 ][ 0 ] . $quote;
$row = substr_replace( $row, $replace, $match[ 0 ][ 1 ], strlen( $match[ 0 ][ 0 ] ) );
$pos = $match[ 0 ][ 1 ] + strlen( $replace );
}
return $row;
}
/**
* Run individual compression techniques on each property of a selector
*
* @param (string) row: Selector properties
*/
private function details( $row ) {
$row = preg_split( $this->rsemicolon, $row );
$parts = array();
$details = '';
foreach ( $row as $line ) {
// Set loopers
$parts = preg_split( $this->rcolon, $line, 2 );
$prop = '';
$value = '';
// Property
if ( isset( $parts[ 0 ] ) && ( $parts[ 0 ] = trim( $parts[ 0 ] ) ) != '' ) {
$prop = $parts[ 0 ];
}
// Value
if ( isset( $parts[ 1 ] ) && ( $parts[ 1 ] = trim( $parts[ 1 ] ) ) != '' ) {
$value = preg_replace( $this->rbang, ' !', $parts[ 1 ] );
}
// Fail safe, remove unspecified property/values
if ( $prop == '' || $value == '' ) {
continue;
}
// Run the tag/element through each compression
list ( $prop, $value ) = $this->Individuals->individuals( $prop, $value );
// Add counter to before stats
$this->stats['before']['props']++;
// Store the compressed element
$details .= "$prop:" . preg_replace( $this->rspacebang, '!', $value ) . ";";
}
return $details;
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in Setup Class - " . $method );
}
}
};
?>

View File

@@ -1,213 +0,0 @@
<?php
/**
* CSS Compressor [VERSION]
* [DATE]
* Corey Hart @ http://www.codenothing.com
*/
Class CSSCompression_Trim
{
/**
* Trim Patterns
*
* @class Control: Compression Controller
* @param (array) options: Reference to options
* @param (regex) rcmark: Marking point when traversing through sheet for comments
* @param (regex) rendcomment: Finds the ending comment point
* @param (regex) rendquote: Finds the ending quote point
* @param (regex) rendsinglequote: Finds the ending single quote point
* @param (array) rescape: Array of patterns of groupings that should be escaped
* @param (array) trimmings: Stylesheet trimming patterns/replacements
* @param (array) escaped: Array of characters that need to be escaped
*/
private $Control;
private $options = array();
private $rcmark = "/((?<!\\\)\/\*|(?<!\\\)\"|(?<!\\\)')/";
private $rendcomment = "/\*\//";
private $rendquote = "/(?<!\\\)\"/";
private $rendsinglequote = "/(?<!\\\)'/";
private $rescape = array(
"/(url\()([^'\"].*?)(\))/is",
"/((?<!\\\)\")(.*?)((?<!\\\)\")/s",
"/((?<!\\\)')(.*?)((?<!\\\)')/s",
);
private $trimmings = array(
'patterns' => array(
"/(?<!\\\)(\s+)?(?<!\\\)([!,{};>\~\+\/])(?<!\\\)(\s+)?/s", // Remove un-needed spaces around special characters
"/url\((?<!\\\)\"(.*?)(?<!\\\)\"\)/is", // Remove quotes from urls
"/url\((?<!\\\)'(.*?)(?<!\\\)'\)/is", // Remove single quotes from urls
"/url\((.*?)\)/is", // Lowercase url wrapper
"/(?<!\\\);{2,}/", // Remove unecessary semi-colons
"/(?<!\\\)\s+/s", // Compress all spaces into single space
),
'replacements' => array(
'$2',
'url($1)',
'url($1)',
'url($1)',
';',
' ',
)
);
private $escaped = array(
'search' => array(
":",
";",
"}",
"{",
"@",
"!",
",",
">",
"+",
"~",
"/",
"*",
".",
"=",
"#",
"\r",
"\n",
"\t",
" ",
),
'replace' => array(
"\\:",
"\\;",
"\\}",
"\\{",
"\\@",
"\\!",
"\\,",
"\\>",
"\\+",
"\\~",
"\\/",
"\\*",
"\\.",
"\\=",
"\\#",
"\\r",
"\\n",
"\\t",
"\\ ",
),
);
/**
* Stash a reference to the controller on each instantiation
*
* @param (class) control: CSSCompression Controller
*/
public function __construct( CSSCompression_Control $control ) {
$this->Control = $control;
$this->options = &$control->Option->options;
}
/**
* Central trim handler
*
* @param (string) css: Stylesheet to trim
*/
public function trim( $css ) {
$css = $this->comments( $css );
$css = $this->escape( $css );
$css = $this->strip( $css );
return $css;
}
/**
* Does a quick run through the script to remove all comments from the sheet,
*
* @param (string) css: Stylesheet to trim
*/
private function comments( $css ) {
$pos = 0;
while ( preg_match( $this->rcmark, $css, $match, PREG_OFFSET_CAPTURE, $pos ) ) {
switch ( $match[ 1 ][ 0 ] ) {
// Start of comment block
case "/*":
if ( preg_match( $this->rendcomment, $css, $m, PREG_OFFSET_CAPTURE, $match[ 1 ][ 1 ] + 1 ) ) {
$end = $m[ 0 ][ 1 ] - $match[ 1 ][ 1 ] + strlen( $m[ 0 ][ 0 ] );
$css = substr_replace( $css, '', $match[ 1 ][ 1 ], $end );
$pos = $match[ 0 ][ 1 ];
}
else {
$css = substr( $css, 0, $match[ 1 ][ 1 ] );
break 2;
}
break;
// Start of string
case "\"":
if ( preg_match( $this->rendquote, $css, $m, PREG_OFFSET_CAPTURE, $match[ 1 ][ 1 ] + 1 ) ) {
$pos = $m[ 0 ][ 1 ] + strlen( $m[ 0 ][ 0 ] );
}
else {
break 2;
}
break;
// Start of string
case "'":
if ( preg_match( $this->rendsinglequote, $css, $m, PREG_OFFSET_CAPTURE, $match[ 1 ][ 1 ] + 1 ) ) {
$pos = $m[ 0 ][ 1 ] + strlen( $m[ 0 ][ 0 ] );
}
else {
break 2;
}
break;
// Should have never gotten here
default:
break 2;
}
}
return $css;
}
/**
* Escape out possible splitter characters within urls
*
* @param (string) css: Full stylesheet
*/
private function escape( $css ) {
foreach ( $this->rescape as $regex ) {
$start = 0;
while ( preg_match( $regex, $css, $match, PREG_OFFSET_CAPTURE, $start ) ) {
$value = $match[ 1 ][ 0 ]
. str_replace( $this->escaped['search'], $this->escaped['replace'], $match[ 2 ][ 0 ] )
. $match[ 3 ][ 0 ];
$css = substr_replace( $css, $value, $match[ 0 ][ 1 ], strlen( $match[ 0 ][ 0 ] ) );
$start = $match[ 0 ][ 1 ] + strlen( $value ) + 1;
}
}
return $css;
}
/**
* Runs initial formatting to setup for compression
*
* @param (string) css: CSS Contents
*/
private function strip( $css ) {
// Run replacements
return trim( preg_replace( $this->trimmings['patterns'], $this->trimmings['replacements'], $css ) );
}
/**
* Access to private methods for testing
*
* @param (string) method: Method to be called
* @param (array) args: Array of paramters to be passed in
*/
public function access( $method, $args ) {
if ( method_exists( $this, $method ) ) {
return call_user_func_array( array( $this, $method ), $args );
}
else {
throw new CSSCompression_Exception( "Unknown method in Trim Class - " . $method );
}
}
};
?>

View File

@@ -1,21 +0,0 @@
The MIT License
Copyright (c) 2011 Corey Hart
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

11138
build/tools/csslint-rhino.js Normal file

File diff suppressed because it is too large Load Diff

5904
build/tools/fulljshint.js Normal file

File diff suppressed because it is too large Load Diff

6651
build/tools/fulljslint.js Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

BIN
build/tools/rhino.jar Normal file

Binary file not shown.

View File

@@ -17,9 +17,9 @@
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
-->
<!--
If you host a crossdomain.xml file with allow-access-from domain=“*”
If you host a crossdomain.xml file with allow-access-from domain="*"
and dont understand all of the points described here, you probably
have a nasty security vulnerability. ~ simon willison
-->
</cross-domain-policy>
</cross-domain-policy>

View File

@@ -1,8 +0,0 @@
* {
float: none; /* Screens are not big enough to account for floats */
background: #fff; /* As much contrast as possible */
color: #000;
}
/* Slightly reducing font size to reduce need to scroll */
body { font-size: 80%; }

View File

@@ -1,172 +1,215 @@
/**
/*
* HTML5 ✰ Boilerplate
*
* style.css contains a reset, font normalization and some base styles.
* What follows is the result of much research on cross-browser styling.
* Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,
* Kroc Camen, and the H5BP dev community and team.
*
* Credit is left where credit is due.
* Much inspiration was taken from these projects:
* - yui.yahooapis.com/2.8.1/build/base/base.css
* - camendesign.com/design/
* - praegnanz.de/weblog/htmlcssjs-kickstart
* Detailed information about this CSS: h5bp.com/css
*
* ==|== normalize ==========================================================
*/
/**
* html5doctor.com Reset Stylesheet (Eric Meyer's Reset Reloaded + HTML5 baseline)
* v1.6.1 2010-09-17 | Authors: Eric Meyer & Richard Clark
* html5doctor.com/html-5-reset-stylesheet/
/* =============================================================================
HTML5 display definitions
========================================================================== */
article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; }
audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; }
audio:not([controls]) { display: none; }
[hidden] { display: none; }
/* =============================================================================
Base
========================================================================== */
/*
* 1. Correct text resizing oddly in IE6/7 when body font-size is set using em units
* 2. Force vertical scrollbar in non-IE
* 3. Prevent iOS text size adjust on device orientation change, without disabling user zoom: h5bp.com/g
*/
html, body, div, span, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp,
small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, figcaption, figure,
footer, header, hgroup, menu, nav, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body { margin: 0; font-size: 13px; line-height: 1.231; }
blockquote, q { quotes: none; }
body, button, input, select, textarea { font-family: sans-serif; color: #222; }
blockquote:before, blockquote:after,
q:before, q:after { content: ''; content: none; }
/*
* Remove text-shadow in selection highlight: h5bp.com/i
* These selection declarations have to be separate
* Also: hot pink! (or customize the background color to match your design)
*/
ins { background-color: #ff9; color: #000; text-decoration: none; }
::-moz-selection { background: #fe57a1; color: #fff; text-shadow: none; }
::selection { background: #fe57a1; color: #fff; text-shadow: none; }
mark { background-color: #ff9; color: #000; font-style: italic; font-weight: bold; }
del { text-decoration: line-through; }
/* =============================================================================
Links
========================================================================== */
abbr[title], dfn[title] { border-bottom: 1px dotted; cursor: help; }
a { color: #00e; }
a:visited { color: #551a8b; }
a:hover { color: #06e; }
a:focus { outline: thin dotted; }
table { border-collapse: collapse; border-spacing: 0; }
/* Improve readability when focused and hovered in all browsers: h5bp.com/h */
a:hover, a:active { outline: 0; }
/* =============================================================================
Typography
========================================================================== */
abbr[title] { border-bottom: 1px dotted; }
b, strong { font-weight: bold; }
blockquote { margin: 1em 40px; }
dfn { font-style: italic; }
hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
input, select { vertical-align: middle; }
ins { background: #ff9; color: #000; text-decoration: none; }
mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
/**
* Font normalization inspired by YUI Library's fonts.css: developer.yahoo.com/yui/
*/
/* Redeclare monospace font family: h5bp.com/j */
pre, code, kbd, samp { font-family: monospace, monospace; _font-family: 'courier new', monospace; font-size: 1em; }
body { font:13px/1.231 sans-serif; *font-size:small; } /* Hack retained to preserve specificity */
select, input, textarea, button { font:99% sans-serif; }
/* Improve readability of pre-formatted text in all browsers */
pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; }
/* Normalize monospace sizing:
en.wikipedia.org/wiki/MediaWiki_talk:Common.css/Archive_11#Teletype_style_fix_for_Chrome */
pre, code, kbd, samp { font-family: monospace, sans-serif; }
/**
* Minimal base styles.
*/
/* Always force a scrollbar in non-IE */
html { overflow-y: scroll; }
/* Accessible focus treatment: people.opera.com/patrickl/experiments/keyboard/test */
a:hover, a:active { outline: none; }
ul, ol { margin-left: 2em; }
ol { list-style-type: decimal; }
/* Remove margins for navigation lists */
nav ul, nav li { margin: 0; list-style:none; list-style-image: none; }
q { quotes: none; }
q:before, q:after { content: ""; content: none; }
small { font-size: 85%; }
strong, th { font-weight: bold; }
td { vertical-align: top; }
/* Set sub, sup without affecting line-height: gist.github.com/413930 */
sub, sup { font-size: 75%; line-height: 0; position: relative; }
/* Position subscript and superscript content without affecting line-height: h5bp.com/k */
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
sup { top: -0.5em; }
sub { bottom: -0.25em; }
pre {
/* www.pathf.com/blogs/2008/05/formatting-quoted-code-in-blog-posts-css21-white-space-pre-wrap/ */
white-space: pre; white-space: pre-wrap; word-wrap: break-word;
padding: 15px;
}
textarea { overflow: auto; } /* www.sitepoint.com/blogs/2010/08/20/ie-remove-textarea-scrollbars/ */
/* =============================================================================
Lists
========================================================================== */
.ie6 legend, .ie7 legend { margin-left: -7px; }
ul, ol { margin: 1em 0; padding: 0 0 0 40px; }
dd { margin: 0 0 0 40px; }
nav ul, nav ol { list-style: none; list-style-image: none; margin: 0; padding: 0; }
/* Align checkboxes, radios, text inputs with their label by: Thierry Koblentz tjkdesign.com/ez-css/css/base.css */
input[type="radio"] { vertical-align: text-bottom; }
input[type="checkbox"] { vertical-align: bottom; }
.ie7 input[type="checkbox"] { vertical-align: baseline; }
.ie6 input { vertical-align: text-bottom; }
/* Hand cursor on clickable input elements */
label, input[type="button"], input[type="submit"], input[type="image"], button { cursor: pointer; }
/* =============================================================================
Embedded content
========================================================================== */
/* Webkit browsers add a 2px margin outside the chrome of form elements */
button, input, select, textarea { margin: 0; }
/*
* 1. Improve image quality when scaled in IE7: h5bp.com/d
* 2. Remove the gap between images and borders on image containers: h5bp.com/e
*/
img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
/*
* Correct overflow not hidden in IE9
*/
svg:not(:root) { overflow: hidden; }
/* =============================================================================
Figures
========================================================================== */
figure { margin: 0; }
/* =============================================================================
Forms
========================================================================== */
form { margin: 0; }
fieldset { border: 0; margin: 0; padding: 0; }
/* Indicate that 'label' will shift focus to the associated form element */
label { cursor: pointer; }
/*
* 1. Correct color not inheriting in IE6/7/8/9
* 2. Correct alignment displayed oddly in IE6/7
*/
legend { border: 0; *margin-left: -7px; padding: 0; }
/*
* 1. Correct font-size not inheriting in all browsers
* 2. Remove margins in FF3/4 S5 Chrome
* 3. Define consistent vertical alignment display in all browsers
*/
button, input, select, textarea { font-size: 100%; margin: 0; vertical-align: baseline; *vertical-align: middle; }
/*
* 1. Define line-height as normal to match FF3/4 (set using !important in the UA stylesheet)
* 2. Correct inner spacing displayed oddly in IE6/7
*/
button, input { line-height: normal; *overflow: visible; }
/*
* Reintroduce inner spacing in 'table' to avoid overlap and whitespace issues in IE6/7
*/
table button, table input { *overflow: auto; }
/*
* 1. Display hand cursor for clickable form elements
* 2. Allow styling of clickable form elements in iOS
*/
button, input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; }
/*
* Consistent box sizing and appearance
*/
input[type="checkbox"], input[type="radio"] { box-sizing: border-box; }
input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; }
input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
/*
* Remove inner padding and border in FF3/4: h5bp.com/l
*/
button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
/*
* 1. Remove default vertical scrollbar in IE6/7/8/9
* 2. Allow only vertical resizing
*/
textarea { overflow: auto; vertical-align: top; resize: vertical; }
/* Colors for form validity */
input:valid, textarea:valid { }
input:invalid, textarea:invalid {
border-radius: 1px; -moz-box-shadow: 0px 0px 5px red; -webkit-box-shadow: 0px 0px 5px red; box-shadow: 0px 0px 5px red;
}
.no-boxshadow input:invalid, .no-boxshadow textarea:invalid { background-color: #f0dddd; }
input:valid, textarea:valid { }
input:invalid, textarea:invalid { background-color: #f0dddd; }
/* These selection declarations have to be separate
No text-shadow: twitter.com/miketaylr/status/12228805301
Also: hot pink! */
::-moz-selection{ background: #FF5E99; color:#fff; text-shadow: none; }
::selection { background:#FF5E99; color:#fff; text-shadow: none; }
/* =============================================================================
Tables
========================================================================== */
/* j.mp/webkit-tap-highlight-color */
a:link { -webkit-tap-highlight-color: #FF5E99; }
/* Make buttons play nice in IE:
www.viget.com/inspire/styling-the-button-element-in-internet-explorer/ */
button { width: auto; overflow: visible; }
/* Bicubic resizing for non-native sized IMG:
code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/ */
.ie7 img { -ms-interpolation-mode: bicubic; }
/**
* You might tweak these..
*/
body, select, input, textarea {
/* #444 looks better than black: twitter.com/H_FJ/statuses/11800719859 */
color: #444;
/* Set your base font here, to apply evenly */
/* font-family: Georgia, serif; */
}
/* Headers (h1, h2, etc) have no default font-size or margin; define those yourself */
h1, h2, h3, h4, h5, h6 { font-weight: bold; }
a, a:active, a:visited { color: #607890; }
a:hover { color: #036; }
table { border-collapse: collapse; border-spacing: 0; }
td { vertical-align: top; }
/**
* Primary styles
*
* Author:
*/
/* ==|== primary styles =====================================================
Author:
========================================================================== */
@@ -183,79 +226,67 @@ a:hover { color: #036; }
/**
* Non-semantic helper classes: please define your styles before this section.
*/
/* ==|== non-semantic helper classes ========================================
Please define your styles before this section.
========================================================================== */
/* For image replacement */
.ir { display: block; text-indent: -999em; overflow: hidden; background-repeat: no-repeat; text-align: left; direction: ltr; }
.ir { display: block; border: 0; text-indent: -999em; overflow: hidden; background-color: transparent; background-repeat: no-repeat; text-align: left; direction: ltr; }
.ir br { display: none; }
/* Hide for both screenreaders and browsers:
css-discuss.incutio.com/wiki/Screenreader_Visibility */
.hidden { display: none; visibility: hidden; }
/* Hide from both screenreaders and browsers: h5bp.com/u */
.hidden { display: none !important; visibility: hidden; }
/* Hide only visually, but have it available for screenreaders: by Jon Neal.
www.webaim.org/techniques/css/invisiblecontent/ & j.mp/visuallyhidden */
/* Hide only visually, but have it available for screenreaders: h5bp.com/v */
.visuallyhidden { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
/* Extends the .visuallyhidden class to allow the element to be focusable when navigated to via the keyboard: drupal.org/node/897638 */
.visuallyhidden.focusable:active,
.visuallyhidden.focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; }
/* Extends the .visuallyhidden class to allow the element to be focusable when navigated to via the keyboard: h5bp.com/p */
.visuallyhidden.focusable:active, .visuallyhidden.focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; }
/* Hide visually and from screenreaders, but maintain layout */
.invisible { visibility: hidden; }
/* The Magnificent Clearfix: Updated to prevent margin-collapsing on child elements.
j.mp/bestclearfix */
.clearfix:before, .clearfix:after { content: "\0020"; display: block; height: 0; overflow: hidden; }
/* Contain floats: h5bp.com/q */
.clearfix:before, .clearfix:after { content: ""; display: table; }
.clearfix:after { clear: both; }
/* Fix clearfix: blueprintcss.lighthouseapp.com/projects/15318/tickets/5-extra-margin-padding-bottom-of-page */
.clearfix { zoom: 1; }
/**
* Media queries for responsive design.
*
* These follow after primary styles so they will successfully override.
*/
/* ==|== media queries ======================================================
PLACEHOLDER Media Queries for Responsive Design.
These override the primary ('mobile first') styles
Modify as content requires.
========================================================================== */
@media all and (orientation:portrait) {
/* Style adjustments for portrait mode goes here */
@media only screen and (min-width: 480px) {
/* Style adjustments for viewports 480px and over go here */
}
@media all and (orientation:landscape) {
/* Style adjustments for landscape mode goes here */
@media only screen and (min-width: 768px) {
/* Style adjustments for viewports 768px and over go here */
}
/* Grade-A Mobile Browsers (Opera Mobile, Mobile Safari, Android Chrome)
consider this: www.cloudfour.com/css-media-query-for-mobile-is-fools-gold/ */
@media screen and (max-device-width: 480px) {
/* Uncomment if you don't want iOS and WinMobile to mobile-optimize the text for you: j.mp/textsizeadjust */
/* html { -webkit-text-size-adjust:none; -ms-text-size-adjust:none; } */
}
/**
* Print styles.
*
* Inlined to avoid required HTTP connection: www.phpied.com/delay-loading-your-print-css/
*/
/* ==|== print styles =======================================================
Print styles.
Inlined to avoid required HTTP connection: h5bp.com/r
========================================================================== */
@media print {
* { background: transparent !important; color: black !important; text-shadow: none !important; filter:none !important;
-ms-filter: none !important; } /* Black prints faster: sanbeiji.com/archives/953 */
a, a:visited { color: #444 !important; text-decoration: underline; }
* { background: transparent !important; color: black !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; } /* Black prints faster: h5bp.com/s */
a, a:visited { text-decoration: underline; }
a[href]:after { content: " (" attr(href) ")"; }
abbr[title]:after { content: " (" attr(title) ")"; }
.ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } /* Don't show links for images, or javascript/internal links */
pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
thead { display: table-header-group; } /* css-discuss.incutio.com/wiki/Printing_Tables */
thead { display: table-header-group; } /* h5bp.com/t */
tr, img { page-break-inside: avoid; }
img { max-width: 100% !important; }
@page { margin: 0.5cm; }
p, h2, h3 { orphans: 3; widows: 3; }
h2, h3{ page-break-after: avoid; }
h2, h3 { page-break-after: avoid; }
}

View File

@@ -1,14 +1,15 @@
<!doctype html>
<!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->
<!--[if lt IE 7 ]> <html class="no-js ie6" lang="en"> <![endif]-->
<!--[if IE 7 ]> <html class="no-js ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]> <html class="no-js ie8" lang="en"> <![endif]-->
<!--[if (gte IE 9)|!(IE)]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!-- Consider adding an manifest.appcache: h5bp.com/d/Offline -->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame
Remove this if you use the .htaccess -->
<!-- Use the .htaccess and remove these lines to avoid edge case issues.
More info: h5bp.com/b/378 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title></title>
@@ -16,22 +17,21 @@
<meta name="author" content="">
<!-- Mobile viewport optimized: j.mp/bplateviewport -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Place favicon.ico & apple-touch-icon.png in the root of your domain and delete these references -->
<link rel="shortcut icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<!-- Place favicon.ico and apple-touch-icon.png in the root directory: mathiasbynens.be/notes/touch-icons -->
<!-- CSS: implied media=all -->
<!-- CSS concatenated and minified via ant build script-->
<link rel="stylesheet" href="css/style.css">
<!-- end CSS-->
<!-- CSS: implied media="all" -->
<link rel="stylesheet" href="css/style.css?v=2">
<!-- Uncomment if you are specifically targeting less enabled mobile browsers
<link rel="stylesheet" media="handheld" href="css/handheld.css?v=2"> -->
<!-- All JavaScript at the bottom, except for Modernizr which enables HTML5 elements & feature detects -->
<script src="js/libs/modernizr-1.7.min.js"></script>
<!-- More ideas for your <head> here: h5bp.com/d/head-Tips -->
<!-- All JavaScript at the bottom, except for Modernizr / Respond.
Modernizr enables HTML5 elements & feature detects; Respond is a polyfill for min/max-width CSS3 Media Queries
For optimal performance, use a custom Modernizr build: www.modernizr.com/download/ -->
<script src="js/libs/modernizr-2.0.6.min.js"></script>
</head>
<body>
@@ -51,30 +51,32 @@
<!-- JavaScript at the bottom for fast page loading -->
<!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if necessary -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.5.1.min.js">\x3C/script>')</script>
<!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if offline -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.6.2.min.js"><\/script>')</script>
<!-- scripts concatenated and minified via ant build script-->
<script src="js/plugins.js"></script>
<script src="js/script.js"></script>
<script defer src="js/plugins.js"></script>
<script defer src="js/script.js"></script>
<!-- end scripts-->
<!--[if lt IE 7 ]>
<script src="js/libs/dd_belatedpng.js"></script>
<script>DD_belatedPNG.fix('img, .png_bg'); // Fix any <img> or .png_bg bg-images. Also, please read goo.gl/mZiyb </script>
<![endif]-->
<!-- mathiasbynens.be/notes/async-analytics-snippet Change UA-XXXXX-X to be your site's ID -->
<!-- Change UA-XXXXX-X to be your site's ID -->
<script>
var _gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']];
(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.async=1;
g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
s.parentNode.insertBefore(g,s)}(document,'script'));
window._gaq = [['_setAccount','UAXXXXXXXX1'],['_trackPageview'],['_trackPageLoadTime']];
Modernizr.load({
load: ('https:' == location.protocol ? '//ssl' : '//www') + '.google-analytics.com/ga.js'
});
</script>
<!-- Prompt IE 6 users to install Chrome Frame. Remove this if you want to support IE 6.
chromium.org/developers/how-tos/chrome-frame-getting-started -->
<!--[if lt IE 7 ]>
<script src="//ajax.googleapis.com/ajax/libs/chrome-frame/1.0.3/CFInstall.min.js"></script>
<script>window.attachEvent('onload',function(){CFInstall.check({mode:'overlay'})})</script>
<![endif]-->
</body>
</html>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

18
js/libs/jquery-1.6.2.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4
js/libs/modernizr-2.0.6.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -4,11 +4,16 @@
window.log = function(){
log.history = log.history || []; // store logs to an array for reference
log.history.push(arguments);
arguments.callee = arguments.callee.caller;
if(this.console) console.log( Array.prototype.slice.call(arguments) );
if(this.console) {
arguments.callee = arguments.callee.caller;
var newarr = [].slice.call(arguments);
(typeof console.log === 'object' ? log.apply.call(console.log, console, newarr) : console.log.apply(console, newarr));
}
};
// make it safe to use console.log always
(function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();)b[a]=b[a]||c})(window.console=window.console||{});
(function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,timeStamp,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();){b[a]=b[a]||c}})((function(){try
{console.log();return window.console;}catch(err){return window.console={};}})());
// place any jQuery/helper plugins in here, instead of separate, slower script files.

View File

@@ -6,9 +6,9 @@
<!-- reference your own javascript files here -->
<script src="../js/libs/modernizr-1.7.min.js"></script>
<script src="../js/libs/modernizr-2.0.6.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script src="../js/plugins.js"></script>
<script src="../js/script.js"></script>
@@ -28,4 +28,4 @@
<ol id="qunit-tests"></ol>
<div id="qunit-fixture">test markup</div>
</body>
</html>
</html>

View File

@@ -5,22 +5,22 @@
// below are some general tests but feel free to delete them.
module("example tests");
test('HTML5 Boilerplate is sweet',function(){
test("HTML5 Boilerplate is sweet",function(){
expect(1);
equals('boilerplate'.replace('boilerplate','sweet'),'sweet','Yes. HTML5 Boilerplate is, in fact, sweet');
equals("boilerplate".replace("boilerplate","sweet"),"sweet","Yes. HTML5 Boilerplate is, in fact, sweet");
})
// these test things from plugins.js
test('Environment is good',function(){
test("Environment is good",function(){
expect(3);
ok( !!window.log, 'log function present');
ok( !!window.log, "log function present");
var history = log.history && log.history.length || 0;
log('logging from the test suite.')
equals( log.history.length - history, 1, 'log history keeps track' )
log("logging from the test suite.")
equals( log.history.length - history, 1, "log history keeps track" )
ok( !!window.Modernizr, 'Modernizr global is present')
ok( !!window.Modernizr, "Modernizr global is present")
})