Browse Source
highlighting tests, improved syntax highlighting and styling of pre blocks. Overriding dynamic gist styling. Added a plugin for pygments caching which should speed things up terrifically. added ender.js as a lightweight way of scripting the DOM, events, etc. Some general typography and semantic html improvements.unreleased_contents
Brandon Mathis
14 years ago
74 changed files with 6017 additions and 1991 deletions
@ -1,4 +1,3 @@ |
|||
guard 'livereload', :api_version => '1.6' do |
|||
watch(/public\/stylesheets\/(.*)\.css/); |
|||
watch(/public\/(.*)\.(js|html|png|jpg|gif|jpeg|ttf|otf|woff|svg)/i); |
|||
watch(/public\/\S[css|js|html|png|jpg|gif]/) |
|||
end |
|||
|
@ -0,0 +1,109 @@ |
|||
# |
|||
# Author: Josediaz Gonzalez - https://github.com/josegonzalez |
|||
# Source URL: https://github.com/josegonzalez/josediazgonzalez.com/blob/master/_plugins/blockquote.rb |
|||
# Modified by Brandon Mathis |
|||
# |
|||
require './_plugins/titlecase.rb' |
|||
module Jekyll |
|||
|
|||
# Outputs a string with a given attribution as a quote |
|||
# |
|||
# {% blockquote John Paul Jones %} |
|||
# Monkeys! |
|||
# {% endblockquote %} |
|||
# ... |
|||
# <blockquote> |
|||
# Monkeys! |
|||
# <br /> |
|||
# John Paul Jones |
|||
# </blockquote> |
|||
# |
|||
class Blockquote < Liquid::Block |
|||
FullCiteWithTitle = /([\w\s]+)(https?:\/\/)(\S+\s)([\w\s]+)/i |
|||
FullCite = /([\w\s]+)(https?:\/\/)(\S+)/i |
|||
Author = /([\w\s]+)/ |
|||
|
|||
def initialize(tag_name, markup, tokens) |
|||
@by = nil |
|||
@source = nil |
|||
@title = nil |
|||
if markup =~ FullCiteWithTitle |
|||
@by = $1 |
|||
@source = $2 + $3 |
|||
@title = $4.titlecase |
|||
elsif markup =~ FullCite |
|||
@by = $1 |
|||
@source = $2 + $3 |
|||
elsif markup =~ Author |
|||
@by = $1 |
|||
end |
|||
super |
|||
end |
|||
|
|||
def render(context) |
|||
output = super |
|||
if @by.nil? |
|||
'<blockquote><p>' + output.join + '</p></blockquote>' |
|||
elsif !@title.nil? |
|||
'<blockquote><p>' + output.join + '</p></blockquote>' + '<p><cite><strong>' + @by + '</strong>' + '<a class="source" href="' + @source + '">' + @title + '</a></cite></p>' |
|||
elsif !@source.nil? |
|||
'<blockquote><p>' + output.join + '</p></blockquote>' + '<p><cite><strong>' + @by + '</strong>' + '<a class="source" href="' + @source + '">source</a></cite></p>' |
|||
else |
|||
'<blockquote><p>' + output.join + '</p></blockquote>' + '<p><cite><strong>' + @by + '</strong></cite></p>' |
|||
end |
|||
end |
|||
end |
|||
|
|||
# Outputs a string with a given attribution as a pullquote |
|||
# |
|||
# {% blockquote John Paul Jones %} |
|||
# Monkeys! |
|||
# {% endblockquote %} |
|||
# ... |
|||
# <blockquote class="pullquote"> |
|||
# Monkeys! |
|||
# <br /> |
|||
# John Paul Jones |
|||
# </blockquote> |
|||
# |
|||
class Pullquote < Liquid::Block |
|||
FullCiteWithTitle = /([\w\s]+)(http:\/\/|https:\/\/)(\S+)([\w\s]+)/i |
|||
FullCite = /([\w\s]+)(http:\/\/|https:\/\/)(\S+)/i |
|||
Author = /([\w\s]+)/ |
|||
|
|||
def initialize(tag_name, markup, tokens) |
|||
@by = nil |
|||
@source = nil |
|||
@title = nil |
|||
if markup =~ FullCiteWithTitle |
|||
@by = $1 |
|||
@source = $2 + $3 |
|||
@title = $4 |
|||
elsif markup =~ FullCite |
|||
@by = $1 |
|||
@source = $2 + $3 |
|||
elsif markup =~ Author |
|||
@by = $1 |
|||
end |
|||
super |
|||
end |
|||
|
|||
def render(context) |
|||
output = super |
|||
if @by.nil? |
|||
'<blockquote class="pullquote"><p>' + output.join + '</p></blockquote>' |
|||
elsif @title |
|||
'<blockquote class="pullquote"><p>' + output.join + '</p></blockquote>' + '<p><cite><strong>' + @by + '</strong>' + ' <a class="source" href="' + @source + '">' + @title + '</a></cite></p>' |
|||
elsif @source |
|||
'<blockquote class="pullquote"><p>' + output.join + '</p></blockquote>' + '<p><cite><strong>' + @by + '</strong>' + ' <a class="source" href="' + @source + '">source</a></cite></p>' |
|||
elsif @by |
|||
'<blockquote class="pullquote"><p>' + output.join + '</p></blockquote>' + '<p><cite><strong>' + @by + '</strong></cite></p>' |
|||
end |
|||
end |
|||
end |
|||
end |
|||
|
|||
Liquid::Template.register_tag('blockquote', Jekyll::Blockquote) |
|||
Liquid::Template.register_tag('pullquote', Jekyll::Pullquote) |
|||
|
|||
|
@ -0,0 +1,65 @@ |
|||
module Jekyll |
|||
|
|||
class CategoryIndex < Page |
|||
def initialize(site, base, dir, category) |
|||
@site = site |
|||
@base = base |
|||
@dir = dir |
|||
@name = 'index.html' |
|||
|
|||
self.process(@name) |
|||
self.read_yaml(File.join(base, '_layouts'), 'category_index.html') |
|||
self.data['category'] = category |
|||
|
|||
category_title_prefix = site.config['category_title_prefix'] || 'Category: ' |
|||
self.data['title'] = "#{category_title_prefix}#{category}" |
|||
end |
|||
end |
|||
|
|||
class CategoryList < Page |
|||
def initialize(site, base, dir, categories) |
|||
@site = site |
|||
@base = base |
|||
@dir = dir |
|||
@name = 'index.html' |
|||
|
|||
self.process(@name) |
|||
self.read_yaml(File.join(base, '_layouts'), 'category_list.html') |
|||
self.data['categories'] = categories |
|||
end |
|||
end |
|||
|
|||
class CategoryGenerator < Generator |
|||
safe true |
|||
|
|||
def generate(site) |
|||
if site.layouts.key? 'category_index' |
|||
dir = site.config['category_dir'] || 'categories' |
|||
site.categories.keys.each do |category| |
|||
write_category_index(site, File.join(dir, category.gsub(/\s/, "-").gsub(/[^\w-]/, '').downcase), category) |
|||
end |
|||
end |
|||
|
|||
if site.layouts.key? 'category_list' |
|||
dir = site.config['category_dir'] || 'categories' |
|||
write_category_list(site, dir, site.categories.keys.sort) |
|||
end |
|||
end |
|||
|
|||
def write_category_index(site, dir, category) |
|||
index = CategoryIndex.new(site, site.source, dir, category) |
|||
index.render(site.layouts, site.site_payload) |
|||
index.write(site.dest) |
|||
site.static_files << index |
|||
end |
|||
|
|||
def write_category_list(site, dir, categories) |
|||
index = CategoryList.new(site, site.source, dir, categories) |
|||
index.render(site.layouts, site.site_payload) |
|||
index.write(site.dest) |
|||
site.static_files << index |
|||
end |
|||
end |
|||
|
|||
end |
|||
|
@ -0,0 +1,49 @@ |
|||
## |
|||
## Author: Jose Gonzalez - https://github.com/josegonzalez |
|||
## Source URL: https://github.com/josegonzalez/josediazgonzalez.com/blob/master/_plugins/iterator.rb |
|||
## |
|||
|
|||
#module Jekyll |
|||
#class Site |
|||
#alias_method :orig_site_payload, :site_payload |
|||
|
|||
## Constuct an array of hashes that will allow the user, using Liquid, to |
|||
## iterate through the keys of _kv_hash_ and be able to iterate through the |
|||
## elements under each key. |
|||
## |
|||
## Example: |
|||
## categories = { 'Ruby' => [<Post>, <Post>] } |
|||
## make_iterable(categories, :index => 'name', :items => 'posts') |
|||
## Will allow the user to iterate through all categories and then iterate |
|||
## though each post in the current category like so: |
|||
## {% for category in site.categories %} |
|||
## h1. {{ category.name }} |
|||
## <ul> |
|||
## {% for post in category.posts %} |
|||
## <li>{{ post.title }}</li> |
|||
## {% endfor %} |
|||
## </ul> |
|||
## {% endfor %} |
|||
## |
|||
## Returns [ {<index> => <kv_hash_key>, <items> => kv_hash[<kv_hash_key>]}, ... ] |
|||
|
|||
#def make_iterable(kv_hash, options) |
|||
#options = {:index => 'name', :items => 'items'}.merge(options) |
|||
#result = [] |
|||
#kv_hash.sort.each do |key, value| |
|||
#result << { options[:index] => key, options[:items] => value } |
|||
#end |
|||
#result |
|||
#end |
|||
|
|||
#def site_payload |
|||
#payload = orig_site_payload |
|||
#payload['site']['iterable'].merge!({ |
|||
#'categories' => make_iterable(self.categories, :index => 'name', :items => 'posts'), |
|||
#'tags' => make_iterable(self.tags, :index => 'name', :items => 'posts') |
|||
#}) |
|||
#payload |
|||
#end |
|||
|
|||
#end |
|||
#end |
@ -0,0 +1,30 @@ |
|||
# |
|||
# Author: Raimonds Simanovskis, http://blog.rayapps.com/ |
|||
# Source URL: https://github.com/rsim/blog.rayapps.com/blob/master/_plugins/pygments_cache_patch.rb |
|||
# |
|||
|
|||
require 'fileutils' |
|||
require 'digest/md5' |
|||
|
|||
PYGMENTS_CACHE_DIR = File.expand_path('../../_cache', __FILE__) |
|||
FileUtils.mkdir_p(PYGMENTS_CACHE_DIR) |
|||
|
|||
Jekyll::HighlightBlock.class_eval do |
|||
def render_pygments(context, code) |
|||
if defined?(PYGMENTS_CACHE_DIR) |
|||
path = File.join(PYGMENTS_CACHE_DIR, "#{@lang}-#{Digest::MD5.hexdigest(code)}.html") |
|||
if File.exist?(path) |
|||
highlighted_code = File.read(path) |
|||
else |
|||
highlighted_code = Albino.new(code, @lang).to_s(@options) |
|||
File.open(path, 'w') {|f| f.print(highlighted_code) } |
|||
end |
|||
else |
|||
highlighted_code = Albino.new(code, @lang).to_s(@options) |
|||
end |
|||
output = add_code_tags(highlighted_code, @lang) |
|||
output = context["pygments_prefix"] + output if context["pygments_prefix"] |
|||
output = output + context["pygments_suffix"] if context["pygments_suffix"] |
|||
output |
|||
end |
|||
end |
@ -1,160 +0,0 @@ |
|||
<!DOCTYPE html> |
|||
<!--[if IEMobile 7 ]><html class="no-js iem7" manifest="default.appcache?v=1"><![endif]--> |
|||
<!--[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)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" manifest="default.appcache?v=1" lang="en"><!--<![endif]--> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
|
|||
<title>Hello World! I'm Octopress! - My Octopress Blog</title> |
|||
<meta name="author" content="Your Name"> |
|||
|
|||
|
|||
<!-- http://t.co/dKP3o1e --> |
|||
<meta name="HandheldFriendly" content="True"> |
|||
<meta name="MobileOptimized" content="320"> |
|||
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1"> |
|||
|
|||
|
|||
|
|||
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css"> |
|||
<!--<script src="/javascripts/octopress.js" type="text/javascript"></script>--> |
|||
<script src="javascripts/libs/modernizr-1.7.min.js"></script> |
|||
<script src="javascripts/libs/ios-viewport-scaling-bug-fix.js"></script> |
|||
|
|||
<link href="/atom.xml" rel="alternate" title="My Octopress Blog" type="application/atom+xml"/> |
|||
</head> |
|||
|
|||
<body > |
|||
<header><div><h1><a href="/">My Octopress Blog</a></h1> |
|||
</div></header> |
|||
<nav><div><div> |
|||
<a href="/atom.xml">Subscribe</a> |
|||
<form action="http://google.com/search" method="get"> |
|||
<input class="search" type="text" name="q" results="0" placeholder="Search"/> |
|||
<input type="hidden" name="q" value="site:yoursite.com" /> |
|||
</form> |
|||
</div> |
|||
<ul> |
|||
<li><a href="/">Blog</a></li> |
|||
<li><a href="/about/">About</a></li> |
|||
</ul> |
|||
</div></nav> |
|||
<div> |
|||
<div> |
|||
<div id="articles"><article> |
|||
<header> |
|||
<h1><a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a></h1> |
|||
<p> |
|||
|
|||
<span class="byline author vcard">By <span class="fn">Your Name</span></span> |
|||
|
|||
|
|||
<time datetime="2009-11-13 00:00:00 -0500" pubdate>November 13<span>th</span>, 2009</time> |
|||
|
|||
|
|||
<time class="updated" datetime="2010-03-10 00:00:00 -0500" pubdate>Updated March 10<span>th</span>, 2010</time> |
|||
|
|||
</p> |
|||
</header> |
|||
|
|||
<div class="entry"><p><strong>Octopress is a blogging framework designed for hackers</strong>, based on <a href="http://github.com/mojombo/jekyll">Jekyll</a> the blog aware static site generator powering <a href="http://pages.github.com/">Github pages</a>. |
|||
If you don’t know what Jekyll is, <a href="http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/">Jack Moffitt</a> wrote a good summary:</p> |
|||
|
|||
<blockquote><p>Jekyll is a static blog generator; it transforms a directory of input files into another directory of files suitable for a blog. The management of the blog is handled by standard, familiar tools like creating and renaming files, the text editor of your choice, and version control.</p></blockquote> |
|||
|
|||
<p><cite><strong>Jack Moffitt</strong> <a href="http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/">Blogging with Git Emacs and Jekyll</a></cite></p> |
|||
|
|||
<p>There’s no database to set up, and you get to use tools like Emacs, Vim, or TextMate to write your posts, not some lame in-browser text editor. Just write, generate, deploy, using the same tools and patterns you already use for your daily work.</p> |
|||
|
|||
<p><a href="http://wiki.github.com/imathis/octopress/">Read the wiki to learn more</a></p> |
|||
</div> |
|||
|
|||
|
|||
|
|||
<div id="disqus_thread"><script type="text/javascript"> |
|||
var disqus_url = "http://yoursite.com/2009/11/13/hello-world/"; |
|||
</script> |
|||
<noscript> |
|||
<a href="http://imathis.disqus.com/?url=ref">View the discussion thread</a> |
|||
</noscript> |
|||
<script type="text/javascript" src="http://disqus.com/forums/imathis/embed.js"></script> |
|||
</div> |
|||
|
|||
</article> |
|||
</div> |
|||
|
|||
<aside><section> |
|||
<h1>About Me</h1> |
|||
<p>Hi, I'm Octopress!</p> |
|||
</section> |
|||
|
|||
<section> |
|||
<h1>Recent Posts</h1> |
|||
<ul id="recent_posts"> |
|||
|
|||
<li class="post"> |
|||
<a href="/2011/04/07/test-of-typography/">Test of Typography</a> |
|||
<time>April 07, 2011</time> |
|||
</li> |
|||
|
|||
<li class="post"> |
|||
<a href="/2011/03/14/test-post/">Test Post</a> |
|||
<time>March 14, 2011</time> |
|||
</li> |
|||
|
|||
<li class="post"> |
|||
<a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a> |
|||
<time>November 13, 2009</time> |
|||
</li> |
|||
|
|||
</ul> |
|||
</section> |
|||
|
|||
|
|||
<section><h1>Latest Tweets</h1> |
|||
<ul id="tweets"> |
|||
Status updating... |
|||
</ul> |
|||
<p>Follow <a href="http://twitter.com/imathis">@imathis</a></p> |
|||
|
|||
<script> |
|||
var twitter_user = "imathis"; |
|||
var show_replies = false; |
|||
var tweet_count = 3; |
|||
</script> |
|||
<script src="/javascripts/twitter.js" type="text/javascript"></script> |
|||
|
|||
</section> |
|||
|
|||
|
|||
|
|||
<section><h1>My Pinboard</h1> |
|||
<ul id="pinboard_linkroll">Fetching linkroll...</ul> |
|||
<p><a href="http://pinboard.in/u:designenthusiast">My Pinboard Bookmarks »</a></p> |
|||
</section> |
|||
|
|||
</aside> |
|||
|
|||
</div> |
|||
</div> |
|||
<footer><div><p> |
|||
Copyright © 2011 - Your Name - |
|||
<span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span> |
|||
</p> |
|||
|
|||
<script language="javascript"> |
|||
var pinboard_user = "designenthusiast"; |
|||
var pinboard_count = "3"; |
|||
</script> |
|||
<script language="javascript" src="/javascripts/pinboard.js"></script> |
|||
|
|||
</div></footer> |
|||
<!--[if (lt IE 9) & (!IEMobile)]> |
|||
<script src="javascripts/libs/DOMAssistantCompressed-2.8.js"></script> |
|||
<script src="javascripts/libs/selectivizr-1.0.1.js"></script> |
|||
<script src="javascripts/libs/respond.min.js"></script> |
|||
<![endif]--> |
|||
</body> |
|||
</html> |
@ -1,149 +0,0 @@ |
|||
<!DOCTYPE html> |
|||
<!--[if IEMobile 7 ]><html class="no-js iem7" manifest="default.appcache?v=1"><![endif]--> |
|||
<!--[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)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" manifest="default.appcache?v=1" lang="en"><!--<![endif]--> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
|
|||
<title>Test Post - My Octopress Blog</title> |
|||
<meta name="author" content="Your Name"> |
|||
|
|||
|
|||
<!-- http://t.co/dKP3o1e --> |
|||
<meta name="HandheldFriendly" content="True"> |
|||
<meta name="MobileOptimized" content="320"> |
|||
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1"> |
|||
|
|||
|
|||
|
|||
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css"> |
|||
<!--<script src="/javascripts/octopress.js" type="text/javascript"></script>--> |
|||
<script src="javascripts/libs/modernizr-1.7.min.js"></script> |
|||
<script src="javascripts/libs/ios-viewport-scaling-bug-fix.js"></script> |
|||
|
|||
<link href="/atom.xml" rel="alternate" title="My Octopress Blog" type="application/atom+xml"/> |
|||
</head> |
|||
|
|||
<body > |
|||
<header><div><h1><a href="/">My Octopress Blog</a></h1> |
|||
</div></header> |
|||
<nav><div><div> |
|||
<a href="/atom.xml">Subscribe</a> |
|||
<form action="http://google.com/search" method="get"> |
|||
<input class="search" type="text" name="q" results="0" placeholder="Search"/> |
|||
<input type="hidden" name="q" value="site:yoursite.com" /> |
|||
</form> |
|||
</div> |
|||
<ul> |
|||
<li><a href="/">Blog</a></li> |
|||
<li><a href="/about/">About</a></li> |
|||
</ul> |
|||
</div></nav> |
|||
<div> |
|||
<div> |
|||
<div id="articles"><article> |
|||
<header> |
|||
<h1><a href="/2011/03/14/test-post/">Test Post</a></h1> |
|||
<p> |
|||
|
|||
<span class="byline author vcard">By <span class="fn">Your Name</span></span> |
|||
|
|||
|
|||
<time datetime="2011-03-14 00:00:00 -0400" pubdate>March 14<span>th</span>, 2011</time> |
|||
|
|||
|
|||
</p> |
|||
</header> |
|||
|
|||
<div class="entry"><p>This is a test!</p> |
|||
</div> |
|||
|
|||
|
|||
|
|||
<div id="disqus_thread"><script type="text/javascript"> |
|||
var disqus_url = "http://yoursite.com/2011/03/14/test-post/"; |
|||
</script> |
|||
<noscript> |
|||
<a href="http://imathis.disqus.com/?url=ref">View the discussion thread</a> |
|||
</noscript> |
|||
<script type="text/javascript" src="http://disqus.com/forums/imathis/embed.js"></script> |
|||
</div> |
|||
|
|||
</article> |
|||
</div> |
|||
|
|||
<aside><section> |
|||
<h1>About Me</h1> |
|||
<p>Hi, I'm Octopress!</p> |
|||
</section> |
|||
|
|||
<section> |
|||
<h1>Recent Posts</h1> |
|||
<ul id="recent_posts"> |
|||
|
|||
<li class="post"> |
|||
<a href="/2011/04/07/test-of-typography/">Test of Typography</a> |
|||
<time>April 07, 2011</time> |
|||
</li> |
|||
|
|||
<li class="post"> |
|||
<a href="/2011/03/14/test-post/">Test Post</a> |
|||
<time>March 14, 2011</time> |
|||
</li> |
|||
|
|||
<li class="post"> |
|||
<a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a> |
|||
<time>November 13, 2009</time> |
|||
</li> |
|||
|
|||
</ul> |
|||
</section> |
|||
|
|||
|
|||
<section><h1>Latest Tweets</h1> |
|||
<ul id="tweets"> |
|||
Status updating... |
|||
</ul> |
|||
<p>Follow <a href="http://twitter.com/imathis">@imathis</a></p> |
|||
|
|||
<script> |
|||
var twitter_user = "imathis"; |
|||
var show_replies = false; |
|||
var tweet_count = 3; |
|||
</script> |
|||
<script src="/javascripts/twitter.js" type="text/javascript"></script> |
|||
|
|||
</section> |
|||
|
|||
|
|||
|
|||
<section><h1>My Pinboard</h1> |
|||
<ul id="pinboard_linkroll">Fetching linkroll...</ul> |
|||
<p><a href="http://pinboard.in/u:designenthusiast">My Pinboard Bookmarks »</a></p> |
|||
</section> |
|||
|
|||
</aside> |
|||
|
|||
</div> |
|||
</div> |
|||
<footer><div><p> |
|||
Copyright © 2011 - Your Name - |
|||
<span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span> |
|||
</p> |
|||
|
|||
<script language="javascript"> |
|||
var pinboard_user = "designenthusiast"; |
|||
var pinboard_count = "3"; |
|||
</script> |
|||
<script language="javascript" src="/javascripts/pinboard.js"></script> |
|||
|
|||
</div></footer> |
|||
<!--[if (lt IE 9) & (!IEMobile)]> |
|||
<script src="javascripts/libs/DOMAssistantCompressed-2.8.js"></script> |
|||
<script src="javascripts/libs/selectivizr-1.0.1.js"></script> |
|||
<script src="javascripts/libs/respond.min.js"></script> |
|||
<![endif]--> |
|||
</body> |
|||
</html> |
@ -1,199 +0,0 @@ |
|||
<!DOCTYPE html> |
|||
<!--[if IEMobile 7 ]><html class="no-js iem7" manifest="default.appcache?v=1"><![endif]--> |
|||
<!--[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)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" manifest="default.appcache?v=1" lang="en"><!--<![endif]--> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
|
|||
<title>Test of Typography - My Octopress Blog</title> |
|||
<meta name="author" content="Your Name"> |
|||
|
|||
|
|||
<!-- http://t.co/dKP3o1e --> |
|||
<meta name="HandheldFriendly" content="True"> |
|||
<meta name="MobileOptimized" content="320"> |
|||
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1"> |
|||
|
|||
|
|||
|
|||
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css"> |
|||
<!--<script src="/javascripts/octopress.js" type="text/javascript"></script>--> |
|||
<script src="javascripts/libs/modernizr-1.7.min.js"></script> |
|||
<script src="javascripts/libs/ios-viewport-scaling-bug-fix.js"></script> |
|||
|
|||
<link href="/atom.xml" rel="alternate" title="My Octopress Blog" type="application/atom+xml"/> |
|||
</head> |
|||
|
|||
<body > |
|||
<header><div><h1><a href="/">My Octopress Blog</a></h1> |
|||
</div></header> |
|||
<nav><div><div> |
|||
<a href="/atom.xml">Subscribe</a> |
|||
<form action="http://google.com/search" method="get"> |
|||
<input class="search" type="text" name="q" results="0" placeholder="Search"/> |
|||
<input type="hidden" name="q" value="site:yoursite.com" /> |
|||
</form> |
|||
</div> |
|||
<ul> |
|||
<li><a href="/">Blog</a></li> |
|||
<li><a href="/about/">About</a></li> |
|||
</ul> |
|||
</div></nav> |
|||
<div> |
|||
<div> |
|||
<div id="articles"><article> |
|||
<header> |
|||
<h1><a href="/2011/04/07/test-of-typography/">Test of Typography</a></h1> |
|||
<p> |
|||
|
|||
<span class="byline author vcard">By <span class="fn">Your Name</span></span> |
|||
|
|||
|
|||
<time datetime="2011-04-07 19:17:00 -0400" pubdate>April 7<span>th</span>, 2011</time> |
|||
|
|||
|
|||
</p> |
|||
</header> |
|||
|
|||
<div class="entry"><p>In the past I’ve always designed my own business cards, printed them on expensive card stock, and hand-cut them with an X-Acto knife. My cards were way nicer than those my clients had gotten <em>professionally</em> printed with bubbly ink, no-bleed designs, and cheap paper. Though I put tremendous care into my cards, I never was happy with the design.</p> |
|||
|
|||
<h2>Why Have Business Cards?</h2> |
|||
|
|||
<p>I’m rarely asked for my business card except when I attend conferences, of which I attend one or two each year. As a freelance contractor, I leave work by walking twenty-five feet from my office to the couch. Many of the |
|||
people I work for I’ve never met in-person.</p> |
|||
|
|||
<p>When someone gives me their business card, I read it, pocket it, and eventually throw it out — sometimes before I remember to copy the information to my address book (sorry, just being honest). The reality is, with the ubiquity of the internet and with frictionless social networks like Twitter, I can connect with people immediately. So why have business cards?</p> |
|||
|
|||
<!-- more --> |
|||
|
|||
|
|||
<h3>Inspiration Demands Action</h3> |
|||
|
|||
<p>In one of our campfire chats <a href="http://twitter.com/NTalbott">Nathaniel Talbott</a> showed off his business cards which he printed through <a href="http://moo.com">Moo</a>. They were half the size of regular business cards featuring the company logo on the front, and the url on the back. The unique size of the card intrigued me, and days later I couldn’t stop thinking about designing a set of mini-cards for myself.</p> |
|||
|
|||
<p><img src="/content/blog/2010/cards/box.jpg" alt="cards in a box" width="300px" class="right"/> Moo’s <a href="http://moo.com/products/minicards.php">MiniCard’s</a> are very unique. You can print 100 cards, each with a totally different back. With a typical printing service this would be prohibitively expensive, but with Moo the rules are different. This freedom encourages us to go beyond nicely styled contact information and branding. Some clever uses involve offering unique invite codes for a web application, or sharing a photography portfolio with Moo’s Flickr import feature.</p> |
|||
|
|||
<p>I realized that I could print several design iterations and decide later which worked best. Without the pressure to choose a single design, I felt the freedom to create.</p> |
|||
|
|||
<h3>The Freedom to Fail</h3> |
|||
|
|||
<p><img src="/content/blog/2010/cards/concepts.jpg" alt="card concepts" width="270px" class="left"/> I could be cheeky and print up half of my cards with my logo on one side and only my Twitter name on the other. For less than $20 for 100 cards, I wasn’t even concerned about possibly screwing up a whole batch. So that’s what I did. I designed cards that were good enough and I printed them. If the cards did’t turn out how I wanted them to, I could improve and print again.</p> |
|||
|
|||
<p><img src="/content/blog/2010/cards/handout.jpg" alt="handout cards" width="220px" class="right"/> The process was fun and simple, and as soon as I finished, I wanted to do it again. When my cards arrived, I was absolutely delighted by the print quality and the care put into their presentation. Smartly Moo even included some beautiful promotional cards to hand out when people inevitably ask about mine.</p> |
|||
|
|||
<h3>A Second Iteration</h3> |
|||
|
|||
<p>After holding the finished product, I began to see how my design could be improved. I learned that Gill Sans is harder to read at a small size in a high contrast print, so I switched to Futura. I showed my cards to some far-sighted friends and adjusted my font size accordingly. I discarded a background gradient (which I should have known wouldn’t translate well to print) in favor of a solid color. <strong>Sidenote:</strong> On screen, gradients emulate the subtleties of a natural light source, but on a real object it doesn’t make sense and generally looks bad.</p> |
|||
|
|||
<p>I changed my approach choosing a single design with multiple color variations. In the promotional cards Moo sent me, I learned that they do a fantastic job with bright colors and I wanted to use that boldness in my design. I was inspired by what <a href="http://sethgodin.typepad.com/seths_blog/2009/07/welcome-to-island-marketing.html">Seth Godin said</a>:</p> |
|||
|
|||
<blockquote><p>Every interaction is both precious and an opportunity to delight.</p></blockquote> |
|||
|
|||
<p><img src="/content/blog/2010/cards/holder.jpg" alt="MiniCard Holder" width="220px" class="right"/> I pictured sliding a card out of my <a href="http://moo.com/products/accessories/holders/moo_minicard_holders">MiniCard Holder</a> and revealing another brightly-colored card beneath. As I hand someone a card they’ll see the flash of color and realize that their card was special, and different from my other cards. That’s what I want my clients and future clients to feel.</p> |
|||
|
|||
<h3>The Final Design</h3> |
|||
|
|||
<p><img src="/content/blog/2010/cards/all.jpg" alt="all card designs" width="640px"/></p> |
|||
|
|||
<p>The MiniCard’s unique constraints inspired me with a fresh challenge and their pricing model encouraged me to experiment. Instead of treating business cards like a necessary design task, I saw them as a opportunity to release quickly, fail cheaply, and improve. Now when I give someone a business card, it’s something valuable to me, and I hope they’re delighted.</p> |
|||
|
|||
<p><strong>Update:</strong> I thought I’d share some other great uses of Moo’s MiniCards. There’s a fantastic <a href="http://www.flickr.com/groups/moo/pool/">Flikr pool</a>, but here are some of my favorites. Enjoy:</p> |
|||
|
|||
<ul> |
|||
<li><a href="http://www.flickr.com/photos/lushlampwork/4131018201/in/pool-moo">Product</a> <a href="http://www.flickr.com/photos/lushlampwork/4297224179/in/pool-moo">tags</a></li> |
|||
<li><a href="http://www.flickr.com/photos/thisiswoly/4206576342/in/pool-moo">Photography</a> or <a href="http://www.flickr.com/photos/lesleybarnes/4276368956/in/pool-moo">art</a> <a href="http://www.flickr.com/photos/playinprogress/4158223112/in/pool-moo">portfolios</a></li> |
|||
<li><a href="http://www.flickr.com/photos/polkadotcreations/4167249758/in/pool-moo">Gift</a> <a href="http://www.flickr.com/photos/22338102@N04/4278114745/in/pool-moo">tags</a></li> |
|||
<li><a href="http://www.flickr.com/photos/bcome/4177034036/in/pool-moo">An advent calendar</a></li> |
|||
</ul> |
|||
|
|||
</div> |
|||
|
|||
|
|||
|
|||
<div id="disqus_thread"><script type="text/javascript"> |
|||
var disqus_url = "http://yoursite.com/2011/04/07/test-of-typography/"; |
|||
</script> |
|||
<noscript> |
|||
<a href="http://imathis.disqus.com/?url=ref">View the discussion thread</a> |
|||
</noscript> |
|||
<script type="text/javascript" src="http://disqus.com/forums/imathis/embed.js"></script> |
|||
</div> |
|||
|
|||
</article> |
|||
</div> |
|||
|
|||
<aside><section> |
|||
<h1>About Me</h1> |
|||
<p>Hi, I'm Octopress!</p> |
|||
</section> |
|||
|
|||
<section> |
|||
<h1>Recent Posts</h1> |
|||
<ul id="recent_posts"> |
|||
|
|||
<li class="post"> |
|||
<a href="/2011/04/07/test-of-typography/">Test of Typography</a> |
|||
<time>April 07, 2011</time> |
|||
</li> |
|||
|
|||
<li class="post"> |
|||
<a href="/2011/03/14/test-post/">Test Post</a> |
|||
<time>March 14, 2011</time> |
|||
</li> |
|||
|
|||
<li class="post"> |
|||
<a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a> |
|||
<time>November 13, 2009</time> |
|||
</li> |
|||
|
|||
</ul> |
|||
</section> |
|||
|
|||
|
|||
<section><h1>Latest Tweets</h1> |
|||
<ul id="tweets"> |
|||
Status updating... |
|||
</ul> |
|||
<p>Follow <a href="http://twitter.com/imathis">@imathis</a></p> |
|||
|
|||
<script> |
|||
var twitter_user = "imathis"; |
|||
var show_replies = false; |
|||
var tweet_count = 3; |
|||
</script> |
|||
<script src="/javascripts/twitter.js" type="text/javascript"></script> |
|||
|
|||
</section> |
|||
|
|||
|
|||
|
|||
<section><h1>My Pinboard</h1> |
|||
<ul id="pinboard_linkroll">Fetching linkroll...</ul> |
|||
<p><a href="http://pinboard.in/u:designenthusiast">My Pinboard Bookmarks »</a></p> |
|||
</section> |
|||
|
|||
</aside> |
|||
|
|||
</div> |
|||
</div> |
|||
<footer><div><p> |
|||
Copyright © 2011 - Your Name - |
|||
<span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span> |
|||
</p> |
|||
|
|||
<script language="javascript"> |
|||
var pinboard_user = "designenthusiast"; |
|||
var pinboard_count = "3"; |
|||
</script> |
|||
<script language="javascript" src="/javascripts/pinboard.js"></script> |
|||
|
|||
</div></footer> |
|||
<!--[if (lt IE 9) & (!IEMobile)]> |
|||
<script src="javascripts/libs/DOMAssistantCompressed-2.8.js"></script> |
|||
<script src="javascripts/libs/selectivizr-1.0.1.js"></script> |
|||
<script src="javascripts/libs/respond.min.js"></script> |
|||
<![endif]--> |
|||
</body> |
|||
</html> |
@ -1,154 +0,0 @@ |
|||
<!DOCTYPE html> |
|||
<!--[if IEMobile 7 ]><html class="no-js iem7" manifest="default.appcache?v=1"><![endif]--> |
|||
<!--[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)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" manifest="default.appcache?v=1" lang="en"><!--<![endif]--> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
|
|||
<title>About Me - My Octopress Blog</title> |
|||
<meta name="author" content="Your Name"> |
|||
|
|||
|
|||
<!-- http://t.co/dKP3o1e --> |
|||
<meta name="HandheldFriendly" content="True"> |
|||
<meta name="MobileOptimized" content="320"> |
|||
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1"> |
|||
|
|||
|
|||
|
|||
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css"> |
|||
<!--<script src="/javascripts/octopress.js" type="text/javascript"></script>--> |
|||
<script src="javascripts/libs/modernizr-1.7.min.js"></script> |
|||
<script src="javascripts/libs/ios-viewport-scaling-bug-fix.js"></script> |
|||
|
|||
<link href="/atom.xml" rel="alternate" title="My Octopress Blog" type="application/atom+xml"/> |
|||
</head> |
|||
|
|||
<body > |
|||
<header><div><h1><a href="/">My Octopress Blog</a></h1> |
|||
</div></header> |
|||
<nav><div><div> |
|||
<a href="/atom.xml">Subscribe</a> |
|||
<form action="http://google.com/search" method="get"> |
|||
<input class="search" type="text" name="q" results="0" placeholder="Search"/> |
|||
<input type="hidden" name="q" value="site:yoursite.com" /> |
|||
</form> |
|||
</div> |
|||
<ul> |
|||
<li><a href="/">Blog</a></li> |
|||
<li><a href="/about/">About</a></li> |
|||
</ul> |
|||
</div></nav> |
|||
<div> |
|||
<div> |
|||
<div id="articles"><article> |
|||
<header> |
|||
<h1><a href="/about/">About Me</a></h1> |
|||
<p> |
|||
|
|||
<span class="byline author vcard">By <span class="fn">Your Name</span></span> |
|||
|
|||
|
|||
<time datetime="2011-05-14 00:00:00 -0400" pubdate>May 14<span>th</span>, 2011</time> |
|||
|
|||
|
|||
</p> |
|||
</header> |
|||
|
|||
<div class="entry"><!-- use the :mardown filter if you want to write pages with Markdown --> |
|||
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum.</p> |
|||
|
|||
<p>Ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt.</p> |
|||
|
|||
<p>Dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent.</p> |
|||
</div> |
|||
|
|||
|
|||
|
|||
<div id="disqus_thread"><script type="text/javascript"> |
|||
var disqus_url = "http://yoursite.com/about/"; |
|||
</script> |
|||
<noscript> |
|||
<a href="http://imathis.disqus.com/?url=ref">View the discussion thread</a> |
|||
</noscript> |
|||
<script type="text/javascript" src="http://disqus.com/forums/imathis/embed.js"></script> |
|||
</div> |
|||
|
|||
</article> |
|||
</div> |
|||
|
|||
<aside><section> |
|||
<h1>About Me</h1> |
|||
<p>Hi, I'm Octopress!</p> |
|||
</section> |
|||
|
|||
<section> |
|||
<h1>Recent Posts</h1> |
|||
<ul id="recent_posts"> |
|||
|
|||
<li class="post"> |
|||
<a href="/2011/04/07/test-of-typography/">Test of Typography</a> |
|||
<time>April 07, 2011</time> |
|||
</li> |
|||
|
|||
<li class="post"> |
|||
<a href="/2011/03/14/test-post/">Test Post</a> |
|||
<time>March 14, 2011</time> |
|||
</li> |
|||
|
|||
<li class="post"> |
|||
<a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a> |
|||
<time>November 13, 2009</time> |
|||
</li> |
|||
|
|||
</ul> |
|||
</section> |
|||
|
|||
|
|||
<section><h1>Latest Tweets</h1> |
|||
<ul id="tweets"> |
|||
Status updating... |
|||
</ul> |
|||
<p>Follow <a href="http://twitter.com/imathis">@imathis</a></p> |
|||
|
|||
<script> |
|||
var twitter_user = "imathis"; |
|||
var show_replies = false; |
|||
var tweet_count = 3; |
|||
</script> |
|||
<script src="/javascripts/twitter.js" type="text/javascript"></script> |
|||
|
|||
</section> |
|||
|
|||
|
|||
|
|||
<section><h1>My Pinboard</h1> |
|||
<ul id="pinboard_linkroll">Fetching linkroll...</ul> |
|||
<p><a href="http://pinboard.in/u:designenthusiast">My Pinboard Bookmarks »</a></p> |
|||
</section> |
|||
|
|||
</aside> |
|||
|
|||
</div> |
|||
</div> |
|||
<footer><div><p> |
|||
Copyright © 2011 - Your Name - |
|||
<span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span> |
|||
</p> |
|||
|
|||
<script language="javascript"> |
|||
var pinboard_user = "designenthusiast"; |
|||
var pinboard_count = "3"; |
|||
</script> |
|||
<script language="javascript" src="/javascripts/pinboard.js"></script> |
|||
|
|||
</div></footer> |
|||
<!--[if (lt IE 9) & (!IEMobile)]> |
|||
<script src="javascripts/libs/DOMAssistantCompressed-2.8.js"></script> |
|||
<script src="javascripts/libs/selectivizr-1.0.1.js"></script> |
|||
<script src="javascripts/libs/respond.min.js"></script> |
|||
<![endif]--> |
|||
</body> |
|||
</html> |
@ -1,103 +0,0 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<feed xmlns="http://www.w3.org/2005/Atom"> |
|||
|
|||
<title></title> |
|||
<link href="http://yoursite.com/atom.xml" rel="self"/> |
|||
<link href="http://yoursite.com/"/> |
|||
<updated>2011-05-15T18:13:17-04:00</updated> |
|||
<id>http://yoursite.com/</id> |
|||
<author> |
|||
<name>Your Name</name> |
|||
|
|||
<email>you@domain.com</email> |
|||
|
|||
</author> |
|||
|
|||
|
|||
<entry> |
|||
<title>Test of Typography</title> |
|||
<link href="http://yoursite.com/2011/04/07/test-of-typography/"/> |
|||
<updated>2011-04-07T19:17:00-04:00</updated> |
|||
<id>http://yoursite.com/2011/04/07/test-of-typography</id> |
|||
<content type="html"><p>In the past I've always designed my own business cards, printed them on expensive card stock, and hand-cut them with an X-Acto knife. My cards were way nicer than those my clients had gotten <em>professionally</em> printed with bubbly ink, no-bleed designs, and cheap paper. Though I put tremendous care into my cards, I never was happy with the design.</p> |
|||
|
|||
<h2>Why Have Business Cards?</h2> |
|||
|
|||
<p>I'm rarely asked for my business card except when I attend conferences, of which I attend one or two each year. As a freelance contractor, I leave work by walking twenty-five feet from my office to the couch. Many of the |
|||
people I work for I've never met in-person.</p> |
|||
|
|||
<p>When someone gives me their business card, I read it, pocket it, and eventually throw it out &mdash; sometimes before I remember to copy the information to my address book (sorry, just being honest). The reality is, with the ubiquity of the internet and with frictionless social networks like Twitter, I can connect with people immediately. So why have business cards?</p> |
|||
|
|||
<!-- more --> |
|||
|
|||
|
|||
<h3>Inspiration Demands Action</h3> |
|||
|
|||
<p>In one of our campfire chats <a href="http://twitter.com/NTalbott">Nathaniel Talbott</a> showed off his business cards which he printed through <a href="http://moo.com">Moo</a>. They were half the size of regular business cards featuring the company logo on the front, and the url on the back. The unique size of the card intrigued me, and days later I couldn't stop thinking about designing a set of mini-cards for myself.</p> |
|||
|
|||
<p><img src="http://yoursite.com/content/blog/2010/cards/box.jpg" alt="cards in a box" width="300px" class="right"/> Moo's <a href="http://moo.com/products/minicards.php">MiniCard's</a> are very unique. You can print 100 cards, each with a totally different back. With a typical printing service this would be prohibitively expensive, but with Moo the rules are different. This freedom encourages us to go beyond nicely styled contact information and branding. Some clever uses involve offering unique invite codes for a web application, or sharing a photography portfolio with Moo's Flickr import feature.</p> |
|||
|
|||
<p>I realized that I could print several design iterations and decide later which worked best. Without the pressure to choose a single design, I felt the freedom to create.</p> |
|||
|
|||
<h3>The Freedom to Fail</h3> |
|||
|
|||
<p><img src="http://yoursite.com/content/blog/2010/cards/concepts.jpg" alt="card concepts" width="270px" class="left"/> I could be cheeky and print up half of my cards with my logo on one side and only my Twitter name on the other. For less than $20 for 100 cards, I wasn't even concerned about possibly screwing up a whole batch. So that's what I did. I designed cards that were good enough and I printed them. If the cards did't turn out how I wanted them to, I could improve and print again.</p> |
|||
|
|||
<p><img src="http://yoursite.com/content/blog/2010/cards/handout.jpg" alt="handout cards" width="220px" class="right"/> The process was fun and simple, and as soon as I finished, I wanted to do it again. When my cards arrived, I was absolutely delighted by the print quality and the care put into their presentation. Smartly Moo even included some beautiful promotional cards to hand out when people inevitably ask about mine.</p> |
|||
|
|||
<h3>A Second Iteration</h3> |
|||
|
|||
<p>After holding the finished product, I began to see how my design could be improved. I learned that Gill Sans is harder to read at a small size in a high contrast print, so I switched to Futura. I showed my cards to some far-sighted friends and adjusted my font size accordingly. I discarded a background gradient (which I should have known wouldn't translate well to print) in favor of a solid color. <strong>Sidenote:</strong> On screen, gradients emulate the subtleties of a natural light source, but on a real object it doesn't make sense and generally looks bad.</p> |
|||
|
|||
<p>I changed my approach choosing a single design with multiple color variations. In the promotional cards Moo sent me, I learned that they do a fantastic job with bright colors and I wanted to use that boldness in my design. I was inspired by what <a href="http://sethgodin.typepad.com/seths_blog/2009/07/welcome-to-island-marketing.html">Seth Godin said</a>:</p> |
|||
|
|||
<blockquote><p>Every interaction is both precious and an opportunity to delight.</p></blockquote> |
|||
|
|||
<p><img src="http://yoursite.com/content/blog/2010/cards/holder.jpg" alt="MiniCard Holder" width="220px" class="right"/> I pictured sliding a card out of my <a href="http://moo.com/products/accessories/holders/moo_minicard_holders">MiniCard Holder</a> and revealing another brightly-colored card beneath. As I hand someone a card they'll see the flash of color and realize that their card was special, and different from my other cards. That's what I want my clients and future clients to feel.</p> |
|||
|
|||
<h3>The Final Design</h3> |
|||
|
|||
<p><img src="http://yoursite.com/content/blog/2010/cards/all.jpg" alt="all card designs" width="640px"/></p> |
|||
|
|||
<p>The MiniCard's unique constraints inspired me with a fresh challenge and their pricing model encouraged me to experiment. Instead of treating business cards like a necessary design task, I saw them as a opportunity to release quickly, fail cheaply, and improve. Now when I give someone a business card, it's something valuable to me, and I hope they're delighted.</p> |
|||
|
|||
<p><strong>Update:</strong> I thought I'd share some other great uses of Moo's MiniCards. There's a fantastic <a href="http://www.flickr.com/groups/moo/pool/">Flikr pool</a>, but here are some of my favorites. Enjoy:</p> |
|||
|
|||
<ul> |
|||
<li><a href="http://www.flickr.com/photos/lushlampwork/4131018201/in/pool-moo">Product</a> <a href="http://www.flickr.com/photos/lushlampwork/4297224179/in/pool-moo">tags</a></li> |
|||
<li><a href="http://www.flickr.com/photos/thisiswoly/4206576342/in/pool-moo">Photography</a> or <a href="http://www.flickr.com/photos/lesleybarnes/4276368956/in/pool-moo">art</a> <a href="http://www.flickr.com/photos/playinprogress/4158223112/in/pool-moo">portfolios</a></li> |
|||
<li><a href="http://www.flickr.com/photos/polkadotcreations/4167249758/in/pool-moo">Gift</a> <a href="http://www.flickr.com/photos/22338102@N04/4278114745/in/pool-moo">tags</a></li> |
|||
<li><a href="http://www.flickr.com/photos/bcome/4177034036/in/pool-moo">An advent calendar</a></li> |
|||
</ul> |
|||
|
|||
</content> |
|||
</entry> |
|||
|
|||
<entry> |
|||
<title>Test Post</title> |
|||
<link href="http://yoursite.com/2011/03/14/test-post/"/> |
|||
<updated>2011-03-14T00:00:00-04:00</updated> |
|||
<id>http://yoursite.com/2011/03/14/test-post</id> |
|||
<content type="html"><p>This is a test!</p> |
|||
</content> |
|||
</entry> |
|||
|
|||
<entry> |
|||
<title>Hello World! I'm Octopress!</title> |
|||
<link href="http://yoursite.com/2009/11/13/hello-world/"/> |
|||
<updated>2009-11-13T00:00:00-05:00</updated> |
|||
<id>http://yoursite.com/2009/11/13/hello-world</id> |
|||
<content type="html"><p><strong>Octopress is a blogging framework designed for hackers</strong>, based on <a href="http://github.com/mojombo/jekyll">Jekyll</a> the blog aware static site generator powering <a href="http://pages.github.com/">Github pages</a>. |
|||
If you don't know what Jekyll is, <a href="http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/">Jack Moffitt</a> wrote a good summary:</p> |
|||
|
|||
<blockquote><p>Jekyll is a static blog generator; it transforms a directory of input files into another directory of files suitable for a blog. The management of the blog is handled by standard, familiar tools like creating and renaming files, the text editor of your choice, and version control.</p></blockquote> |
|||
|
|||
<p><cite><strong>Jack Moffitt</strong> <a href="http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/">Blogging with Git Emacs and Jekyll</a></cite></p> |
|||
|
|||
<p>There's no database to set up, and you get to use tools like Emacs, Vim, or TextMate to write your posts, not some lame in-browser text editor. Just write, generate, deploy, using the same tools and patterns you already use for your daily work.</p> |
|||
|
|||
<p><a href="http://wiki.github.com/imathis/octopress/">Read the wiki to learn more</a></p> |
|||
</content> |
|||
</entry> |
|||
|
|||
</feed> |
Binary file not shown.
Before Width: | Height: | Size: 27 KiB |
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 239 B |
Before Width: | Height: | Size: 504 B |
Before Width: | Height: | Size: 333 B |
@ -1,207 +0,0 @@ |
|||
<!DOCTYPE html> |
|||
<!--[if IEMobile 7 ]><html class="no-js iem7" manifest="default.appcache?v=1"><![endif]--> |
|||
<!--[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)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" manifest="default.appcache?v=1" lang="en"><!--<![endif]--> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
|
|||
<title>Octopress - My Octopress Blog</title> |
|||
<meta name="author" content="Your Name"> |
|||
|
|||
|
|||
<!-- http://t.co/dKP3o1e --> |
|||
<meta name="HandheldFriendly" content="True"> |
|||
<meta name="MobileOptimized" content="320"> |
|||
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1"> |
|||
|
|||
|
|||
|
|||
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css"> |
|||
<!--<script src="/javascripts/octopress.js" type="text/javascript"></script>--> |
|||
<script src="javascripts/libs/modernizr-1.7.min.js"></script> |
|||
<script src="javascripts/libs/ios-viewport-scaling-bug-fix.js"></script> |
|||
|
|||
<link href="/atom.xml" rel="alternate" title="My Octopress Blog" type="application/atom+xml"/> |
|||
</head> |
|||
|
|||
<body > |
|||
<header><div><h1><a href="/">My Octopress Blog</a></h1> |
|||
</div></header> |
|||
<nav><div><div> |
|||
<a href="/atom.xml">Subscribe</a> |
|||
<form action="http://google.com/search" method="get"> |
|||
<input class="search" type="text" name="q" results="0" placeholder="Search"/> |
|||
<input type="hidden" name="q" value="site:yoursite.com" /> |
|||
</form> |
|||
</div> |
|||
<ul> |
|||
<li><a href="/">Blog</a></li> |
|||
<li><a href="/about/">About</a></li> |
|||
</ul> |
|||
</div></nav> |
|||
<div> |
|||
<div> |
|||
<div id="articles"> |
|||
|
|||
|
|||
<article> |
|||
<header> |
|||
<h1><a href="/2011/04/07/test-of-typography/">Test of Typography</a></h1> |
|||
<p> |
|||
|
|||
<span class="byline author vcard">By <span class="fn">Your Name</span></span> |
|||
|
|||
|
|||
<time datetime="2011-04-07 19:17:00 -0400" pubdate>April 7<span>th</span>, 2011</time> |
|||
|
|||
|
|||
</p> |
|||
</header> |
|||
|
|||
<div class="entry"><p>In the past I’ve always designed my own business cards, printed them on expensive card stock, and hand-cut them with an X-Acto knife. My cards were way nicer than those my clients had gotten <em>professionally</em> printed with bubbly ink, no-bleed designs, and cheap paper. Though I put tremendous care into my cards, I never was happy with the design.</p> |
|||
|
|||
<h2>Why Have Business Cards?</h2> |
|||
|
|||
<p>I’m rarely asked for my business card except when I attend conferences, of which I attend one or two each year. As a freelance contractor, I leave work by walking twenty-five feet from my office to the couch. Many of the |
|||
people I work for I’ve never met in-person.</p> |
|||
|
|||
<p>When someone gives me their business card, I read it, pocket it, and eventually throw it out — sometimes before I remember to copy the information to my address book (sorry, just being honest). The reality is, with the ubiquity of the internet and with frictionless social networks like Twitter, I can connect with people immediately. So why have business cards?</p> |
|||
|
|||
<p><a href='/2011/04/07/test-of-typography/'>Continue reading »</a></p></div> |
|||
|
|||
|
|||
</article> |
|||
|
|||
|
|||
|
|||
<article> |
|||
<header> |
|||
<h1><a href="/2011/03/14/test-post/">Test Post</a></h1> |
|||
<p> |
|||
|
|||
<span class="byline author vcard">By <span class="fn">Your Name</span></span> |
|||
|
|||
|
|||
<time datetime="2011-03-14 00:00:00 -0400" pubdate>March 14<span>th</span>, 2011</time> |
|||
|
|||
|
|||
</p> |
|||
</header> |
|||
|
|||
<div class="entry"><p>This is a test!</p> |
|||
</div> |
|||
|
|||
|
|||
</article> |
|||
|
|||
|
|||
|
|||
<article> |
|||
<header> |
|||
<h1><a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a></h1> |
|||
<p> |
|||
|
|||
<span class="byline author vcard">By <span class="fn">Your Name</span></span> |
|||
|
|||
|
|||
<time datetime="2009-11-13 00:00:00 -0500" pubdate>November 13<span>th</span>, 2009</time> |
|||
|
|||
|
|||
<time class="updated" datetime="2010-03-10 00:00:00 -0500" pubdate>Updated March 10<span>th</span>, 2010</time> |
|||
|
|||
</p> |
|||
</header> |
|||
|
|||
<div class="entry"><p><strong>Octopress is a blogging framework designed for hackers</strong>, based on <a href="http://github.com/mojombo/jekyll">Jekyll</a> the blog aware static site generator powering <a href="http://pages.github.com/">Github pages</a>. |
|||
If you don’t know what Jekyll is, <a href="http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/">Jack Moffitt</a> wrote a good summary:</p> |
|||
|
|||
<blockquote><p>Jekyll is a static blog generator; it transforms a directory of input files into another directory of files suitable for a blog. The management of the blog is handled by standard, familiar tools like creating and renaming files, the text editor of your choice, and version control.</p></blockquote> |
|||
|
|||
<p><cite><strong>Jack Moffitt</strong> <a href="http://metajack.im/2009/01/23/blogging-with-git-emacs-and-jekyll/">Blogging with Git Emacs and Jekyll</a></cite></p> |
|||
|
|||
<p>There’s no database to set up, and you get to use tools like Emacs, Vim, or TextMate to write your posts, not some lame in-browser text editor. Just write, generate, deploy, using the same tools and patterns you already use for your daily work.</p> |
|||
|
|||
<p><a href="http://wiki.github.com/imathis/octopress/">Read the wiki to learn more</a></p> |
|||
</div> |
|||
|
|||
|
|||
</article> |
|||
|
|||
|
|||
</div> |
|||
|
|||
<aside><section> |
|||
<h1>About Me</h1> |
|||
<p>Hi, I'm Octopress!</p> |
|||
</section> |
|||
|
|||
<section> |
|||
<h1>Recent Posts</h1> |
|||
<ul id="recent_posts"> |
|||
|
|||
<li class="post"> |
|||
<a href="/2011/04/07/test-of-typography/">Test of Typography</a> |
|||
<time>April 07, 2011</time> |
|||
</li> |
|||
|
|||
<li class="post"> |
|||
<a href="/2011/03/14/test-post/">Test Post</a> |
|||
<time>March 14, 2011</time> |
|||
</li> |
|||
|
|||
<li class="post"> |
|||
<a href="/2009/11/13/hello-world/">Hello World! I'm Octopress!</a> |
|||
<time>November 13, 2009</time> |
|||
</li> |
|||
|
|||
</ul> |
|||
</section> |
|||
|
|||
|
|||
<section><h1>Latest Tweets</h1> |
|||
<ul id="tweets"> |
|||
Status updating... |
|||
</ul> |
|||
<p>Follow <a href="http://twitter.com/imathis">@imathis</a></p> |
|||
|
|||
<script> |
|||
var twitter_user = "imathis"; |
|||
var show_replies = false; |
|||
var tweet_count = 3; |
|||
</script> |
|||
<script src="/javascripts/twitter.js" type="text/javascript"></script> |
|||
|
|||
</section> |
|||
|
|||
|
|||
|
|||
<section><h1>My Pinboard</h1> |
|||
<ul id="pinboard_linkroll">Fetching linkroll...</ul> |
|||
<p><a href="http://pinboard.in/u:designenthusiast">My Pinboard Bookmarks »</a></p> |
|||
</section> |
|||
|
|||
</aside> |
|||
|
|||
</div> |
|||
</div> |
|||
<footer><div><p> |
|||
Copyright © 2011 - Your Name - |
|||
<span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span> |
|||
</p> |
|||
|
|||
<script language="javascript"> |
|||
var pinboard_user = "designenthusiast"; |
|||
var pinboard_count = "3"; |
|||
</script> |
|||
<script language="javascript" src="/javascripts/pinboard.js"></script> |
|||
|
|||
</div></footer> |
|||
<!--[if (lt IE 9) & (!IEMobile)]> |
|||
<script src="javascripts/libs/DOMAssistantCompressed-2.8.js"></script> |
|||
<script src="javascripts/libs/selectivizr-1.0.1.js"></script> |
|||
<script src="javascripts/libs/respond.min.js"></script> |
|||
<![endif]--> |
|||
</body> |
|||
</html> |
File diff suppressed because one or more lines are too long
@ -1,20 +0,0 @@ |
|||
// https://gist.github.com/901295
|
|||
// By @mathias, @cheeaun and @jdalton
|
|||
|
|||
(function(doc) { |
|||
var addEvent = 'addEventListener', |
|||
type = 'gesturestart', |
|||
qsa = 'querySelectorAll', |
|||
scales = [1, 1], |
|||
meta = qsa in doc ? doc[qsa]('meta[name=viewport]') : []; |
|||
function fix() { |
|||
meta.content = 'width=device-width,minimum-scale=' + scales[0] + ',maximum-scale=' + scales[1]; |
|||
doc.removeEventListener(type, fix, true); |
|||
} |
|||
if ((meta = meta[meta.length - 1]) && addEvent in doc) { |
|||
fix(); |
|||
scales = [.25, 1.6]; |
|||
doc[addEvent](type, fix, true); |
|||
} |
|||
}(document)); |
|||
|
File diff suppressed because one or more lines are too long
@ -1,8 +0,0 @@ |
|||
/* |
|||
* respond.js - A small and fast polyfill for min/max-width CSS3 Media Queries |
|||
* Copyright 2011, Scott Jehl, scottjehl.com |
|||
* Dual licensed under the MIT or GPL Version 2 licenses. |
|||
* Usage: Check out the readme file or github.com/scottjehl/respond |
|||
*/ |
|||
(function(e,h){e.respond={};respond.update=function(){};respond.mediaQueriesSupported=h;if(h){return}var u=e.document,r=u.documentElement,i=[],k=[],p=[],o={},g=30,f=u.getElementsByTagName("head")[0]||r,b=f.getElementsByTagName("link"),d=[],a=function(){var B=b,w=B.length;for(var z=0;z<w;z++){var y=B[z],x=y.href,A=y.media,v=y.rel&&y.rel.toLowerCase()==="stylesheet";if(!!x&&v&&!o[x]){if(!/^([a-zA-Z]+?:(\/\/)?(www\.)?)/.test(x)||x.replace(RegExp.$1,"").split("/")[0]===e.location.host){d.push({href:x,media:A})}else{o[x]=true}}}t()},t=function(){if(d.length){var v=d.shift();n(v.href,function(w){m(w,v.href,v.media);o[v.href]=true;t()})}},m=function(G,v,x){var E=G.match(/@media ([^\{]+)\{((?!@media)[\s\S])*(?=\}[\s]*\/\*\/mediaquery\*\/)/gmi),H=E&&E.length||0,v=v.substring(0,v.lastIndexOf("/")),w=function(I){return I.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+v+"$2$3")},y=!H&&x;if(v.length){v+="/"}if(y){H=1}for(var B=0;B<H;B++){var C;if(y){C=x;k.push(w(G))}else{C=E[B].match(/@media ([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1;k.push(RegExp.$2&&w(RegExp.$2))}var z=C.split(","),F=z.length;for(var A=0;A<F;A++){var D=z[A];i.push({media:D.match(/(only\s+)?([a-zA-Z]+)(\sand)?/)&&RegExp.$2,rules:k.length-1,minw:D.match(/\(min\-width:[\s]*([\s]*[0-9]+)px[\s]*\)/)&&parseFloat(RegExp.$1),maxw:D.match(/\(max\-width:[\s]*([\s]*[0-9]+)px[\s]*\)/)&&parseFloat(RegExp.$1)})}}j()},l,q,j=function(E){var v="clientWidth",x=r[v],D=u.compatMode==="CSS1Compat"&&x||u.body[v]||x,z={},C=u.createDocumentFragment(),B=b[b.length-1],w=(new Date()).getTime();if(E&&l&&w-l<g){clearTimeout(q);q=setTimeout(j,g);return}else{l=w}for(var y in i){var F=i[y];if(!F.minw&&!F.maxw||(!F.minw||F.minw&&D>=F.minw)&&(!F.maxw||F.maxw&&D<=F.maxw)){if(!z[F.media]){z[F.media]=[]}z[F.media].push(k[F.rules])}}for(var y in p){if(p[y]&&p[y].parentNode===f){f.removeChild(p[y])}}for(var y in z){var G=u.createElement("style"),A=z[y].join("\n");G.type="text/css";G.media=y;if(G.styleSheet){G.styleSheet.cssText=A}else{G.appendChild(u.createTextNode(A))}C.appendChild(G);p.push(G)}f.insertBefore(C,B.nextSibling)},n=function(v,x){var w=c();if(!w){return}w.open("GET",v,true);w.onreadystatechange=function(){if(w.readyState!=4||w.status!=200&&w.status!=304){return}x(w.responseText)};if(w.readyState==4){return}w.send()},c=(function(){var v=false,w=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml3.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new XMLHttpRequest()}],y=w.length;while(y--){try{v=w[y]()}catch(x){continue}break}return function(){return v}})();a();respond.update=a;function s(){j(true)}if(e.addEventListener){e.addEventListener("resize",s,false)}else{if(e.attachEvent){e.attachEvent("onresize",s)}}})(this,(function(f){if(f.matchMedia){return true}var e,i=document,c=i.documentElement,g=c.firstElementChild||c.firstChild,h=!i.body,d=i.body||i.createElement("body"),b=i.createElement("div"),a="only all";b.id="mq-test-1";b.style.cssText="position:absolute;top:-99em";d.appendChild(b);b.innerHTML='_<style media="'+a+'"> #mq-test-1 { width: 9px; }</style>';if(h){c.insertBefore(d,g)}b.removeChild(b.firstChild);e=b.offsetWidth==9;if(h){c.removeChild(d)}else{d.removeChild(b)}return e})(this)); |
|||
|
@ -1,5 +0,0 @@ |
|||
/*! |
|||
* selectivizr v1.0.2 - (c) Keith Clark, freely distributable under the terms of the MIT license. |
|||
* selectivizr.com |
|||
*/ |
|||
(function(j){function A(a){return a.replace(B,h).replace(C,function(a,d,b){for(var a=b.split(","),b=0,e=a.length;b<e;b++){var s=D(a[b].replace(E,h).replace(F,h))+o,l=[];a[b]=s.replace(G,function(a,b,c,d,e){if(b){if(l.length>0){var a=l,f,e=s.substring(0,e).replace(H,i);if(e==i||e.charAt(e.length-1)==o)e+="*";try{f=t(e)}catch(k){}if(f){e=0;for(c=f.length;e<c;e++){for(var d=f[e],h=d.className,j=0,m=a.length;j<m;j++){var g=a[j];if(!RegExp("(^|\\s)"+g.className+"(\\s|$)").test(d.className)&&g.b&&(g.b===!0||g.b(d)===!0))h=u(h,g.className,!0)}d.className=h}}l=[]}return b}else{if(b=c?I(c):!v||v.test(d)?{className:w(d),b:!0}:null)return l.push(b),"."+b.className;return a}})}return d+a.join(",")})}function I(a){var c=!0,d=w(a.slice(1)),b=a.substring(0,5)==":not(",e,f;b&&(a=a.slice(5,-1));var l=a.indexOf("(");l>-1&&(a=a.substring(0,l));if(a.charAt(0)==":")switch(a.slice(1)){case "root":c=function(a){return b?a!=p:a==p};break;case "target":if(m==8){c=function(a){function c(){var d=location.hash,e=d.slice(1);return b?d==i||a.id!=e:d!=i&&a.id==e}k(j,"hashchange",function(){g(a,d,c())});return c()};break}return!1;case "checked":c=function(a){J.test(a.type)&&k(a,"propertychange",function(){event.propertyName=="checked"&&g(a,d,a.checked!==b)});return a.checked!==b};break;case "disabled":b=!b;case "enabled":c=function(c){if(K.test(c.tagName))return k(c,"propertychange",function(){event.propertyName=="$disabled"&&g(c,d,c.a===b)}),q.push(c),c.a=c.disabled,c.disabled===b;return a==":enabled"?b:!b};break;case "focus":e="focus",f="blur";case "hover":e||(e="mouseenter",f="mouseleave");c=function(a){k(a,b?f:e,function(){g(a,d,!0)});k(a,b?e:f,function(){g(a,d,!1)});return b};break;default:if(!L.test(a))return!1}return{className:d,b:c}}function w(a){return M+"-"+(m==6&&N?O++:a.replace(P,function(a){return a.charCodeAt(0)}))}function D(a){return a.replace(x,h).replace(Q,o)}function g(a,c,d){var b=a.className,c=u(b,c,d);if(c!=b)a.className=c,a.parentNode.className+=i}function u(a,c,d){var b=RegExp("(^|\\s)"+c+"(\\s|$)"),e=b.test(a);return d?e?a:a+o+c:e?a.replace(b,h).replace(x,h):a}function k(a,c,d){a.attachEvent("on"+c,d)}function r(a,c){if(/^https?:\/\//i.test(a))return c.substring(0,c.indexOf("/",8))==a.substring(0,a.indexOf("/",8))?a:null;if(a.charAt(0)=="/")return c.substring(0,c.indexOf("/",8))+a;var d=c.split(/[?#]/)[0];a.charAt(0)!="?"&&d.charAt(d.length-1)!="/"&&(d=d.substring(0,d.lastIndexOf("/")+1));return d+a}function y(a){if(a)return n.open("GET",a,!1),n.send(),(n.status==200?n.responseText:i).replace(R,i).replace(S,function(c,d,b,e,f){return y(r(b||f,a))}).replace(T,function(c,d,b){d=d||i;return" url("+d+r(b,a)+d+") "});return i}function U(){var a,c;a=f.getElementsByTagName("BASE");for(var d=a.length>0?a[0].href:f.location.href,b=0;b<f.styleSheets.length;b++)if(c=f.styleSheets[b],c.href!=i&&(a=r(c.href,d)))c.cssText=A(y(a));q.length>0&&setInterval(function(){for(var a=0,c=q.length;a<c;a++){var b=q[a];if(b.disabled!==b.a)b.disabled?(b.disabled=!1,b.a=!0,b.disabled=!0):b.a=b.disabled}},250)}if(!/*@cc_on!@*/true){var f=document,p=f.documentElement,n=function(){if(j.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(a){return null}}(),m=/MSIE (\d+)/.exec(navigator.userAgent)[1];if(!(f.compatMode!="CSS1Compat"||m<6||m>8||!n)){var z={NW:"*.Dom.select",MooTools:"$$",DOMAssistant:"*.$",Prototype:"$$",YAHOO:"*.util.Selector.query",Sizzle:"*",jQuery:"*",dojo:"*.query"},t,q=[],O=0,N=!0,M="slvzr",R=/(\/\*[^*]*\*+([^\/][^*]*\*+)*\/)\s*/g,S=/@import\s*(?:(?:(?:url\(\s*(['"]?)(.*)\1)\s*\))|(?:(['"])(.*)\3))[^;]*;/g,T=/\burl\(\s*(["']?)(?!data:)([^"')]+)\1\s*\)/g,L=/^:(empty|(first|last|only|nth(-last)?)-(child|of-type))$/,B=/:(:first-(?:line|letter))/g,C=/(^|})\s*([^\{]*?[\[:][^{]+)/g,G=/([ +~>])|(:[a-z-]+(?:\(.*?\)+)?)|(\[.*?\])/g,H=/(:not\()?:(hover|enabled|disabled|focus|checked|target|active|visited|first-line|first-letter)\)?/g,P=/[^\w-]/g,K=/^(INPUT|SELECT|TEXTAREA|BUTTON)$/,J=/^(checkbox|radio)$/,v=m>6?/[\$\^*]=(['"])\1/:null,E=/([(\[+~])\s+/g,F=/\s+([)\]+~])/g,Q=/\s+/g,x=/^\s*((?:[\S\s]*\S)?)\s*$/,i="",o=" ",h="$1";(function(a,c){function d(){try{p.doScroll("left")}catch(a){setTimeout(d,50);return}b("poll")}function b(d){if(!(d.type=="readystatechange"&&f.readyState!="complete")&&((d.type=="load"?a:f).detachEvent("on"+d.type,b,!1),!e&&(e=!0)))c.call(a,d.type||d)}var e=!1,g=!0;if(f.readyState=="complete")c.call(a,i);else{if(f.createEventObject&&p.doScroll){try{g=!a.frameElement}catch(h){}g&&d()}k(f,"readystatechange",b);k(a,"load",b)}})(j,function(){for(var a in z){var c,d,b=j;if(j[a]){for(c=z[a].replace("*",a).split(".");(d=c.shift())&&(b=b[d]););if(typeof b=="function"){t=b;U();break}}}})}}})(this); |
@ -1,52 +0,0 @@ |
|||
var count = pinboard_count; |
|||
var linkroll = 'pinboard_linkroll'; |
|||
function pinboardNS_fetch_script(url) { |
|||
document.writeln('<s'+'cript type="text/javascript" src="' + url + '"></s'+'cript>'); |
|||
} |
|||
|
|||
function pinboardNS_show_bmarks(r) { |
|||
var lr = new Pinboard_Linkroll(); |
|||
lr.set_items(r); |
|||
lr.show_bmarks(); |
|||
} |
|||
|
|||
var json_URL = "http://feeds.pinboard.in/json/v1/u:"+pinboard_user+"/?cb=pinboardNS_show_bmarks\&count=" + count; |
|||
pinboardNS_fetch_script(json_URL); |
|||
|
|||
function Pinboard_Linkroll() { |
|||
var items; |
|||
|
|||
this.set_items = function(i) { |
|||
this.items = i; |
|||
} |
|||
this.show_bmarks = function() { |
|||
var lines = []; |
|||
for (var i = 0; i < this.items.length; i++) { |
|||
var item = this.items[i]; |
|||
var str = this.format_item(item); |
|||
lines.push(str); |
|||
} |
|||
document.getElementById(linkroll).innerHTML = lines.join("\n"); |
|||
} |
|||
this.cook = function(v) { |
|||
return v.replace('<', '<').replace('>', '>>'); |
|||
} |
|||
|
|||
this.format_item = function(it) { |
|||
var str = "<li class=\"pin-item\">"; |
|||
if (!it.d) { return; } |
|||
str += "<p><a class=\"pin-title\" href=\"" + this.cook(it.u) + "\">" + this.cook(it.d) + "</a>"; |
|||
if (it.n) { |
|||
str += "<span class=\"pin-description\">" + this.cook(it.n) + "</span>\n"; |
|||
} |
|||
if (it.t.length > 0) { |
|||
for (var i = 0; i < it.t.length; i++) { |
|||
var tag = it.t[i]; |
|||
str += " <a class=\"pin-tag\" href=\"http://pinboard.in/u:"+ this.cook(it.a) + "/t:" + this.cook(tag) + "\">" + this.cook(tag) + "</a> "; |
|||
} |
|||
} |
|||
str += "</p></li>\n"; |
|||
return str; |
|||
} |
|||
} |
|||
Pinboard_Linkroll.prototype = new Pinboard_Linkroll(); |
@ -1,70 +0,0 @@ |
|||
/* http://www.JSON.org/json2.js 2009-09-29 Public Domain. NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. See http://www.JSON.org/js.html */ |
|||
if(!this.JSON){this.JSON={}}(function(){function l(c){return c<10?'0'+c:c}if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(c){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+l(this.getUTCMonth()+1)+'-'+l(this.getUTCDate())+'T'+l(this.getUTCHours())+':'+l(this.getUTCMinutes())+':'+l(this.getUTCSeconds())+'Z':null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(c){return this.valueOf()}}var o=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,p=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,h,m,r={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},j;function q(a){p.lastIndex=0;return p.test(a)?'"'+a.replace(p,function(c){var f=r[c];return typeof f==='string'?f:'\\u'+('0000'+c.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function n(c,f){var a,e,d,i,k=h,g,b=f[c];if(b&&typeof b==='object'&&typeof b.toJSON==='function'){b=b.toJSON(c)}if(typeof j==='function'){b=j.call(f,c,b)}switch(typeof b){case'string':return q(b);case'number':return isFinite(b)?String(b):'null';case'boolean':case'null':return String(b);case'object':if(!b){return'null'}h+=m;g=[];if(Object.prototype.toString.apply(b)==='[object Array]'){i=b.length;for(a=0;a<i;a+=1){g[a]=n(a,b)||'null'}d=g.length===0?'[]':h?'[\n'+h+g.join(',\n'+h)+'\n'+k+']':'['+g.join(',')+']';h=k;return d}if(j&&typeof j==='object'){i=j.length;for(a=0;a<i;a+=1){e=j[a];if(typeof e==='string'){d=n(e,b);if(d){g.push(q(e)+(h?': ':':')+d)}}}}else{for(e in b){if(Object.hasOwnProperty.call(b,e)){d=n(e,b);if(d){g.push(q(e)+(h?': ':':')+d)}}}}d=g.length===0?'{}':h?'{\n'+h+g.join(',\n'+h)+'\n'+k+'}':'{'+g.join(',')+'}';h=k;return d}}if(typeof JSON.stringify!=='function'){JSON.stringify=function(c,f,a){var e;h='';m='';if(typeof a==='number'){for(e=0;e<a;e+=1){m+=' '}}else if(typeof a==='string'){m=a}j=f;if(f&&typeof f!=='function'&&(typeof f!=='object'||typeof f.length!=='number')){throw new Error('JSON.stringify');}return n('',{'':c})}}if(typeof JSON.parse!=='function'){JSON.parse=function(i,k){var g;function b(c,f){var a,e,d=c[f];if(d&&typeof d==='object'){for(a in d){if(Object.hasOwnProperty.call(d,a)){e=b(d,a);if(e!==undefined){d[a]=e}else{delete d[a]}}}}return k.call(c,f,d)}o.lastIndex=0;if(o.test(i)){i=i.replace(o,function(c){return'\\u'+('0000'+c.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(i.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){g=eval('('+i+')');return typeof k==='function'?b({'':g},''):g}throw new SyntaxError('JSON.parse');}}}()); |
|||
|
|||
// jXHR.js (JSON-P XHR) | v0.1 (c) Kyle Simpson | MIT License
|
|||
(function(c){var b=c.setTimeout,d=c.document,a=0;c.jXHR=function(){var e,g,n,h,m=null;function l(){try{h.parentNode.removeChild(h)}catch(o){}}function k(){g=false;e="";l();h=null;i(0)}function f(p){try{m.onerror.call(m,p,e)}catch(o){throw new Error(p)}}function j(){if((this.readyState&&this.readyState!=="complete"&&this.readyState!=="loaded")||g){return}this.onload=this.onreadystatechange=null;g=true;if(m.readyState!==4){f("Script failed to load ["+e+"].")}l()}function i(o,p){p=p||[];m.readyState=o;if(typeof m.onreadystatechange==="function"){m.onreadystatechange.apply(m,p)}}m={onerror:null,onreadystatechange:null,readyState:0,open:function(p,o){k();internal_callback="cb"+(a++);(function(q){c.jXHR[q]=function(){try{i.call(m,4,arguments)}catch(r){m.readyState=-1;f("Script failed to run ["+e+"].")}c.jXHR[q]=null}})(internal_callback);e=o.replace(/=\?/,"=jXHR."+internal_callback);i(1)},send:function(){b(function(){h=d.createElement("script");h.setAttribute("type","text/javascript");h.onload=h.onreadystatechange=function(){j.call(h)};h.setAttribute("src",e);d.getElementsByTagName("head")[0].appendChild(h)},0);i(2)},setRequestHeader:function(){},getResponseHeader:function(){return""},getAllResponseHeaders:function(){return[]}};k();return m}})(window); |
|||
|
|||
function getTwitterFeed(success, user, count, replies) { |
|||
feed = new jXHR(); |
|||
feed.onerror = function (msg,url) { alert(msg); } |
|||
feed.onreadystatechange = function(data){ |
|||
if (feed.readyState === 4) { |
|||
var tweets = new Array(); |
|||
for (i in data){ |
|||
if(tweets.length < count){ |
|||
if(replies || data[i].in_reply_to_user_id == null){ |
|||
tweets.push(data[i]); |
|||
} |
|||
} |
|||
} |
|||
success(tweets); |
|||
} |
|||
}; |
|||
feed.open("GET","http://twitter.com/statuses/user_timeline/"+user+".json?trim_user=true&count="+parseInt(count)+25+"&callback=?"); |
|||
feed.send(); |
|||
} |
|||
|
|||
getTwitterFeed(showTwitterFeed, twitter_user, tweet_count, show_replies); |
|||
|
|||
function showTwitterFeed(tweets){ |
|||
var timeline = document.getElementById('tweets'); |
|||
timeline.innerHTML=''; |
|||
for (t in tweets){ |
|||
timeline.innerHTML+='<li>'+'<p>'+linkifyTweet(tweets[t].text)+'<a href="http://twitter.com/'+twitter_user+'/status/'+tweets[t].id_str+'">'+prettyDate(tweets[t].created_at)+'</a></p>'+'</li>'; |
|||
} |
|||
} |
|||
function linkifyTweet(text){ |
|||
return text.replace(/(https?:\/\/[\w\-:;?&=+.%#\/]+)/gi, '<a href="$1">$1</a>') |
|||
.replace(/(^|\W)@(\w+)/g, '$1<a href="http://twitter.com/$2">@$2</a>') |
|||
.replace(/(^|\W)#(\w+)/g, '$1#<a href="http://search.twitter.com/search?q=%23$2">$2</a>'); |
|||
} |
|||
|
|||
function prettyDate(date_str){ |
|||
var time_formats = [ |
|||
[60, 'just now', 1], // 60
|
|||
[120, '1 min', '1 minute from now'], // 60*2
|
|||
[3600, 'mins', 60], // 60*60, 60
|
|||
[7200, '1 hour', '1 hour from now'], // 60*60*2
|
|||
[86400, 'hours', 3600], // 60*60*24, 60*60
|
|||
[172800, '1 day', 'tomorrow'], // 60*60*24*2
|
|||
[2903040000, 'days', 86400], // 60*60*24*7, 60*60*24
|
|||
]; |
|||
var time = ('' + date_str).replace(/-/g,"/").replace(/[TZ]/g," ").replace(/^\s\s*/, '').replace(/\s\s*$/, ''); |
|||
if(time.substr(time.length-4,1)==".") time =time.substr(0,time.length-4); |
|||
var seconds = (new Date - new Date(time)) / 1000; |
|||
var token = 'ago', list_choice = 1; |
|||
if (seconds < 0) { |
|||
seconds = Math.abs(seconds); |
|||
token = 'from now'; |
|||
list_choice = 2; |
|||
} |
|||
var i = 0, format; |
|||
while (format = time_formats[i++]) |
|||
if (seconds < format[0]) { |
|||
if (typeof format[2] == 'string') |
|||
return format[list_choice]; |
|||
else |
|||
return Math.floor(seconds / format[2]) + ' ' + format[1]; |
|||
} |
|||
return time; |
|||
}; |
@ -1,35 +0,0 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> |
|||
<url> |
|||
<loc>http://yoursite.com/about.haml</loc> |
|||
<lastmod>2011-05-14</lastmod> |
|||
</url> |
|||
<url> |
|||
<loc>http://yoursite.com/atom.xml</loc> |
|||
<lastmod>2011-05-12</lastmod> |
|||
</url> |
|||
<url> |
|||
<loc>http://yoursite.com/</loc> |
|||
<lastmod>2011-05-12</lastmod> |
|||
</url> |
|||
<url> |
|||
<loc>http://yoursite.com/test/syntax.html</loc> |
|||
<lastmod>2010-04-10</lastmod> |
|||
</url> |
|||
<url> |
|||
<loc>http://yoursite.com/test/typography.haml</loc> |
|||
<lastmod>2011-05-14</lastmod> |
|||
</url> |
|||
<url> |
|||
<loc>http://yoursite.com/2011/04/07/test-of-typography</loc> |
|||
<lastmod>2011-04-07</lastmod> |
|||
</url> |
|||
<url> |
|||
<loc>http://yoursite.com/2011/03/14/test-post</loc> |
|||
<lastmod>2011-03-14</lastmod> |
|||
</url> |
|||
<url> |
|||
<loc>http://yoursite.com/2009/11/13/hello-world</loc> |
|||
<lastmod>2009-11-13</lastmod> |
|||
</url> |
|||
</urlset> |
File diff suppressed because one or more lines are too long
@ -1,45 +1,44 @@ |
|||
// Link Colors |
|||
$link_color: lighten(#165b94, 0.3); |
|||
$link-color: lighten(#165b94, 3); |
|||
$link-color-hover: darken(#165b94, 5); |
|||
|
|||
// Main Section Colors |
|||
$body_color: #333333; |
|||
$light_text: #999999; |
|||
$body_bg: #323232; |
|||
$body-color: #333333; |
|||
$light-text: #999999; |
|||
$body-bg: #323232; |
|||
|
|||
$header_bg: #323232; |
|||
$header_border: #181818; |
|||
$title_color: #dddddd; |
|||
$header-bg: #323232; |
|||
$header-border: #181818; |
|||
$title-color: #dddddd; |
|||
|
|||
$nav_color: #555555; |
|||
$nav_color_hover: black; |
|||
$nav_bg: #e8e8e8; |
|||
$nav_border_top: white; |
|||
$nav_border_bottom: #aaaaaa; |
|||
$nav_border_left: #cccccc; |
|||
$nav_border_right: white; |
|||
$nav-color: #555555; |
|||
$nav-color_hover: black; |
|||
$nav-bg: #e8e8e8; |
|||
$nav-border_top: white; |
|||
$nav-border_bottom: #aaaaaa; |
|||
$nav-border_left: #cccccc; |
|||
$nav-border_right: white; |
|||
|
|||
$sidebar_bg: #f2f2f2; |
|||
$sidebar_border: #d5d5d5; |
|||
$sidebar-bg: #f2f2f2; |
|||
$sidebar-border: #d5d5d5; |
|||
|
|||
// Blog |
|||
$article_border: #eeeeee; |
|||
$main_bg: #fff; |
|||
$article-border: #eeeeee; |
|||
$main-bg: #fff; |
|||
|
|||
$footer_color: #999999; |
|||
$footer_bg: #444444; |
|||
$footer-color: #999999; |
|||
$footer-bg: #444444; |
|||
|
|||
// Form Colors |
|||
$fieldset_bg: #ececec; |
|||
$fieldset_border: #c3c3c3; |
|||
|
|||
$textinput_color: #333333; |
|||
$textinput_bg: #f4f4f4; |
|||
$textinput_bg_focus: #fefeee; |
|||
|
|||
$textinput_border_top: #aaaaaa; |
|||
$textinput_border_bottom: #c6c6c6; |
|||
$textinput_border_left: #c3c3c3; |
|||
$textinput_border_right: #c3c3c3; |
|||
$textinput_border_focus: #989898; |
|||
|
|||
$twitter_topic: #888888; |
|||
$fieldset-bg: #ececec; |
|||
$fieldset-border: #c3c3c3; |
|||
|
|||
$textinput-color: #333333; |
|||
$textinput-bg: #f4f4f4; |
|||
$textinput-bg-focus: #fefeee; |
|||
|
|||
$textinput-border-top: #aaaaaa; |
|||
$textinput-border-bottom: #c6c6c6; |
|||
$textinput-border-left: #c3c3c3; |
|||
$textinput-border-right: #c3c3c3; |
|||
$textinput-border-focus: #989898; |
|||
|
@ -0,0 +1,15 @@ |
|||
#pinboard_linkroll { |
|||
.pin-title, .pin-description { |
|||
display: block; |
|||
margin-bottom: .5em; |
|||
} |
|||
.pin-tag { |
|||
@extend .aside-alt-link; |
|||
&:after { |
|||
content: ','; |
|||
} |
|||
&:last-child:after { |
|||
content: ''; |
|||
} |
|||
} |
|||
} |
@ -1,12 +0,0 @@ |
|||
#collapser { |
|||
display: block; |
|||
cursor: pointer; |
|||
background: #f8f8f8; |
|||
color: #888888; |
|||
padding: 5px 10px; |
|||
font-size: 10px; |
|||
line-height: 150%; |
|||
cursor: pointer; |
|||
position: absolute; |
|||
top: 0; |
|||
right: 0; } |
@ -1,279 +1,167 @@ |
|||
.code_window { |
|||
@include border-top-radius(5px); |
|||
@include border-bottom-radius(2px); |
|||
background: #aaaaaa image-url("code_bg.png") top repeat-x; |
|||
position: relative; |
|||
margin: 0.3em 0 1.3em; |
|||
padding: 0 3px 3px; |
|||
font-size: 14px; |
|||
border: 1px solid #898989; |
|||
border-top-color: #cbcbcb; |
|||
border-left-color: #a5a5a5; |
|||
border-right-color: #a5a5a5; |
|||
em { |
|||
text-align: center; |
|||
text-shadow: #cccccc 1px 1px 1px; |
|||
display: block; |
|||
padding: 1px 0; |
|||
color: #333333; |
|||
font-style: normal; } |
|||
.highlight { |
|||
margin: 0; } } |
|||
$base03: #002b36; //darkest blue |
|||
$base02: #073642; //dark blue |
|||
$base01: #586e75; //darkest gray |
|||
$base00: #657b83; //dark gray |
|||
$base0: #839496; //medium gray |
|||
$base1: #93a1a1; //medium light gray |
|||
$base2: #eee8d5; //cream |
|||
$base3: #fdf6e3; //white |
|||
$yellow: #b58900; |
|||
$orange: #cb4b16; |
|||
$red: #dc322f; |
|||
$magenta: #d33682; |
|||
$violet: #6c71c4; |
|||
$blue: #268bd2; |
|||
$cyan: #2aa198; |
|||
$green: #859900; |
|||
|
|||
pre { |
|||
color: #cccccc; |
|||
font-size: 13px; |
|||
background: #222222; |
|||
line-height: 1.5em; |
|||
border: #aaaaaa 1px solid; |
|||
overflow-x: auto; |
|||
overflow-y: hidden; |
|||
padding: 25px 20px; |
|||
.lineno { |
|||
color: #888888; |
|||
background: #e3e3e3; |
|||
display: inline-block; |
|||
padding: 0 0 0 10px; |
|||
&:first-child { |
|||
padding-top: 15px; |
|||
display: inline-block; } } } |
|||
// If you prefer light colors, uncomment the following block to change themes |
|||
//$base03: $base3; |
|||
//$base02: $base2; |
|||
//$base01: $base1; |
|||
//$base00: $base0; |
|||
//$base0: $base00; |
|||
//$base1: $base01; |
|||
//$base2: $base02; |
|||
//$base3: $base03; |
|||
|
|||
.highlight { |
|||
position: relative; |
|||
.pre_expander { |
|||
font-size: 10px; |
|||
.gutter { |
|||
.line-numbers { |
|||
text-align: right; |
|||
padding: 4px 8px; |
|||
line-height: 150%; |
|||
position: absolute; |
|||
cursor: pointer; |
|||
top: 2px; |
|||
right: 2px; |
|||
@include border-bottom-left-radius; |
|||
display: block; |
|||
color: #777777; |
|||
background: #333333; |
|||
&:hover { |
|||
background: #444444; |
|||
color: #cccccc; } } } |
|||
background: $base02 !important; |
|||
border-right: 1px solid darken($base03, 2); |
|||
@include box-shadow(lighten($base02, 2) -1px 0 inset); |
|||
text-shadow: darken($base02, 10) 0 -1px; |
|||
span { color: $base01 !important; } |
|||
} |
|||
} |
|||
html .gist .gist-file { |
|||
margin-bottom: 1.5em; |
|||
border: none; |
|||
.gist-syntax { |
|||
border-bottom: 1px solid #515151 !important; |
|||
.gist-highlight{ |
|||
background: $base03 !important; |
|||
pre { |
|||
@extend .pre; |
|||
overflow-y: hidden; |
|||
overflow-x: auto; |
|||
} |
|||
} |
|||
} |
|||
.gist-meta { |
|||
@include background(linear-gradient(#b0b0b0, #a7a7a7)); |
|||
padding: 0.5em; |
|||
background-color: #bababa !important; |
|||
border: 1px solid #9c9c9c; |
|||
border-top: 1px solid #d0d0d0; |
|||
border-bottom: 1px solid #777777; |
|||
font-size: .7em !important; |
|||
font-family: "Helvetica Neue", Arial, sans-serif !important; |
|||
color: #464646 !important; |
|||
line-height: 1.4em; |
|||
} |
|||
} |
|||
pre { @extend .pre; } |
|||
|
|||
// based on: http://github.com/mojombo/tpw/raw/master/css/syntax.css |
|||
.editor { |
|||
background: rgb(0, 22, 41); |
|||
line-height: 1.25; } |
|||
.pre { |
|||
@extend .mono; |
|||
font-size: .8em; |
|||
line-height: 1.45em; |
|||
padding: 1em 1.2em !important; |
|||
background: $base03 !important; |
|||
color: $base1 !important; |
|||
span { color: $base1 !important; } |
|||
span { font-style: normal !important; font-weight: normal !important; } |
|||
|
|||
pre.console { |
|||
background-color: black; |
|||
color: lighten(green, 25); |
|||
letter-spacing: 1px; |
|||
padding: 0.5em; |
|||
.prompt { |
|||
color: lighten(navy, 50); |
|||
&:before { |
|||
color: white; |
|||
content: "["; } |
|||
&:after { |
|||
color: white; |
|||
content: "]"; } } |
|||
.stdin { |
|||
font-weight: bold; |
|||
color: lighten(green, 75); } } |
|||
.c { color: $base01 !important; font-style: italic !important; } /* Comment */ |
|||
.cm { color: $base01 !important; font-style: italic !important; } /* Comment.Multiline */ |
|||
.cp { color: $base01 !important; font-style: italic !important; } /* Comment.Preproc */ |
|||
.c1 { color: $base01 !important; font-style: italic !important; } /* Comment.Single */ |
|||
.cs { color: $base01 !important; font-weight: bold !important; font-style: italic !important; } /* Comment.Special */ |
|||
.err { color: $red !important; background: none !important; } /* Error */ |
|||
.k { color: $orange !important; } /* Keyword */ |
|||
.o { color: $base1 !important; font-weight: bold !important; } /* Operator */ |
|||
.p { color: $base1 !important; } /* Operator */ |
|||
.ow { color: $cyan !important; font-weight: bold !important; } /* Operator.Word */ |
|||
.gd { color: $base1 !important; background-color: mix($red, $base03, 25%) !important; display: block; } /* Generic.Deleted */ |
|||
.gd .x { color: $base1 !important; background-color: mix($red, $base03, 35%) !important; display: block; } /* Generic.Deleted.Specific */ |
|||
.ge { color: $base1 !important; font-style: italic !important; } /* Generic.Emph */ |
|||
//.gr { color: #aa0000 } /* Generic.Error */ |
|||
.gh { color: $base01 !important; } /* Generic.Heading */ |
|||
.gi { color: $base1 !important; background-color: mix($green, $base03, 20%) !important; display: block; } /* Generic.Inserted */ |
|||
.gi .x { color: $base1 !important; background-color: mix($green, $base03, 40%) !important; display: block; } /* Generic.Inserted.Specific */ |
|||
//.go { color: #888888 } /* Generic.Output */ |
|||
//.gp { color: #555555 } /* Generic.Prompt */ |
|||
.gs { color: $base1 !important; font-weight: bold !important; } /* Generic.Strong */ |
|||
.gu { color: $violet !important; } /* Generic.Subheading */ |
|||
//.gt { color: #aa0000 } /* Generic.Traceback */ |
|||
.kc { color: $green !important; font-weight: bold !important; } /* Keyword.Constant */ |
|||
.kd { color: $blue !important; } /* Keyword.Declaration */ |
|||
.kp { color: $orange !important; font-weight: bold !important; } /* Keyword.Pseudo */ |
|||
.kr { color: $magenta !important; font-weight: bold !important; } /* Keyword.Reserved */ |
|||
.kt { color: $cyan !important; } /* Keyword.Type */ |
|||
.n { color: $blue !important; } |
|||
.na { color: $blue !important; } /* Name.Attribute */ |
|||
.nb { color: $green !important; } /* Name.Builtin */ |
|||
//.nc { color: #445588; font-weight: bold } /* Name.Class */ |
|||
.no { color: $yellow !important; } /* Name.Constant */ |
|||
//.ni { color: #800080 } /* Name.Entity */ |
|||
.ne { color: $blue !important; font-weight: bold !important; } /* Name.Exception */ |
|||
.nf { color: $blue !important; font-weight: bold !important; } /* Name.Function */ |
|||
.nn { color: $yellow !important; } /* Name.Namespace */ |
|||
.nt { color: $blue !important; font-weight: bold !important; } /* Name.Tag */ |
|||
.nx { color: $yellow !Important; } |
|||
//.bp { color: #999999 } /* Name.Builtin.Pseudo */ |
|||
//.vc { color: #008080 } /* Name.Variable.Class */ |
|||
.vg { color: $blue !important; } /* Name.Variable.Global */ |
|||
.vi { color: $blue !important; } /* Name.Variable.Instance */ |
|||
.nv { color: $blue !important; } /* Name.Variable */ |
|||
//.w { color: #bbbbbb } /* Text.Whitespace */ |
|||
.mf { color: $cyan !important; } /* Literal.Number.Float */ |
|||
.m { color: $cyan !important; } /* Literal.Number */ |
|||
.mh { color: $cyan !important; } /* Literal.Number.Hex */ |
|||
.mi { color: $cyan !important; } /* Literal.Number.Integer */ |
|||
//.mo { color: #009999 } /* Literal.Number.Oct */ |
|||
.s { color: $cyan !important; } /* Literal.String */ |
|||
//.sb { color: #d14 } /* Literal.String.Backtick */ |
|||
//.sc { color: #d14 } /* Literal.String.Char */ |
|||
.sd { color: $cyan !important; } /* Literal.String.Doc */ |
|||
.s2 { color: $cyan !important; } /* Literal.String.Double */ |
|||
.se { color: $red !important; } /* Literal.String.Escape */ |
|||
//.sh { color: #d14 } /* Literal.String.Heredoc */ |
|||
.si { color: $blue !important; } /* Literal.String.Interpol */ |
|||
//.sx { color: #d14 } /* Literal.String.Other */ |
|||
.sr { color: $cyan !important; } /* Literal.String.Regex */ |
|||
.s1 { color: $cyan !important; } /* Literal.String.Single */ |
|||
//.ss { color: #990073 } /* Literal.String.Symbol */ |
|||
//.il { color: #009999 } /* Literal.Number.Integer.Long */ |
|||
} |
|||
|
|||
.highlight { |
|||
padding: 0 0 0.1em; |
|||
color: white; |
|||
// Comment |
|||
.c { |
|||
color: #999988; |
|||
font-style: italic; } |
|||
// Error |
|||
.err { |
|||
color: #a61717; |
|||
background-color: #e3d2d2; } |
|||
// Name |
|||
.n { |
|||
color: white; } |
|||
// Keyword |
|||
.k { |
|||
color: rgb(255, 157, 0); } |
|||
// Paren |
|||
.p { |
|||
color: darken(#ff9d00, 33); } |
|||
// Operator |
|||
.o { |
|||
color: rgb(255, 157, 0); } |
|||
// Comment.Multiline |
|||
.cm { |
|||
color: #999988; |
|||
font-style: italic; } |
|||
// Comment.Preproc |
|||
.cp { |
|||
color: #999999; } |
|||
// Comment.Single |
|||
.c1 { |
|||
color: #999988; |
|||
font-style: italic; } |
|||
// Comment.Special |
|||
.cs { |
|||
color: #999999; |
|||
font-style: italic; } |
|||
// Generic.Deleted |
|||
.gd { |
|||
color: black; |
|||
background-color: #ffdddd; } |
|||
// Generic.Deleted.Specific |
|||
.gd .x { |
|||
color: black; |
|||
background-color: #ffaaaa; } |
|||
// Generic.Emph |
|||
.ge { |
|||
font-style: italic; } |
|||
// Generic.Error |
|||
.gr { |
|||
color: #aa0000; } |
|||
// Generic.Heading |
|||
.gh { |
|||
color: #999999; } |
|||
// Generic.Inserted |
|||
.gi { |
|||
color: black; |
|||
background-color: #ddffdd; } |
|||
// Generic.Inserted.Specific |
|||
.gi .x { |
|||
color: black; |
|||
background-color: #aaffaa; } |
|||
// Generic.Output |
|||
.go { |
|||
color: #888888; } |
|||
// Generic.Prompt |
|||
.gp { |
|||
color: #555555; } |
|||
// Generic.Strong |
|||
.gs { |
|||
color: white; } |
|||
// Generic.Subheading |
|||
.gu { |
|||
color: #aaaaaa; } |
|||
// Generic.Traceback |
|||
.gt { |
|||
color: #aa0000; } |
|||
// Keyword.Constant |
|||
.kc { |
|||
color: white; } |
|||
// Keyword.Declaration |
|||
.kd { |
|||
color: white; } |
|||
// Keyword.Pseudo |
|||
.kp { |
|||
color: white; } |
|||
// Keyword.Reserved |
|||
.kr { |
|||
color: white; } |
|||
// Keyword.Type |
|||
.kt { |
|||
color: #445588; } |
|||
// Literal.Number |
|||
.m { |
|||
color: rgb(255, 98, 140); } |
|||
// Literal.String |
|||
.s { |
|||
color: #dd1144; } |
|||
// Name.Attribute |
|||
.na { |
|||
color: teal; } |
|||
// Name.Builtin |
|||
.nb { |
|||
color: darken(rgb(128, 255, 187), 20); } |
|||
// Name.Class |
|||
.nc { |
|||
color: darken(rgb(128, 255, 187), 20); } |
|||
// Name.Constant |
|||
.no { |
|||
color: rgb(128, 255, 187); } |
|||
// Name.Entity |
|||
.ni { |
|||
color: purple; } |
|||
// Name.Exception |
|||
.ne { |
|||
color: rgb(255, 221, 0); } |
|||
// Name.Function |
|||
.nf { |
|||
color: rgb(255, 221, 0); } |
|||
// Name.Namespace |
|||
.nn { |
|||
color: #555555; } |
|||
// Name.Tag |
|||
.nt { |
|||
color: white; } |
|||
// Name.Variable |
|||
.nv { |
|||
color: teal; } |
|||
// Operator.Word |
|||
.ow { |
|||
color: white; } |
|||
// Text.Whitespace |
|||
.w { |
|||
color: #bbbbbb; } |
|||
// Literal.Number |
|||
.nl { |
|||
color: rgb(255, 98, 140); } |
|||
// Literal.Number.Float |
|||
.mf { |
|||
color: rgb(255, 98, 140); } |
|||
// Literal.Number.Hex |
|||
.mh { |
|||
color: rgb(255, 98, 140); } |
|||
// Literal.Number.Integer |
|||
.mi { |
|||
color: rgb(255, 98, 140); } |
|||
// Literal.Number.Oct |
|||
.mo { |
|||
color: rgb(255, 98, 140); } |
|||
// Literal.String.Backtick |
|||
.sb { |
|||
color: rgb(58, 217, 0); } |
|||
// Literal.String.Char |
|||
.sc { |
|||
color: rgb(58, 217, 0); } |
|||
// Literal.String.Doc |
|||
.sd { |
|||
color: rgb(58, 217, 0); } |
|||
// Literal.String.Double |
|||
.s2 { |
|||
color: rgb(58, 217, 0); } |
|||
// Literal.String.Escape |
|||
.se { |
|||
color: rgb(58, 217, 0); } |
|||
// Literal.String.Heredoc |
|||
.sh { |
|||
color: rgb(58, 217, 0); } |
|||
// Literal.String.Interpol |
|||
.si { |
|||
color: rgb(158, 255, 128); } |
|||
// Literal.String.Other |
|||
.sx { |
|||
color: rgb(58, 217, 0); } |
|||
// Literal.String.Regex |
|||
.sr { |
|||
color: #009926; } |
|||
// Literal.String.Single |
|||
.s1 { |
|||
color: rgb(58, 217, 0); } |
|||
// Literal.String.Symbol |
|||
.ss { |
|||
color: rgb(255, 98, 140); } |
|||
// Name.Builtin.Pseudo |
|||
.bp { |
|||
color: #999999; } |
|||
// Name.Variable.Class |
|||
.vc { |
|||
color: teal; } |
|||
// Name.Variable.Global |
|||
.vg { |
|||
color: teal; } |
|||
// Name.Variable.Instance |
|||
.vi { |
|||
color: teal; } |
|||
// Literal.Number.Integer.Long |
|||
.il { |
|||
color: rgb(255, 98, 140); } } |
|||
margin-bottom: 1.5em; |
|||
overflow-y: hidden; |
|||
.gutter pre { |
|||
padding-left: .8em !important; |
|||
padding-right: .8em !important; |
|||
} |
|||
} |
|||
|
|||
h3.filename { |
|||
font-size: 13px; |
|||
line-height: 2em; |
|||
text-align: center; |
|||
text-shadow: #cbcccc 0 1px 0; |
|||
color: #474747; |
|||
font-style: normal; |
|||
margin-bottom: 0; |
|||
|
|||
@include border-top-radius(5px); |
|||
font-family: "Helvetica Neue",Arial, "Lucida Grande", "Lucida Sans Unicode", Lucida, sans-serif; |
|||
background: #aaaaaa image-url("code_bg.png") top repeat-x; |
|||
border: 1px solid #565656; |
|||
border-top-color: #cbcbcb; |
|||
border-left-color: #a5a5a5; |
|||
border-right-color: #a5a5a5; |
|||
border-bottom: 0; |
|||
} |
|||
|
@ -1,15 +1,49 @@ |
|||
#twitter { |
|||
#tweets { |
|||
a { |
|||
color: #666; |
|||
text-decoration: none; |
|||
&:hover { text-decoration: underline; } |
|||
} |
|||
li:hover a[href*='status']{ |
|||
color: #666; |
|||
} |
|||
p { |
|||
padding-bottom: 10px; |
|||
a.topic { |
|||
color: $twitter_topic; } } |
|||
.meta { |
|||
color: $light_text; |
|||
font-size: 80%; |
|||
display: block; |
|||
padding: 8px 0 0; |
|||
a { |
|||
color: inherit; |
|||
position: relative; |
|||
padding-right: 1.4em; |
|||
} |
|||
a[href*='status']{ |
|||
color: #ccc; |
|||
position: absolute; |
|||
top: 0; |
|||
right: -.5em; |
|||
text-decoration: none; |
|||
padding: 0 .5em .1em; |
|||
text-shadow: #fff 0 1px; |
|||
span:last-child { |
|||
display: none; |
|||
font-size: .7em; |
|||
} |
|||
span:first-child { |
|||
font-size: 1.1em; |
|||
} |
|||
&:hover { |
|||
span:first-child{ display: none; } |
|||
span:last-child{ display: inline-block; } |
|||
background: #e5e5e5; |
|||
@include box-shadow($sidebar-bg -2px 2px 8px 8px); |
|||
@include border-radius(1em); |
|||
text-decoration: none; |
|||
&:hover { |
|||
text-decoration: underline; } } } } |
|||
line-height: 1.2em; |
|||
span:last-child { |
|||
color: #444; |
|||
//text-shadow: #eee 0 1px; |
|||
} |
|||
} |
|||
} |
|||
a[href*='twitter.com/search']{ |
|||
@extend .aside-alt-link; |
|||
&:hover { |
|||
text-decoration: underline; |
|||
} |
|||
} |
|||
} |
|||
|
@ -0,0 +1,19 @@ |
|||
--- |
|||
layout: default |
|||
--- |
|||
<div id="content"> |
|||
<div class="post"> |
|||
<h1 class="post-title">{{ page.month | date_to_month }} {{ page.year }}</h1> |
|||
<p class="lead">Posts from {{ page.month | date_to_month }}, {{ page.year }}</p> |
|||
<ul> |
|||
{% for d in (1..31) reversed %} |
|||
{% if page.collated_posts[page.year][page.month][d] %} |
|||
{% for p in page.collated_posts[page.year][page.month][d] reversed %} |
|||
<li><a href='{{ p.url }}'>{{ p.title }}</a></li> |
|||
{% endfor %} |
|||
{% endif %} |
|||
{% endfor %} |
|||
</ul> |
|||
</div> |
|||
</div> |
|||
|
@ -0,0 +1,25 @@ |
|||
--- |
|||
layout: default |
|||
--- |
|||
<div id="content"> |
|||
<div class="post"> |
|||
<h1 class="post-title">{{ page.year }}</h1> |
|||
<p class="lead">Posts from the year {{ page.year }}</p> |
|||
{% for m in (1..12) reversed %} |
|||
{% if page.collated_posts[page.year][m] %} |
|||
<h3>{{ m | date_to_month }}</h3> |
|||
{% for d in (1..31) reversed %} |
|||
{% if page.collated_posts[page.year][m][d] %} |
|||
{% for p in page.collated_posts[page.year][m][d] reversed %} |
|||
<div> |
|||
<strong>{{ p.date | date: "%d" }}</strong> |
|||
<a href='{{ p.url }}'>{{ p.title }}</a> |
|||
</div> |
|||
{% endfor %} |
|||
{% endif %} |
|||
{% endfor %} |
|||
{% endif %} |
|||
{% endfor %} |
|||
</div> |
|||
</div> |
|||
|
@ -0,0 +1,24 @@ |
|||
--- |
|||
layout: page |
|||
title: Blog Archive |
|||
nometa: true |
|||
--- |
|||
{% for post in site.posts reverse %} |
|||
{% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %} |
|||
{% capture this_month %}{{ post.date | date: "%B" }}{% endcapture %} |
|||
{% unless year == this_year %} |
|||
{% unless forloop.first %}</ul>{% endunless %} |
|||
{% assign year = this_year %} |
|||
<h2>{{ year }}</h2> |
|||
<ul class="blog_archives"> |
|||
{% endunless %} |
|||
{% unless month == this_month %} |
|||
{% assign month = this_month %} |
|||
<li><h4>{{ month }}</h4></li> |
|||
{% endunless %} |
|||
<li> |
|||
<time datetime="{{ post.date | datetime }}" pubdate>{{ post.date | date: "%d"}}</time> |
|||
<a href="{{ post.url }}">{{post.title}}</a> |
|||
</li> |
|||
{% if forloop.last %}</ul>{% endif %} |
|||
{% endfor %} |
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
@ -0,0 +1,292 @@ |
|||
/* |
|||
* respond.js - A small and fast polyfill for min/max-width CSS3 Media Queries |
|||
* Copyright 2011, Scott Jehl, scottjehl.com |
|||
* Dual licensed under the MIT or GPL Version 2 licenses. |
|||
* Usage: Check out the readme file or github.com/scottjehl/respond |
|||
*/ |
|||
(function( win, mqSupported ){ |
|||
//exposed namespace
|
|||
win.respond = {}; |
|||
|
|||
//define update even in native-mq-supporting browsers, to avoid errors
|
|||
respond.update = function(){}; |
|||
|
|||
//expose media query support flag for external use
|
|||
respond.mediaQueriesSupported = mqSupported; |
|||
|
|||
//if media queries are supported, exit here
|
|||
if( mqSupported ){ return; } |
|||
|
|||
//define vars
|
|||
var doc = win.document, |
|||
docElem = doc.documentElement, |
|||
mediastyles = [], |
|||
rules = [], |
|||
appendedEls = [], |
|||
parsedSheets = {}, |
|||
resizeThrottle = 30, |
|||
head = doc.getElementsByTagName( "head" )[0] || docElem, |
|||
links = head.getElementsByTagName( "link" ), |
|||
requestQueue = [], |
|||
|
|||
//loop stylesheets, send text content to translate
|
|||
ripCSS = function(){ |
|||
var sheets = links, |
|||
sl = sheets.length, |
|||
i = 0, |
|||
//vars for loop:
|
|||
sheet, href, media, isCSS; |
|||
|
|||
for( ; i < sl; i++ ){ |
|||
sheet = sheets[ i ], |
|||
href = sheet.href, |
|||
media = sheet.media, |
|||
isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet"; |
|||
|
|||
//only links plz and prevent re-parsing
|
|||
if( !!href && isCSS && !parsedSheets[ href ] ){ |
|||
if( !/^([a-zA-Z]+?:(\/\/)?(www\.)?)/.test( href ) |
|||
|| href.replace( RegExp.$1, "" ).split( "/" )[0] === win.location.host ){ |
|||
requestQueue.push( { |
|||
href: href, |
|||
media: media |
|||
} ); |
|||
} |
|||
else{ |
|||
parsedSheets[ href ] = true; |
|||
} |
|||
} |
|||
} |
|||
makeRequests(); |
|||
|
|||
}, |
|||
|
|||
//recurse through request queue, get css text
|
|||
makeRequests = function(){ |
|||
if( requestQueue.length ){ |
|||
var thisRequest = requestQueue.shift(); |
|||
|
|||
ajax( thisRequest.href, function( styles ){ |
|||
translate( styles, thisRequest.href, thisRequest.media ); |
|||
parsedSheets[ thisRequest.href ] = true; |
|||
makeRequests(); |
|||
} ); |
|||
} |
|||
}, |
|||
|
|||
//find media blocks in css text, convert to style blocks
|
|||
translate = function( styles, href, media ){ |
|||
var qs = styles.match( /@media ([^\{]+)\{((?!@media)[\s\S])*(?=\}[\s]*\/\*\/mediaquery\*\/)/gmi ), |
|||
ql = qs && qs.length || 0, |
|||
//try to get CSS path
|
|||
href = href.substring( 0, href.lastIndexOf( "/" )), |
|||
repUrls = function( css ){ |
|||
return css.replace( /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g, "$1" + href + "$2$3" ); |
|||
}, |
|||
useMedia = !ql && media, |
|||
//vars used in loop
|
|||
i = 0, |
|||
j, fullq, thisq, eachq, eql; |
|||
|
|||
//if path exists, tack on trailing slash
|
|||
if( href.length ){ href += "/"; } |
|||
|
|||
//if no internal queries exist, but media attr does, use that
|
|||
//note: this currently lacks support for situations where a media attr is specified on a link AND
|
|||
//its associated stylesheet has internal CSS media queries.
|
|||
//In those cases, the media attribute will currently be ignored.
|
|||
if( useMedia ){ |
|||
ql = 1; |
|||
} |
|||
|
|||
|
|||
for( ; i < ql; i++ ){ |
|||
j = 0; |
|||
|
|||
//media attr
|
|||
if( useMedia ){ |
|||
fullq = media; |
|||
rules.push( repUrls( styles ) ); |
|||
} |
|||
//parse for styles
|
|||
else{ |
|||
fullq = qs[ i ].match( /@media ([^\{]+)\{([\S\s]+?)$/ ) && RegExp.$1; |
|||
rules.push( RegExp.$2 && repUrls( RegExp.$2 ) ); |
|||
} |
|||
|
|||
eachq = fullq.split( "," ); |
|||
eql = eachq.length; |
|||
|
|||
|
|||
for( ; j < eql; j++ ){ |
|||
thisq = eachq[ j ]; |
|||
mediastyles.push( { |
|||
media : thisq.match( /(only\s+)?([a-zA-Z]+)(\sand)?/ ) && RegExp.$2, |
|||
rules : rules.length - 1, |
|||
minw : thisq.match( /\(min\-width:[\s]*([\s]*[0-9]+)px[\s]*\)/ ) && parseFloat( RegExp.$1 ), |
|||
maxw : thisq.match( /\(max\-width:[\s]*([\s]*[0-9]+)px[\s]*\)/ ) && parseFloat( RegExp.$1 ) |
|||
} ); |
|||
} |
|||
} |
|||
|
|||
applyMedia(); |
|||
}, |
|||
|
|||
lastCall, |
|||
|
|||
resizeDefer, |
|||
|
|||
//enable/disable styles
|
|||
applyMedia = function( fromResize ){ |
|||
var name = "clientWidth", |
|||
docElemProp = docElem[ name ], |
|||
currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[ name ] || docElemProp, |
|||
styleBlocks = {}, |
|||
dFrag = doc.createDocumentFragment(), |
|||
lastLink = links[ links.length-1 ], |
|||
now = (new Date()).getTime(); |
|||
|
|||
//throttle resize calls
|
|||
if( fromResize && lastCall && now - lastCall < resizeThrottle ){ |
|||
clearTimeout( resizeDefer ); |
|||
resizeDefer = setTimeout( applyMedia, resizeThrottle ); |
|||
return; |
|||
} |
|||
else { |
|||
lastCall = now; |
|||
} |
|||
|
|||
for( var i in mediastyles ){ |
|||
var thisstyle = mediastyles[ i ]; |
|||
if( !thisstyle.minw && !thisstyle.maxw || |
|||
( !thisstyle.minw || thisstyle.minw && currWidth >= thisstyle.minw ) && |
|||
(!thisstyle.maxw || thisstyle.maxw && currWidth <= thisstyle.maxw ) ){ |
|||
if( !styleBlocks[ thisstyle.media ] ){ |
|||
styleBlocks[ thisstyle.media ] = []; |
|||
} |
|||
styleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] ); |
|||
} |
|||
} |
|||
|
|||
//remove any existing respond style element(s)
|
|||
for( var i in appendedEls ){ |
|||
if( appendedEls[ i ] && appendedEls[ i ].parentNode === head ){ |
|||
head.removeChild( appendedEls[ i ] ); |
|||
} |
|||
} |
|||
|
|||
//inject active styles, grouped by media type
|
|||
for( var i in styleBlocks ){ |
|||
var ss = doc.createElement( "style" ), |
|||
css = styleBlocks[ i ].join( "\n" ); |
|||
|
|||
ss.type = "text/css"; |
|||
ss.media = i; |
|||
|
|||
if ( ss.styleSheet ){ |
|||
ss.styleSheet.cssText = css; |
|||
} |
|||
else { |
|||
ss.appendChild( doc.createTextNode( css ) ); |
|||
} |
|||
dFrag.appendChild( ss ); |
|||
appendedEls.push( ss ); |
|||
} |
|||
|
|||
//append to DOM at once
|
|||
head.insertBefore( dFrag, lastLink.nextSibling ); |
|||
}, |
|||
//tweaked Ajax functions from Quirksmode
|
|||
ajax = function( url, callback ) { |
|||
var req = xmlHttp(); |
|||
if (!req){ |
|||
return; |
|||
} |
|||
req.open( "GET", url, true ); |
|||
req.onreadystatechange = function () { |
|||
if ( req.readyState != 4 || req.status != 200 && req.status != 304 ){ |
|||
return; |
|||
} |
|||
callback( req.responseText ); |
|||
} |
|||
if ( req.readyState == 4 ){ |
|||
return; |
|||
} |
|||
req.send(); |
|||
}, |
|||
//define ajax obj
|
|||
xmlHttp = (function() { |
|||
var xmlhttpmethod = false, |
|||
attempts = [ |
|||
function(){ return new ActiveXObject("Microsoft.XMLHTTP") }, |
|||
function(){ return new XMLHttpRequest() } |
|||
], |
|||
al = attempts.length; |
|||
|
|||
while( al-- ){ |
|||
try { |
|||
xmlhttpmethod = attempts[ al ](); |
|||
} |
|||
catch(e) { |
|||
continue; |
|||
} |
|||
break; |
|||
} |
|||
return function(){ |
|||
return xmlhttpmethod; |
|||
}; |
|||
})(); |
|||
|
|||
//translate CSS
|
|||
ripCSS(); |
|||
|
|||
//expose update for re-running respond later on
|
|||
respond.update = ripCSS; |
|||
|
|||
//adjust on resize
|
|||
function callMedia(){ |
|||
applyMedia( true ); |
|||
} |
|||
if( win.addEventListener ){ |
|||
win.addEventListener( "resize", callMedia, false ); |
|||
} |
|||
else if( win.attachEvent ){ |
|||
win.attachEvent( "onresize", callMedia ); |
|||
} |
|||
})( |
|||
this, |
|||
(function( win ){ |
|||
|
|||
//for speed, flag browsers with window.matchMedia support and IE 9 as supported
|
|||
if( win.matchMedia ){ return true; } |
|||
|
|||
var bool, |
|||
doc = document, |
|||
docElem = doc.documentElement, |
|||
refNode = docElem.firstElementChild || docElem.firstChild, |
|||
// fakeBody required for <FF4 when executed in <head>
|
|||
fakeUsed = !doc.body, |
|||
fakeBody = doc.body || doc.createElement( "body" ), |
|||
div = doc.createElement( "div" ), |
|||
q = "only all"; |
|||
|
|||
div.id = "mq-test-1"; |
|||
div.style.cssText = "position:absolute;top:-99em"; |
|||
fakeBody.appendChild( div ); |
|||
|
|||
div.innerHTML = '_<style media="'+q+'"> #mq-test-1 { width: 9px; }</style>'; |
|||
if( fakeUsed ){ |
|||
docElem.insertBefore( fakeBody, refNode ); |
|||
} |
|||
div.removeChild( div.firstChild ); |
|||
bool = div.offsetWidth == 9; |
|||
if( fakeUsed ){ |
|||
docElem.removeChild( fakeBody ); |
|||
} |
|||
else{ |
|||
fakeBody.removeChild( div ); |
|||
} |
|||
return bool; |
|||
})( this ) |
|||
); |
|||
|
@ -0,0 +1,5 @@ |
|||
/*! |
|||
* selectivizr v1.0.1 - (c) Keith Clark, freely distributable under the terms of the MIT license. |
|||
* selectivizr.com |
|||
*/ |
|||
var k=true,p=false;(function(A){function N(a){return a.replace(O,q).replace(P,function(b,e,c){b=c.split(",");c=0;for(var g=b.length;c<g;c++){var h=Q(b[c].replace(R,q).replace(S,q))+w,f=[];b[c]=h.replace(T,function(d,l,m,j,i){if(l){if(f.length>0){d=f;var x;i=h.substring(0,i).replace(U,o);if(i==o||i.charAt(i.length-1)==w)i+="*";try{x=y(i)}catch(ha){}if(x){i=0;for(m=x.length;i<m;i++){j=x[i];for(var B=j.className,C=0,V=d.length;C<V;C++){var r=d[C];if(!RegExp("(^|\\s)"+r.className+"(\\s|$)").test(j.className))if(r.b&&(r.b===k||r.b(j)===k))B=E(B,r.className,k)}j.className=B}}f=[]}return l}else{if(l=m?W(m):!F||F.test(j)?{className:G(j),b:k}:null){f.push(l);return"."+l.className}return d}})}return e+b.join(",")})}function W(a){var b=k,e=G(a.slice(1)),c=a.substring(0,5)==":not(",g,h;if(c)a=a.slice(5,-1);var f=a.indexOf("(");if(f>-1)a=a.substring(0,f);if(a.charAt(0)==":")switch(a.slice(1)){case "root":b=function(d){return c?d!=H:d==H};break;case "target":if(s==8){b=function(d){function l(){var m=location.hash,j=m.slice(1);return c?m==""||d.id!=j:m!=""&&d.id==j}t(A,"hashchange",function(){u(d,e,l())});return l()};break}return p;case "checked":b=function(d){X.test(d.type)&&t(d,"propertychange",function(){event.propertyName=="checked"&&u(d,e,d.checked!==c)});return d.checked!==c};break;case "disabled":c=!c;case "enabled":b=function(d){if(Y.test(d.tagName)){t(d,"propertychange",function(){event.propertyName=="$disabled"&&u(d,e,d.a===c)});z.push(d);d.a=d.disabled;return d.disabled===c}return a==":enabled"?c:!c};break;case "focus":g="focus";h="blur";case "hover":if(!g){g="mouseenter";h="mouseleave"}b=function(d){t(d,c?h:g,function(){u(d,e,k)});t(d,c?g:h,function(){u(d,e,p)});return c};break;default:if(!Z.test(a))return p}return{className:e,b:b}}function G(a){return I+"-"+(s==6&&$?aa++:a.replace(ba,function(b){return b.charCodeAt(0)}))}function Q(a){return a.replace(J,q).replace(ca,w)}function u(a,b,e){var c=a.className;b=E(c,b,e);if(b!=c){a.className=b;a.parentNode.className+=o}}function E(a,b,e){var c=RegExp("(^|\\s)"+b+"(\\s|$)"),g=c.test(a);return e?g?a:a+w+b:g?a.replace(c,q).replace(J,q):a}function t(a,b,e){a.attachEvent("on"+b,e)}function D(a,b){if(/^https?:\/\//i.test(a))return b.substring(0,b.indexOf("/",8))==a.substring(0,a.indexOf("/",8))?a:null;if(a.charAt(0)=="/")return b.substring(0,b.indexOf("/",8))+a;var e=b.split("?")[0];if(a.charAt(0)!="?"&&e.charAt(e.length-1)!="/")e=e.substring(0,e.lastIndexOf("/")+1);return e+a}function K(a){if(a){v.open("GET",a,p);v.send();return(v.status==200?v.responseText:o).replace(da,o).replace(ea,function(b,e,c,g,h){return K(D(c||h,a))}).replace(fa,function(b,e,c){e=e||"";return" url("+e+D(c,a)+e+") "})}return o}function ga(){var a,b;a=n.getElementsByTagName("BASE");for(var e=a.length>0?a[0].href:n.location.href,c=0;c<n.styleSheets.length;c++){b=n.styleSheets[c];if(b.href!=o)if(a=D(b.href,e))b.cssText=N(K(a))}z.length>0&&setInterval(function(){for(var g=0,h=z.length;g<h;g++){var f=z[g];if(f.disabled!==f.a)if(f.disabled){f.disabled=p;f.a=k;f.disabled=k}else f.a=f.disabled}},250)}if(!/*@cc_on!@*/true){var n=document,H=n.documentElement,v=function(){if(A.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(a){return null}}(),s=/MSIE ([\d])/.exec(navigator.userAgent)[1];if(!(n.compatMode!="CSS1Compat"||s<6||s>8||!v)){var L={NW:"*.Dom.select",DOMAssistant:"*.$",Prototype:"$$",YAHOO:"*.util.Selector.query",MooTools:"$$",Sizzle:"*",jQuery:"*",dojo:"*.query"},y,z=[],aa=0,$=k,I="slvzr",M=I+"DOMReady",da=/(\/\*[^*]*\*+([^\/][^*]*\*+)*\/)\s*/g,ea=/@import\s*(?:(?:(?:url\(\s*(['"]?)(.*)\1)\s*\))|(?:(['"])(.*)\3))[^;]*;/g,fa=/\burl\(\s*(["']?)([^"')]+)\1\s*\)/g,Z=/^:(empty|(first|last|only|nth(-last)?)-(child|of-type))$/,O=/:(:first-(?:line|letter))/g,P=/(^|})\s*([^\{]*?[\[:][^{]+)/g,T=/([ +~>])|(:[a-z-]+(?:\(.*?\)+)?)|(\[.*?\])/g,U=/(:not\()?:(hover|enabled|disabled|focus|checked|target|active|visited|first-line|first-letter)\)?/g,ba=/[^\w-]/g,Y=/^(INPUT|SELECT|TEXTAREA|BUTTON)$/,X=/^(checkbox|radio)$/,F=s>6?/[\$\^*]=(['"])\1/:null,R=/([(\[+~])\s+/g,S=/\s+([)\]+~])/g,ca=/\s+/g,J=/^\s*((?:[\S\s]*\S)?)\s*$/,o="",w=" ",q="$1";n.write("<script id="+M+" defer src='//:'><\/script>");n.getElementById(M).onreadystatechange=function(){if(this.readyState=="complete"){a:{var a,b;for(b in L)if(A[b]&&(a=eval(L[b].replace("*",b)))){y=a;break a}y=p}if(y){ga();this.parentNode.removeChild(this)}}}}}})(this); |
@ -0,0 +1,85 @@ |
|||
// jXHR.js (JSON-P XHR)
|
|||
// v0.1 (c) Kyle Simpson
|
|||
// MIT License
|
|||
|
|||
(function(global){ |
|||
var SETTIMEOUT = global.setTimeout, // for better compression
|
|||
doc = global.document, |
|||
callback_counter = 0; |
|||
|
|||
global.jXHR = function() { |
|||
var script_url, |
|||
script_loaded, |
|||
jsonp_callback, |
|||
scriptElem, |
|||
publicAPI = null; |
|||
|
|||
function removeScript() { try { scriptElem.parentNode.removeChild(scriptElem); } catch (err) { } } |
|||
|
|||
function reset() { |
|||
script_loaded = false; |
|||
script_url = ""; |
|||
removeScript(); |
|||
scriptElem = null; |
|||
fireReadyStateChange(0); |
|||
} |
|||
|
|||
function ThrowError(msg) { |
|||
try { publicAPI.onerror.call(publicAPI,msg,script_url); } catch (err) { throw new Error(msg); } |
|||
} |
|||
|
|||
function handleScriptLoad() { |
|||
if ((this.readyState && this.readyState!=="complete" && this.readyState!=="loaded") || script_loaded) { return; } |
|||
this.onload = this.onreadystatechange = null; // prevent memory leak
|
|||
script_loaded = true; |
|||
if (publicAPI.readyState !== 4) ThrowError("Script failed to load ["+script_url+"]."); |
|||
removeScript(); |
|||
} |
|||
|
|||
function fireReadyStateChange(rs,args) { |
|||
args = args || []; |
|||
publicAPI.readyState = rs; |
|||
if (typeof publicAPI.onreadystatechange === "function") publicAPI.onreadystatechange.apply(publicAPI,args); |
|||
} |
|||
|
|||
publicAPI = { |
|||
onerror:null, |
|||
onreadystatechange:null, |
|||
readyState:0, |
|||
open:function(method,url){ |
|||
reset(); |
|||
internal_callback = "cb"+(callback_counter++); |
|||
(function(icb){ |
|||
global.jXHR[icb] = function() { |
|||
try { fireReadyStateChange.call(publicAPI,4,arguments); } |
|||
catch(err) { |
|||
publicAPI.readyState = -1; |
|||
ThrowError("Script failed to run ["+script_url+"]."); |
|||
} |
|||
global.jXHR[icb] = null; |
|||
}; |
|||
})(internal_callback); |
|||
script_url = url.replace(/=\?/,"=jXHR."+internal_callback); |
|||
fireReadyStateChange(1); |
|||
}, |
|||
send:function(){ |
|||
SETTIMEOUT(function(){ |
|||
scriptElem = doc.createElement("script"); |
|||
scriptElem.setAttribute("type","text/javascript"); |
|||
scriptElem.onload = scriptElem.onreadystatechange = function(){handleScriptLoad.call(scriptElem);}; |
|||
scriptElem.setAttribute("src",script_url); |
|||
doc.getElementsByTagName("head")[0].appendChild(scriptElem); |
|||
},0); |
|||
fireReadyStateChange(2); |
|||
}, |
|||
setRequestHeader:function(){}, // noop
|
|||
getResponseHeader:function(){return "";}, // basically noop
|
|||
getAllResponseHeaders:function(){return [];} // ditto
|
|||
}; |
|||
|
|||
reset(); |
|||
|
|||
return publicAPI; |
|||
}; |
|||
})(window); |
|||
|
@ -0,0 +1,481 @@ |
|||
/* |
|||
http://www.JSON.org/json2.js
|
|||
2011-02-23 |
|||
|
|||
Public Domain. |
|||
|
|||
NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. |
|||
|
|||
See http://www.JSON.org/js.html
|
|||
|
|||
|
|||
This code should be minified before deployment. |
|||
See http://javascript.crockford.com/jsmin.html
|
|||
|
|||
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO |
|||
NOT CONTROL. |
|||
|
|||
|
|||
This file creates a global JSON object containing two methods: stringify |
|||
and parse. |
|||
|
|||
JSON.stringify(value, replacer, space) |
|||
value any JavaScript value, usually an object or array. |
|||
|
|||
replacer an optional parameter that determines how object |
|||
values are stringified for objects. It can be a |
|||
function or an array of strings. |
|||
|
|||
space an optional parameter that specifies the indentation |
|||
of nested structures. If it is omitted, the text will |
|||
be packed without extra whitespace. If it is a number, |
|||
it will specify the number of spaces to indent at each |
|||
level. If it is a string (such as '\t' or ' '), |
|||
it contains the characters used to indent at each level. |
|||
|
|||
This method produces a JSON text from a JavaScript value. |
|||
|
|||
When an object value is found, if the object contains a toJSON |
|||
method, its toJSON method will be called and the result will be |
|||
stringified. A toJSON method does not serialize: it returns the |
|||
value represented by the name/value pair that should be serialized, |
|||
or undefined if nothing should be serialized. The toJSON method |
|||
will be passed the key associated with the value, and this will be |
|||
bound to the value |
|||
|
|||
For example, this would serialize Dates as ISO strings. |
|||
|
|||
Date.prototype.toJSON = function (key) { |
|||
function f(n) { |
|||
// Format integers to have at least two digits.
|
|||
return n < 10 ? '0' + n : n; |
|||
} |
|||
|
|||
return this.getUTCFullYear() + '-' + |
|||
f(this.getUTCMonth() + 1) + '-' + |
|||
f(this.getUTCDate()) + 'T' + |
|||
f(this.getUTCHours()) + ':' + |
|||
f(this.getUTCMinutes()) + ':' + |
|||
f(this.getUTCSeconds()) + 'Z'; |
|||
}; |
|||
|
|||
You can provide an optional replacer method. It will be passed the |
|||
key and value of each member, with this bound to the containing |
|||
object. The value that is returned from your method will be |
|||
serialized. If your method returns undefined, then the member will |
|||
be excluded from the serialization. |
|||
|
|||
If the replacer parameter is an array of strings, then it will be |
|||
used to select the members to be serialized. It filters the results |
|||
such that only members with keys listed in the replacer array are |
|||
stringified. |
|||
|
|||
Values that do not have JSON representations, such as undefined or |
|||
functions, will not be serialized. Such values in objects will be |
|||
dropped; in arrays they will be replaced with null. You can use |
|||
a replacer function to replace those with JSON values. |
|||
JSON.stringify(undefined) returns undefined. |
|||
|
|||
The optional space parameter produces a stringification of the |
|||
value that is filled with line breaks and indentation to make it |
|||
easier to read. |
|||
|
|||
If the space parameter is a non-empty string, then that string will |
|||
be used for indentation. If the space parameter is a number, then |
|||
the indentation will be that many spaces. |
|||
|
|||
Example: |
|||
|
|||
text = JSON.stringify(['e', {pluribus: 'unum'}]); |
|||
// text is '["e",{"pluribus":"unum"}]'
|
|||
|
|||
|
|||
text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); |
|||
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
|||
|
|||
text = JSON.stringify([new Date()], function (key, value) { |
|||
return this[key] instanceof Date ? |
|||
'Date(' + this[key] + ')' : value; |
|||
}); |
|||
// text is '["Date(---current time---)"]'
|
|||
|
|||
|
|||
JSON.parse(text, reviver) |
|||
This method parses a JSON text to produce an object or array. |
|||
It can throw a SyntaxError exception. |
|||
|
|||
The optional reviver parameter is a function that can filter and |
|||
transform the results. It receives each of the keys and values, |
|||
and its return value is used instead of the original value. |
|||
If it returns what it received, then the structure is not modified. |
|||
If it returns undefined then the member is deleted. |
|||
|
|||
Example: |
|||
|
|||
// Parse the text. Values that look like ISO date strings will
|
|||
// be converted to Date objects.
|
|||
|
|||
myData = JSON.parse(text, function (key, value) { |
|||
var a; |
|||
if (typeof value === 'string') { |
|||
a = |
|||
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); |
|||
if (a) { |
|||
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], |
|||
+a[5], +a[6])); |
|||
} |
|||
} |
|||
return value; |
|||
}); |
|||
|
|||
myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { |
|||
var d; |
|||
if (typeof value === 'string' && |
|||
value.slice(0, 5) === 'Date(' && |
|||
value.slice(-1) === ')') { |
|||
d = new Date(value.slice(5, -1)); |
|||
if (d) { |
|||
return d; |
|||
} |
|||
} |
|||
return value; |
|||
}); |
|||
|
|||
|
|||
This is a reference implementation. You are free to copy, modify, or |
|||
redistribute. |
|||
*/ |
|||
|
|||
/*jslint evil: true, strict: false, regexp: false */ |
|||
|
|||
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, |
|||
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, |
|||
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, |
|||
lastIndex, length, parse, prototype, push, replace, slice, stringify, |
|||
test, toJSON, toString, valueOf |
|||
*/ |
|||
|
|||
|
|||
// Create a JSON object only if one does not already exist. We create the
|
|||
// methods in a closure to avoid creating global variables.
|
|||
|
|||
var JSON; |
|||
if (!JSON) { |
|||
JSON = {}; |
|||
} |
|||
|
|||
(function () { |
|||
"use strict"; |
|||
|
|||
function f(n) { |
|||
// Format integers to have at least two digits.
|
|||
return n < 10 ? '0' + n : n; |
|||
} |
|||
|
|||
if (typeof Date.prototype.toJSON !== 'function') { |
|||
|
|||
Date.prototype.toJSON = function (key) { |
|||
|
|||
return isFinite(this.valueOf()) ? |
|||
this.getUTCFullYear() + '-' + |
|||
f(this.getUTCMonth() + 1) + '-' + |
|||
f(this.getUTCDate()) + 'T' + |
|||
f(this.getUTCHours()) + ':' + |
|||
f(this.getUTCMinutes()) + ':' + |
|||
f(this.getUTCSeconds()) + 'Z' : null; |
|||
}; |
|||
|
|||
String.prototype.toJSON = |
|||
Number.prototype.toJSON = |
|||
Boolean.prototype.toJSON = function (key) { |
|||
return this.valueOf(); |
|||
}; |
|||
} |
|||
|
|||
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, |
|||
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, |
|||
gap, |
|||
indent, |
|||
meta = { // table of character substitutions
|
|||
'\b': '\\b', |
|||
'\t': '\\t', |
|||
'\n': '\\n', |
|||
'\f': '\\f', |
|||
'\r': '\\r', |
|||
'"' : '\\"', |
|||
'\\': '\\\\' |
|||
}, |
|||
rep; |
|||
|
|||
|
|||
function quote(string) { |
|||
|
|||
// If the string contains no control characters, no quote characters, and no
|
|||
// backslash characters, then we can safely slap some quotes around it.
|
|||
// Otherwise we must also replace the offending characters with safe escape
|
|||
// sequences.
|
|||
|
|||
escapable.lastIndex = 0; |
|||
return escapable.test(string) ? '"' + string.replace(escapable, function (a) { |
|||
var c = meta[a]; |
|||
return typeof c === 'string' ? c : |
|||
'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); |
|||
}) + '"' : '"' + string + '"'; |
|||
} |
|||
|
|||
|
|||
function str(key, holder) { |
|||
|
|||
// Produce a string from holder[key].
|
|||
|
|||
var i, // The loop counter.
|
|||
k, // The member key.
|
|||
v, // The member value.
|
|||
length, |
|||
mind = gap, |
|||
partial, |
|||
value = holder[key]; |
|||
|
|||
// If the value has a toJSON method, call it to obtain a replacement value.
|
|||
|
|||
if (value && typeof value === 'object' && |
|||
typeof value.toJSON === 'function') { |
|||
value = value.toJSON(key); |
|||
} |
|||
|
|||
// If we were called with a replacer function, then call the replacer to
|
|||
// obtain a replacement value.
|
|||
|
|||
if (typeof rep === 'function') { |
|||
value = rep.call(holder, key, value); |
|||
} |
|||
|
|||
// What happens next depends on the value's type.
|
|||
|
|||
switch (typeof value) { |
|||
case 'string': |
|||
return quote(value); |
|||
|
|||
case 'number': |
|||
|
|||
// JSON numbers must be finite. Encode non-finite numbers as null.
|
|||
|
|||
return isFinite(value) ? String(value) : 'null'; |
|||
|
|||
case 'boolean': |
|||
case 'null': |
|||
|
|||
// If the value is a boolean or null, convert it to a string. Note:
|
|||
// typeof null does not produce 'null'. The case is included here in
|
|||
// the remote chance that this gets fixed someday.
|
|||
|
|||
return String(value); |
|||
|
|||
// If the type is 'object', we might be dealing with an object or an array or
|
|||
// null.
|
|||
|
|||
case 'object': |
|||
|
|||
// Due to a specification blunder in ECMAScript, typeof null is 'object',
|
|||
// so watch out for that case.
|
|||
|
|||
if (!value) { |
|||
return 'null'; |
|||
} |
|||
|
|||
// Make an array to hold the partial results of stringifying this object value.
|
|||
|
|||
gap += indent; |
|||
partial = []; |
|||
|
|||
// Is the value an array?
|
|||
|
|||
if (Object.prototype.toString.apply(value) === '[object Array]') { |
|||
|
|||
// The value is an array. Stringify every element. Use null as a placeholder
|
|||
// for non-JSON values.
|
|||
|
|||
length = value.length; |
|||
for (i = 0; i < length; i += 1) { |
|||
partial[i] = str(i, value) || 'null'; |
|||
} |
|||
|
|||
// Join all of the elements together, separated with commas, and wrap them in
|
|||
// brackets.
|
|||
|
|||
v = partial.length === 0 ? '[]' : gap ? |
|||
'[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : |
|||
'[' + partial.join(',') + ']'; |
|||
gap = mind; |
|||
return v; |
|||
} |
|||
|
|||
// If the replacer is an array, use it to select the members to be stringified.
|
|||
|
|||
if (rep && typeof rep === 'object') { |
|||
length = rep.length; |
|||
for (i = 0; i < length; i += 1) { |
|||
if (typeof rep[i] === 'string') { |
|||
k = rep[i]; |
|||
v = str(k, value); |
|||
if (v) { |
|||
partial.push(quote(k) + (gap ? ': ' : ':') + v); |
|||
} |
|||
} |
|||
} |
|||
} else { |
|||
|
|||
// Otherwise, iterate through all of the keys in the object.
|
|||
|
|||
for (k in value) { |
|||
if (Object.prototype.hasOwnProperty.call(value, k)) { |
|||
v = str(k, value); |
|||
if (v) { |
|||
partial.push(quote(k) + (gap ? ': ' : ':') + v); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// Join all of the member texts together, separated with commas,
|
|||
// and wrap them in braces.
|
|||
|
|||
v = partial.length === 0 ? '{}' : gap ? |
|||
'{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : |
|||
'{' + partial.join(',') + '}'; |
|||
gap = mind; |
|||
return v; |
|||
} |
|||
} |
|||
|
|||
// If the JSON object does not yet have a stringify method, give it one.
|
|||
|
|||
if (typeof JSON.stringify !== 'function') { |
|||
JSON.stringify = function (value, replacer, space) { |
|||
|
|||
// The stringify method takes a value and an optional replacer, and an optional
|
|||
// space parameter, and returns a JSON text. The replacer can be a function
|
|||
// that can replace values, or an array of strings that will select the keys.
|
|||
// A default replacer method can be provided. Use of the space parameter can
|
|||
// produce text that is more easily readable.
|
|||
|
|||
var i; |
|||
gap = ''; |
|||
indent = ''; |
|||
|
|||
// If the space parameter is a number, make an indent string containing that
|
|||
// many spaces.
|
|||
|
|||
if (typeof space === 'number') { |
|||
for (i = 0; i < space; i += 1) { |
|||
indent += ' '; |
|||
} |
|||
|
|||
// If the space parameter is a string, it will be used as the indent string.
|
|||
|
|||
} else if (typeof space === 'string') { |
|||
indent = space; |
|||
} |
|||
|
|||
// If there is a replacer, it must be a function or an array.
|
|||
// Otherwise, throw an error.
|
|||
|
|||
rep = replacer; |
|||
if (replacer && typeof replacer !== 'function' && |
|||
(typeof replacer !== 'object' || |
|||
typeof replacer.length !== 'number')) { |
|||
throw new Error('JSON.stringify'); |
|||
} |
|||
|
|||
// Make a fake root object containing our value under the key of ''.
|
|||
// Return the result of stringifying the value.
|
|||
|
|||
return str('', {'': value}); |
|||
}; |
|||
} |
|||
|
|||
|
|||
// If the JSON object does not yet have a parse method, give it one.
|
|||
|
|||
if (typeof JSON.parse !== 'function') { |
|||
JSON.parse = function (text, reviver) { |
|||
|
|||
// The parse method takes a text and an optional reviver function, and returns
|
|||
// a JavaScript value if the text is a valid JSON text.
|
|||
|
|||
var j; |
|||
|
|||
function walk(holder, key) { |
|||
|
|||
// The walk method is used to recursively walk the resulting structure so
|
|||
// that modifications can be made.
|
|||
|
|||
var k, v, value = holder[key]; |
|||
if (value && typeof value === 'object') { |
|||
for (k in value) { |
|||
if (Object.prototype.hasOwnProperty.call(value, k)) { |
|||
v = walk(value, k); |
|||
if (v !== undefined) { |
|||
value[k] = v; |
|||
} else { |
|||
delete value[k]; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return reviver.call(holder, key, value); |
|||
} |
|||
|
|||
|
|||
// Parsing happens in four stages. In the first stage, we replace certain
|
|||
// Unicode characters with escape sequences. JavaScript handles many characters
|
|||
// incorrectly, either silently deleting them, or treating them as line endings.
|
|||
|
|||
text = String(text); |
|||
cx.lastIndex = 0; |
|||
if (cx.test(text)) { |
|||
text = text.replace(cx, function (a) { |
|||
return '\\u' + |
|||
('0000' + a.charCodeAt(0).toString(16)).slice(-4); |
|||
}); |
|||
} |
|||
|
|||
// In the second stage, we run the text against regular expressions that look
|
|||
// for non-JSON patterns. We are especially concerned with '()' and 'new'
|
|||
// because they can cause invocation, and '=' because it can cause mutation.
|
|||
// But just to be safe, we want to reject all unexpected forms.
|
|||
|
|||
// We split the second stage into 4 regexp operations in order to work around
|
|||
// crippling inefficiencies in IE's and Safari's regexp engines. First we
|
|||
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
|
|||
// replace all simple value tokens with ']' characters. Third, we delete all
|
|||
// open brackets that follow a colon or comma or that begin the text. Finally,
|
|||
// we look to see that the remaining characters are only whitespace or ']' or
|
|||
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
|||
|
|||
if (/^[\],:{}\s]*$/ |
|||
.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') |
|||
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') |
|||
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { |
|||
|
|||
// In the third stage we use the eval function to compile the text into a
|
|||
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
|||
// in JavaScript: it can begin a block or an object literal. We wrap the text
|
|||
// in parens to eliminate the ambiguity.
|
|||
|
|||
j = eval('(' + text + ')'); |
|||
|
|||
// In the optional fourth stage, we recursively walk the new structure, passing
|
|||
// each name/value pair to a reviver function for possible transformation.
|
|||
|
|||
return typeof reviver === 'function' ? |
|||
walk({'': j}, '') : j; |
|||
} |
|||
|
|||
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
|||
|
|||
throw new SyntaxError('JSON.parse'); |
|||
}; |
|||
} |
|||
}()); |
|||
|
@ -0,0 +1,964 @@ |
|||
/*! |
|||
* Modernizr v1.7 |
|||
* http://www.modernizr.com
|
|||
* |
|||
* Developed by: |
|||
* - Faruk Ates http://farukat.es/
|
|||
* - Paul Irish http://paulirish.com/
|
|||
* |
|||
* Copyright (c) 2009-2011 |
|||
* Dual-licensed under the BSD or MIT licenses. |
|||
* http://www.modernizr.com/license/
|
|||
*/ |
|||
|
|||
|
|||
/* |
|||
* Modernizr is a script that detects native CSS3 and HTML5 features |
|||
* available in the current UA and provides an object containing all |
|||
* features with a true/false value, depending on whether the UA has |
|||
* native support for it or not. |
|||
* |
|||
* Modernizr will also add classes to the <html> element of the page, |
|||
* one for each feature it detects. If the UA supports it, a class |
|||
* like "cssgradients" will be added. If not, the class name will be |
|||
* "no-cssgradients". This allows for simple if-conditionals in your |
|||
* CSS, giving you fine control over the look & feel of your website. |
|||
* |
|||
* @author Faruk Ates |
|||
* @author Paul Irish |
|||
* @copyright (c) 2009-2011 Faruk Ates. |
|||
* @contributor Ben Alman |
|||
*/ |
|||
|
|||
window.Modernizr = (function(window,document,undefined){ |
|||
|
|||
var version = '1.7', |
|||
|
|||
ret = {}, |
|||
|
|||
/** |
|||
* !! DEPRECATED !! |
|||
* |
|||
* enableHTML5 is a private property for advanced use only. If enabled, |
|||
* it will make Modernizr.init() run through a brief while() loop in |
|||
* which it will create all HTML5 elements in the DOM to allow for |
|||
* styling them in Internet Explorer, which does not recognize any |
|||
* non-HTML4 elements unless created in the DOM this way. |
|||
* |
|||
* enableHTML5 is ON by default. |
|||
* |
|||
* The enableHTML5 toggle option is DEPRECATED as per 1.6, and will be |
|||
* replaced in 2.0 in lieu of the modular, configurable nature of 2.0. |
|||
*/ |
|||
enableHTML5 = true, |
|||
|
|||
|
|||
docElement = document.documentElement, |
|||
docHead = document.head || document.getElementsByTagName('head')[0], |
|||
|
|||
/** |
|||
* Create our "modernizr" element that we do most feature tests on. |
|||
*/ |
|||
mod = 'modernizr', |
|||
modElem = document.createElement( mod ), |
|||
m_style = modElem.style, |
|||
|
|||
/** |
|||
* Create the input element for various Web Forms feature tests. |
|||
*/ |
|||
inputElem = document.createElement( 'input' ), |
|||
|
|||
smile = ':)', |
|||
|
|||
tostring = Object.prototype.toString, |
|||
|
|||
// List of property values to set for css tests. See ticket #21
|
|||
prefixes = ' -webkit- -moz- -o- -ms- -khtml- '.split(' '), |
|||
|
|||
// Following spec is to expose vendor-specific style properties as:
|
|||
// elem.style.WebkitBorderRadius
|
|||
// and the following would be incorrect:
|
|||
// elem.style.webkitBorderRadius
|
|||
|
|||
// Webkit ghosts their properties in lowercase but Opera & Moz do not.
|
|||
// Microsoft foregoes prefixes entirely <= IE8, but appears to
|
|||
// use a lowercase `ms` instead of the correct `Ms` in IE9
|
|||
|
|||
// More here: http://github.com/Modernizr/Modernizr/issues/issue/21
|
|||
domPrefixes = 'Webkit Moz O ms Khtml'.split(' '), |
|||
|
|||
ns = {'svg': 'http://www.w3.org/2000/svg'}, |
|||
|
|||
tests = {}, |
|||
inputs = {}, |
|||
attrs = {}, |
|||
|
|||
classes = [], |
|||
|
|||
featurename, // used in testing loop
|
|||
|
|||
|
|||
|
|||
// todo: consider using http://javascript.nwbox.com/CSSSupport/css-support.js instead
|
|||
testMediaQuery = function(mq){ |
|||
|
|||
var st = document.createElement('style'), |
|||
div = document.createElement('div'), |
|||
ret; |
|||
|
|||
st.textContent = mq + '{#modernizr{height:3px}}'; |
|||
docHead.appendChild(st); |
|||
div.id = 'modernizr'; |
|||
docElement.appendChild(div); |
|||
|
|||
ret = div.offsetHeight === 3; |
|||
|
|||
st.parentNode.removeChild(st); |
|||
div.parentNode.removeChild(div); |
|||
|
|||
return !!ret; |
|||
|
|||
}, |
|||
|
|||
|
|||
/** |
|||
* isEventSupported determines if a given element supports the given event |
|||
* function from http://yura.thinkweb2.com/isEventSupported/
|
|||
*/ |
|||
isEventSupported = (function(){ |
|||
|
|||
var TAGNAMES = { |
|||
'select':'input','change':'input', |
|||
'submit':'form','reset':'form', |
|||
'error':'img','load':'img','abort':'img' |
|||
}; |
|||
|
|||
function isEventSupported(eventName, element) { |
|||
|
|||
element = element || document.createElement(TAGNAMES[eventName] || 'div'); |
|||
eventName = 'on' + eventName; |
|||
|
|||
// When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those
|
|||
var isSupported = (eventName in element); |
|||
|
|||
if (!isSupported) { |
|||
// If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element
|
|||
if (!element.setAttribute) { |
|||
element = document.createElement('div'); |
|||
} |
|||
if (element.setAttribute && element.removeAttribute) { |
|||
element.setAttribute(eventName, ''); |
|||
isSupported = is(element[eventName], 'function'); |
|||
|
|||
// If property was created, "remove it" (by setting value to `undefined`)
|
|||
if (!is(element[eventName], undefined)) { |
|||
element[eventName] = undefined; |
|||
} |
|||
element.removeAttribute(eventName); |
|||
} |
|||
} |
|||
|
|||
element = null; |
|||
return isSupported; |
|||
} |
|||
return isEventSupported; |
|||
})(); |
|||
|
|||
|
|||
// hasOwnProperty shim by kangax needed for Safari 2.0 support
|
|||
var _hasOwnProperty = ({}).hasOwnProperty, hasOwnProperty; |
|||
if (!is(_hasOwnProperty, undefined) && !is(_hasOwnProperty.call, undefined)) { |
|||
hasOwnProperty = function (object, property) { |
|||
return _hasOwnProperty.call(object, property); |
|||
}; |
|||
} |
|||
else { |
|||
hasOwnProperty = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */ |
|||
return ((property in object) && is(object.constructor.prototype[property], undefined)); |
|||
}; |
|||
} |
|||
|
|||
/** |
|||
* set_css applies given styles to the Modernizr DOM node. |
|||
*/ |
|||
function set_css( str ) { |
|||
m_style.cssText = str; |
|||
} |
|||
|
|||
/** |
|||
* set_css_all extrapolates all vendor-specific css strings. |
|||
*/ |
|||
function set_css_all( str1, str2 ) { |
|||
return set_css(prefixes.join(str1 + ';') + ( str2 || '' )); |
|||
} |
|||
|
|||
/** |
|||
* is returns a boolean for if typeof obj is exactly type. |
|||
*/ |
|||
function is( obj, type ) { |
|||
return typeof obj === type; |
|||
} |
|||
|
|||
/** |
|||
* contains returns a boolean for if substr is found within str. |
|||
*/ |
|||
function contains( str, substr ) { |
|||
return (''+str).indexOf( substr ) !== -1; |
|||
} |
|||
|
|||
/** |
|||
* test_props is a generic CSS / DOM property test; if a browser supports |
|||
* a certain property, it won't return undefined for it. |
|||
* A supported CSS property returns empty string when its not yet set. |
|||
*/ |
|||
function test_props( props, callback ) { |
|||
for ( var i in props ) { |
|||
if ( m_style[ props[i] ] !== undefined && ( !callback || callback( props[i], modElem ) ) ) { |
|||
return true; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* test_props_all tests a list of DOM properties we want to check against. |
|||
* We specify literally ALL possible (known and/or likely) properties on |
|||
* the element including the non-vendor prefixed one, for forward- |
|||
* compatibility. |
|||
*/ |
|||
function test_props_all( prop, callback ) { |
|||
|
|||
var uc_prop = prop.charAt(0).toUpperCase() + prop.substr(1), |
|||
props = (prop + ' ' + domPrefixes.join(uc_prop + ' ') + uc_prop).split(' '); |
|||
|
|||
return !!test_props( props, callback ); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* Tests |
|||
* ----- |
|||
*/ |
|||
|
|||
tests['flexbox'] = function() { |
|||
/** |
|||
* set_prefixed_value_css sets the property of a specified element |
|||
* adding vendor prefixes to the VALUE of the property. |
|||
* @param {Element} element |
|||
* @param {string} property The property name. This will not be prefixed. |
|||
* @param {string} value The value of the property. This WILL be prefixed. |
|||
* @param {string=} extra Additional CSS to append unmodified to the end of |
|||
* the CSS string. |
|||
*/ |
|||
function set_prefixed_value_css(element, property, value, extra) { |
|||
property += ':'; |
|||
element.style.cssText = (property + prefixes.join(value + ';' + property)).slice(0, -property.length) + (extra || ''); |
|||
} |
|||
|
|||
/** |
|||
* set_prefixed_property_css sets the property of a specified element |
|||
* adding vendor prefixes to the NAME of the property. |
|||
* @param {Element} element |
|||
* @param {string} property The property name. This WILL be prefixed. |
|||
* @param {string} value The value of the property. This will not be prefixed. |
|||
* @param {string=} extra Additional CSS to append unmodified to the end of |
|||
* the CSS string. |
|||
*/ |
|||
function set_prefixed_property_css(element, property, value, extra) { |
|||
element.style.cssText = prefixes.join(property + ':' + value + ';') + (extra || ''); |
|||
} |
|||
|
|||
var c = document.createElement('div'), |
|||
elem = document.createElement('div'); |
|||
|
|||
set_prefixed_value_css(c, 'display', 'box', 'width:42px;padding:0;'); |
|||
set_prefixed_property_css(elem, 'box-flex', '1', 'width:10px;'); |
|||
|
|||
c.appendChild(elem); |
|||
docElement.appendChild(c); |
|||
|
|||
var ret = elem.offsetWidth === 42; |
|||
|
|||
c.removeChild(elem); |
|||
docElement.removeChild(c); |
|||
|
|||
return ret; |
|||
}; |
|||
|
|||
// On the S60 and BB Storm, getContext exists, but always returns undefined
|
|||
// http://github.com/Modernizr/Modernizr/issues/issue/97/
|
|||
|
|||
tests['canvas'] = function() { |
|||
var elem = document.createElement( 'canvas' ); |
|||
return !!(elem.getContext && elem.getContext('2d')); |
|||
}; |
|||
|
|||
tests['canvastext'] = function() { |
|||
return !!(ret['canvas'] && is(document.createElement( 'canvas' ).getContext('2d').fillText, 'function')); |
|||
}; |
|||
|
|||
// This WebGL test false positives in FF depending on graphics hardware. But really it's quite impossible to know
|
|||
// wether webgl will succeed until after you create the context. You might have hardware that can support
|
|||
// a 100x100 webgl canvas, but will not support a 1000x1000 webgl canvas. So this feature inference is weak,
|
|||
// but intentionally so.
|
|||
tests['webgl'] = function(){ |
|||
return !!window.WebGLRenderingContext; |
|||
}; |
|||
|
|||
/* |
|||
* The Modernizr.touch test only indicates if the browser supports |
|||
* touch events, which does not necessarily reflect a touchscreen |
|||
* device, as evidenced by tablets running Windows 7 or, alas, |
|||
* the Palm Pre / WebOS (touch) phones. |
|||
* |
|||
* Additionally, Chrome (desktop) used to lie about its support on this, |
|||
* but that has since been rectified: http://crbug.com/36415
|
|||
* |
|||
* We also test for Firefox 4 Multitouch Support. |
|||
* |
|||
* For more info, see: http://modernizr.github.com/Modernizr/touch.html
|
|||
*/ |
|||
|
|||
tests['touch'] = function() { |
|||
|
|||
return ('ontouchstart' in window) || testMediaQuery('@media ('+prefixes.join('touch-enabled),(')+'modernizr)'); |
|||
|
|||
}; |
|||
|
|||
|
|||
/** |
|||
* geolocation tests for the new Geolocation API specification. |
|||
* This test is a standards compliant-only test; for more complete |
|||
* testing, including a Google Gears fallback, please see: |
|||
* http://code.google.com/p/geo-location-javascript/
|
|||
* or view a fallback solution using google's geo API: |
|||
* http://gist.github.com/366184
|
|||
*/ |
|||
tests['geolocation'] = function() { |
|||
return !!navigator.geolocation; |
|||
}; |
|||
|
|||
// Per 1.6:
|
|||
// This used to be Modernizr.crosswindowmessaging but the longer
|
|||
// name has been deprecated in favor of a shorter and property-matching one.
|
|||
// The old API is still available in 1.6, but as of 2.0 will throw a warning,
|
|||
// and in the first release thereafter disappear entirely.
|
|||
tests['postmessage'] = function() { |
|||
return !!window.postMessage; |
|||
}; |
|||
|
|||
// Web SQL database detection is tricky:
|
|||
|
|||
// In chrome incognito mode, openDatabase is truthy, but using it will
|
|||
// throw an exception: http://crbug.com/42380
|
|||
// We can create a dummy database, but there is no way to delete it afterwards.
|
|||
|
|||
// Meanwhile, Safari users can get prompted on any database creation.
|
|||
// If they do, any page with Modernizr will give them a prompt:
|
|||
// http://github.com/Modernizr/Modernizr/issues/closed#issue/113
|
|||
|
|||
// We have chosen to allow the Chrome incognito false positive, so that Modernizr
|
|||
// doesn't litter the web with these test databases. As a developer, you'll have
|
|||
// to account for this gotcha yourself.
|
|||
tests['websqldatabase'] = function() { |
|||
var result = !!window.openDatabase; |
|||
/* if (result){ |
|||
try { |
|||
result = !!openDatabase( mod + "testdb", "1.0", mod + "testdb", 2e4); |
|||
} catch(e) { |
|||
} |
|||
} */ |
|||
return result; |
|||
}; |
|||
|
|||
// Vendors have inconsistent prefixing with the experimental Indexed DB:
|
|||
// - Firefox is shipping indexedDB in FF4 as moz_indexedDB
|
|||
// - Webkit's implementation is accessible through webkitIndexedDB
|
|||
// We test both styles.
|
|||
tests['indexedDB'] = function(){ |
|||
for (var i = -1, len = domPrefixes.length; ++i < len; ){ |
|||
var prefix = domPrefixes[i].toLowerCase(); |
|||
if (window[prefix + '_indexedDB'] || window[prefix + 'IndexedDB']){ |
|||
return true; |
|||
} |
|||
} |
|||
return false; |
|||
}; |
|||
|
|||
// documentMode logic from YUI to filter out IE8 Compat Mode
|
|||
// which false positives.
|
|||
tests['hashchange'] = function() { |
|||
return isEventSupported('hashchange', window) && ( document.documentMode === undefined || document.documentMode > 7 ); |
|||
}; |
|||
|
|||
// Per 1.6:
|
|||
// This used to be Modernizr.historymanagement but the longer
|
|||
// name has been deprecated in favor of a shorter and property-matching one.
|
|||
// The old API is still available in 1.6, but as of 2.0 will throw a warning,
|
|||
// and in the first release thereafter disappear entirely.
|
|||
tests['history'] = function() { |
|||
return !!(window.history && history.pushState); |
|||
}; |
|||
|
|||
tests['draganddrop'] = function() { |
|||
return isEventSupported('dragstart') && isEventSupported('drop'); |
|||
}; |
|||
|
|||
tests['websockets'] = function(){ |
|||
return ('WebSocket' in window); |
|||
}; |
|||
|
|||
|
|||
// http://css-tricks.com/rgba-browser-support/
|
|||
tests['rgba'] = function() { |
|||
// Set an rgba() color and check the returned value
|
|||
|
|||
set_css( 'background-color:rgba(150,255,150,.5)' ); |
|||
|
|||
return contains( m_style.backgroundColor, 'rgba' ); |
|||
}; |
|||
|
|||
tests['hsla'] = function() { |
|||
// Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,
|
|||
// except IE9 who retains it as hsla
|
|||
|
|||
set_css('background-color:hsla(120,40%,100%,.5)' ); |
|||
|
|||
return contains( m_style.backgroundColor, 'rgba' ) || contains( m_style.backgroundColor, 'hsla' ); |
|||
}; |
|||
|
|||
tests['multiplebgs'] = function() { |
|||
// Setting multiple images AND a color on the background shorthand property
|
|||
// and then querying the style.background property value for the number of
|
|||
// occurrences of "url(" is a reliable method for detecting ACTUAL support for this!
|
|||
|
|||
set_css( 'background:url(//:),url(//:),red url(//:)' ); |
|||
|
|||
// If the UA supports multiple backgrounds, there should be three occurrences
|
|||
// of the string "url(" in the return value for elem_style.background
|
|||
|
|||
return new RegExp("(url\\s*\\(.*?){3}").test(m_style.background); |
|||
}; |
|||
|
|||
|
|||
// In testing support for a given CSS property, it's legit to test:
|
|||
// `elem.style[styleName] !== undefined`
|
|||
// If the property is supported it will return an empty string,
|
|||
// if unsupported it will return undefined.
|
|||
|
|||
// We'll take advantage of this quick test and skip setting a style
|
|||
// on our modernizr element, but instead just testing undefined vs
|
|||
// empty string.
|
|||
|
|||
|
|||
tests['backgroundsize'] = function() { |
|||
return test_props_all( 'backgroundSize' ); |
|||
}; |
|||
|
|||
tests['borderimage'] = function() { |
|||
return test_props_all( 'borderImage' ); |
|||
}; |
|||
|
|||
|
|||
// Super comprehensive table about all the unique implementations of
|
|||
// border-radius: http://muddledramblings.com/table-of-css3-border-radius-compliance
|
|||
|
|||
tests['borderradius'] = function() { |
|||
return test_props_all( 'borderRadius', '', function( prop ) { |
|||
return contains( prop, 'orderRadius' ); |
|||
}); |
|||
}; |
|||
|
|||
// WebOS unfortunately false positives on this test.
|
|||
tests['boxshadow'] = function() { |
|||
return test_props_all( 'boxShadow' ); |
|||
}; |
|||
|
|||
// FF3.0 will false positive on this test
|
|||
tests['textshadow'] = function(){ |
|||
return document.createElement('div').style.textShadow === ''; |
|||
}; |
|||
|
|||
|
|||
tests['opacity'] = function() { |
|||
// Browsers that actually have CSS Opacity implemented have done so
|
|||
// according to spec, which means their return values are within the
|
|||
// range of [0.0,1.0] - including the leading zero.
|
|||
|
|||
set_css_all( 'opacity:.55' ); |
|||
|
|||
// The non-literal . in this regex is intentional:
|
|||
// German Chrome returns this value as 0,55
|
|||
// https://github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632
|
|||
return /^0.55$/.test(m_style.opacity); |
|||
}; |
|||
|
|||
|
|||
tests['cssanimations'] = function() { |
|||
return test_props_all( 'animationName' ); |
|||
}; |
|||
|
|||
|
|||
tests['csscolumns'] = function() { |
|||
return test_props_all( 'columnCount' ); |
|||
}; |
|||
|
|||
|
|||
tests['cssgradients'] = function() { |
|||
/** |
|||
* For CSS Gradients syntax, please see: |
|||
* http://webkit.org/blog/175/introducing-css-gradients/
|
|||
* https://developer.mozilla.org/en/CSS/-moz-linear-gradient
|
|||
* https://developer.mozilla.org/en/CSS/-moz-radial-gradient
|
|||
* http://dev.w3.org/csswg/css3-images/#gradients-
|
|||
*/ |
|||
|
|||
var str1 = 'background-image:', |
|||
str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));', |
|||
str3 = 'linear-gradient(left top,#9f9, white);'; |
|||
|
|||
set_css( |
|||
(str1 + prefixes.join(str2 + str1) + prefixes.join(str3 + str1)).slice(0,-str1.length) |
|||
); |
|||
|
|||
return contains( m_style.backgroundImage, 'gradient' ); |
|||
}; |
|||
|
|||
|
|||
tests['cssreflections'] = function() { |
|||
return test_props_all( 'boxReflect' ); |
|||
}; |
|||
|
|||
|
|||
tests['csstransforms'] = function() { |
|||
return !!test_props([ 'transformProperty', 'WebkitTransform', 'MozTransform', 'OTransform', 'msTransform' ]); |
|||
}; |
|||
|
|||
|
|||
tests['csstransforms3d'] = function() { |
|||
|
|||
var ret = !!test_props([ 'perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective' ]); |
|||
|
|||
// Webkit’s 3D transforms are passed off to the browser's own graphics renderer.
|
|||
// It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in
|
|||
// some conditions. As a result, Webkit typically recognizes the syntax but
|
|||
// will sometimes throw a false positive, thus we must do a more thorough check:
|
|||
if (ret && 'webkitPerspective' in docElement.style){ |
|||
|
|||
// Webkit allows this media query to succeed only if the feature is enabled.
|
|||
// `@media (transform-3d),(-o-transform-3d),(-moz-transform-3d),(-ms-transform-3d),(-webkit-transform-3d),(modernizr){ ... }`
|
|||
ret = testMediaQuery('@media ('+prefixes.join('transform-3d),(')+'modernizr)'); |
|||
} |
|||
return ret; |
|||
}; |
|||
|
|||
|
|||
tests['csstransitions'] = function() { |
|||
return test_props_all( 'transitionProperty' ); |
|||
}; |
|||
|
|||
|
|||
// @font-face detection routine by Diego Perini
|
|||
// http://javascript.nwbox.com/CSSSupport/
|
|||
tests['fontface'] = function(){ |
|||
|
|||
var |
|||
sheet, bool, |
|||
head = docHead || docElement, |
|||
style = document.createElement("style"), |
|||
impl = document.implementation || { hasFeature: function() { return false; } }; |
|||
|
|||
style.type = 'text/css'; |
|||
head.insertBefore(style, head.firstChild); |
|||
sheet = style.sheet || style.styleSheet; |
|||
|
|||
var supportAtRule = impl.hasFeature('CSS2', '') ? |
|||
function(rule) { |
|||
if (!(sheet && rule)) return false; |
|||
var result = false; |
|||
try { |
|||
sheet.insertRule(rule, 0); |
|||
result = (/src/i).test(sheet.cssRules[0].cssText); |
|||
sheet.deleteRule(sheet.cssRules.length - 1); |
|||
} catch(e) { } |
|||
return result; |
|||
} : |
|||
function(rule) { |
|||
if (!(sheet && rule)) return false; |
|||
sheet.cssText = rule; |
|||
|
|||
return sheet.cssText.length !== 0 && (/src/i).test(sheet.cssText) && |
|||
sheet.cssText |
|||
.replace(/\r+|\n+/g, '') |
|||
.indexOf(rule.split(' ')[0]) === 0; |
|||
}; |
|||
|
|||
bool = supportAtRule('@font-face { font-family: "font"; src: url(data:,); }'); |
|||
head.removeChild(style); |
|||
return bool; |
|||
}; |
|||
|
|||
|
|||
// These tests evaluate support of the video/audio elements, as well as
|
|||
// testing what types of content they support.
|
|||
//
|
|||
// We're using the Boolean constructor here, so that we can extend the value
|
|||
// e.g. Modernizr.video // true
|
|||
// Modernizr.video.ogg // 'probably'
|
|||
//
|
|||
// Codec values from : http://github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845
|
|||
// thx to NielsLeenheer and zcorpan
|
|||
|
|||
// Note: in FF 3.5.1 and 3.5.0, "no" was a return value instead of empty string.
|
|||
// Modernizr does not normalize for that.
|
|||
|
|||
tests['video'] = function() { |
|||
var elem = document.createElement('video'), |
|||
bool = !!elem.canPlayType; |
|||
|
|||
if (bool){ |
|||
bool = new Boolean(bool); |
|||
bool.ogg = elem.canPlayType('video/ogg; codecs="theora"'); |
|||
|
|||
// Workaround required for IE9, which doesn't report video support without audio codec specified.
|
|||
// bug 599718 @ msft connect
|
|||
var h264 = 'video/mp4; codecs="avc1.42E01E'; |
|||
bool.h264 = elem.canPlayType(h264 + '"') || elem.canPlayType(h264 + ', mp4a.40.2"'); |
|||
|
|||
bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"'); |
|||
} |
|||
return bool; |
|||
}; |
|||
|
|||
tests['audio'] = function() { |
|||
var elem = document.createElement('audio'), |
|||
bool = !!elem.canPlayType; |
|||
|
|||
if (bool){ |
|||
bool = new Boolean(bool); |
|||
bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"'); |
|||
bool.mp3 = elem.canPlayType('audio/mpeg;'); |
|||
|
|||
// Mimetypes accepted:
|
|||
// https://developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements
|
|||
// http://bit.ly/iphoneoscodecs
|
|||
bool.wav = elem.canPlayType('audio/wav; codecs="1"'); |
|||
bool.m4a = elem.canPlayType('audio/x-m4a;') || elem.canPlayType('audio/aac;'); |
|||
} |
|||
return bool; |
|||
}; |
|||
|
|||
|
|||
// Firefox has made these tests rather unfun.
|
|||
|
|||
// In FF4, if disabled, window.localStorage should === null.
|
|||
|
|||
// Normally, we could not test that directly and need to do a
|
|||
// `('localStorage' in window) && ` test first because otherwise Firefox will
|
|||
// throw http://bugzil.la/365772 if cookies are disabled
|
|||
|
|||
// However, in Firefox 4 betas, if dom.storage.enabled == false, just mentioning
|
|||
// the property will throw an exception. http://bugzil.la/599479
|
|||
// This looks to be fixed for FF4 Final.
|
|||
|
|||
// Because we are forced to try/catch this, we'll go aggressive.
|
|||
|
|||
// FWIW: IE8 Compat mode supports these features completely:
|
|||
// http://www.quirksmode.org/dom/html5.html
|
|||
// But IE8 doesn't support either with local files
|
|||
|
|||
tests['localstorage'] = function() { |
|||
try { |
|||
return !!localStorage.getItem; |
|||
} catch(e) { |
|||
return false; |
|||
} |
|||
}; |
|||
|
|||
tests['sessionstorage'] = function() { |
|||
try { |
|||
return !!sessionStorage.getItem; |
|||
} catch(e){ |
|||
return false; |
|||
} |
|||
}; |
|||
|
|||
|
|||
tests['webWorkers'] = function () { |
|||
return !!window.Worker; |
|||
}; |
|||
|
|||
|
|||
tests['applicationcache'] = function() { |
|||
return !!window.applicationCache; |
|||
}; |
|||
|
|||
|
|||
// Thanks to Erik Dahlstrom
|
|||
tests['svg'] = function(){ |
|||
return !!document.createElementNS && !!document.createElementNS(ns.svg, "svg").createSVGRect; |
|||
}; |
|||
|
|||
tests['inlinesvg'] = function() { |
|||
var div = document.createElement('div'); |
|||
div.innerHTML = '<svg/>'; |
|||
return (div.firstChild && div.firstChild.namespaceURI) == ns.svg; |
|||
}; |
|||
|
|||
// Thanks to F1lt3r and lucideer
|
|||
// http://github.com/Modernizr/Modernizr/issues#issue/35
|
|||
tests['smil'] = function(){ |
|||
return !!document.createElementNS && /SVG/.test(tostring.call(document.createElementNS(ns.svg,'animate'))); |
|||
}; |
|||
|
|||
tests['svgclippaths'] = function(){ |
|||
// Possibly returns a false positive in Safari 3.2?
|
|||
return !!document.createElementNS && /SVG/.test(tostring.call(document.createElementNS(ns.svg,'clipPath'))); |
|||
}; |
|||
|
|||
|
|||
// input features and input types go directly onto the ret object, bypassing the tests loop.
|
|||
// Hold this guy to execute in a moment.
|
|||
function webforms(){ |
|||
|
|||
// Run through HTML5's new input attributes to see if the UA understands any.
|
|||
// We're using f which is the <input> element created early on
|
|||
// Mike Taylr has created a comprehensive resource for testing these attributes
|
|||
// when applied to all input types:
|
|||
// http://miketaylr.com/code/input-type-attr.html
|
|||
// spec: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
|
|||
ret['input'] = (function(props) { |
|||
for (var i = 0, len = props.length; i<len; i++) { |
|||
attrs[ props[i] ] = !!(props[i] in inputElem); |
|||
} |
|||
return attrs; |
|||
})('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ')); |
|||
|
|||
// Run through HTML5's new input types to see if the UA understands any.
|
|||
// This is put behind the tests runloop because it doesn't return a
|
|||
// true/false like all the other tests; instead, it returns an object
|
|||
// containing each input type with its corresponding true/false value
|
|||
|
|||
// Big thanks to @miketaylr for the html5 forms expertise. http://miketaylr.com/
|
|||
ret['inputtypes'] = (function(props) { |
|||
|
|||
for (var i = 0, bool, inputElemType, defaultView, len=props.length; i < len; i++) { |
|||
|
|||
inputElem.setAttribute('type', inputElemType = props[i]); |
|||
bool = inputElem.type !== 'text'; |
|||
|
|||
// We first check to see if the type we give it sticks..
|
|||
// If the type does, we feed it a textual value, which shouldn't be valid.
|
|||
// If the value doesn't stick, we know there's input sanitization which infers a custom UI
|
|||
if (bool){ |
|||
|
|||
inputElem.value = smile; |
|||
inputElem.style.cssText = 'position:absolute;visibility:hidden;'; |
|||
|
|||
if (/^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined){ |
|||
|
|||
docElement.appendChild(inputElem); |
|||
defaultView = document.defaultView; |
|||
|
|||
// Safari 2-4 allows the smiley as a value, despite making a slider
|
|||
bool = defaultView.getComputedStyle && |
|||
defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' && |
|||
// Mobile android web browser has false positive, so must
|
|||
// check the height to see if the widget is actually there.
|
|||
(inputElem.offsetHeight !== 0); |
|||
|
|||
docElement.removeChild(inputElem); |
|||
|
|||
} else if (/^(search|tel)$/.test(inputElemType)){ |
|||
// Spec doesnt define any special parsing or detectable UI
|
|||
// behaviors so we pass these through as true
|
|||
|
|||
// Interestingly, opera fails the earlier test, so it doesn't
|
|||
// even make it here.
|
|||
|
|||
} else if (/^(url|email)$/.test(inputElemType)) { |
|||
// Real url and email support comes with prebaked validation.
|
|||
bool = inputElem.checkValidity && inputElem.checkValidity() === false; |
|||
|
|||
} else if (/^color$/.test(inputElemType)) { |
|||
// chuck into DOM and force reflow for Opera bug in 11.00
|
|||
// github.com/Modernizr/Modernizr/issues#issue/159
|
|||
docElement.appendChild(inputElem); |
|||
docElement.offsetWidth; |
|||
bool = inputElem.value != smile; |
|||
docElement.removeChild(inputElem); |
|||
|
|||
} else { |
|||
// If the upgraded input compontent rejects the :) text, we got a winner
|
|||
bool = inputElem.value != smile; |
|||
} |
|||
} |
|||
|
|||
inputs[ props[i] ] = !!bool; |
|||
} |
|||
return inputs; |
|||
})('search tel url email datetime date month week time datetime-local number range color'.split(' ')); |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
// End of test definitions
|
|||
// -----------------------
|
|||
|
|||
|
|||
|
|||
// Run through all tests and detect their support in the current UA.
|
|||
// todo: hypothetically we could be doing an array of tests and use a basic loop here.
|
|||
for ( var feature in tests ) { |
|||
if ( hasOwnProperty( tests, feature ) ) { |
|||
// run the test, throw the return value into the Modernizr,
|
|||
// then based on that boolean, define an appropriate className
|
|||
// and push it into an array of classes we'll join later.
|
|||
featurename = feature.toLowerCase(); |
|||
ret[ featurename ] = tests[ feature ](); |
|||
|
|||
classes.push( ( ret[ featurename ] ? '' : 'no-' ) + featurename ); |
|||
} |
|||
} |
|||
|
|||
// input tests need to run.
|
|||
if (!ret.input) webforms(); |
|||
|
|||
|
|||
|
|||
// Per 1.6: deprecated API is still accesible for now:
|
|||
ret.crosswindowmessaging = ret.postmessage; |
|||
ret.historymanagement = ret.history; |
|||
|
|||
|
|||
|
|||
/** |
|||
* Addtest allows the user to define their own feature tests |
|||
* the result will be added onto the Modernizr object, |
|||
* as well as an appropriate className set on the html element |
|||
* |
|||
* @param feature - String naming the feature |
|||
* @param test - Function returning true if feature is supported, false if not |
|||
*/ |
|||
ret.addTest = function (feature, test) { |
|||
feature = feature.toLowerCase(); |
|||
|
|||
if (ret[ feature ]) { |
|||
return; // quit if you're trying to overwrite an existing test
|
|||
} |
|||
test = !!(test()); |
|||
docElement.className += ' ' + (test ? '' : 'no-') + feature; |
|||
ret[ feature ] = test; |
|||
return ret; // allow chaining.
|
|||
}; |
|||
|
|||
/** |
|||
* Reset m.style.cssText to nothing to reduce memory footprint. |
|||
*/ |
|||
set_css( '' ); |
|||
modElem = inputElem = null; |
|||
|
|||
//>>BEGIN IEPP
|
|||
// Enable HTML 5 elements for styling in IE.
|
|||
// fyi: jscript version does not reflect trident version
|
|||
// therefore ie9 in ie7 mode will still have a jScript v.9
|
|||
if ( enableHTML5 && window.attachEvent && (function(){ var elem = document.createElement("div"); |
|||
elem.innerHTML = "<elem></elem>"; |
|||
return elem.childNodes.length !== 1; })()) { |
|||
// iepp v1.6.2 by @jon_neal : code.google.com/p/ie-print-protector
|
|||
(function(win, doc) { |
|||
var elems = 'abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video', |
|||
elemsArr = elems.split('|'), |
|||
elemsArrLen = elemsArr.length, |
|||
elemRegExp = new RegExp('(^|\\s)('+elems+')', 'gi'), |
|||
tagRegExp = new RegExp('<(\/*)('+elems+')', 'gi'), |
|||
ruleRegExp = new RegExp('(^|[^\\n]*?\\s)('+elems+')([^\\n]*)({[\\n\\w\\W]*?})', 'gi'), |
|||
docFrag = doc.createDocumentFragment(), |
|||
html = doc.documentElement, |
|||
head = html.firstChild, |
|||
bodyElem = doc.createElement('body'), |
|||
styleElem = doc.createElement('style'), |
|||
body; |
|||
function shim(doc) { |
|||
var a = -1; |
|||
while (++a < elemsArrLen) |
|||
// Use createElement so IE allows HTML5-named elements in a document
|
|||
doc.createElement(elemsArr[a]); |
|||
} |
|||
function getCSS(styleSheetList, mediaType) { |
|||
var a = -1, |
|||
len = styleSheetList.length, |
|||
styleSheet, |
|||
cssTextArr = []; |
|||
while (++a < len) { |
|||
styleSheet = styleSheetList[a]; |
|||
// Get css from all non-screen stylesheets and their imports
|
|||
if ((mediaType = styleSheet.media || mediaType) != 'screen') cssTextArr.push(getCSS(styleSheet.imports, mediaType), styleSheet.cssText); |
|||
} |
|||
return cssTextArr.join(''); |
|||
} |
|||
// Shim the document and iepp fragment
|
|||
shim(doc); |
|||
shim(docFrag); |
|||
// Add iepp custom print style element
|
|||
head.insertBefore(styleElem, head.firstChild); |
|||
styleElem.media = 'print'; |
|||
win.attachEvent( |
|||
'onbeforeprint', |
|||
function() { |
|||
var a = -1, |
|||
cssText = getCSS(doc.styleSheets, 'all'), |
|||
cssTextArr = [], |
|||
rule; |
|||
body = body || doc.body; |
|||
// Get only rules which reference HTML5 elements by name
|
|||
while ((rule = ruleRegExp.exec(cssText)) != null) |
|||
// Replace all html5 element references with iepp substitute classnames
|
|||
cssTextArr.push((rule[1]+rule[2]+rule[3]).replace(elemRegExp, '$1.iepp_$2')+rule[4]); |
|||
// Write iepp custom print CSS
|
|||
styleElem.styleSheet.cssText = cssTextArr.join('\n'); |
|||
while (++a < elemsArrLen) { |
|||
var nodeList = doc.getElementsByTagName(elemsArr[a]), |
|||
nodeListLen = nodeList.length, |
|||
b = -1; |
|||
while (++b < nodeListLen) |
|||
if (nodeList[b].className.indexOf('iepp_') < 0) |
|||
// Append iepp substitute classnames to all html5 elements
|
|||
nodeList[b].className += ' iepp_'+elemsArr[a]; |
|||
} |
|||
docFrag.appendChild(body); |
|||
html.appendChild(bodyElem); |
|||
// Write iepp substitute print-safe document
|
|||
bodyElem.className = body.className; |
|||
// Replace HTML5 elements with <font> which is print-safe and shouldn't conflict since it isn't part of html5
|
|||
bodyElem.innerHTML = body.innerHTML.replace(tagRegExp, '<$1font'); |
|||
} |
|||
); |
|||
win.attachEvent( |
|||
'onafterprint', |
|||
function() { |
|||
// Undo everything done in onbeforeprint
|
|||
bodyElem.innerHTML = ''; |
|||
html.removeChild(bodyElem); |
|||
html.appendChild(body); |
|||
styleElem.styleSheet.cssText = ''; |
|||
} |
|||
); |
|||
})(window, document); |
|||
} |
|||
//>>END IEPP
|
|||
|
|||
// Assign private properties to the return object with prefix
|
|||
ret._enableHTML5 = enableHTML5; |
|||
ret._version = version; |
|||
|
|||
// Remove "no-js" class from <html> element, if it exists:
|
|||
docElement.className = docElement.className.replace(/\bno-js\b/,'') |
|||
+ ' js ' |
|||
|
|||
// Add the new classes to the <html> element.
|
|||
+ classes.join( ' ' ); |
|||
|
|||
return ret; |
|||
|
|||
})(this,this.document); |
File diff suppressed because one or more lines are too long
@ -1,8 +0,0 @@ |
|||
/* |
|||
* respond.js - A small and fast polyfill for min/max-width CSS3 Media Queries |
|||
* Copyright 2011, Scott Jehl, scottjehl.com |
|||
* Dual licensed under the MIT or GPL Version 2 licenses. |
|||
* Usage: Check out the readme file or github.com/scottjehl/respond |
|||
*/ |
|||
(function(e,h){e.respond={};respond.update=function(){};respond.mediaQueriesSupported=h;if(h){return}var u=e.document,r=u.documentElement,i=[],k=[],p=[],o={},g=30,f=u.getElementsByTagName("head")[0]||r,b=f.getElementsByTagName("link"),d=[],a=function(){var B=b,w=B.length;for(var z=0;z<w;z++){var y=B[z],x=y.href,A=y.media,v=y.rel&&y.rel.toLowerCase()==="stylesheet";if(!!x&&v&&!o[x]){if(!/^([a-zA-Z]+?:(\/\/)?(www\.)?)/.test(x)||x.replace(RegExp.$1,"").split("/")[0]===e.location.host){d.push({href:x,media:A})}else{o[x]=true}}}t()},t=function(){if(d.length){var v=d.shift();n(v.href,function(w){m(w,v.href,v.media);o[v.href]=true;t()})}},m=function(G,v,x){var E=G.match(/@media ([^\{]+)\{((?!@media)[\s\S])*(?=\}[\s]*\/\*\/mediaquery\*\/)/gmi),H=E&&E.length||0,v=v.substring(0,v.lastIndexOf("/")),w=function(I){return I.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+v+"$2$3")},y=!H&&x;if(v.length){v+="/"}if(y){H=1}for(var B=0;B<H;B++){var C;if(y){C=x;k.push(w(G))}else{C=E[B].match(/@media ([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1;k.push(RegExp.$2&&w(RegExp.$2))}var z=C.split(","),F=z.length;for(var A=0;A<F;A++){var D=z[A];i.push({media:D.match(/(only\s+)?([a-zA-Z]+)(\sand)?/)&&RegExp.$2,rules:k.length-1,minw:D.match(/\(min\-width:[\s]*([\s]*[0-9]+)px[\s]*\)/)&&parseFloat(RegExp.$1),maxw:D.match(/\(max\-width:[\s]*([\s]*[0-9]+)px[\s]*\)/)&&parseFloat(RegExp.$1)})}}j()},l,q,j=function(E){var v="clientWidth",x=r[v],D=u.compatMode==="CSS1Compat"&&x||u.body[v]||x,z={},C=u.createDocumentFragment(),B=b[b.length-1],w=(new Date()).getTime();if(E&&l&&w-l<g){clearTimeout(q);q=setTimeout(j,g);return}else{l=w}for(var y in i){var F=i[y];if(!F.minw&&!F.maxw||(!F.minw||F.minw&&D>=F.minw)&&(!F.maxw||F.maxw&&D<=F.maxw)){if(!z[F.media]){z[F.media]=[]}z[F.media].push(k[F.rules])}}for(var y in p){if(p[y]&&p[y].parentNode===f){f.removeChild(p[y])}}for(var y in z){var G=u.createElement("style"),A=z[y].join("\n");G.type="text/css";G.media=y;if(G.styleSheet){G.styleSheet.cssText=A}else{G.appendChild(u.createTextNode(A))}C.appendChild(G);p.push(G)}f.insertBefore(C,B.nextSibling)},n=function(v,x){var w=c();if(!w){return}w.open("GET",v,true);w.onreadystatechange=function(){if(w.readyState!=4||w.status!=200&&w.status!=304){return}x(w.responseText)};if(w.readyState==4){return}w.send()},c=(function(){var v=false,w=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("Msxml3.XMLHTTP")},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new XMLHttpRequest()}],y=w.length;while(y--){try{v=w[y]()}catch(x){continue}break}return function(){return v}})();a();respond.update=a;function s(){j(true)}if(e.addEventListener){e.addEventListener("resize",s,false)}else{if(e.attachEvent){e.attachEvent("onresize",s)}}})(this,(function(f){if(f.matchMedia){return true}var e,i=document,c=i.documentElement,g=c.firstElementChild||c.firstChild,h=!i.body,d=i.body||i.createElement("body"),b=i.createElement("div"),a="only all";b.id="mq-test-1";b.style.cssText="position:absolute;top:-99em";d.appendChild(b);b.innerHTML='_<style media="'+a+'"> #mq-test-1 { width: 9px; }</style>';if(h){c.insertBefore(d,g)}b.removeChild(b.firstChild);e=b.offsetWidth==9;if(h){c.removeChild(d)}else{d.removeChild(b)}return e})(this)); |
|||
|
@ -1,5 +0,0 @@ |
|||
/*! |
|||
* selectivizr v1.0.2 - (c) Keith Clark, freely distributable under the terms of the MIT license. |
|||
* selectivizr.com |
|||
*/ |
|||
(function(j){function A(a){return a.replace(B,h).replace(C,function(a,d,b){for(var a=b.split(","),b=0,e=a.length;b<e;b++){var s=D(a[b].replace(E,h).replace(F,h))+o,l=[];a[b]=s.replace(G,function(a,b,c,d,e){if(b){if(l.length>0){var a=l,f,e=s.substring(0,e).replace(H,i);if(e==i||e.charAt(e.length-1)==o)e+="*";try{f=t(e)}catch(k){}if(f){e=0;for(c=f.length;e<c;e++){for(var d=f[e],h=d.className,j=0,m=a.length;j<m;j++){var g=a[j];if(!RegExp("(^|\\s)"+g.className+"(\\s|$)").test(d.className)&&g.b&&(g.b===!0||g.b(d)===!0))h=u(h,g.className,!0)}d.className=h}}l=[]}return b}else{if(b=c?I(c):!v||v.test(d)?{className:w(d),b:!0}:null)return l.push(b),"."+b.className;return a}})}return d+a.join(",")})}function I(a){var c=!0,d=w(a.slice(1)),b=a.substring(0,5)==":not(",e,f;b&&(a=a.slice(5,-1));var l=a.indexOf("(");l>-1&&(a=a.substring(0,l));if(a.charAt(0)==":")switch(a.slice(1)){case "root":c=function(a){return b?a!=p:a==p};break;case "target":if(m==8){c=function(a){function c(){var d=location.hash,e=d.slice(1);return b?d==i||a.id!=e:d!=i&&a.id==e}k(j,"hashchange",function(){g(a,d,c())});return c()};break}return!1;case "checked":c=function(a){J.test(a.type)&&k(a,"propertychange",function(){event.propertyName=="checked"&&g(a,d,a.checked!==b)});return a.checked!==b};break;case "disabled":b=!b;case "enabled":c=function(c){if(K.test(c.tagName))return k(c,"propertychange",function(){event.propertyName=="$disabled"&&g(c,d,c.a===b)}),q.push(c),c.a=c.disabled,c.disabled===b;return a==":enabled"?b:!b};break;case "focus":e="focus",f="blur";case "hover":e||(e="mouseenter",f="mouseleave");c=function(a){k(a,b?f:e,function(){g(a,d,!0)});k(a,b?e:f,function(){g(a,d,!1)});return b};break;default:if(!L.test(a))return!1}return{className:d,b:c}}function w(a){return M+"-"+(m==6&&N?O++:a.replace(P,function(a){return a.charCodeAt(0)}))}function D(a){return a.replace(x,h).replace(Q,o)}function g(a,c,d){var b=a.className,c=u(b,c,d);if(c!=b)a.className=c,a.parentNode.className+=i}function u(a,c,d){var b=RegExp("(^|\\s)"+c+"(\\s|$)"),e=b.test(a);return d?e?a:a+o+c:e?a.replace(b,h).replace(x,h):a}function k(a,c,d){a.attachEvent("on"+c,d)}function r(a,c){if(/^https?:\/\//i.test(a))return c.substring(0,c.indexOf("/",8))==a.substring(0,a.indexOf("/",8))?a:null;if(a.charAt(0)=="/")return c.substring(0,c.indexOf("/",8))+a;var d=c.split(/[?#]/)[0];a.charAt(0)!="?"&&d.charAt(d.length-1)!="/"&&(d=d.substring(0,d.lastIndexOf("/")+1));return d+a}function y(a){if(a)return n.open("GET",a,!1),n.send(),(n.status==200?n.responseText:i).replace(R,i).replace(S,function(c,d,b,e,f){return y(r(b||f,a))}).replace(T,function(c,d,b){d=d||i;return" url("+d+r(b,a)+d+") "});return i}function U(){var a,c;a=f.getElementsByTagName("BASE");for(var d=a.length>0?a[0].href:f.location.href,b=0;b<f.styleSheets.length;b++)if(c=f.styleSheets[b],c.href!=i&&(a=r(c.href,d)))c.cssText=A(y(a));q.length>0&&setInterval(function(){for(var a=0,c=q.length;a<c;a++){var b=q[a];if(b.disabled!==b.a)b.disabled?(b.disabled=!1,b.a=!0,b.disabled=!0):b.a=b.disabled}},250)}if(!/*@cc_on!@*/true){var f=document,p=f.documentElement,n=function(){if(j.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(a){return null}}(),m=/MSIE (\d+)/.exec(navigator.userAgent)[1];if(!(f.compatMode!="CSS1Compat"||m<6||m>8||!n)){var z={NW:"*.Dom.select",MooTools:"$$",DOMAssistant:"*.$",Prototype:"$$",YAHOO:"*.util.Selector.query",Sizzle:"*",jQuery:"*",dojo:"*.query"},t,q=[],O=0,N=!0,M="slvzr",R=/(\/\*[^*]*\*+([^\/][^*]*\*+)*\/)\s*/g,S=/@import\s*(?:(?:(?:url\(\s*(['"]?)(.*)\1)\s*\))|(?:(['"])(.*)\3))[^;]*;/g,T=/\burl\(\s*(["']?)(?!data:)([^"')]+)\1\s*\)/g,L=/^:(empty|(first|last|only|nth(-last)?)-(child|of-type))$/,B=/:(:first-(?:line|letter))/g,C=/(^|})\s*([^\{]*?[\[:][^{]+)/g,G=/([ +~>])|(:[a-z-]+(?:\(.*?\)+)?)|(\[.*?\])/g,H=/(:not\()?:(hover|enabled|disabled|focus|checked|target|active|visited|first-line|first-letter)\)?/g,P=/[^\w-]/g,K=/^(INPUT|SELECT|TEXTAREA|BUTTON)$/,J=/^(checkbox|radio)$/,v=m>6?/[\$\^*]=(['"])\1/:null,E=/([(\[+~])\s+/g,F=/\s+([)\]+~])/g,Q=/\s+/g,x=/^\s*((?:[\S\s]*\S)?)\s*$/,i="",o=" ",h="$1";(function(a,c){function d(){try{p.doScroll("left")}catch(a){setTimeout(d,50);return}b("poll")}function b(d){if(!(d.type=="readystatechange"&&f.readyState!="complete")&&((d.type=="load"?a:f).detachEvent("on"+d.type,b,!1),!e&&(e=!0)))c.call(a,d.type||d)}var e=!1,g=!0;if(f.readyState=="complete")c.call(a,i);else{if(f.createEventObject&&p.doScroll){try{g=!a.frameElement}catch(h){}g&&d()}k(f,"readystatechange",b);k(a,"load",b)}})(j,function(){for(var a in z){var c,d,b=j;if(j[a]){for(c=z[a].replace("*",a).split(".");(d=c.shift())&&(b=b[d]););if(typeof b=="function"){t=b;U();break}}}})}}})(this); |
@ -0,0 +1,30 @@ |
|||
function addDivLines(){ |
|||
$('div.highlight pre code').each(function(el){ |
|||
var content = bonzo(el).html(); |
|||
var lines = content.split('\n'); |
|||
var count = lines.length; |
|||
bonzo(lines).each(function(line, index){ |
|||
if(line == '') line = ' '; |
|||
lines[index] = '<div class="line">' + line + '</div>'; |
|||
}); |
|||
$(el).html(lines.join('')); |
|||
}); |
|||
} |
|||
function preToTable(){ |
|||
$('div.highlight').each(function(code){ |
|||
var tableStart = '<table cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter">'; |
|||
var lineNumbers = '<pre class="line-numbers">'; |
|||
var tableMiddle = '</pre></td><td class="code" width="100%">'; |
|||
var tableEnd = '</td></tr></tbody></table>'; |
|||
var count = $('div.line', code).length; |
|||
for (i=1;i<=count; i++){ |
|||
lineNumbers += '<span class="line">'+i+'</span>\n'; |
|||
} |
|||
table = tableStart + lineNumbers + tableMiddle + '<pre>'+$('pre', code).html()+'</pre>' + tableEnd; |
|||
$(code).html(table); |
|||
}); |
|||
} |
|||
$.domReady(function () { |
|||
addDivLines(); |
|||
preToTable(); |
|||
}); |
@ -0,0 +1,397 @@ |
|||
--- |
|||
layout: default |
|||
layout: page |
|||
nometa: true |
|||
title: Syntax Highlighting Debug |
|||
--- |
|||
|
|||
<h3 class="filename">gist_syntax_test.rb</h3> |
|||
{% gist 996818 test.rb %} |
|||
|
|||
<h3 class="filename">syntax_test.diff</h3> |
|||
{% highlight diff %} |
|||
@@ -590,7 +590,7 @@ class SpritesTest < Test::Unit::TestCase |
|||
it "should generate a sprite from nested folders" do |
|||
css = render <<-SCSS |
|||
- @import "nested/*.png"; |
|||
+ @import "nested/**/*.png"; |
|||
@include all-nested-sprites; |
|||
SCSS |
|||
assert_correct css, <<-CSS |
|||
|
|||
{% endhighlight %} |
|||
|
|||
<h3 class="filename">syntax_test.html</h3> |
|||
{% highlight html %} |
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
|||
<html><head> |
|||
<title>A Tiny Page</title> |
|||
<style type="text/css"> |
|||
<!-- |
|||
p { font-size:15pt; color:#000 } |
|||
--> |
|||
</style></head><!-- real comment --> |
|||
<body bgcolor="#FFFFFF" text="#000000" link="#0000CC"> |
|||
<script language="javascript" type="text/javascript"> |
|||
function changeHeight(h) { |
|||
var tds = document.getElementsByTagName("td"); |
|||
for(var i = 0; i < tds.length; i++) { |
|||
tds[i].setAttribute("height", h + "px"); |
|||
}} |
|||
</script> |
|||
<h1>abc</h1> |
|||
<h2>def</h2> |
|||
<p>Testing page</p> |
|||
</body></html> |
|||
{% endhighlight %} |
|||
|
|||
<h3 class="filename">syntax_test.js</h3> |
|||
{% highlight js %} |
|||
|
|||
/** |
|||
sample javascript from xui |
|||
*/ |
|||
|
|||
var undefined, |
|||
xui, |
|||
window = this, |
|||
string = new String('string'), |
|||
document = window.document, |
|||
simpleExpr = /^#?([\w-]+)$/, |
|||
idExpr = /^#/, |
|||
tagExpr = /<([\w:]+)/, |
|||
slice = function (e) { return [].slice.call(e, 0); }; |
|||
try { var a = slice(document.documentElement.childNodes)[0].nodeType; } |
|||
catch(e){ slice = function (e) { var ret=[]; for (var i=0; e[i]; i++) |
|||
ret.push(e[i]); return ret; }; } |
|||
|
|||
window.x$ = window.xui = xui = function(q, context) { |
|||
return new xui.fn.find(q, context); |
|||
}; |
|||
|
|||
|
|||
{% endhighlight %} |
|||
|
|||
<h3 class="filename">syntax_test.rb</h3> |
|||
{% highlight ruby %} |
|||
|
|||
include Enumerable |
|||
|
|||
def initialize(rbconfig) |
|||
@rbconfig = rbconfig |
|||
@no_harm = false |
|||
end |
|||
|
|||
def load_savefile |
|||
begin |
|||
File.foreach(savefile()) do |line| |
|||
k, v = *line.split(/=/, 2) |
|||
self[k] = v.strip |
|||
end |
|||
rescue Errno::ENOENT |
|||
setup_rb_error $!.message + "\n#{File.basename($0)} config first" |
|||
end |
|||
end |
|||
|
|||
if c['rubylibdir'] |
|||
# V > 1.6.3 |
|||
libruby = "#{c['prefix']}/lib/ruby" |
|||
siterubyverarch = c['sitearchdir'] |
|||
end |
|||
parameterize = lambda {|path| |
|||
path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix') |
|||
} |
|||
|
|||
if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg } |
|||
makeprog = arg.sub(/'/, '').split(/=/, 2)[1] |
|||
else |
|||
makeprog = 'make' |
|||
end |
|||
|
|||
def setup_rb_error(msg) |
|||
raise SetupError, msg |
|||
end |
|||
|
|||
if $0 == __FILE__ |
|||
begin |
|||
ToplevelInstaller.invoke |
|||
rescue SetupError |
|||
raise if $DEBUG |
|||
$stderr.puts $!.message |
|||
$stderr.puts "Try 'ruby #{$0} --help' for detailed usage." |
|||
exit 1 |
|||
end |
|||
end |
|||
{% endhighlight %} |
|||
|
|||
<h3 class="filename">syntax_test.php</h3> |
|||
{% highlight php %} |
|||
<?php |
|||
require_once($GLOBALS['g_campsiteDir']. "/$ADMIN_DIR/country/common.php"); |
|||
require_once($GLOBALS['g_campsiteDir']. "/classes/SimplePager.php"); |
|||
camp_load_translation_strings("api"); |
|||
|
|||
$f_country_language_selected = camp_session_get('f_language_selected', ''); |
|||
$f_country_offset = camp_session_get('f_country_offset', 0); |
|||
if (empty($f_country_language_selected)) { |
|||
$f_country_language_selected = null; |
|||
} |
|||
$ItemsPerPage = 20; |
|||
$languages = Language::GetLanguages(null, null, null, array(), array(), true); |
|||
$numCountries = Country::GetNumCountries($f_country_language_selected); |
|||
|
|||
$pager = new SimplePager($numCountries, $ItemsPerPage, "index.php?"); |
|||
|
|||
$crumbs = array(); |
|||
$crumbs[] = array(getGS("Configure"), ""); |
|||
$crumbs[] = array(getGS("Countries"), ""); |
|||
echo camp_html_breadcrumbs($crumbs); |
|||
|
|||
?> |
|||
|
|||
<?php if ($g_user->hasPermission("ManageCountries")) { ?> |
|||
<table BORDER="0" CELLSPACING="0" CELLPADDING="1"> |
|||
<tr> |
|||
<td><a href="add.php"><?php putGS("Add new"); ?></a></td> |
|||
</tr> |
|||
</table> |
|||
{% endhighlight %} |
|||
|
|||
|
|||
<h3 class="filename">syntax_test.hs</h3> |
|||
{% highlight hs %} |
|||
{-# LANGUAGE OverloadedStrings #-} |
|||
module Main where |
|||
|
|||
--import Prelude hiding (id) |
|||
--import Control.Category (id) |
|||
import Control.Arrow ((>>>), (***), arr) |
|||
import Control.Monad (forM_) |
|||
-- import Data.Monoid (mempty, mconcat) |
|||
|
|||
-- import System.FilePath |
|||
|
|||
import Hakyll |
|||
|
|||
|
|||
main :: IO () |
|||
main = hakyll $ do |
|||
|
|||
route "css/*" $ setExtension "css" |
|||
compile "css/*" $ byExtension (error "Not a (S)CSS file") |
|||
[ (".css", compressCssCompiler) |
|||
, (".scss", sass) |
|||
] |
|||
|
|||
route "js/**" idRoute |
|||
compile "js/**" copyFileCompiler |
|||
|
|||
route "img/*" idRoute |
|||
compile "img/*" copyFileCompiler |
|||
|
|||
compile "templates/*" templateCompiler |
|||
|
|||
forM_ ["test.md", "index.md"] $ \page -> do |
|||
route page $ setExtension "html" |
|||
compile page $ pageCompiler |
|||
>>> applyTemplateCompiler "templates/default.html" |
|||
>>> relativizeUrlsCompiler |
|||
|
|||
sass :: Compiler Resource String |
|||
sass = getResourceString >>> unixFilter "sass" ["-s", "--scss"] |
|||
>>> arr compressCss |
|||
|
|||
{% endhighlight %} |
|||
|
|||
<h3 class="filename">syntax_test.sh</h3> |
|||
{% highlight sh %} |
|||
#!/bin/bash |
|||
|
|||
cd $ROOT_DIR |
|||
DOT_FILES="lastpass weechat ssh Xauthority" |
|||
for dotfile in $DOT_FILES; do conform_link "$DATA_DIR/$dotfile" ".$dotfile"; done |
|||
|
|||
# TODO: refactor with suffix variables (or common cron values) |
|||
|
|||
case "$PLATFORM" in |
|||
linux) |
|||
#conform_link "$CONF_DIR/shell/zshenv" ".zshenv" |
|||
crontab -l > $ROOT_DIR/tmp/crontab-conflict-arch |
|||
cd $ROOT_DIR/$CONF_DIR/cron |
|||
if [[ "$(diff ~/tmp/crontab-conflict-arch crontab-current-arch)" == "" |
|||
]]; |
|||
then # no difference with current backup |
|||
logger "$LOG_PREFIX: crontab live settings match stored "\ |
|||
"settings; no restore required" |
|||
rm ~/tmp/crontab-conflict-arch |
|||
else # current crontab settings in file do not match live settings |
|||
crontab $ROOT_DIR/$CONF_DIR/cron/crontab-current-arch |
|||
logger "$LOG_PREFIX: crontab stored settings conflict with "\ |
|||
"live settings; stored settings restored. "\ |
|||
"Previous settings recorded in ~/tmp/crontab-conflict-arch." |
|||
fi |
|||
;; |
|||
|
|||
{% endhighlight %} |
|||
|
|||
<h3 class="filename">syntax_test.py</h3> |
|||
{% highlight py %} |
|||
# test python (sample from offlineimap) |
|||
|
|||
class ExitNotifyThread(Thread): |
|||
"""This class is designed to alert a "monitor" to the fact that a thread has |
|||
exited and to provide for the ability for it to find out why.""" |
|||
def run(self): |
|||
global exitthreads, profiledir |
|||
self.threadid = thread.get_ident() |
|||
try: |
|||
if not profiledir: # normal case |
|||
Thread.run(self) |
|||
else: |
|||
try: |
|||
import cProfile as profile |
|||
except ImportError: |
|||
import profile |
|||
prof = profile.Profile() |
|||
try: |
|||
prof = prof.runctx("Thread.run(self)", globals(), locals()) |
|||
except SystemExit: |
|||
pass |
|||
prof.dump_stats( \ |
|||
profiledir + "/" + str(self.threadid) + "_" + \ |
|||
self.getName() + ".prof") |
|||
except: |
|||
self.setExitCause('EXCEPTION') |
|||
if sys: |
|||
self.setExitException(sys.exc_info()[1]) |
|||
tb = traceback.format_exc() |
|||
self.setExitStackTrace(tb) |
|||
else: |
|||
self.setExitCause('NORMAL') |
|||
if not hasattr(self, 'exitmessage'): |
|||
self.setExitMessage(None) |
|||
|
|||
if exitthreads: |
|||
exitthreads.put(self, True) |
|||
|
|||
def setExitCause(self, cause): |
|||
self.exitcause = cause |
|||
def getExitCause(self): |
|||
"""Returns the cause of the exit, one of: |
|||
'EXCEPTION' -- the thread aborted because of an exception |
|||
'NORMAL' -- normal termination.""" |
|||
return self.exitcause |
|||
def setExitException(self, exc): |
|||
self.exitexception = exc |
|||
def getExitException(self): |
|||
"""If getExitCause() is 'EXCEPTION', holds the value from |
|||
sys.exc_info()[1] for this exception.""" |
|||
return self.exitexception |
|||
def setExitStackTrace(self, st): |
|||
self.exitstacktrace = st |
|||
def getExitStackTrace(self): |
|||
"""If getExitCause() is 'EXCEPTION', returns a string representing |
|||
the stack trace for this exception.""" |
|||
return self.exitstacktrace |
|||
def setExitMessage(self, msg): |
|||
"""Sets the exit message to be fetched by a subsequent call to |
|||
getExitMessage. This message may be any object or type except |
|||
None.""" |
|||
self.exitmessage = msg |
|||
def getExitMessage(self): |
|||
"""For any exit cause, returns the message previously set by |
|||
a call to setExitMessage(), or None if there was no such message |
|||
set.""" |
|||
return self.exitmessage |
|||
|
|||
{% endhighlight %} |
|||
|
|||
<h3 class="filename">syntax_test.pl</h3> |
|||
{% highlight perl %} |
|||
#!perl -w |
|||
|
|||
# Time-stamp: <2002/04/06, 13:12:13 (EST), maverick, csvformat.pl> |
|||
# Two pass CSV file to table formatter |
|||
|
|||
$delim = $#ARGV >= 1 ? $ARGV[1] : ','; |
|||
print STDERR "Split pattern: $delim\n"; |
|||
|
|||
# first pass |
|||
open F, "<$ARGV[0]" or die; |
|||
while(<F>) |
|||
{ |
|||
chomp; |
|||
$i = 0; |
|||
map { $max[$_->[1]] = $_->[0] if $_->[0] > ($max[$_->[1]] || 0) } |
|||
(map {[length $_, $i++]} split($delim)); |
|||
} |
|||
close F; |
|||
|
|||
print STDERR 'Field width: ', join(', ', @max), "\n"; |
|||
print STDERR join(' ', map {'-' x $_} @max); |
|||
|
|||
# second pass |
|||
open F, "<$ARGV[0]" or die; |
|||
while(<F>) |
|||
{ |
|||
chomp; |
|||
$i = 0; |
|||
map { printf("%-$max[$_->[1]]s ", $_->[0]) } |
|||
(map {[$_, $i++]} split($delim)); |
|||
print "\n"; |
|||
} |
|||
close F; |
|||
|
|||
{% endhighlight %} |
|||
|
|||
<h3 class="filename">syntax_test.java</h3> |
|||
{% highlight java %} |
|||
import java.util.Map; |
|||
import java.util.TreeSet; |
|||
|
|||
public class GetEnv { |
|||
/** |
|||
* let's test generics |
|||
* @param args the command line arguments |
|||
*/ |
|||
public static void main(String[] args) { |
|||
// get a map of environment variables |
|||
Map<String, String> env = System.getenv(); |
|||
// build a sorted set out of the keys and iterate |
|||
for(String k: new TreeSet<String>(env.keySet())) { |
|||
System.out.printf("%s = %s\n", k, env.get(k)); |
|||
} |
|||
} } |
|||
{% endhighlight %} |
|||
|
|||
<h3 class="filename">syntax_test.c</h3> |
|||
{% highlight c %} |
|||
#define UNICODE |
|||
#include <windows.h> |
|||
|
|||
int main(int argc, char **argv) { |
|||
int speed = 0, speed1 = 0, speed2 = 0; // 1-20 |
|||
printf("Set Mouse Speed by Maverick\n"); |
|||
|
|||
SystemParametersInfo(SPI_GETMOUSESPEED, 0, &speed, 0); |
|||
printf("Current speed: %2d\n", speed); |
|||
|
|||
if (argc == 1) return 0; |
|||
if (argc >= 2) sscanf(argv[1], "%d", &speed1); |
|||
if (argc >= 3) sscanf(argv[2], "%d", &speed2); |
|||
|
|||
if (argc == 2) // set speed to first value |
|||
speed = speed1; |
|||
else if (speed == speed1 || speed == speed2) // alternate |
|||
speed = speed1 + speed2 - speed; |
|||
else |
|||
speed = speed1; // start with first value |
|||
|
|||
SystemParametersInfo(SPI_SETMOUSESPEED, 0, speed, 0); |
|||
SystemParametersInfo(SPI_GETMOUSESPEED, 0, &speed, 0); |
|||
printf("New speed: %2d\n", speed); |
|||
return 0; |
|||
} |
|||
|
|||
{% endhighlight %} |
|||
|
@ -1,228 +0,0 @@ |
|||
--- |
|||
layout: default |
|||
title: Syntax Highlighting Debug |
|||
--- |
|||
<div class="code_window"> |
|||
<em>Ruby</em> |
|||
{% highlight ruby %} |
|||
def rebuild_site(relative) |
|||
puts ">>> Change Detected to: #{relative} <<<" |
|||
IO.popen('rake generate') do |io| |
|||
print(io.readpartial(512)) until io.eof? |
|||
end |
|||
puts '>>> Update Complete <<<' |
|||
end |
|||
{% endhighlight %} |
|||
</div> |
|||
|
|||
So that's a small example. What about a big one? |
|||
|
|||
<div class="code_window"> |
|||
<em>Ruby</em> |
|||
{% highlight ruby %} |
|||
require 'active_support/core_ext/array' |
|||
require 'active_support/core_ext/hash/except' |
|||
require 'active_support/core_ext/object/metaclass' |
|||
|
|||
module ActiveRecord |
|||
module NamedScope |
|||
extend ActiveSupport::Concern |
|||
|
|||
# All subclasses of ActiveRecord::Base have one named scope: |
|||
# * <tt>scoped</tt> - which allows for the creation of anonymous \scopes, on the fly: <tt>Shirt.scoped(:conditions => {:color => 'red'}).scoped(:include => :washing_instructions)</tt> |
|||
# |
|||
# These anonymous \scopes tend to be useful when procedurally generating complex queries, where passing |
|||
# intermediate values (scopes) around as first-class objects is convenient. |
|||
# |
|||
# You can define a scope that applies to all finders using ActiveRecord::Base.default_scope. |
|||
included do |
|||
named_scope :scoped, lambda { |scope| scope } |
|||
end |
|||
|
|||
module ClassMethods |
|||
def scopes |
|||
read_inheritable_attribute(:scopes) || write_inheritable_attribute(:scopes, {}) |
|||
end |
|||
|
|||
# Adds a class method for retrieving and querying objects. A scope represents a narrowing of a database query, |
|||
# such as <tt>:conditions => {:color => :red}, :select => 'shirts.*', :include => :washing_instructions</tt>. |
|||
# |
|||
# class Shirt < ActiveRecord::Base |
|||
# named_scope :red, :conditions => {:color => 'red'} |
|||
# named_scope :dry_clean_only, :joins => :washing_instructions, :conditions => ['washing_instructions.dry_clean_only = ?', true] |
|||
# end |
|||
# |
|||
# The above calls to <tt>named_scope</tt> define class methods Shirt.red and Shirt.dry_clean_only. Shirt.red, |
|||
# in effect, represents the query <tt>Shirt.find(:all, :conditions => {:color => 'red'})</tt>. |
|||
# |
|||
# Unlike <tt>Shirt.find(...)</tt>, however, the object returned by Shirt.red is not an Array; it resembles the association object |
|||
# constructed by a <tt>has_many</tt> declaration. For instance, you can invoke <tt>Shirt.red.find(:first)</tt>, <tt>Shirt.red.count</tt>, |
|||
# <tt>Shirt.red.find(:all, :conditions => {:size => 'small'})</tt>. Also, just |
|||
# as with the association objects, named \scopes act like an Array, implementing Enumerable; <tt>Shirt.red.each(&block)</tt>, |
|||
# <tt>Shirt.red.first</tt>, and <tt>Shirt.red.inject(memo, &block)</tt> all behave as if Shirt.red really was an Array. |
|||
# |
|||
# These named \scopes are composable. For instance, <tt>Shirt.red.dry_clean_only</tt> will produce all shirts that are both red and dry clean only. |
|||
# Nested finds and calculations also work with these compositions: <tt>Shirt.red.dry_clean_only.count</tt> returns the number of garments |
|||
# for which these criteria obtain. Similarly with <tt>Shirt.red.dry_clean_only.average(:thread_count)</tt>. |
|||
# |
|||
# All \scopes are available as class methods on the ActiveRecord::Base descendant upon which the \scopes were defined. But they are also available to |
|||
# <tt>has_many</tt> associations. If, |
|||
# |
|||
# class Person < ActiveRecord::Base |
|||
# has_many :shirts |
|||
# end |
|||
# |
|||
# then <tt>elton.shirts.red.dry_clean_only</tt> will return all of Elton's red, dry clean |
|||
# only shirts. |
|||
# |
|||
# Named \scopes can also be procedural: |
|||
# |
|||
# class Shirt < ActiveRecord::Base |
|||
# named_scope :colored, lambda { |color| |
|||
# { :conditions => { :color => color } } |
|||
# } |
|||
# end |
|||
# |
|||
# In this example, <tt>Shirt.colored('puce')</tt> finds all puce shirts. |
|||
# |
|||
# Named \scopes can also have extensions, just as with <tt>has_many</tt> declarations: |
|||
# |
|||
# class Shirt < ActiveRecord::Base |
|||
# named_scope :red, :conditions => {:color => 'red'} do |
|||
# def dom_id |
|||
# 'red_shirts' |
|||
# end |
|||
# end |
|||
# end |
|||
# |
|||
# |
|||
# For testing complex named \scopes, you can examine the scoping options using the |
|||
# <tt>proxy_options</tt> method on the proxy itself. |
|||
# |
|||
# class Shirt < ActiveRecord::Base |
|||
# named_scope :colored, lambda { |color| |
|||
# { :conditions => { :color => color } } |
|||
# } |
|||
# end |
|||
# |
|||
# expected_options = { :conditions => { :colored => 'red' } } |
|||
# assert_equal expected_options, Shirt.colored('red').proxy_options |
|||
def named_scope(name, options = {}, &block) |
|||
name = name.to_sym |
|||
scopes[name] = lambda do |parent_scope, *args| |
|||
Scope.new(parent_scope, case options |
|||
when Hash |
|||
options |
|||
when Proc |
|||
options.call(*args) |
|||
end, &block) |
|||
end |
|||
metaclass.instance_eval do |
|||
define_method name do |*args| |
|||
scopes[name].call(self, *args) |
|||
end |
|||
end |
|||
end |
|||
end |
|||
|
|||
class Scope |
|||
attr_reader :proxy_scope, :proxy_options, :current_scoped_methods_when_defined |
|||
NON_DELEGATE_METHODS = %w(nil? send object_id class extend find size count sum average maximum minimum paginate first last empty? any? many? respond_to?).to_set |
|||
[].methods.each do |m| |
|||
unless m =~ /^__/ || NON_DELEGATE_METHODS.include?(m.to_s) |
|||
delegate m, :to => :proxy_found |
|||
end |
|||
end |
|||
|
|||
delegate :scopes, :with_scope, :scoped_methods, :to => :proxy_scope |
|||
|
|||
def initialize(proxy_scope, options, &block) |
|||
options ||= {} |
|||
[options[:extend]].flatten.each { |extension| extend extension } if options[:extend] |
|||
extend Module.new(&block) if block_given? |
|||
unless Scope === proxy_scope |
|||
@current_scoped_methods_when_defined = proxy_scope.send(:current_scoped_methods) |
|||
end |
|||
@proxy_scope, @proxy_options = proxy_scope, options.except(:extend) |
|||
end |
|||
|
|||
def reload |
|||
load_found; self |
|||
end |
|||
|
|||
def first(*args) |
|||
if args.first.kind_of?(Integer) || (@found && !args.first.kind_of?(Hash)) |
|||
proxy_found.first(*args) |
|||
else |
|||
find(:first, *args) |
|||
end |
|||
end |
|||
|
|||
def last(*args) |
|||
if args.first.kind_of?(Integer) || (@found && !args.first.kind_of?(Hash)) |
|||
proxy_found.last(*args) |
|||
else |
|||
find(:last, *args) |
|||
end |
|||
end |
|||
|
|||
def size |
|||
@found ? @found.length : count |
|||
end |
|||
|
|||
def empty? |
|||
@found ? @found.empty? : count.zero? |
|||
end |
|||
|
|||
def respond_to?(method, include_private = false) |
|||
super || @proxy_scope.respond_to?(method, include_private) |
|||
end |
|||
|
|||
def any? |
|||
if block_given? |
|||
proxy_found.any? { |*block_args| yield(*block_args) } |
|||
else |
|||
!empty? |
|||
end |
|||
end |
|||
|
|||
# Returns true if the named scope has more than 1 matching record. |
|||
def many? |
|||
if block_given? |
|||
proxy_found.many? { |*block_args| yield(*block_args) } |
|||
else |
|||
size > 1 |
|||
end |
|||
end |
|||
|
|||
protected |
|||
def proxy_found |
|||
@found || load_found |
|||
end |
|||
|
|||
private |
|||
def method_missing(method, *args, &block) |
|||
if scopes.include?(method) |
|||
scopes[method].call(self, *args) |
|||
else |
|||
with_scope({:find => proxy_options, :create => proxy_options[:conditions].is_a?(Hash) ? proxy_options[:conditions] : {}}, :reverse_merge) do |
|||
method = :new if method == :build |
|||
if current_scoped_methods_when_defined && !scoped_methods.include?(current_scoped_methods_when_defined) |
|||
with_scope current_scoped_methods_when_defined do |
|||
proxy_scope.send(method, *args, &block) |
|||
end |
|||
else |
|||
proxy_scope.send(method, *args, &block) |
|||
end |
|||
end |
|||
end |
|||
end |
|||
|
|||
def load_found |
|||
@found = find(:all) |
|||
end |
|||
end |
|||
end |
|||
end |
|||
{% endhighlight %} |
|||
</div> |
Loading…
Reference in new issue