Moved themes to .themes to get it out of the way. Updated Rakefile to support .themes dir and remove duplication. Improved deploy task. Renamed init_deploy to cofig_deploy and rewrote it to update configurations in the Rakefile for easier deploy use
73
.themes/classic/_plugins/blockquote.rb
Normal file
@ -0,0 +1,73 @@
|
||||
#
|
||||
# Author: Brandon Mathis
|
||||
# Based on the work of: Josediaz Gonzalez - https://github.com/josegonzalez/josediazgonzalez.com/blob/master/_plugins/blockquote.rb
|
||||
#
|
||||
# Outputs a string with a given attribution as a quote
|
||||
#
|
||||
# {% blockquote Bobby Willis http://google.com/blah the search for bobby's mom %}
|
||||
# Wheeee!
|
||||
# {% endblockquote %}
|
||||
# ...
|
||||
# <blockquote>
|
||||
# <p>Wheeee!</p>
|
||||
# <footer>
|
||||
# <strong>Bobby Willis</strong><cite><a href="http://google.com/blah">The Search For Bobby's Mom</a>
|
||||
# </blockquote>
|
||||
#
|
||||
require './_plugins/titlecase.rb'
|
||||
module Jekyll
|
||||
|
||||
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 = paragraphize(super.map(&:strip).join)
|
||||
author = "<strong>#{@by.strip}</strong>"
|
||||
if @source
|
||||
url = @source.match(/https?:\/\/(.+)/)[1].split('/')
|
||||
parts = []
|
||||
url.each do |part|
|
||||
if (parts + [part]).join('/').length < 32
|
||||
parts << part
|
||||
end
|
||||
end
|
||||
source = parts.join('/')
|
||||
source << '/…' unless source == @source
|
||||
end
|
||||
cite = "<cite><a href='#{@source}'>#{(@title || source)}</a></cite>"
|
||||
reply = if @by.nil?
|
||||
output
|
||||
elsif !@source.nil?
|
||||
"#{output}<footer>#{author + cite}</footer>"
|
||||
else
|
||||
"#{output}<footer>#{author}</footer>"
|
||||
end
|
||||
"<blockquote>#{reply}</blockquote>"
|
||||
end
|
||||
|
||||
def paragraphize(input)
|
||||
"<p>#{input.gsub(/\n\n/, '</p><p>').gsub(/\n/, '<br/>')}</p>"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Liquid::Template.register_tag('blockquote', Jekyll::Blockquote)
|
||||
161
.themes/classic/_plugins/category_generator.rb
Normal file
@ -0,0 +1,161 @@
|
||||
# Jekyll category page generator.
|
||||
# http://recursive-design.com/projects/jekyll-plugins/
|
||||
#
|
||||
# Version: 0.1.4 (201101061053)
|
||||
#
|
||||
# Copyright (c) 2010 Dave Perrett, http://recursive-design.com/
|
||||
# Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
|
||||
#
|
||||
# A generator that creates category pages for jekyll sites.
|
||||
#
|
||||
# To use it, simply drop this script into the _plugins directory of your Jekyll site. You should
|
||||
# also create a file called 'category_index.html' in the _layouts directory of your jekyll site
|
||||
# with the following contents (note: you should remove the leading '# ' characters):
|
||||
#
|
||||
# ================================== COPY BELOW THIS LINE ==================================
|
||||
# ---
|
||||
# layout: default
|
||||
# ---
|
||||
#
|
||||
# <h1 class="category">{{ page.title }}</h1>
|
||||
# <ul class="posts">
|
||||
# {% for post in site.categories[page.category] %}
|
||||
# <div>{{ post.date | date_to_html_string }}</div>
|
||||
# <h2><a href="{{ post.url }}">{{ post.title }}</a></h2>
|
||||
# <div class="categories">Filed under {{ post.categories | category_links }}</div>
|
||||
# {% endfor %}
|
||||
# </ul>
|
||||
# ================================== COPY ABOVE THIS LINE ==================================
|
||||
#
|
||||
# You can alter the _layout_ setting if you wish to use an alternate layout, and obviously you
|
||||
# can change the HTML above as you see fit.
|
||||
#
|
||||
# When you compile your jekyll site, this plugin will loop through the list of categories in your
|
||||
# site, and use the layout above to generate a page for each one with a list of links to the
|
||||
# individual posts.
|
||||
#
|
||||
# Included filters :
|
||||
# - category_links: Outputs the list of categories as comma-separated <a> links.
|
||||
# - date_to_html_string: Outputs the post.date as formatted html, with hooks for CSS styling.
|
||||
#
|
||||
# Available _config.yml settings :
|
||||
# - category_dir: The subfolder to build category pages in (default is 'categories').
|
||||
# - category_title_prefix: The string used before the category name in the page title (default is
|
||||
# 'Category: ').
|
||||
module Jekyll
|
||||
|
||||
|
||||
# The CategoryIndex class creates a single category page for the specified category.
|
||||
class CategoryIndex < Page
|
||||
|
||||
# Initializes a new CategoryIndex.
|
||||
#
|
||||
# +base+ is the String path to the <source>.
|
||||
# +category_dir+ is the String path between <source> and the category folder.
|
||||
# +category+ is the category currently being processed.
|
||||
def initialize(site, base, category_dir, category)
|
||||
@site = site
|
||||
@base = base
|
||||
@dir = category_dir
|
||||
@name = 'index.html'
|
||||
self.process(@name)
|
||||
# Read the YAML data from the layout page.
|
||||
self.read_yaml(File.join(base, '_layouts'), 'category_index.html')
|
||||
self.data['category'] = category
|
||||
# Set the title for this page.
|
||||
title_prefix = site.config['category_title_prefix'] || 'Category: '
|
||||
self.data['title'] = "#{title_prefix}#{category}"
|
||||
# Set the meta-description for this page.
|
||||
meta_description_prefix = site.config['category_meta_description_prefix'] || 'Category: '
|
||||
self.data['description'] = "#{meta_description_prefix}#{category}"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
# The Site class is a built-in Jekyll class with access to global site config information.
|
||||
class Site
|
||||
|
||||
# Creates an instance of CategoryIndex for each category page, renders it, and
|
||||
# writes the output to a file.
|
||||
#
|
||||
# +category_dir+ is the String path to the category folder.
|
||||
# +category+ is the category currently being processed.
|
||||
def write_category_index(category_dir, category)
|
||||
index = CategoryIndex.new(self, self.source, category_dir, category)
|
||||
index.render(self.layouts, site_payload)
|
||||
index.write(self.dest)
|
||||
# Record the fact that this page has been added, otherwise Site::cleanup will remove it.
|
||||
self.pages << index
|
||||
end
|
||||
|
||||
# Loops through the list of category pages and processes each one.
|
||||
def write_category_indexes
|
||||
if self.layouts.key? 'category_index'
|
||||
dir = self.config['category_dir'] || 'categories'
|
||||
self.categories.keys.each do |category|
|
||||
self.write_category_index(File.join(dir, category.gsub(/_|\W/, '-')), category)
|
||||
end
|
||||
|
||||
# Throw an exception if the layout couldn't be found.
|
||||
else
|
||||
throw "No 'category_index' layout found."
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
# Jekyll hook - the generate method is called by jekyll, and generates all of the category pages.
|
||||
class GenerateCategories < Generator
|
||||
safe true
|
||||
priority :low
|
||||
|
||||
def generate(site)
|
||||
site.write_category_indexes
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
# Adds some extra filters used during the category creation process.
|
||||
module Filters
|
||||
|
||||
# Outputs a list of categories as comma-separated <a> links. This is used
|
||||
# to output the category list for each post on a category page.
|
||||
#
|
||||
# +categories+ is the list of categories to format.
|
||||
#
|
||||
# Returns string
|
||||
#
|
||||
def category_links(categories)
|
||||
categories = categories.sort!.map do |item|
|
||||
"<a class='category' href='/#{@context.registers[:site].config['category_dir']}/#{item.gsub(/_|\W/, '-')}'/>#{item}</a>"
|
||||
end
|
||||
|
||||
case categories.length
|
||||
when 0
|
||||
""
|
||||
when 1
|
||||
categories[0].to_s
|
||||
else
|
||||
"#{categories[0...-1].join(', ')}, #{categories[-1]}"
|
||||
end
|
||||
end
|
||||
|
||||
# Outputs the post.date as formatted html, with hooks for CSS styling.
|
||||
#
|
||||
# +date+ is the date object to format as HTML.
|
||||
#
|
||||
# Returns string
|
||||
def date_to_html_string(date)
|
||||
result = '<span class="month">' + date.strftime('%b').upcase + '</span> '
|
||||
result += date.strftime('<span class="day">%d</span> ')
|
||||
result += date.strftime('<span class="year">%Y</span> ')
|
||||
result
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
1
.themes/classic/_plugins/compass_compiler.rb
Normal file
@ -0,0 +1 @@
|
||||
system "compass compile --css-dir source/stylesheets"
|
||||
75
.themes/classic/_plugins/custom_filters.rb
Normal file
@ -0,0 +1,75 @@
|
||||
#custom filters for Octopress
|
||||
|
||||
module OctopressFilters
|
||||
# Used on the blog index to split posts on the <!--more--> marker
|
||||
def exerpt(input)
|
||||
if input.index(/<!--\s*more\s*-->/i)
|
||||
input.split(/<!--\s*more\s*-->/i)[0]
|
||||
else
|
||||
input
|
||||
end
|
||||
end
|
||||
|
||||
# Summary is used on the Archive pages to return the first block of content from a post.
|
||||
def summary(input)
|
||||
if input.index(/\n\n/)
|
||||
input.split(/\n\n/)[0]
|
||||
else
|
||||
input
|
||||
end
|
||||
end
|
||||
|
||||
# Replaces relative urls with full urls
|
||||
def full_urls(input, url='')
|
||||
input.gsub /(\s+(href|src)\s*=\s*["|']{1})(\/[^\"'>]+)/ do
|
||||
$1+url+$3
|
||||
end
|
||||
end
|
||||
|
||||
# Returns a url without the http:// for use in as a search modifier eg. 'search terms site:website.com'
|
||||
def search_url(input)
|
||||
input.gsub /(https?:\/\/)(\S+)/ do
|
||||
$2
|
||||
end
|
||||
end
|
||||
|
||||
# replaces primes with smartquotes using RubyPants
|
||||
def smart_quotes(input)
|
||||
require 'rubypants'
|
||||
RubyPants.new(input).to_html
|
||||
end
|
||||
|
||||
# Returns a title cased string based on John Gruber's title case http://daringfireball.net/2008/08/title_case_update
|
||||
def titlecase(input)
|
||||
input.titlecase
|
||||
end
|
||||
|
||||
# Returns a datetime if the input is a string
|
||||
def datetime(date)
|
||||
if date.class == String
|
||||
date = Time.parse(date)
|
||||
end
|
||||
date
|
||||
end
|
||||
|
||||
# Returns an ordidinal date eg July 22 2007 -> July 22nd 2007
|
||||
def ordinalize(date)
|
||||
date = datetime(date)
|
||||
"#{date.strftime('%b')} #{ordinal(date.strftime('%e').to_i)}, #{date.strftime('%Y')}"
|
||||
end
|
||||
|
||||
# Returns an ordinal number. 13 -> 13th, 21 -> 21st etc.
|
||||
def ordinal(number)
|
||||
if (11..13).include?(number.to_i % 100)
|
||||
"#{number}<span>th</span>"
|
||||
else
|
||||
case number.to_i % 10
|
||||
when 1; "#{number}<span>st</span>"
|
||||
when 2; "#{number}<span>nd</span>"
|
||||
when 3; "#{number}<span>rd</span>"
|
||||
else "#{number}<span>th</span>"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Liquid::Template.register_filter OctopressFilters
|
||||
94
.themes/classic/_plugins/gist_tag.rb
Normal file
@ -0,0 +1,94 @@
|
||||
# A Liquid tag for Jekyll sites that allows embedding Gists and showing code for non-JavaScript enabled browsers and readers.
|
||||
# by: Brandon Tilly
|
||||
# Source URL: https://gist.github.com/1027674
|
||||
# Post http://brandontilley.com/2011/01/31/gist-tag-for-jekyll.html
|
||||
#
|
||||
# Example usage: {% gist 1027674 gist_tag.rb %} //embeds a gist for this plugin
|
||||
|
||||
require 'cgi'
|
||||
require 'digest/md5'
|
||||
require 'net/https'
|
||||
require 'uri'
|
||||
|
||||
module Jekyll
|
||||
class GistTag < Liquid::Tag
|
||||
def initialize(tag_name, text, token)
|
||||
super
|
||||
@text = text
|
||||
@cache_disabled = false
|
||||
@cache_folder = File.expand_path "../_gist_cache", File.dirname(__FILE__)
|
||||
FileUtils.mkdir_p @cache_folder
|
||||
end
|
||||
|
||||
def render(context)
|
||||
if parts = @text.match(/([\d]*) (.*)/)
|
||||
gist, file = parts[1].strip, parts[2].strip
|
||||
script_url = script_url_for gist, file
|
||||
code = get_cached_gist(gist, file) || get_gist_from_web(gist, file)
|
||||
html_output_for script_url, code
|
||||
else
|
||||
""
|
||||
end
|
||||
end
|
||||
|
||||
def html_output_for(script_url, code)
|
||||
code = CGI.escapeHTML code
|
||||
<<-HTML
|
||||
<script src='#{script_url}'></script>
|
||||
<noscript><pre><code>#{code}</code></pre></noscript>
|
||||
HTML
|
||||
end
|
||||
|
||||
def script_url_for(gist_id, filename)
|
||||
"https://gist.github.com/#{gist_id}.js?file=#{filename}"
|
||||
end
|
||||
|
||||
def get_gist_url_for(gist, file)
|
||||
"https://raw.github.com/gist/#{gist}/#{file}"
|
||||
end
|
||||
|
||||
def cache(gist, file, data)
|
||||
cache_file = get_cache_file_for gist, file
|
||||
File.open(cache_file, "w") do |io|
|
||||
io.write data
|
||||
end
|
||||
end
|
||||
|
||||
def get_cached_gist(gist, file)
|
||||
return nil if @cache_disabled
|
||||
cache_file = get_cache_file_for gist, file
|
||||
File.read cache_file if File.exist? cache_file
|
||||
end
|
||||
|
||||
def get_cache_file_for(gist, file)
|
||||
bad_chars = /[^a-zA-Z0-9\-_.]/
|
||||
gist = gist.gsub bad_chars, ''
|
||||
file = file.gsub bad_chars, ''
|
||||
md5 = Digest::MD5.hexdigest "#{gist}-#{file}"
|
||||
File.join @cache_folder, "#{gist}-#{file}-#{md5}.cache"
|
||||
end
|
||||
|
||||
def get_gist_from_web(gist, file)
|
||||
gist_url = get_gist_url_for gist, file
|
||||
raw_uri = URI.parse gist_url
|
||||
https = Net::HTTP.new raw_uri.host, raw_uri.port
|
||||
https.use_ssl = true
|
||||
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
||||
request = Net::HTTP::Get.new raw_uri.request_uri
|
||||
data = https.request request
|
||||
data = data.body
|
||||
cache gist, file, data unless @cache_disabled
|
||||
data
|
||||
end
|
||||
end
|
||||
|
||||
class GistTagNoCache < GistTag
|
||||
def initialize(tag_name, text, token)
|
||||
super
|
||||
@cache_disabled = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Liquid::Template.register_tag('gist', Jekyll::GistTag)
|
||||
Liquid::Template.register_tag('gistnocache', Jekyll::GistTagNoCache)
|
||||
24
.themes/classic/_plugins/haml.rb
Normal file
@ -0,0 +1,24 @@
|
||||
module Jekyll
|
||||
require 'haml'
|
||||
class HamlConverter < Converter
|
||||
safe true
|
||||
priority :low
|
||||
|
||||
def matches(ext)
|
||||
ext =~ /haml/i
|
||||
end
|
||||
|
||||
def output_ext(ext)
|
||||
".html"
|
||||
end
|
||||
|
||||
def convert(content)
|
||||
begin
|
||||
engine = Haml::Engine.new(content)
|
||||
engine.render
|
||||
rescue StandardError => e
|
||||
puts "!!! HAML Error: " + e.message
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
40
.themes/classic/_plugins/include_code.rb
Normal file
@ -0,0 +1,40 @@
|
||||
require 'pathname'
|
||||
|
||||
module Jekyll
|
||||
|
||||
class IncludeCodeTag < Liquid::Tag
|
||||
def initialize(tag_name, file, tokens)
|
||||
super
|
||||
@file = file.strip
|
||||
end
|
||||
|
||||
def render(context)
|
||||
code_dir = (context.registers[:site].config['code_dir'] || 'downloads/code')
|
||||
code_path = (Pathname.new(context.registers[:site].source) + code_dir).expand_path
|
||||
file = code_path + @file
|
||||
|
||||
if File.symlink?(code_path)
|
||||
return "Code directory '#{code_path}' cannot be a symlink"
|
||||
end
|
||||
|
||||
unless file.file?
|
||||
return "File #{file} could not be found"
|
||||
end
|
||||
|
||||
Dir.chdir(code_path) do
|
||||
code = file.read
|
||||
file_type = file.extname
|
||||
url = "#{context.registers[:site].config['url']}/#{code_dir}/#{@file}"
|
||||
source = "<figure><figcaption><span>#{file.basename}</span><a href='#{url}'>download</a></figcaption>\n"
|
||||
source += "{% highlight #{file_type} %}\n" + code + "\n{% endhighlight %}</figure>"
|
||||
partial = Liquid::Template.parse(source)
|
||||
context.stack do
|
||||
partial.render(context)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Liquid::Template.register_tag('include_code', Jekyll::IncludeCodeTag)
|
||||
31
.themes/classic/_plugins/include_file.rb
Normal file
@ -0,0 +1,31 @@
|
||||
require 'pathname'
|
||||
|
||||
module Jekyll
|
||||
|
||||
class IncludePartialTag < Liquid::Tag
|
||||
def initialize(tag_name, file, tokens)
|
||||
super
|
||||
@file = file.strip
|
||||
end
|
||||
|
||||
def render(context)
|
||||
file_dir = (context.registers[:site].source || 'source')
|
||||
file_path = Pathname.new(file_dir).expand_path
|
||||
file = file_path + @file
|
||||
|
||||
unless file.file?
|
||||
return "File #{file} could not be found"
|
||||
end
|
||||
|
||||
Dir.chdir(file_path) do
|
||||
partial = Liquid::Template.parse(file.read)
|
||||
context.stack do
|
||||
partial.render(context)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Liquid::Template.register_tag('include_partial', Jekyll::IncludePartialTag)
|
||||
|
||||
42
.themes/classic/_plugins/pullquote.rb
Normal file
@ -0,0 +1,42 @@
|
||||
#
|
||||
# Author: Brandon Mathis
|
||||
# Based on the sematic pullquote technique by Maykel Loomans at http://miekd.com/articles/pull-quotes-with-html5-and-css/
|
||||
#
|
||||
# Outputs a span with a data-pullquote attribute set from the marked pullquote. Example:
|
||||
#
|
||||
# {% pullquote %}
|
||||
# When writing longform posts, I find it helpful to include pullquotes, which help those scanning a post discern whether or not a post is helpful.
|
||||
# It is important to note, {" pullquotes are merely visual in presentation and should not appear twice in the text. "} That is why it is prefered
|
||||
# to use a CSS only technique for styling pullquotes.
|
||||
# {% endpullquote %}
|
||||
# ...will output...
|
||||
# <p>
|
||||
# <span data-pullquote="pullquotes are merely visual in presentation and should not appear twice in the text.">
|
||||
# When writing longform posts, I find it helpful to include pullquotes, which help those scanning a post discern whether or not a post is helpful.
|
||||
# It is important to note, pullquotes are merely visual in presentation and should not appear twice in the text. This is why a CSS only approach # for styling pullquotes is prefered.
|
||||
# </span>
|
||||
# </p>
|
||||
#
|
||||
|
||||
module Jekyll
|
||||
|
||||
class PullquoteTag < Liquid::Block
|
||||
PullQuoteMarkup = /\{(.+)\}/i
|
||||
|
||||
def initialize(tag_name, markup, tokens)
|
||||
super
|
||||
end
|
||||
|
||||
def render(context)
|
||||
output = super
|
||||
if output.join =~ /\{"\s*(.+)\s*"\}/
|
||||
@quote = $1
|
||||
"<span class='has-pullquote' data-pullquote='#{@quote}'>#{output.join.gsub(/\{"\s*|\s*"\}/, '')}</span>"
|
||||
else
|
||||
return "Surround your pullquote like this {! text to be quoted !}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Liquid::Template.register_tag('pullquote', Jekyll::PullquoteTag)
|
||||
30
.themes/classic/_plugins/pygments_cache_patch.rb
Normal file
@ -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('../../_code_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
|
||||
308
.themes/classic/_plugins/sitemap_generator.rb
Normal file
@ -0,0 +1,308 @@
|
||||
# Sitemap.xml Generator is a Jekyll plugin that generates a sitemap.xml file by
|
||||
# traversing all of the available posts and pages.
|
||||
#
|
||||
# How To Use:
|
||||
# 1) Copy source file into your _plugins folder within your Jekyll project.
|
||||
# 2) Change modify the url variable in _config.yml to reflect your domain name.
|
||||
# 3) Run Jekyll: jekyll --server to re-generate your site.
|
||||
#
|
||||
# Variables:
|
||||
# * Change SITEMAP_FILE_NAME if you want your sitemap to be called something
|
||||
# other than sitemap.xml.
|
||||
# * Change the PAGES_INCLUDE_POSTS list to include any pages that are looping
|
||||
# through your posts (e.g. "index.html", "archive.html", etc.). This will
|
||||
# ensure that right after you make a new post, the last modified date will
|
||||
# be updated to reflect the new post.
|
||||
# * A sitemap.xml should be included in your _site folder.
|
||||
# * If there are any files you don't want included in the sitemap, add them
|
||||
# to the EXCLUDED_FILES list. The name should match the name of the source
|
||||
# file.
|
||||
# * If you want to include the optional changefreq and priority attributes,
|
||||
# simply include custom variables in the YAML Front Matter of that file.
|
||||
# The names of these custom variables are defined below in the
|
||||
# CHANGE_FREQUENCY_CUSTOM_VARIABLE_NAME and PRIORITY_CUSTOM_VARIABLE_NAME
|
||||
# constants.
|
||||
#
|
||||
# Notes:
|
||||
# * The last modified date is determined by the latest from the following:
|
||||
# system modified date of the page or post, system modified date of
|
||||
# included layout, system modified date of included layout within that
|
||||
# layout, ...
|
||||
#
|
||||
# Author: Michael Levin
|
||||
# Site: http://www.kinnetica.com
|
||||
# Distributed Under A Creative Commons License
|
||||
# - http://creativecommons.org/licenses/by/3.0/
|
||||
#
|
||||
# Modified for Octopress by John W. Long
|
||||
#
|
||||
require 'rexml/document'
|
||||
|
||||
module Jekyll
|
||||
|
||||
# Change SITEMAP_FILE_NAME if you would like your sitemap file
|
||||
# to be called something else
|
||||
SITEMAP_FILE_NAME = "sitemap.xml"
|
||||
|
||||
# Any files to exclude from being included in the sitemap.xml
|
||||
EXCLUDED_FILES = ["atom.xml"]
|
||||
|
||||
# Any files that include posts, so that when a new post is added, the last
|
||||
# modified date of these pages should take that into account
|
||||
PAGES_INCLUDE_POSTS = ["index.html"]
|
||||
|
||||
# Custom variable names for changefreq and priority elements
|
||||
# These names are used within the YAML Front Matter of pages or posts
|
||||
# for which you want to include these properties
|
||||
CHANGE_FREQUENCY_CUSTOM_VARIABLE_NAME = "change_frequency"
|
||||
PRIORITY_CUSTOM_VARIABLE_NAME = "priority"
|
||||
|
||||
class Post
|
||||
attr_accessor :name
|
||||
|
||||
def full_path_to_source
|
||||
File.join(@base, @name)
|
||||
end
|
||||
|
||||
def location_on_server
|
||||
"#{site.config['url']}#{url}"
|
||||
end
|
||||
end
|
||||
|
||||
class Page
|
||||
attr_accessor :name
|
||||
|
||||
def full_path_to_source
|
||||
File.join(@base, @dir, @name)
|
||||
end
|
||||
|
||||
def location_on_server
|
||||
location = "#{site.config['url']}#{@dir}#{url}"
|
||||
location.gsub(/index.html$/, "")
|
||||
end
|
||||
end
|
||||
|
||||
class Layout
|
||||
def full_path_to_source
|
||||
File.join(@base, @name)
|
||||
end
|
||||
end
|
||||
|
||||
# Recover from strange exception when starting server without --auto
|
||||
class SitemapFile < StaticFile
|
||||
def write(dest)
|
||||
begin
|
||||
super(dest)
|
||||
rescue
|
||||
end
|
||||
|
||||
true
|
||||
end
|
||||
end
|
||||
|
||||
class SitemapGenerator < Generator
|
||||
|
||||
# Valid values allowed by sitemap.xml spec for change frequencies
|
||||
VALID_CHANGE_FREQUENCY_VALUES = ["always", "hourly", "daily", "weekly",
|
||||
"monthly", "yearly", "never"]
|
||||
|
||||
# Goes through pages and posts and generates sitemap.xml file
|
||||
#
|
||||
# Returns nothing
|
||||
def generate(site)
|
||||
sitemap = REXML::Document.new << REXML::XMLDecl.new("1.0", "UTF-8")
|
||||
|
||||
urlset = REXML::Element.new "urlset"
|
||||
urlset.add_attribute("xmlns",
|
||||
"http://www.sitemaps.org/schemas/sitemap/0.9")
|
||||
|
||||
@last_modified_post_date = fill_posts(site, urlset)
|
||||
fill_pages(site, urlset)
|
||||
|
||||
sitemap.add_element(urlset)
|
||||
|
||||
# File I/O: create sitemap.xml file and write out pretty-printed XML
|
||||
file = File.new(File.join(site.dest, SITEMAP_FILE_NAME), "w")
|
||||
formatter = REXML::Formatters::Pretty.new(4)
|
||||
formatter.compact = true
|
||||
formatter.write(sitemap, file)
|
||||
file.close
|
||||
|
||||
# Keep the sitemap.xml file from being cleaned by Jekyll
|
||||
site.static_files << Jekyll::SitemapFile.new(site, site.dest, "/", SITEMAP_FILE_NAME)
|
||||
end
|
||||
|
||||
# Create url elements for all the posts and find the date of the latest one
|
||||
#
|
||||
# Returns last_modified_date of latest post
|
||||
def fill_posts(site, urlset)
|
||||
last_modified_date = nil
|
||||
site.posts.each do |post|
|
||||
if !excluded?(post.name)
|
||||
url = fill_url(site, post)
|
||||
urlset.add_element(url)
|
||||
end
|
||||
|
||||
path = post.full_path_to_source
|
||||
date = File.mtime(path)
|
||||
last_modified_date = date if last_modified_date == nil or date > last_modified_date
|
||||
end
|
||||
|
||||
last_modified_date
|
||||
end
|
||||
|
||||
# Create url elements for all the normal pages and find the date of the
|
||||
# index to use with the pagination pages
|
||||
#
|
||||
# Returns last_modified_date of index page
|
||||
def fill_pages(site, urlset)
|
||||
site.pages.each do |page|
|
||||
if !excluded?(page.name)
|
||||
path = page.full_path_to_source
|
||||
if File.exists?(path)
|
||||
url = fill_url(site, page)
|
||||
urlset.add_element(url)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Fill data of each URL element: location, last modified,
|
||||
# change frequency (optional), and priority.
|
||||
#
|
||||
# Returns url REXML::Element
|
||||
def fill_url(site, page_or_post)
|
||||
url = REXML::Element.new "url"
|
||||
|
||||
loc = fill_location(page_or_post)
|
||||
url.add_element(loc)
|
||||
|
||||
lastmod = fill_last_modified(site, page_or_post)
|
||||
url.add_element(lastmod) if lastmod
|
||||
|
||||
if (page_or_post.data[CHANGE_FREQUENCY_CUSTOM_VARIABLE_NAME])
|
||||
change_frequency =
|
||||
page_or_post.data[CHANGE_FREQUENCY_CUSTOM_VARIABLE_NAME].downcase
|
||||
|
||||
if (valid_change_frequency?(change_frequency))
|
||||
changefreq = REXML::Element.new "changefreq"
|
||||
changefreq.text = change_frequency
|
||||
url.add_element(changefreq)
|
||||
else
|
||||
puts "ERROR: Invalid Change Frequency In #{page_or_post.name}"
|
||||
end
|
||||
end
|
||||
|
||||
if (page_or_post.data[PRIORITY_CUSTOM_VARIABLE_NAME])
|
||||
priority_value = page_or_post.data[PRIORITY_CUSTOM_VARIABLE_NAME]
|
||||
if valid_priority?(priority_value)
|
||||
priority = REXML::Element.new "priority"
|
||||
priority.text = page_or_post.data[PRIORITY_CUSTOM_VARIABLE_NAME]
|
||||
url.add_element(priority)
|
||||
else
|
||||
puts "ERROR: Invalid Priority In #{page_or_post.name}"
|
||||
end
|
||||
end
|
||||
|
||||
url
|
||||
end
|
||||
|
||||
# Get URL location of page or post
|
||||
#
|
||||
# Returns the location of the page or post
|
||||
def fill_location(page_or_post)
|
||||
loc = REXML::Element.new "loc"
|
||||
loc.text = page_or_post.location_on_server
|
||||
|
||||
loc
|
||||
end
|
||||
|
||||
# Fill lastmod XML element with the last modified date for the page or post.
|
||||
#
|
||||
# Returns lastmod REXML::Element or nil
|
||||
def fill_last_modified(site, page_or_post)
|
||||
path = page_or_post.full_path_to_source
|
||||
|
||||
lastmod = REXML::Element.new "lastmod"
|
||||
date = File.mtime(path)
|
||||
latest_date = find_latest_date(date, site, page_or_post)
|
||||
|
||||
if @last_modified_post_date == nil
|
||||
# This is a post
|
||||
lastmod.text = latest_date.iso8601
|
||||
else
|
||||
# This is a page
|
||||
if posts_included?(page_or_post.name)
|
||||
# We want to take into account the last post date
|
||||
final_date = greater_date(latest_date, @last_modified_post_date)
|
||||
lastmod.text = final_date.iso8601
|
||||
else
|
||||
lastmod.text = latest_date.iso8601
|
||||
end
|
||||
end
|
||||
lastmod
|
||||
end
|
||||
|
||||
# Go through the page/post and any implemented layouts and get the latest
|
||||
# modified date
|
||||
#
|
||||
# Returns formatted output of latest date of page/post and any used layouts
|
||||
def find_latest_date(latest_date, site, page_or_post)
|
||||
layouts = site.layouts
|
||||
layout = layouts[page_or_post.data["layout"]]
|
||||
while layout
|
||||
path = layout.full_path_to_source
|
||||
date = File.mtime(path)
|
||||
|
||||
latest_date = date if (date > latest_date)
|
||||
|
||||
layout = layouts[layout.data["layout"]]
|
||||
end
|
||||
|
||||
latest_date
|
||||
end
|
||||
|
||||
# Which of the two dates is later
|
||||
#
|
||||
# Returns latest of two dates
|
||||
def greater_date(date1, date2)
|
||||
if (date1 >= date2)
|
||||
date1
|
||||
else
|
||||
date2
|
||||
end
|
||||
end
|
||||
|
||||
# Is the page or post listed as something we want to exclude?
|
||||
#
|
||||
# Returns boolean
|
||||
def excluded?(name)
|
||||
EXCLUDED_FILES.include? name
|
||||
end
|
||||
|
||||
def posts_included?(name)
|
||||
PAGES_INCLUDE_POSTS.include? name
|
||||
end
|
||||
|
||||
# Is the change frequency value provided valid according to the spec
|
||||
#
|
||||
# Returns boolean
|
||||
def valid_change_frequency?(change_frequency)
|
||||
VALID_CHANGE_FREQUENCY_VALUES.include? change_frequency
|
||||
end
|
||||
|
||||
# Is the priority value provided valid according to the spec
|
||||
#
|
||||
# Returns boolean
|
||||
def valid_priority?(priority)
|
||||
begin
|
||||
priority_val = Float(priority)
|
||||
return true if priority_val >= 0.0 and priority_val <= 1.0
|
||||
rescue ArgumentError
|
||||
end
|
||||
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
36
.themes/classic/_plugins/titlecase.rb
Normal file
@ -0,0 +1,36 @@
|
||||
class String
|
||||
def titlecase
|
||||
small_words = %w(a an and as at but by en for if in of on or the to v v. via vs vs.)
|
||||
|
||||
x = split(" ").map do |word|
|
||||
# note: word could contain non-word characters!
|
||||
# downcase all small_words, capitalize the rest
|
||||
small_words.include?(word.gsub(/\W/, "").downcase) ? word.downcase! : word.smart_capitalize!
|
||||
word
|
||||
end
|
||||
# capitalize first and last words
|
||||
x.first.to_s.smart_capitalize!
|
||||
x.last.to_s.smart_capitalize!
|
||||
# small words after colons are capitalized
|
||||
x.join(" ").gsub(/:\s?(\W*#{small_words.join("|")}\W*)\s/) { ": #{$1.smart_capitalize} " }
|
||||
end
|
||||
|
||||
def titlecase!
|
||||
replace(titlecase)
|
||||
end
|
||||
|
||||
def smart_capitalize
|
||||
# ignore any leading crazy characters and capitalize the first real character
|
||||
if self =~ /^['"\(\[']*([a-z])/
|
||||
i = index($1)
|
||||
x = self[i,self.length]
|
||||
# word with capitals and periods mid-word are left alone
|
||||
self[i,1] = self[i,1].upcase unless x =~ /[A-Z]/ or x =~ /\.\w+/
|
||||
end
|
||||
self
|
||||
end
|
||||
|
||||
def smart_capitalize!
|
||||
replace(smart_capitalize)
|
||||
end
|
||||
end
|
||||
5
.themes/classic/sass/_base.scss
Normal file
@ -0,0 +1,5 @@
|
||||
@import "base/utilities";
|
||||
@import "base/solarized";
|
||||
@import "base/theme";
|
||||
@import "base/layout";
|
||||
@import "base/typography";
|
||||
7
.themes/classic/sass/_partials.scss
Normal file
@ -0,0 +1,7 @@
|
||||
@import "partials/header";
|
||||
@import "partials/navigation";
|
||||
@import "partials/blog";
|
||||
@import "partials/syntax";
|
||||
@import "partials/archive";
|
||||
@import "partials/sidebar";
|
||||
@import "partials/footer";
|
||||
134
.themes/classic/sass/base/_layout.scss
Normal file
@ -0,0 +1,134 @@
|
||||
$max-width: 1200px !default;
|
||||
|
||||
// Padding used for layout margins
|
||||
$pad-min: 18px !default;
|
||||
$pad-narrow: 25px !default;
|
||||
$pad-medium: 35px !default;
|
||||
$pad-wide: 55px !default;
|
||||
|
||||
// Sidebar widths used in media queries
|
||||
$sidebar-width-medium: 240px !default;
|
||||
$sidebar-pad-medium: 15px !default;
|
||||
$sidebar-pad-wide: 20px !default;
|
||||
$sidebar-width-wide: 300px !default;
|
||||
|
||||
.group { @include pie-clearfix; }
|
||||
|
||||
body {
|
||||
-webkit-text-size-adjust: none;
|
||||
max-width: $max-width;
|
||||
position: relative;
|
||||
margin: 0 auto;
|
||||
> header, > nav, > footer, #articles > article, #articles > nav {
|
||||
@extend .group;
|
||||
padding-left: $pad-min;
|
||||
padding-right: $pad-min;
|
||||
@media only screen and (min-width: 480px) {
|
||||
padding-left: $pad-narrow;
|
||||
padding-right: $pad-narrow;
|
||||
}
|
||||
@media only screen and (min-width: 768px) {
|
||||
padding-left: $pad-medium;
|
||||
padding-right: $pad-medium;
|
||||
}
|
||||
@media only screen and (min-width: 992px) {
|
||||
padding-left: $pad-wide;
|
||||
padding-right: $pad-wide;
|
||||
}
|
||||
}
|
||||
> header {
|
||||
font-size: 1em;
|
||||
padding-top: 1.5em;
|
||||
padding-bottom: 1.5em;
|
||||
}
|
||||
}
|
||||
|
||||
.toggle-sidebar { display: none; }
|
||||
#articles { width: 100%;
|
||||
+ aside {
|
||||
float: none;
|
||||
padding: 0 $pad-min 1px;
|
||||
background-color: $sidebar-bg;
|
||||
border-top: 1px solid $sidebar-border;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 550px) {
|
||||
body > header { font-size: 1em; }
|
||||
}
|
||||
@media only screen and (min-width: 768px) {
|
||||
body { -webkit-text-size-adjust: auto; }
|
||||
body > header { font-size: 1.2em; }
|
||||
body > nav {
|
||||
+ div {
|
||||
@extend .group;
|
||||
padding: 0;
|
||||
margin: 0 auto;
|
||||
> div {
|
||||
@extend .group;
|
||||
margin-right: $sidebar-width-medium;
|
||||
}
|
||||
}
|
||||
}
|
||||
#articles {
|
||||
padding-top: $pad-medium/2;
|
||||
padding-bottom: $pad-medium/2;
|
||||
float: left;
|
||||
+ aside {
|
||||
width: $sidebar-width-medium - $sidebar-pad-medium*2;
|
||||
padding: 0 $sidebar-pad-medium $sidebar-pad-medium;
|
||||
background: none;
|
||||
float: left;
|
||||
margin: 0 -100% 0 0;
|
||||
}
|
||||
}
|
||||
body > div > div { position: relative; }
|
||||
|
||||
.collapse-sidebar {
|
||||
> div > div { margin-right: 10px; }
|
||||
#articles + aside {
|
||||
display: none;
|
||||
}
|
||||
.toggle-sidebar {
|
||||
right: -1px;
|
||||
background-color: $sidebar-bg;
|
||||
border-right-width: 0;
|
||||
text-indent: 2px;
|
||||
border-left: 1px solid $sidebar-border;
|
||||
@include border-bottom-right-radius(0);
|
||||
@include border-bottom-left-radius(.3em);
|
||||
@include link-colors(#aaa, #888);
|
||||
}
|
||||
}
|
||||
|
||||
.toggle-sidebar {
|
||||
outline: none;
|
||||
position: absolute; right: -21px; top: 0;
|
||||
width: 20px;
|
||||
font-size: 1.2em;
|
||||
line-height: 1.1em;
|
||||
padding-bottom: .1em;
|
||||
text-indent: -1px;
|
||||
text-decoration: none;
|
||||
@include link-colors(#ccc, #999);
|
||||
@include border-bottom-right-radius(.3em);
|
||||
text-align: center;
|
||||
background: $main-bg;
|
||||
border-bottom: 1px solid $sidebar-border;
|
||||
border-right: 1px solid $sidebar-border;
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 992px) {
|
||||
body > header { font-size: 1.3em; }
|
||||
body > nav + div > div { margin-right: $sidebar-width-wide; }
|
||||
#articles {
|
||||
padding-top: $pad-wide/2;
|
||||
padding-bottom: $pad-wide/2;
|
||||
+ aside {
|
||||
width: $sidebar-width-wide - $sidebar-pad-wide*2;
|
||||
padding: 1.2em $sidebar-pad-wide $sidebar-pad-wide;
|
||||
}
|
||||
}
|
||||
}
|
||||
16
.themes/classic/sass/base/_solarized.scss
Normal file
@ -0,0 +1,16 @@
|
||||
$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;
|
||||
76
.themes/classic/sass/base/_theme.scss
Normal file
@ -0,0 +1,76 @@
|
||||
$img-border: inline-image('dotted-border.png');
|
||||
|
||||
// Main Link Colors
|
||||
$link-color: lighten(#165b94, 3) !default;
|
||||
$link-color-hover: adjust-hue($link-color, -200) !default;
|
||||
$link-color-visited: darken(adjust_hue($link_color, 70), 10) !default;
|
||||
$link-color-active: darken($link-color-hover, 15) !default;
|
||||
|
||||
// Main Section Colors
|
||||
$main-bg: #f8f8f8 !default;
|
||||
$page-bg: #252525 !default;
|
||||
$article-border: #eeeeee !default;
|
||||
|
||||
$header-bg: #333 !default;
|
||||
$header-border: lighten($header-bg, 15) !default;
|
||||
$title-color: #f2f2f2 !default;
|
||||
$subtitle-color: #aaa !default;
|
||||
|
||||
$text-color: #222 !default;
|
||||
$text-color-light: #aaa !default;
|
||||
$type-border: #ddd !default;
|
||||
|
||||
|
||||
/* Navigation */
|
||||
$nav-bg: #ccc !default;
|
||||
$nav-color: darken($nav-bg, 38) !default;
|
||||
$nav-color-hover: darken($nav-color, 25) !default;
|
||||
$nav-placeholder: desaturate(darken($nav-bg, 10), 15) !default;
|
||||
$nav-border: darken($nav-bg, 10) !default;
|
||||
$nav-border-top: lighten($nav-bg, 15) !default;
|
||||
$nav-border-bottom: darken($nav-bg, 25) !default;
|
||||
$nav-border-left: darken($nav-bg, 11) !default;
|
||||
$nav-border-right: lighten($nav-bg, 7) !default;
|
||||
|
||||
/* Sidebar colors */
|
||||
$sidebar-bg: #eee !default;
|
||||
$sidebar-link-color: $link-color !default;
|
||||
$sidebar-link-color-hover: $link-color-hover !default;
|
||||
$sidebar-color: change-color(mix($text-color, $sidebar-bg, 80), $hue: hue($sidebar-bg), $saturation: saturation($sidebar-bg)/2) !default;
|
||||
$sidebar-border: desaturate(darken($sidebar-bg, 7), 10) !default;
|
||||
$sidebar-border: darken($sidebar-bg, 7) !default;
|
||||
$sidebar-link-color-subdued: lighten($sidebar-color, 20) !default;
|
||||
$sidebar-link-color-subdued-hover: $sidebar-link-color-hover !default;
|
||||
$twitter-status-link: lighten($sidebar-link-color-subdued, 15) !default;
|
||||
|
||||
$footer-color: #888 !default;
|
||||
$footer-bg: #ccc !default;
|
||||
$footer-color: darken($footer-bg, 38) !default;
|
||||
$footer-color-hover: darken($footer-color, 10) !default;
|
||||
$footer-border-top: lighten($footer-bg, 15) !default;
|
||||
$footer-border-bottom: darken($footer-bg, 15) !default;
|
||||
$footer-link-color: darken($footer-bg, 38) !default;
|
||||
$footer-link-color-hover: darken($footer-color, 25) !default;
|
||||
$page-border-bottom: darken($footer-bg, 5) !default;
|
||||
|
||||
|
||||
/* Core theme application */
|
||||
|
||||
article a, #articles + aside a {
|
||||
@include link-colors($link-color, $hover: $link-color-hover, $focus: $link-color-hover, $visited: $link-color-visited, $active: $link-color-active);
|
||||
}
|
||||
a { @include transition(color, .5s); }
|
||||
|
||||
html {
|
||||
background: $page-bg image-url('line-tile.png') top left;
|
||||
}
|
||||
body {
|
||||
> div {
|
||||
background: $sidebar-bg image-url('noise.png') top left;
|
||||
border-bottom: 1px solid $page-border-bottom;
|
||||
> div {
|
||||
background: $main-bg image-url('noise.png') top left;
|
||||
border-right: 1px solid $sidebar-border;
|
||||
}
|
||||
}
|
||||
}
|
||||
130
.themes/classic/sass/base/_typography.scss
Normal file
@ -0,0 +1,130 @@
|
||||
$blockquote: $type-border !default;
|
||||
$mono: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace;
|
||||
|
||||
// Fonts
|
||||
.heading {
|
||||
font-family: "PT Serif", "Georgia", "Helvetica Neue", Arial, sans-serif;
|
||||
}
|
||||
.sans { font-family: "PT Sans", "Helvetica Neue", Arial, sans-serif; }
|
||||
.serif { font-family: "PT Serif", Georgia, Times, "Times New Roman", serif; }
|
||||
.mono { font-family: $mono; }
|
||||
|
||||
body > header h1 {
|
||||
font-size: 2.6em;
|
||||
@extend .heading;
|
||||
font-weight: normal;
|
||||
line-height: 1.2em;
|
||||
margin-bottom: 0.6667em;
|
||||
}
|
||||
|
||||
body {
|
||||
line-height: 1.5em;
|
||||
color: $text-color;
|
||||
@extend .serif;
|
||||
}
|
||||
|
||||
#{headings()}{
|
||||
@extend .heading;
|
||||
text-rendering: optimizelegibility;
|
||||
margin-bottom: 1em;
|
||||
font-weight: bold;
|
||||
}
|
||||
h1 {
|
||||
font-size: 3.2em;
|
||||
line-height: 1.2em;
|
||||
@media only screen and (max-width: 768px) { font-size: 2.2em; }
|
||||
}
|
||||
|
||||
|
||||
h2, section h1 {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
h3, section h2, section section h1 {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
h4, section h3, section section h2, section section section h1 {
|
||||
font-size: 1em;
|
||||
}
|
||||
h5, section h4, section section h3 {
|
||||
font-size: .9em;
|
||||
}
|
||||
h6, section h5, section section h4, section section section h3 {
|
||||
font-size: .8em;
|
||||
}
|
||||
p, blockquote, ul, ol { margin-bottom: 1.5em; }
|
||||
|
||||
ul{ list-style-type: circle; }
|
||||
|
||||
ol{ list-style-type: decimal; ol { list-style-type: lower-alpha; } }
|
||||
ul ul, ol ol { margin-left: 1.75em; }
|
||||
|
||||
strong { font-weight: bold; }
|
||||
|
||||
em { font-style: italic; }
|
||||
|
||||
sup, sub { font-size: 0.8em; position: relative; display: inline-block; }
|
||||
sup { top: -.5em; }
|
||||
sub { bottom: -.5em; }
|
||||
|
||||
q { font-style: italic;
|
||||
&:before { content: "\201C"; }
|
||||
&:after { content: "\201D"; }
|
||||
}
|
||||
|
||||
em, dfn { font-style: italic; }
|
||||
|
||||
strong, dfn { font-weight: bold; }
|
||||
|
||||
del, s { text-decoration: line-through; }
|
||||
|
||||
abbr, acronym { border-bottom: 1px dotted; cursor: help; }
|
||||
|
||||
pre, code, tt { @extend .mono-font; }
|
||||
|
||||
sub, sup { line-height: 0; }
|
||||
|
||||
hr { margin-bottom: 0.2em; }
|
||||
|
||||
small { font-size: .8em; }
|
||||
|
||||
big { font-size: 1.2em; }
|
||||
|
||||
blockquote {
|
||||
$bq-margin: 1.2em;
|
||||
font-style: italic;
|
||||
position: relative;
|
||||
font-size: 1.2em;
|
||||
line-height: 1.5em;
|
||||
padding-left: 1em;
|
||||
border-left: 4px solid rgba($text-color-light, .5);
|
||||
cite {
|
||||
font-style: italic;
|
||||
a { color: $text-color-light !important; word-wrap: break-word; }
|
||||
&:before { content: '–'; padding:{right: .3em; left: .3em;} color: $text-color-light; }
|
||||
}
|
||||
@media only screen and (min-width: 992px) {
|
||||
padding-left: 1.5em;
|
||||
border-left-width: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.has-pullquote:before {
|
||||
/* Reset metrics. */
|
||||
padding: 0;
|
||||
border: none;
|
||||
|
||||
/* Content */
|
||||
content: attr(data-pullquote);
|
||||
|
||||
/* Pull out to the right, modular scale based margins. */
|
||||
float: right;
|
||||
width: 45%;
|
||||
margin: .5em 0 1em 1.5em;
|
||||
|
||||
/* Baseline correction */
|
||||
position: relative;
|
||||
top: 7px;
|
||||
font-size: 1.4em;
|
||||
line-height: 1.45em;
|
||||
}
|
||||
|
||||
21
.themes/classic/sass/base/_utilities.scss
Normal file
@ -0,0 +1,21 @@
|
||||
@mixin mask-image($img, $repeat: no-repeat){
|
||||
@include experimental(mask-image, image-url($img), -webkit, -moz, -o, -ms);
|
||||
@include experimental(mask-repeat, $repeat, -webkit, -moz, -o, -ms);
|
||||
width: image-width($img);
|
||||
height: image-height($img);
|
||||
}
|
||||
|
||||
@mixin selection($bg, $color: inherit, $text-shadow: none){
|
||||
* {
|
||||
&::-moz-selection { background: $bg; color: $color; text-shadow: $text-shadow; }
|
||||
&::-webkit-selection { background: $bg; color: $color; text-shadow: $text-shadow; }
|
||||
&::selection { background: $bg; color: $color; text-shadow: $text-shadow; }
|
||||
}
|
||||
}
|
||||
|
||||
@function text-color($color, $dark: dark, $light: light){
|
||||
$text-color: ( (red($color)*299) + (green($color)*587) + (blue($color)*114) ) / 1000;
|
||||
$text-color: if($text-color >= 150, $dark, $light);
|
||||
@return $text-color;
|
||||
}
|
||||
|
||||
20
.themes/classic/sass/custom/_colors.scss
Normal file
@ -0,0 +1,20 @@
|
||||
// Here you can easily change your sites's color scheme.
|
||||
// To give it a try, uncomment some of the lines below rebuild your blog, and see how it works.
|
||||
|
||||
//$header-bg: #263347;
|
||||
//$subtitle-color: lighten($header-bg, 58);
|
||||
//$nav-bg: desaturate(lighten(#8fc17a, 18), 5);
|
||||
//$sidebar-bg: desaturate(#eceff5, 8);
|
||||
//$sidebar-link-color: saturate(#526f9a, 10);
|
||||
//$sidebar-link-color-hover: darken(#7ab662, 9);
|
||||
|
||||
|
||||
//To use the light Solarized highlighting theme uncomment this block
|
||||
//$base03: $base3;
|
||||
//$base02: $base2;
|
||||
//$base01: $base1;
|
||||
//$base00: $base0;
|
||||
//$base0: $base00;
|
||||
//$base1: $base01;
|
||||
//$base2: $base02;
|
||||
//$base3: $base03;
|
||||
16
.themes/classic/sass/custom/_layout.scss
Normal file
@ -0,0 +1,16 @@
|
||||
// Here you can easily change your sites's layout.
|
||||
// To give it a try, uncomment some of the lines below, make changes, rebuild your blog, and see how it works.
|
||||
|
||||
//$max-width: 1350px;
|
||||
|
||||
// Padding used for layout margins
|
||||
//$pad-min: 18px;
|
||||
//$pad-narrow: 25px;
|
||||
//$pad-medium: 35px;
|
||||
//$pad-wide: 55px;
|
||||
|
||||
// Sidebar widths used in media queries
|
||||
//$sidebar-width-medium: 240px;
|
||||
//$sidebar-pad-medium: 15px;
|
||||
//$sidebar-pad-wide: 20px;
|
||||
//$sidebar-width-wide: 300px;
|
||||
2
.themes/classic/sass/custom/_styles.scss
Normal file
@ -0,0 +1,2 @@
|
||||
// This File is imported last, and will override other styles in the cascade
|
||||
// Add styles here to make changes without digging in too much
|
||||
72
.themes/classic/sass/partials/_archive.scss
Normal file
@ -0,0 +1,72 @@
|
||||
#articles .blog-archives {
|
||||
article {
|
||||
padding: 1em 0 1em;
|
||||
position: relative;
|
||||
background: $img-border bottom left repeat-x;
|
||||
&:last-child {
|
||||
background: none;
|
||||
}
|
||||
}
|
||||
h2 {
|
||||
background: none;
|
||||
display: none;
|
||||
}
|
||||
h1, h2 { color: $text-color; margin-bottom: .3em; }
|
||||
h1 {
|
||||
font-size: 1.5em;
|
||||
a {
|
||||
@include hover-link;
|
||||
color: inherit;
|
||||
&:hover { color: $link-color-hover; }
|
||||
font-weight: normal;
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
a.category, time {
|
||||
@extend .sans;
|
||||
color: $text-color-light;
|
||||
}
|
||||
color: $text-color-light;
|
||||
.entry-content { display: none; }
|
||||
time {
|
||||
font-size: .9em;
|
||||
line-height: 1em;
|
||||
.month, .day { display: inline-block; }
|
||||
.month { text-transform: uppercase; }
|
||||
}
|
||||
p { margin-bottom: 1em; }
|
||||
&, .entry-content { a { @include link-colors(inherit, $link-color-hover); }}
|
||||
a:hover { color: $link-color-hover; }
|
||||
@media only screen and (min-width: 550px) {
|
||||
article { margin-left: 5em; }
|
||||
h2 {
|
||||
background: none;
|
||||
display: inline-block;
|
||||
float: left;
|
||||
padding-top: .75em;
|
||||
&:first-child { padding-top: .75em; }
|
||||
}
|
||||
time {
|
||||
position: absolute;
|
||||
text-align: right;
|
||||
left: 0em;
|
||||
top: 1.8em;
|
||||
}
|
||||
.year { display: none; }
|
||||
article {
|
||||
padding:{left: 4.5em; bottom: .7em;}
|
||||
}
|
||||
a.category {
|
||||
//text-align: right;
|
||||
line-height: 1.1em;
|
||||
//float: right;
|
||||
}
|
||||
}
|
||||
}
|
||||
#articles .blog-archives.category {
|
||||
article {
|
||||
margin-left: 0;
|
||||
padding-left: 6.8em;
|
||||
}
|
||||
.year { display: inline; }
|
||||
}
|
||||
131
.themes/classic/sass/partials/_blog.scss
Normal file
@ -0,0 +1,131 @@
|
||||
#articles {
|
||||
overflow: hidden;
|
||||
ul, ol { margin-left: 1.4em; }
|
||||
@media only screen and (min-width: 768px) {
|
||||
ul, ol { margin-left: 0; }
|
||||
}
|
||||
> article {
|
||||
padding-bottom: 1em;
|
||||
&:last-child { margin-bottom: 0; }
|
||||
h2 {
|
||||
padding-top: 0.8em;
|
||||
background: $img-border top left repeat-x;
|
||||
&:first-child { background: none; padding-top: 0; }
|
||||
}
|
||||
.byline + time:before, time +time:before, .comments:before, .byline ~ .categories:before {
|
||||
@extend .separator;
|
||||
}
|
||||
}
|
||||
header {
|
||||
position: relative;
|
||||
padding-top: 2em;
|
||||
padding-bottom: 1em;
|
||||
margin-bottom: 1em;
|
||||
background: $img-border bottom left repeat-x;
|
||||
h1 {
|
||||
margin: 0;
|
||||
a { text-decoration: none;
|
||||
&:hover { text-decoration: underline; } }
|
||||
}
|
||||
p {
|
||||
font-size: .9em;
|
||||
color: $text-color-light;
|
||||
margin: 0;
|
||||
@extend .sans;
|
||||
&.meta {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
}
|
||||
@media only screen and (min-width: 768px) {
|
||||
margin-bottom: 1.5em;
|
||||
padding-bottom: 1em;
|
||||
background: $img-border bottom left repeat-x;
|
||||
p.meta { position: absolute; top: 0; }
|
||||
}
|
||||
}
|
||||
h1.feature {
|
||||
padding-top: .5em;
|
||||
margin-bottom: 1em;
|
||||
padding-bottom: 1em;
|
||||
background: $img-border bottom left repeat-x;
|
||||
font-size: 2.0em; font-style: italic;
|
||||
line-height: 1.3em;
|
||||
}
|
||||
.entry-content {
|
||||
img, video { max-width: 100%; height: auto; }
|
||||
video {
|
||||
width: 100%; display: block; margin-bottom: 1.5em;
|
||||
padding: .8em; background: #fff; border: 1px solid #eee;
|
||||
@include box-sizing(border-box);
|
||||
}
|
||||
}
|
||||
.flash-video {
|
||||
max-width: 100%;
|
||||
margin-bottom: 1.5em;
|
||||
@include box-sizing(border-box);
|
||||
padding: .8em; background: #fff; border: 1px solid #eee;
|
||||
> div {
|
||||
position: relative;
|
||||
display: block;
|
||||
padding-bottom: 56.25%;
|
||||
padding-top: 1px;
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
iframe, object, embed {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
iframe.twitter-share-button {
|
||||
position: relative;
|
||||
top: .3em;
|
||||
padding-left: .5em;
|
||||
}
|
||||
> article > footer {
|
||||
margin-top: 2em;
|
||||
padding-top: 1em;
|
||||
margin-bottom: 1.5em;
|
||||
background: $img-border top left repeat-x;
|
||||
@extend .sans;
|
||||
}
|
||||
|
||||
}
|
||||
article + article {
|
||||
background: $img-border top left repeat-x;
|
||||
}
|
||||
#articles.blog-index {
|
||||
article header { background: none; padding-bottom: 0; }
|
||||
article h1 {
|
||||
font-size: 2.2em;
|
||||
a { color: inherit; &:hover { color: $link-color-hover; } }
|
||||
}
|
||||
a[rel=full-article] {
|
||||
background: darken($main-bg, 5);
|
||||
display: inline-block;
|
||||
padding: .4em .8em;
|
||||
margin-right: .5em;
|
||||
text-decoration: none;
|
||||
color: mix($text-color, $text-color-light);
|
||||
@extend .serif;
|
||||
@include transition(background-color, .5s);
|
||||
&:hover {
|
||||
background: $link-color-hover;
|
||||
text-shadow: none;
|
||||
color: $main-bg;
|
||||
}
|
||||
}
|
||||
footer {
|
||||
@extend .sans;
|
||||
margin-top: 1em;
|
||||
}
|
||||
}
|
||||
|
||||
.separator {
|
||||
content: "\2022 ";
|
||||
padding: 0 .4em 0 .2em;
|
||||
display: inline-block;
|
||||
}
|
||||
19
.themes/classic/sass/partials/_footer.scss
Normal file
@ -0,0 +1,19 @@
|
||||
body > footer {
|
||||
@extend .sans;
|
||||
font-size: .8em;
|
||||
color: $footer-color;
|
||||
text-shadow: lighten($footer-bg, 5) 0 1px;
|
||||
background-color: $footer-bg;
|
||||
@include background(image-url('noise.png'), linear-gradient(lighten($footer-bg, 8), $footer-bg, darken($footer-bg, 11)));
|
||||
border-top: 1px solid $footer-border-top;
|
||||
position: relative;
|
||||
padding-top: 1em;
|
||||
padding-bottom: 1em;
|
||||
margin-bottom: 3em;
|
||||
@include border-bottom-radius(.4em);
|
||||
z-index: 1;
|
||||
a {
|
||||
@include link-colors($footer-link-color, $footer-link-color-hover);
|
||||
}
|
||||
p:last-child { margin-bottom: 0; }
|
||||
}
|
||||
18
.themes/classic/sass/partials/_header.scss
Normal file
@ -0,0 +1,18 @@
|
||||
body > header {
|
||||
background: $header-bg;
|
||||
h1 {
|
||||
display: inline-block;
|
||||
margin: 0;
|
||||
a, a:visited {
|
||||
color: $title_color;
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
h2 {
|
||||
margin: .2em 0 0;
|
||||
@extend .sans;
|
||||
font-size: 1em;
|
||||
color: $subtitle-color;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
137
.themes/classic/sass/partials/_navigation.scss
Normal file
@ -0,0 +1,137 @@
|
||||
body > nav {
|
||||
position: relative;
|
||||
background-color: $nav-bg;
|
||||
@include background(image-url('noise.png'), linear-gradient(lighten($nav-bg, 8), $nav-bg, darken($nav-bg, 11)));
|
||||
border: {
|
||||
top: 1px solid $nav-border-top;
|
||||
bottom: 1px solid $nav-border-bottom; }
|
||||
padding-top: .35em;
|
||||
padding-bottom: .35em;
|
||||
form {
|
||||
@include background-clip(padding-box);
|
||||
margin: 0; padding: 0;
|
||||
.search {
|
||||
padding: .3em .5em 0;
|
||||
font-size: .85em;
|
||||
@extend .sans;
|
||||
line-height: 1.1em;
|
||||
width: 95%;
|
||||
@include border-radius(.5em);
|
||||
@include background-clip(padding-box);
|
||||
@include box-shadow(lighten($nav-bg, 2) 0 1px);
|
||||
background-color: lighten($nav-bg, 15);
|
||||
border: 1px solid $nav-border;
|
||||
color: #888;
|
||||
&:focus {
|
||||
color: #444;
|
||||
border-color: #80b1df;
|
||||
@include box-shadow(#80b1df 0 0 4px, #80b1df 0 0 3px inset);
|
||||
background-color: #fff;
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
fieldset[role=site-search]{ float: right; width: 48%; }
|
||||
fieldset[role=mobile-nav]{ float: left; width: 48%;
|
||||
select{ width: 100%; font-size: .8em; border: 1px solid #888;}
|
||||
}
|
||||
ul { display: none; }
|
||||
@media only screen and (min-width: 550px) {
|
||||
font-size: .9em;
|
||||
ul {
|
||||
@include horizontal-list(0);
|
||||
float: left;
|
||||
display: block;
|
||||
padding-top: .15em;
|
||||
}
|
||||
ul[role=subscription] {
|
||||
margin-left: .8em;
|
||||
float: right;
|
||||
li:last-child a { padding-right: 0; }
|
||||
}
|
||||
ul li {
|
||||
margin: 0;
|
||||
}
|
||||
a {
|
||||
@include link-colors($nav-color, $nav-color-hover, $visited: $nav-color);
|
||||
@extend .sans;
|
||||
text-shadow: lighten($nav-bg, 12) 0 1px;
|
||||
float: left;
|
||||
text-decoration: none;
|
||||
font-size: 1.1em;
|
||||
padding: .1em 0;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
li + li {
|
||||
border-left: 1px solid $nav-border-left;
|
||||
margin-left: .8em;
|
||||
a {
|
||||
padding-left: .8em;
|
||||
border-left: 1px solid $nav-border-right;
|
||||
}
|
||||
}
|
||||
form {
|
||||
float: right;
|
||||
text-align: left;
|
||||
padding-left: .8em;
|
||||
width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium + 20px;
|
||||
.search {
|
||||
width: 93%;
|
||||
font-size: .95em;
|
||||
line-height: 1.2em;
|
||||
}
|
||||
}
|
||||
ul[data-subscription$=email] + form {
|
||||
width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium - 58px;
|
||||
.search { width: 91%; }
|
||||
}
|
||||
fieldset[role=mobile-nav] { display: none; }
|
||||
fieldset[role=site-search]{ width: 100%; }
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 992px) {
|
||||
form {
|
||||
width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 + 10px;
|
||||
}
|
||||
ul[data-subscription$=email] + form {
|
||||
width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 - 58px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.no-placeholder {
|
||||
body > nav .search {
|
||||
background: lighten($nav-bg, 15) image-url('search.png') .3em .25em no-repeat;
|
||||
text-indent: 1.3em;
|
||||
}
|
||||
}
|
||||
@mixin mask-subscription-nav($feed: 'rss.png'){
|
||||
position: relative; top: 0px;
|
||||
text-indent: -999999em;
|
||||
background-color: $nav-border-right;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
&,&:after { @include mask-image($feed); }
|
||||
&:after {
|
||||
content: "";
|
||||
position: absolute; top: -1px; left: 0;
|
||||
background-color: lighten($nav-color, 25);
|
||||
}
|
||||
&:hover:after { background-color: lighten($nav-color, 20); }
|
||||
}
|
||||
.maskImage {
|
||||
body > nav {
|
||||
@media only screen and (min-width: 550px) {
|
||||
ul[data-subscription$=email] + form {
|
||||
width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium - 32px;
|
||||
}
|
||||
}
|
||||
@media only screen and (min-width: 992px) {
|
||||
ul[data-subscription$=email] + form {
|
||||
width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 - 32px;
|
||||
}
|
||||
}
|
||||
}
|
||||
ul[role=subscription] { position: relative; top: .2em; li, a { border: 0; padding: 0; }}
|
||||
a[rel=subscribe-rss]{ @include mask-subscription-nav('rss.png'); }
|
||||
a[rel=subscribe-email]{ @include mask-subscription-nav('email.png'); }
|
||||
}
|
||||
4
.themes/classic/sass/partials/_sidebar.scss
Normal file
@ -0,0 +1,4 @@
|
||||
@import "sidebar/base";
|
||||
@import "sidebar/twitter";
|
||||
@import "sidebar/pinboard";
|
||||
@import "sidebar/delicious";
|
||||
208
.themes/classic/sass/partials/_syntax.scss
Normal file
@ -0,0 +1,208 @@
|
||||
$pre-bg: image-url('noise.png') top left;
|
||||
.highlight, html .gist .gist-file .gist-syntax .gist-highlight {
|
||||
.line-numbers {
|
||||
text-align: right;
|
||||
font-size: .8em;
|
||||
line-height: 1.45em;
|
||||
background: $base02 $pre-bg !important;
|
||||
border-right: 1px solid darken($base03, 2) !important;
|
||||
@include box-shadow(lighten($base02, 2) -1px 0 inset);
|
||||
text-shadow: darken($base02, 10) 0 -1px;
|
||||
span { color: $base01 !important; }
|
||||
padding: .8em !important;
|
||||
@include border-radius(0);
|
||||
}
|
||||
}
|
||||
html .gist .gist-file {
|
||||
margin-bottom: 1.5em;
|
||||
position: relative;
|
||||
border: none;
|
||||
padding-top: image-height("code_bg.png") !important;
|
||||
.gist-syntax {
|
||||
border-bottom: 1px solid darken($base03, 2) !important;
|
||||
.gist-highlight{
|
||||
background: $base03 !important;
|
||||
pre {
|
||||
@extend .pre-code;
|
||||
}
|
||||
}
|
||||
}
|
||||
.gist-meta {
|
||||
padding: .6em 0.8em;
|
||||
border: 1px solid lighten($base02, 2) !important;
|
||||
color: $base01;
|
||||
font-size: .7em !important;
|
||||
background: $base02 $pre-bg;
|
||||
@extend .sans;
|
||||
line-height: 1.5em;
|
||||
a {
|
||||
color: mix($base1, $base01) !important;
|
||||
@include hover-link;
|
||||
&:hover { color: $base1 !important; }
|
||||
}
|
||||
a[href*='#file'] {
|
||||
position: absolute; top: 0; left:0; right:-10px;
|
||||
color: #474747 !important;
|
||||
@extend .code-title;
|
||||
&:hover { color: $link-color !important; }
|
||||
}
|
||||
a[href*=raw]{
|
||||
@extend .download-source;
|
||||
top: .4em;
|
||||
}
|
||||
}
|
||||
}
|
||||
pre {
|
||||
background: $base03 $pre-bg;
|
||||
@include border-radius(.4em);
|
||||
@extend .mono;
|
||||
border: 1px solid $base02;
|
||||
line-height: 1.45em;
|
||||
font-size: .8em;
|
||||
margin-bottom: 1.5em;
|
||||
padding: .8em 1em;
|
||||
color: $base1;
|
||||
overflow: auto;
|
||||
}
|
||||
h3.filename {
|
||||
@extend .code-title;
|
||||
+ pre { @include border-top-radius(0px); }
|
||||
}
|
||||
|
||||
p code {
|
||||
@extend .mono;
|
||||
display: inline-block;
|
||||
white-space: no-wrap;
|
||||
background: #fff;
|
||||
font-size: .9em;
|
||||
line-height: 1.5em;
|
||||
color: #555;
|
||||
border: 1px solid #ddd;
|
||||
@include border-radius(.4em);
|
||||
padding: 0 .3em;
|
||||
margin: -1px 0;
|
||||
}
|
||||
|
||||
.pre-code {
|
||||
@include selection(adjust-color($base03, $lightness: 23%, $saturation: -65%), $text-shadow: $base03 0 1px);
|
||||
overflow: scroll;
|
||||
overflow-y: hidden;
|
||||
display: block;
|
||||
padding: .8em !important;
|
||||
overflow-x: auto;
|
||||
line-height: 1.45em;
|
||||
background: $base03 $pre-bg !important;
|
||||
color: $base1 !important;
|
||||
span { color: $base1 !important; }
|
||||
span { font-style: normal !important; font-weight: normal !important; }
|
||||
|
||||
.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: inline-block; } /* Generic.Deleted */
|
||||
.gd .x { color: $base1 !important; background-color: mix($red, $base03, 35%) !important; display: inline-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: inline-block; } /* Generic.Inserted */
|
||||
.gi .x { color: $base1 !important; background-color: mix($green, $base03, 40%) !important; display: inline-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 */
|
||||
div { .gd, .gd .x, .gi, .gi .x { display: block; }}
|
||||
}
|
||||
|
||||
.highlight, .gist-highlight {
|
||||
pre { background: none; @include border-radius(none); border: none; padding: 0; margin-bottom: 0; }
|
||||
margin-bottom: 1.5em;
|
||||
background: $base03;
|
||||
overflow-y: hidden;
|
||||
overflow-x: auto;
|
||||
}
|
||||
.highlight code { @extend .pre-code; background: #000;}
|
||||
figure {
|
||||
margin-bottom: 1.5em;
|
||||
figcaption {
|
||||
position: relative;
|
||||
@extend .code-title;
|
||||
a { @extend .download-source; }
|
||||
}
|
||||
.highlight { margin-bottom: 0; border-bottom: 1px solid darken($base03, 2) !important; }
|
||||
}
|
||||
.code-title {
|
||||
text-align: center;
|
||||
font-size: 13px;
|
||||
line-height: 2em;
|
||||
text-shadow: #cbcccc 0 1px 0;
|
||||
color: #474747;
|
||||
font-weight: 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;
|
||||
}
|
||||
|
||||
.download-source {
|
||||
position: absolute; right: .8em;
|
||||
@include hover-link;
|
||||
color: #666 !important;
|
||||
z-index: 1;
|
||||
font-size: 13px;
|
||||
text-shadow: #cbcccc 0 1px 0;
|
||||
padding-left: 3em;
|
||||
}
|
||||
|
||||
56
.themes/classic/sass/partials/sidebar/_base.scss
Normal file
@ -0,0 +1,56 @@
|
||||
.side-shadow-border {
|
||||
@include box-shadow(lighten($sidebar-bg, 5) 0 1px);
|
||||
}
|
||||
#articles + aside {
|
||||
color: $sidebar-color;
|
||||
padding-top: 1.2em;
|
||||
text-shadow: lighten($sidebar-bg, 8) 0 1px;
|
||||
section {
|
||||
@extend .sans;
|
||||
font-size: .8em;
|
||||
line-height: 1.4em;
|
||||
margin-bottom: 1.5em;
|
||||
h1 {
|
||||
margin: 1.5em 0 0;
|
||||
padding-bottom: .2em;
|
||||
border-bottom: 1px solid $sidebar-border;
|
||||
@extend .side-shadow-border;
|
||||
+ p {
|
||||
padding-top: .4em;
|
||||
}
|
||||
}
|
||||
}
|
||||
ul {
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
li {
|
||||
list-style: none;
|
||||
padding: .5em 0;
|
||||
margin: 0;
|
||||
border-bottom: 1px solid $sidebar-border;
|
||||
@extend .side-shadow-border;
|
||||
p:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
a {
|
||||
color: inherit;
|
||||
@include transition(color, .5s);
|
||||
}
|
||||
&:hover a, &:hover #tweets a { color: $sidebar-link-color;
|
||||
&:hover { color: $sidebar-link-color-hover; }
|
||||
}
|
||||
#recent_posts {
|
||||
time {
|
||||
text-transform: uppercase;
|
||||
font-size: .9em;
|
||||
color: #666;
|
||||
}
|
||||
}
|
||||
}
|
||||
.aside-alt-link {
|
||||
color: $sidebar-link-color-subdued;
|
||||
&:hover {
|
||||
color: $sidebar-link-color-subdued-hover;
|
||||
}
|
||||
}
|
||||
4
.themes/classic/sass/partials/sidebar/_delicious.scss
Normal file
@ -0,0 +1,4 @@
|
||||
.delicious-posts {
|
||||
a.delicious-link { margin-bottom: .5em; display: block; }
|
||||
p { font-size: 1em; }
|
||||
}
|
||||
12
.themes/classic/sass/partials/sidebar/_pinboard.scss
Normal file
@ -0,0 +1,12 @@
|
||||
#pinboard_linkroll {
|
||||
.pin-title, .pin-description {
|
||||
display: block;
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
.pin-tag {
|
||||
@include hover-link;
|
||||
@extend .aside-alt-link;
|
||||
&:after { content: ','; }
|
||||
&:last-child:after { content: ''; }
|
||||
}
|
||||
}
|
||||
33
.themes/classic/sass/partials/sidebar/_twitter.scss
Normal file
@ -0,0 +1,33 @@
|
||||
#tweets {
|
||||
.loading {
|
||||
background: inline-image('bird_32_gray.png') no-repeat center .5em;
|
||||
color: darken($sidebar-bg, 18);
|
||||
text-shadow: $main-bg 0 1px;
|
||||
text-align: center;
|
||||
padding: 2.5em 0 .5em;
|
||||
&.error {
|
||||
background: inline-image('bird_32_gray_fail.png') no-repeat center .5em;
|
||||
}
|
||||
}
|
||||
a { color: $sidebar-link-color-subdued; @include hover-link; }
|
||||
p {
|
||||
position: relative;
|
||||
padding-right: 1em;
|
||||
}
|
||||
a[href*=status]{
|
||||
color: $twitter-status-link;
|
||||
float: right;
|
||||
padding: 0 0 .1em 1em;
|
||||
position: relative; right: -1.3em;
|
||||
text-shadow: #fff 0 1px;
|
||||
font-size: .7em;
|
||||
span { font-size: 1.5em; }
|
||||
&:hover {
|
||||
color: $sidebar-link-color-subdued-hover;
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
a[href*='twitter.com/search']{
|
||||
@extend .aside-alt-link;
|
||||
}
|
||||
}
|
||||
9
.themes/classic/sass/screen.scss
Normal file
@ -0,0 +1,9 @@
|
||||
@import "compass";
|
||||
@include global-reset;
|
||||
@include reset-html5;
|
||||
|
||||
@import "custom/colors";
|
||||
@import "custom/layout";
|
||||
@import "base";
|
||||
@import "partials";
|
||||
@import "custom/styles";
|
||||
8
.themes/classic/source/_includes/archive_post.html
Normal file
@ -0,0 +1,8 @@
|
||||
{% capture category %}{{ post.categories | size }}{% endcapture %}
|
||||
<h1><a href="{{ post.url }}">{{post.title}}</a></h1>
|
||||
<time datetime="{{ post.date | datetime }}" pubdate>{{ post.date | date: "<span class='month'>%b</span> <span class='day'>%d</span> <span class='year'>%Y</span>"}}</time>
|
||||
{% if category != '0' %}
|
||||
<footer>
|
||||
<span class="categories">posted in {{ post.categories | category_links }}</span>
|
||||
</footer>
|
||||
{% endif %}
|
||||
25
.themes/classic/source/_includes/article.html
Normal file
@ -0,0 +1,25 @@
|
||||
{% unless page.no_header %}
|
||||
<header>
|
||||
{% if index %}
|
||||
<h1 class="entry-title"><a href="{{ post.url }}">{{ post.title | titlecase }}</a></h1>
|
||||
{% else %}
|
||||
<h1 class="entry-title">{{ page.title | titlecase }}</h1>
|
||||
{% endif %}
|
||||
{% unless page.no_meta or !index %}<p class="meta">{% include post_date.html %}</p>{% endunless %}
|
||||
</header>
|
||||
{% endunless %}
|
||||
{% if index %}
|
||||
<div class="entry-content">{{ content | exerpt | smart_quotes }}</div>
|
||||
<p><a rel="full-article" href="{{ post.url }}">Read on →</a></p>
|
||||
<footer>
|
||||
<p class="meta">
|
||||
{% include post_author.html %}
|
||||
{% include post_date.html %}
|
||||
{% include post_categories.html %}
|
||||
<span class="comments"><a rel="comments" href="{{ post.url }}#disqus_thread">Comments</a></span>
|
||||
{% include sharing.html %}
|
||||
</p>
|
||||
</footer>
|
||||
{% else %}
|
||||
<div class="entry-content">{{ content | smart_quotes }}</div>
|
||||
{% endif %}
|
||||
7
.themes/classic/source/_includes/asides/delicious.html
Normal file
@ -0,0 +1,7 @@
|
||||
{% if site.delicious_user %}
|
||||
<section>
|
||||
<h1>On Delicious</h1>
|
||||
<script type="text/javascript" src="http://feeds.delicious.com/v2/js/{{ site.delicious_user }}?title=&count={{ site.delicious_count }}&sort=date&extended"></script>
|
||||
<p><a href="http://delicious.com/{{ site.delicious_user }}">My Delicious Bookmarks »</a></p>
|
||||
</section>
|
||||
{% endif %}
|
||||
19
.themes/classic/source/_includes/asides/pinboard.html
Normal file
@ -0,0 +1,19 @@
|
||||
{% if site.pinboard_user %}
|
||||
<section>
|
||||
<h1>My Pinboard</h1>
|
||||
<ul id="pinboard_linkroll">Fetching linkroll...</ul>
|
||||
<p><a href="http://pinboard.in/u:{{ site.pinboard_user }}">My Pinboard Bookmarks »</a></p>
|
||||
</section>
|
||||
<script type="text/javascript">
|
||||
var linkroll = 'pinboard_linkroll'; //id target for pinboard list
|
||||
var pinboard_user = "{{ site.pinboard_user }}"; //id target for pinboard list
|
||||
var pinboard_count = {{ site.pinboard_count }}; //id target for pinboard list
|
||||
(function(){
|
||||
var pinboardInit = document.createElement('script');
|
||||
pinboardInit.type = 'text/javascript';
|
||||
pinboardInit.async = true;
|
||||
pinboardInit.src = '/javascripts/pinboard.js';
|
||||
document.getElementsByTagName('head')[0].appendChild(pinboardInit);
|
||||
})();
|
||||
</script>
|
||||
{% endif %}
|
||||
12
.themes/classic/source/_includes/asides/recent_posts.html
Normal file
@ -0,0 +1,12 @@
|
||||
{% if page.single and site.recent_posts %}
|
||||
<section>
|
||||
<h1>Recent Posts</h1>
|
||||
<ul id="recent_posts">
|
||||
{% for post in site.posts limit: site.recent_posts %}
|
||||
<li class="post">
|
||||
<a href="{{ post.url }}">{{ post.title }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</section>
|
||||
{% endif %}
|
||||
19
.themes/classic/source/_includes/asides/twitter.html
Normal file
@ -0,0 +1,19 @@
|
||||
{% if site.twitter_user %}
|
||||
<section>
|
||||
<h1>Latest Tweets</h1>
|
||||
<ul id="tweets">
|
||||
<li class="loading">Status updating...</li>
|
||||
</ul>
|
||||
<script type="text/javascript">
|
||||
$.domReady(function(){
|
||||
getTwitterFeed("{{site.twitter_user}}", {{site.twitter_tweet_count}}, {{site.twitter_show_replies}});
|
||||
});
|
||||
</script>
|
||||
<script src="/javascripts/twitter.js" type="text/javascript"> </script>
|
||||
{% if site.twitter_follow_button %}
|
||||
<a href="http://twitter.com/{{ site.twitter_user }}" class="twitter-follow-button" data-width="208px" data-show-count="{{ site.twitter_show_follower_count }}">Follow @{{ site.twitter_user }}</a>
|
||||
{% else %}
|
||||
<p>Follow <a href="http://twitter.com/{{site.twitter_user}}">@{{ site.twitter_user }}</a></p>
|
||||
{% endif %}
|
||||
</section>
|
||||
{% endif %}
|
||||
13
.themes/classic/source/_includes/disqus_thread.html
Normal file
@ -0,0 +1,13 @@
|
||||
<div id="disqus_thread"></div>
|
||||
<script type="text/javascript">
|
||||
var disqus_shortname = '{{ site.disqus_short_name }}';
|
||||
var disqus_identifier = '{{ site.url }}{{ page.url }}';
|
||||
var disqus_url = '{{ site.url }}{{ page.url }}';
|
||||
//var disqus_developer = 1;
|
||||
(function() {
|
||||
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
|
||||
dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
|
||||
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
|
||||
})();
|
||||
</script>
|
||||
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
||||
4
.themes/classic/source/_includes/footer.html
Normal file
@ -0,0 +1,4 @@
|
||||
<p>
|
||||
Copyright © {{ site.time | date: "%Y" }} - {{ site.author }} -
|
||||
<span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
|
||||
</p>
|
||||
13
.themes/classic/source/_includes/google_analytics.html
Normal file
@ -0,0 +1,13 @@
|
||||
{% if site.google_analytics_tracking_id %}
|
||||
<script type="text/javascript">
|
||||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', '{{ site.google_analytics_tracking_id }}']);
|
||||
_gaq.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
||||
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||
})();
|
||||
</script>
|
||||
{% endif %}
|
||||
35
.themes/classic/source/_includes/head.html
Normal file
@ -0,0 +1,35 @@
|
||||
<!DOCTYPE html>
|
||||
<!--[if IEMobile 7 ]><html class="no-js iem7" manifest="default.appcache?v=1"><![endif]-->
|
||||
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
|
||||
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" manifest="default.appcache?v=1" lang="en"><!--<![endif]-->
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
{% if page.title %}
|
||||
<title>{{site.title}}: {{page.title}}{% if site.author %} - {{ site.author }}{% endif %}</title>
|
||||
{% else %}
|
||||
<title>{{site.title}}{% if site.author %} - {{ site.author }}{% endif %}</title>
|
||||
{% endif %}
|
||||
<meta name="author" content="{{site.author}}">
|
||||
{% if page.description %}
|
||||
<meta name="description" content="{{page.description}}"/>
|
||||
{% endif %}
|
||||
|
||||
<!-- http://t.co/dKP3o1e -->
|
||||
<meta name="HandheldFriendly" content="True">
|
||||
<meta name="MobileOptimized" content="320">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
{% if page.keywords %}
|
||||
<meta name="keywords" content="{{page.keywords}}"/>
|
||||
{% endif %}
|
||||
|
||||
<link href="/images/favicon.png" rel="shortcut icon" />
|
||||
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
|
||||
<script src="/javascripts/modernizr-2.0.js"></script>
|
||||
<script src="http://s3.amazonaws.com/ender-js/jeesh.min.js"></script>
|
||||
<script src="/javascripts/octopress.js" type="text/javascript"></script>
|
||||
<link href='http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
|
||||
<link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
|
||||
{% include google_analytics.html %}
|
||||
<link href="/atom.xml" rel="alternate" title="{{site.title}}" type="application/atom+xml"/>
|
||||
</head>
|
||||
6
.themes/classic/source/_includes/header.html
Normal file
@ -0,0 +1,6 @@
|
||||
<hgroup>
|
||||
<h1><a href="/">{{ site.title }}</a></h1>
|
||||
{% if site.subtitle %}
|
||||
<h2>{{ site.subtitle }}</h2>
|
||||
{% endif %}
|
||||
</hgroup>
|
||||
16
.themes/classic/source/_includes/navigation.html
Normal file
@ -0,0 +1,16 @@
|
||||
<ul role="subscription" data-subscription="rss{% if site.subscribe_email %} email{% endif %}">
|
||||
<li><a href="{{ site.subscribe_rss }}" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
|
||||
{% if site.subscribe_email %}
|
||||
<li><a href="{{ site.subscribe_email }}" rel="subscribe-email" title="subscribe via email">Email</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
<form action="{{ site.simple_search }}" method="get">
|
||||
<fieldset role="site-search">
|
||||
<input type="hidden" name="q" value="site:{{ site.url | search_url }}" />
|
||||
<input class="search" type="text" name="q" results="0" placeholder="Search"/>
|
||||
</fieldset>
|
||||
</form>
|
||||
<ul role="main-nav">
|
||||
<li><a href="/">Blog</a></li>
|
||||
<li><a href="/archives.html">Archives</a></li>
|
||||
</ul>
|
||||
6
.themes/classic/source/_includes/post_author.html
Normal file
@ -0,0 +1,6 @@
|
||||
{% if post.author %}
|
||||
{% assign author = post.author %}
|
||||
{% else %}
|
||||
{% assign author = site.author %}
|
||||
{% endif %}
|
||||
{% if author %}<span class="byline author vcard">Posted by <span class="fn">{{ author }}</span></span>{% endif %}
|
||||
10
.themes/classic/source/_includes/post_categories.html
Normal file
@ -0,0 +1,10 @@
|
||||
{% capture category %}{% if post %}{{ post.categories | category_links | size }}{% else %}{{ page.categories | category_links | size }}{% endif %}{% endcapture %}
|
||||
{% unless category == '0' %}
|
||||
<span class="categories"> in
|
||||
{% if post %}
|
||||
{{ post.categories | category_links }}
|
||||
{% else %}
|
||||
{{ page.categories | category_links }}
|
||||
{% endif %}
|
||||
</span>
|
||||
{% endunless %}
|
||||
10
.themes/classic/source/_includes/post_date.html
Normal file
@ -0,0 +1,10 @@
|
||||
{% capture date %}{{ page.date }}{{ post.date }}{% endcapture %}
|
||||
{% capture has_date %}{{ date | size }}{% endcapture %}
|
||||
{% capture updated %}{{ page.updated }}{{ post.updated }}{% endcapture %}
|
||||
{% capture was_updated %}{{ updated | size }}{% endcapture %}
|
||||
{% if has_date != '0' %}
|
||||
<time datetime="{{ date | datetime }}" pubdate {% if updated %} updated {% endif %}>{{ date | ordinalize }}</time>
|
||||
{% endif %}
|
||||
{% if was_updated != '0' %}
|
||||
<time class="updated" datetime="{{ updated | datetime }}"></time>
|
||||
{% endif %}
|
||||
1
.themes/classic/source/_includes/sharing.html
Normal file
@ -0,0 +1 @@
|
||||
<a href="http://twitter.com/share" class="twitter-share-button" data-url="{{ site.url }}{{ page.url }}" data-via="{{ site.twitter_user }}" data-counturl="{{ site.url }}{{ page.url }}" >Tweet</a>
|
||||
8
.themes/classic/source/_includes/sidebar.html
Normal file
@ -0,0 +1,8 @@
|
||||
<section>
|
||||
<h1>About Me</h1>
|
||||
<p>Hi, I'm Octopress!</p>
|
||||
</section>
|
||||
{% include asides/recent_posts.html %}
|
||||
{% include asides/twitter.html %}
|
||||
{% include asides/delicious.html %}
|
||||
{% include asides/pinboard.html %}
|
||||
12
.themes/classic/source/_layouts/category_index.html
Normal file
@ -0,0 +1,12 @@
|
||||
---
|
||||
layout: post
|
||||
no_meta: true
|
||||
---
|
||||
|
||||
<div class="blog-archives category">
|
||||
{% for post in site.categories[page.category] %}
|
||||
<article>
|
||||
{% include archive_post.html %}
|
||||
</article>
|
||||
{% endfor %}
|
||||
</div>
|
||||
26
.themes/classic/source/_layouts/default.html
Normal file
@ -0,0 +1,26 @@
|
||||
{% include head.html %}
|
||||
<body {% if page.body_id %} id="{{ page.body_id }}" {% endif %} {% if page.sidebar == 'none' %} class="no-sidebar" {% endif %}>
|
||||
<header>{% include header.html %}</header>
|
||||
<nav>{% include navigation.html %}</nav>
|
||||
<div>
|
||||
<div>
|
||||
<div id="articles" {% if page.blog_index %} class="blog-index" {% endif %}>{{ content }}</div>
|
||||
{% unless page.sidebar == 'none' %}
|
||||
<aside>{% include sidebar.html %}</aside>
|
||||
{% endunless %}
|
||||
</div>
|
||||
</div>
|
||||
<footer>{% include footer.html %}</footer>
|
||||
{% if site.twitter_follow_button or site.twitter_tweet_button %}
|
||||
<script type="text/javascript">
|
||||
(function(){
|
||||
var twitterWidgets = document.createElement('script');
|
||||
twitterWidgets.type = 'text/javascript';
|
||||
twitterWidgets.async = true;
|
||||
twitterWidgets.src = 'http://platform.twitter.com/widgets.js';
|
||||
document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
|
||||
})();
|
||||
</script>
|
||||
{% endif %}
|
||||
</body>
|
||||
</html>
|
||||
5
.themes/classic/source/_layouts/page.html
Normal file
@ -0,0 +1,5 @@
|
||||
---
|
||||
layout: post
|
||||
---
|
||||
|
||||
<!-- if you want a page layout -->
|
||||
24
.themes/classic/source/_layouts/post.html
Normal file
@ -0,0 +1,24 @@
|
||||
---
|
||||
layout: default
|
||||
single: true
|
||||
---
|
||||
|
||||
<article class="hentry">
|
||||
{% include article.html %}
|
||||
{% unless page.no_meta %}
|
||||
<footer>
|
||||
<p class="meta">
|
||||
{% include post_author.html %}
|
||||
{% include post_date.html %}
|
||||
{% include post_categories.html %}
|
||||
{% include sharing.html %}
|
||||
</p>
|
||||
</footer>
|
||||
{% endunless %}
|
||||
{% if site.disqus_short_name %}
|
||||
<section>
|
||||
<h1>Comments</h1>
|
||||
<div id="disqus_thread">{% include disqus_thread.html %}</div>
|
||||
</section>
|
||||
{% endif %}
|
||||
</article>
|
||||
17
.themes/classic/source/archives.html
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
layout: post
|
||||
title: Blog Archive
|
||||
no_meta: true
|
||||
---
|
||||
<div class="blog-archives">
|
||||
{% for post in site.posts reverse %}
|
||||
{% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %}
|
||||
{% unless year == this_year %}
|
||||
{% assign year = this_year %}
|
||||
<h2>{{ year }}</h2>
|
||||
{% endunless %}
|
||||
<article>
|
||||
{% include archive_post.html %}
|
||||
</article>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
After Width: | Height: | Size: 141 B |
|
After Width: | Height: | Size: 82 B |
|
After Width: | Height: | Size: 118 B |
|
After Width: | Height: | Size: 203 B |
|
After Width: | Height: | Size: 636 B |
|
After Width: | Height: | Size: 343 B |
|
After Width: | Height: | Size: 835 B |
|
After Width: | Height: | Size: 210 B |
|
After Width: | Height: | Size: 664 B |
|
After Width: | Height: | Size: 170 B |
|
After Width: | Height: | Size: 442 B |
|
After Width: | Height: | Size: 251 B |
|
After Width: | Height: | Size: 553 B |
|
After Width: | Height: | Size: 112 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 103 B |
|
After Width: | Height: | Size: 114 B |
|
After Width: | Height: | Size: 116 B |
|
After Width: | Height: | Size: 264 B |
|
After Width: | Height: | Size: 649 B |
|
After Width: | Height: | Size: 686 B |
|
After Width: | Height: | Size: 816 B |
BIN
.themes/classic/source/assets/jwplayer/glow/display/muteIcon.png
Normal file
|
After Width: | Height: | Size: 334 B |
BIN
.themes/classic/source/assets/jwplayer/glow/display/playIcon.png
Normal file
|
After Width: | Height: | Size: 465 B |
BIN
.themes/classic/source/assets/jwplayer/glow/dock/button.png
Normal file
|
After Width: | Height: | Size: 686 B |
115
.themes/classic/source/assets/jwplayer/glow/glow.xml
Normal file
@ -0,0 +1,115 @@
|
||||
<?xml version="1.0"?>
|
||||
<skin version="1.1" name="Glow" author="LongTail Video">
|
||||
|
||||
<settings>
|
||||
<setting name="backcolor" value="0x000000" />
|
||||
<setting name="frontcolor" value="0xeeeeee" />
|
||||
<setting name="lightcolor" value="0xeeeeee" />
|
||||
<setting name="screencolor" value="0x000000" />
|
||||
</settings>
|
||||
|
||||
<components>
|
||||
<component name="controlbar">
|
||||
<settings>
|
||||
<setting name="margin" value="0" />
|
||||
<setting name="fontsize" value="11" />
|
||||
<setting name="fontcolor" value="0xEEEEEE" />
|
||||
<setting name="buttoncolor" value="0xEEEEEE" />
|
||||
</settings>
|
||||
|
||||
<layout>
|
||||
<group position="left">
|
||||
<button name="play" />
|
||||
<text name="elapsed" />
|
||||
</group>
|
||||
<group position="center">
|
||||
<slider name="time" />
|
||||
</group>
|
||||
<group position="right">
|
||||
<text name="duration" />
|
||||
<button name="blank" />
|
||||
<button name="mute" />
|
||||
<button name="fullscreen" />
|
||||
</group>
|
||||
</layout>
|
||||
|
||||
<elements>
|
||||
<element name="background" src="background.png" />
|
||||
<element name="capLeft" src="divider.png" />
|
||||
<element name="capRight" src="divider.png" />
|
||||
<element name="divider" src="divider.png" />
|
||||
<element name="blankButton" src="blankButton.png" />
|
||||
<element name="fullscreenButton" src="fullscreenButton.png" />
|
||||
<element name="fullscreenButtonOver" src="fullscreenButtonOver.png" />
|
||||
<element name="muteButton" src="muteButton.png" />
|
||||
<element name="muteButtonOver" src="muteButtonOver.png" />
|
||||
<element name="pauseButton" src="pauseButton.png" />
|
||||
<element name="pauseButtonOver" src="pauseButtonOver.png" />
|
||||
<element name="playButton" src="playButton.png" />
|
||||
<element name="playButtonOver" src="playButtonOver.png" />
|
||||
<element name="timeSliderBuffer" src="timeSliderBuffer.png" />
|
||||
<element name="timeSliderCapLeft" src="timeSliderCapLeft.png" />
|
||||
<element name="timeSliderCapRight" src="timeSliderCapRight.png" />
|
||||
<element name="timeSliderProgress" src="timeSliderProgress.png" />
|
||||
<element name="timeSliderRail" src="timeSliderRail.png" />
|
||||
<element name="normalscreenButton" src="normalscreenButton.png" />
|
||||
<element name="normalscreenButtonOver" src="normalscreenButtonOver.png" />
|
||||
<element name="unmuteButton" src="unmuteButton.png" />
|
||||
<element name="unmuteButtonOver" src="unmuteButtonOver.png" />
|
||||
<element name="volumeSliderRail" src="divider.png" />
|
||||
<element name="volumeSliderProgress" src="divider.png" />
|
||||
</elements>
|
||||
</component>
|
||||
|
||||
<component name="display">
|
||||
<settings>
|
||||
<setting name="bufferinterval" value="250" />
|
||||
<setting name="bufferrotation" value="90" />
|
||||
</settings>
|
||||
<elements>
|
||||
<element name="background" src="background.png" />
|
||||
<element name="playIcon" src="playIcon.png" />
|
||||
<element name="muteIcon" src="muteIcon.png" />
|
||||
<element name="errorIcon" src="bufferIcon.png" />
|
||||
<element name="bufferIcon" src="bufferIcon.png" />
|
||||
</elements>
|
||||
</component>
|
||||
|
||||
<component name="dock">
|
||||
<settings>
|
||||
<setting name="fontcolor" value="0xFFFFFF" />
|
||||
</settings>
|
||||
<elements>
|
||||
<element name="button" src="button.png" />
|
||||
</elements>
|
||||
</component>
|
||||
|
||||
<component name="playlist">
|
||||
<settings>
|
||||
<setting name="fontcolor" value="0xEEEEEE" />
|
||||
<setting name="overcolor" value="0xFFFFFF" />
|
||||
<setting name="activecolor" value="0xFFFFFF" />
|
||||
<setting name="backgroundcolor" value="0x333333" />
|
||||
</settings>
|
||||
<elements>
|
||||
<element name="item" src="item.png" />
|
||||
<element name="itemOver" src="itemOver.png" />
|
||||
<element name="sliderCapBottom" src="sliderCapBottom.png" />
|
||||
<element name="sliderCapTop" src="sliderCapTop.png" />
|
||||
<element name="sliderRail" src="sliderRail.png" />
|
||||
<element name="sliderThumb" src="sliderThumb.png" />
|
||||
</elements>
|
||||
</component>
|
||||
|
||||
<component name="sharing">
|
||||
<elements>
|
||||
<element name="embedIcon" src="embedIcon.png" />
|
||||
<element name="embedScreen" src="embedScreen.png" />
|
||||
<element name="shareIcon" src="shareIcon.png" />
|
||||
<element name="shareScreen" src="shareScreen.png" />
|
||||
</elements>
|
||||
</component>
|
||||
|
||||
</components>
|
||||
|
||||
</skin>
|
||||
BIN
.themes/classic/source/assets/jwplayer/glow/playlist/item.png
Normal file
|
After Width: | Height: | Size: 172 B |
|
After Width: | Height: | Size: 171 B |
|
After Width: | Height: | Size: 108 B |
|
After Width: | Height: | Size: 105 B |
|
After Width: | Height: | Size: 100 B |
|
After Width: | Height: | Size: 97 B |
|
After Width: | Height: | Size: 749 B |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 589 B |
|
After Width: | Height: | Size: 4.5 KiB |
BIN
.themes/classic/source/assets/jwplayer/player.swf
Normal file
28
.themes/classic/source/atom.xml
Normal file
@ -0,0 +1,28 @@
|
||||
---
|
||||
layout: nil
|
||||
---
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<feed xmlns="http://www.w3.org/2005/Atom">
|
||||
|
||||
<title>{{ site.blog_title }}</title>
|
||||
<link href="{{ site.url }}/atom.xml" rel="self"/>
|
||||
<link href="{{ site.url }}/"/>
|
||||
<updated>{{ site.time | date_to_xmlschema }}</updated>
|
||||
<id>{{ site.url }}/</id>
|
||||
<author>
|
||||
<name>{{ site.author }}</name>
|
||||
{% if site.email %}
|
||||
<email>{{ site.email }}</email>
|
||||
{% endif %}
|
||||
</author>
|
||||
|
||||
{% for post in site.posts %}
|
||||
<entry>
|
||||
<title>{{ post.title }}</title>
|
||||
<link href="{{ site.url }}{{ post.url }}"/>
|
||||
<updated>{{ post.date | date_to_xmlschema }}</updated>
|
||||
<id>{{ site.url }}{{ post.id }}</id>
|
||||
<content type="html">{{ post.content | full_urls: site.url | xml_escape }}</content>
|
||||
</entry>
|
||||
{% endfor %}
|
||||
</feed>
|
||||
BIN
.themes/classic/source/images/bird_32_gray.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
.themes/classic/source/images/bird_32_gray_fail.png
Normal file
|
After Width: | Height: | Size: 615 B |
BIN
.themes/classic/source/images/code_bg.png
Normal file
|
After Width: | Height: | Size: 239 B |
BIN
.themes/classic/source/images/dotted-border.png
Normal file
|
After Width: | Height: | Size: 99 B |
BIN
.themes/classic/source/images/email.png
Normal file
|
After Width: | Height: | Size: 301 B |
BIN
.themes/classic/source/images/favicon.png
Normal file
|
After Width: | Height: | Size: 400 B |