baron 1.0.7 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. data/Rakefile +1 -0
  2. data/VERSION +1 -1
  3. data/baron.gemspec +24 -2
  4. data/lib/baron.rb +52 -20
  5. data/spec/baron_article_spec.rb +2 -2
  6. data/spec/baron_blog_engine_spec.rb +13 -10
  7. data/spec/baron_theme_spec.rb +29 -0
  8. data/spec/sample_data/config.ru +1 -1
  9. data/spec/sample_data/pages/test.rhtml +44 -0
  10. data/spec/sample_data/themes/typography/templates/layout.rhtml +3 -3
  11. data/spec/sample_data/themes/typography/theme_config.yml +9 -0
  12. data/spec/sample_data/themes/typography/typography/css/app.css +58 -0
  13. data/spec/sample_data/themes/typography/typography/css/bootstrap-responsive.css +1092 -0
  14. data/spec/sample_data/themes/typography/typography/css/bootstrap-responsive.min.css +9 -0
  15. data/spec/sample_data/themes/typography/typography/css/bootstrap.css +6039 -0
  16. data/spec/sample_data/themes/typography/typography/css/bootstrap.min.css +9 -0
  17. data/spec/sample_data/themes/typography/typography/img/github.png +0 -0
  18. data/spec/sample_data/themes/typography/typography/img/glyphicons-halflings-white.png +0 -0
  19. data/spec/sample_data/themes/typography/typography/img/glyphicons-halflings.png +0 -0
  20. data/spec/sample_data/themes/typography/typography/img/instagram.png +0 -0
  21. data/spec/sample_data/themes/typography/typography/js/bootstrap.js +2159 -0
  22. data/spec/sample_data/themes/typography/typography/js/bootstrap.min.js +6 -0
  23. data/spec/sample_data/themes/typography/typography/js/image_alt.js +12 -0
  24. data/spec/sample_data/themes/typography/typography/js/read_later.js +14 -0
  25. data/spec/sample_data/themes/typography/typography/templates/archives.rhtml +18 -0
  26. data/spec/sample_data/themes/typography/typography/templates/article.rhtml +14 -0
  27. data/spec/sample_data/themes/typography/typography/templates/category.rhtml +17 -0
  28. data/spec/sample_data/themes/typography/typography/templates/error.rhtml +3 -0
  29. data/spec/sample_data/themes/typography/typography/templates/home.rhtml +28 -0
  30. data/spec/sample_data/themes/typography/typography/templates/layout.rhtml +141 -0
  31. metadata +24 -2
data/Rakefile CHANGED
@@ -25,6 +25,7 @@ end
25
25
  # Run RSpec tests
26
26
 
27
27
  require 'rspec/core/rake_task'
28
+ 'clear'
28
29
  RSpec::Core::RakeTask.new(:spec)
29
30
 
30
31
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.7
1
+ 1.0.8
data/baron.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "baron"
8
- s.version = "1.0.7"
8
+ s.version = "1.0.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Nathan Buggia"]
12
- s.date = "2013-03-22"
12
+ s.date = "2013-03-23"
13
13
  s.description = "What's in the box: (1) Publish to Heroku using Git (2) Author articles in markdown (3) Article categories (4) Multiple permalink formats supported (5) Redirects (6) Advanced SEO optimizations and Google Analytics/ Webmaster Tools support. Uses Rack, RSpec, Bootstrap, JQuery, Disqus, Thin"
14
14
  s.email = "nbuggia@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
25
25
  "spec/baron_article_spec.rb",
26
26
  "spec/baron_blog_engine_spec.rb",
27
27
  "spec/baron_spec.rb",
28
+ "spec/baron_theme_spec.rb",
28
29
  "spec/sample_data/.gitignore",
29
30
  "spec/sample_data/Gemfile",
30
31
  "spec/sample_data/Rakefile",
@@ -39,6 +40,7 @@ Gem::Specification.new do |s|
39
40
  "spec/sample_data/images/robert-frost-small.png",
40
41
  "spec/sample_data/images/robert-frost.png",
41
42
  "spec/sample_data/pages/about.rhtml",
43
+ "spec/sample_data/pages/test.rhtml",
42
44
  "spec/sample_data/resources/feed.rss",
43
45
  "spec/sample_data/resources/redirects.txt",
44
46
  "spec/sample_data/resources/robots.txt",
@@ -61,6 +63,26 @@ Gem::Specification.new do |s|
61
63
  "spec/sample_data/themes/typography/templates/error.rhtml",
62
64
  "spec/sample_data/themes/typography/templates/home.rhtml",
63
65
  "spec/sample_data/themes/typography/templates/layout.rhtml",
66
+ "spec/sample_data/themes/typography/theme_config.yml",
67
+ "spec/sample_data/themes/typography/typography/css/app.css",
68
+ "spec/sample_data/themes/typography/typography/css/bootstrap-responsive.css",
69
+ "spec/sample_data/themes/typography/typography/css/bootstrap-responsive.min.css",
70
+ "spec/sample_data/themes/typography/typography/css/bootstrap.css",
71
+ "spec/sample_data/themes/typography/typography/css/bootstrap.min.css",
72
+ "spec/sample_data/themes/typography/typography/img/github.png",
73
+ "spec/sample_data/themes/typography/typography/img/glyphicons-halflings-white.png",
74
+ "spec/sample_data/themes/typography/typography/img/glyphicons-halflings.png",
75
+ "spec/sample_data/themes/typography/typography/img/instagram.png",
76
+ "spec/sample_data/themes/typography/typography/js/bootstrap.js",
77
+ "spec/sample_data/themes/typography/typography/js/bootstrap.min.js",
78
+ "spec/sample_data/themes/typography/typography/js/image_alt.js",
79
+ "spec/sample_data/themes/typography/typography/js/read_later.js",
80
+ "spec/sample_data/themes/typography/typography/templates/archives.rhtml",
81
+ "spec/sample_data/themes/typography/typography/templates/article.rhtml",
82
+ "spec/sample_data/themes/typography/typography/templates/category.rhtml",
83
+ "spec/sample_data/themes/typography/typography/templates/error.rhtml",
84
+ "spec/sample_data/themes/typography/typography/templates/home.rhtml",
85
+ "spec/sample_data/themes/typography/typography/templates/layout.rhtml",
64
86
  "spec/spec_helper.rb"
65
87
  ]
66
88
  s.homepage = "https://github.com/nbuggia/baron-blog-engine-gem"
data/lib/baron.rb CHANGED
@@ -57,15 +57,14 @@ module Baron
57
57
  end
58
58
 
59
59
  class PageController
60
- def initialize articles_parts, categories, max_articles, params, config
61
- @categories, @params, @config = categories, params, config
60
+ def initialize articles_parts, categories, max_articles, params, theme, config
61
+ @categories, @params, @theme, @config = categories, params, theme, config
62
62
  stop_at = (:all == max_articles) ? articles_parts.count : max_articles
63
63
  @articles = articles_parts.take(stop_at).map { |file_parts| Article.new(file_parts, @config) }
64
64
  @article = @articles.first
65
65
  end
66
66
 
67
67
  def render_html partial_template, layout_template
68
- @theme_root = "/themes/#{@config[:theme]}"
69
68
  @content = ERB.new(File.read(partial_template)).result(binding)
70
69
  if @content[0..99].include? '<html'
71
70
  return @content
@@ -102,25 +101,26 @@ module Baron
102
101
  categories = get_all_categories
103
102
  params = {:page_name => route.first, :rss_feed => get_feed_path}
104
103
  params[:page_title] = (route.first == @config[:root] ? '' : "#{route.first.capitalize} #{@config[:title_delimiter]} ") + "#{@config[:title]}"
104
+ theme = Theme.new(@config)
105
105
 
106
106
  begin
107
107
 
108
108
  # RSS feed... /feed.rss
109
109
  body = if mime_type == :rss
110
- PageController.new(get_all_articles, categories, @config[:article_max], params, @config) .
110
+ PageController.new(get_all_articles, categories, @config[:article_max], params, theme, @config) .
111
111
  render_rss(get_system_resource('feed.rss'))
112
112
 
113
113
  # Robots... /robots.txt
114
114
  elsif route.first == 'robots'
115
- PageController.new(get_all_articles, categories, @config[:article_max], params, @config) .
115
+ PageController.new(get_all_articles, categories, @config[:article_max], params, theme, @config) .
116
116
  render_rss(get_system_resource('robots.txt'))
117
117
 
118
118
  # Home page... /
119
119
  elsif route.first == @config[:root]
120
120
  all_articles = get_all_articles
121
121
  params[:page_forward] = '/page/2/' if @config[:article_max] < all_articles.count
122
- PageController.new(all_articles, categories, @config[:article_max], params, @config) .
123
- render_html(get_theme_template(route.first), get_theme_template('layout'))
122
+ PageController.new(all_articles, categories, @config[:article_max], params, theme, @config) .
123
+ render_html(theme.get_template(route.first), theme.get_template('layout'))
124
124
 
125
125
  # Pagination... /page/2, /page/2/
126
126
  elsif route.first == 'page' && route.count == 2
@@ -137,33 +137,33 @@ module Baron
137
137
  params[:page_forward] = "/page/#{(page_num+1).to_s}/" if show_next
138
138
  params[:page_title] = "Page #{page_num.to_s} #{@config[:title_delimiter]} #{@config[:title]}"
139
139
 
140
- PageController.new(articles_on_this_page, categories, @config[:article_max], params, @config) .
141
- render_html(get_theme_template('home'), get_theme_template('layout'))
140
+ PageController.new(articles_on_this_page, categories, @config[:article_max], params, theme, @config) .
141
+ render_html(theme.get_template('home'), theme.get_template('layout'))
142
142
 
143
143
  # System routes... /robots.txt, /archives
144
144
  elsif route.first == 'archives' or route.first == 'robots'
145
145
  max_articles = ('archives' == route.first) ? :all : @config[:article_max]
146
- PageController.new(get_all_articles, categories, max_articles, params, @config) .
147
- render_html(get_theme_template(route.first), get_theme_template('layout'))
146
+ PageController.new(get_all_articles, categories, max_articles, params, theme, @config) .
147
+ render_html(theme.get_template(route.first), theme.get_template('layout'))
148
148
 
149
149
  # Custom pages... /about, /contact-us
150
150
  elsif is_route_custom_page? route.first
151
- PageController.new(get_all_articles, categories, @config[:article_max], params, @config) .
152
- render_html(get_page_template(route.first), get_theme_template('layout'))
151
+ PageController.new(get_all_articles, categories, @config[:article_max], params, theme, @config) .
152
+ render_html(get_page_template(route.first), theme.get_template('layout'))
153
153
 
154
154
  # Category home pages... /projects/, /photography/, /poems/, etc
155
155
  elsif is_route_category_home? route.last
156
156
  filtered_articles = get_all_articles.select { |h| h[:category] == route.last }
157
157
  params[:page_name] = route.last.gsub('-', ' ').titleize
158
- PageController.new(filtered_articles, categories, :all, params, @config) .
159
- render_html(get_theme_template('category'), get_theme_template('layout'))
158
+ PageController.new(filtered_articles, categories, :all, params, theme, @config) .
159
+ render_html(theme.get_template('category'), theme.get_template('layout'))
160
160
 
161
161
  # Articles... /posts/2013/01/18/my-article-title, /posts/category/2013/my-article-title, etc
162
162
  else
163
163
  article = [ find_single_article(route.last) ]
164
164
  params[:page_title] = "#{article.first[:filename].gsub('-',' ').titleize} #{@config[:title_delimiter]} #{@config[:title]}"
165
- PageController.new(article, categories, 1, params, @config) .
166
- render_html(get_theme_template('article'), get_theme_template('layout'))
165
+ PageController.new(article, categories, 1, params, theme, @config) .
166
+ render_html(theme.get_template('article'), theme.get_template('layout'))
167
167
  end
168
168
 
169
169
  return :body => body, :type => mime_type, :status => 200
@@ -173,8 +173,8 @@ module Baron
173
173
  # 404 Page Not Found
174
174
  params[:error_message] = 'Page not found'
175
175
  params[:error_code] = '404'
176
- body = PageController.new([], categories, 0, params, @config) .
177
- render_html(get_theme_template('error'), get_theme_template('layout'))
176
+ body = PageController.new([], categories, 0, params, theme, @config) .
177
+ render_html(theme.get_template('error'), theme.get_template('layout'))
178
178
 
179
179
  return :body => body, :type => :html, :status => 404
180
180
  end
@@ -232,6 +232,15 @@ module Baron
232
232
  get_all_categories.each { |h| return true if h[:node_name] == path_node }
233
233
  return false
234
234
  end
235
+
236
+ def load_theme_config filename_and_path
237
+ bar = {}
238
+ metadata = File.read(filename_and_path)
239
+ YAML.load(metadata).each_pair { |key, value| bar[key.downcase.to_sym] = value }
240
+ bar
241
+ rescue Errno::ENOENT => e
242
+ return {}
243
+ end
235
244
 
236
245
  def get_pages_path() "#{@config[:sample_data_path]}pages/" end
237
246
  def get_articles_path() "#{@config[:sample_data_path]}articles" end
@@ -240,6 +249,29 @@ module Baron
240
249
  def get_system_resource(name) "#{@config[:sample_data_path]}resources/#{name}" end
241
250
  def get_feed_path() "#{@config[:url]}/feed.rss" end
242
251
  end
252
+
253
+ class Theme < Hash
254
+ def initialize config
255
+ @config = config
256
+ self[:root] = "/themes/#{config[:theme]}"
257
+ self[:name] = config[:theme]
258
+ self[:file_root] = "#{@config[:sample_data_path]}themes/#{@config[:theme]}".squeeze('/')
259
+ load_config("#{self[:file_root]}/theme_config.yml")
260
+ end
261
+
262
+ def load_config filename_and_path
263
+ metadata = File.read(filename_and_path)
264
+ YAML.load(metadata).each_pair { |key, value| self[key.downcase.to_sym] = value }
265
+ rescue Errno::ENOENT => e
266
+ puts "Warning: unable to load config file : " + filename_and_path
267
+ end
268
+
269
+ def root() self[:root] end
270
+
271
+ def get_template name
272
+ "#{self[:file_root]}/templates/#{name}.rhtml".squeeze('/')
273
+ end
274
+ end
243
275
 
244
276
  class Article < Hash
245
277
  def initialize file_parts, config = {}
@@ -289,7 +321,7 @@ module Baron
289
321
 
290
322
  def load_article filename_and_path
291
323
  metadata, self[:body] = File.read(filename_and_path).split(/\n\n/, 2)
292
- YAML.load(metadata).each_pair { |k,v| self[k.downcase.to_sym] = v }
324
+ YAML.load(metadata).each_pair { |key, value| self[key.downcase.to_sym] = value }
293
325
  end
294
326
 
295
327
  def markdown text
@@ -1,11 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  ###
4
- # Tests Baron::ArticleModel class
4
+ # Tests Baron::Article class
5
5
  #
6
6
  # This class represents an individual article
7
7
 
8
- describe "Baron::ArticleModel" do
8
+ describe "Baron::Article" do
9
9
  before :all do
10
10
  @config = load_config()
11
11
  @article_parts = {:filename_and_path => "#{SAMPLE_DATA_PATH}articles/favorites/1916-01-01-the-road-not-taken.txt",
@@ -17,11 +17,6 @@ describe "Baron::BlogEngine" do
17
17
  @blog_engine.get_pages_path.should == SAMPLE_DATA_PATH + 'pages/'
18
18
  @blog_engine.get_articles_path.should == SAMPLE_DATA_PATH + 'articles'
19
19
  @blog_engine.get_page_template('about').should == SAMPLE_DATA_PATH + 'pages/about.rhtml'
20
- @blog_engine.get_theme_template('article').should == SAMPLE_DATA_PATH + 'themes/typography/templates/article.rhtml'
21
- @blog_engine.get_theme_template('category').should == SAMPLE_DATA_PATH + 'themes/typography/templates/category.rhtml'
22
- @blog_engine.get_theme_template('error').should == SAMPLE_DATA_PATH + 'themes/typography/templates/error.rhtml'
23
- @blog_engine.get_theme_template('home').should == SAMPLE_DATA_PATH + 'themes/typography/templates/home.rhtml'
24
- @blog_engine.get_theme_template('layout').should == SAMPLE_DATA_PATH + 'themes/typography/templates/layout.rhtml'
25
20
  @blog_engine.get_system_resource('redirects.txt').should == SAMPLE_DATA_PATH + 'resources/redirects.txt'
26
21
  @blog_engine.get_system_resource('robots.txt').should == SAMPLE_DATA_PATH + 'resources/robots.txt'
27
22
  @blog_engine.get_system_resource('feeds.rss').should == SAMPLE_DATA_PATH + 'resources/feeds.rss'
@@ -43,16 +38,24 @@ describe "Baron::BlogEngine" do
43
38
  it "finds all articles" do
44
39
  articles_fileparts = @blog_engine.get_all_articles()
45
40
  articles_fileparts.count.should == 7
46
- articles_fileparts.first[:filename_and_path].should == SAMPLE_DATA_PATH + 'articles/favorites/1916-01-01-the-road-not-taken.txt'
47
- articles_fileparts.first[:date].should == '1916-01-01'
48
- articles_fileparts.first[:filename].should == 'the-road-not-taken'
49
- articles_fileparts.first[:category].should == 'favorites'
41
+ end
42
+
43
+ it "parses all article fileparts" do
44
+ articles_fileparts = @blog_engine.get_all_articles()
45
+ articles_fileparts[0][:filename_and_path].should == SAMPLE_DATA_PATH + 'articles/favorites/1916-01-01-the-road-not-taken.txt'
46
+ articles_fileparts[0][:date].should == '1916-01-01'
47
+ articles_fileparts[0][:filename].should == 'the-road-not-taken'
48
+ articles_fileparts[0][:category].should == 'favorites'
49
+ articles_fileparts[1][:filename_and_path].should == SAMPLE_DATA_PATH + 'articles/north of boston/1914-01-05-A-Hundred-callers.txt'
50
+ articles_fileparts[1][:date].should == '1914-01-05'
51
+ articles_fileparts[1][:filename].should == 'a-hundred-callers'
52
+ articles_fileparts[1][:category].should == 'north of boston'
50
53
  articles_fileparts.last[:filename_and_path].should == SAMPLE_DATA_PATH + 'articles/other authors/1909-01-02-If.txt'
51
54
  articles_fileparts.last[:date].should == '1909-01-02'
52
55
  articles_fileparts.last[:filename].should == 'if'
53
56
  articles_fileparts.last[:category].should == 'other authors'
54
57
  end
55
-
58
+
56
59
  it "returns all article parts" do
57
60
  @blog_engine.get_all_articles().each do |article_parts|
58
61
  article_parts[:filename_and_path].should_not == nil
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ ###
4
+ # Tests Baron::Theme class
5
+ #
6
+ # This class represents an individual article
7
+
8
+ describe "Baron::Theme" do
9
+ before :all do
10
+ @config = load_config()
11
+ @theme = Baron::Theme.new(@config)
12
+ end
13
+
14
+ it "finds all parameters in theme_config.yml" do
15
+ @theme.root.should == '/themes/typography'
16
+ @theme[:root].should == '/themes/typography'
17
+ @theme[:masthead_url].should == "http://www.my-corporation.com"
18
+ @theme[:param_test].should == "FOOBAR"
19
+ @theme[:company_description].should == "Insert content here"
20
+ end
21
+
22
+ it "finds all the rendering templates" do
23
+ @theme.get_template('article').should == SAMPLE_DATA_PATH + 'themes/typography/templates/article.rhtml'
24
+ @theme.get_template('category').should == SAMPLE_DATA_PATH + 'themes/typography/templates/category.rhtml'
25
+ @theme.get_template('error').should == SAMPLE_DATA_PATH + 'themes/typography/templates/error.rhtml'
26
+ @theme.get_template('home').should == SAMPLE_DATA_PATH + 'themes/typography/templates/home.rhtml'
27
+ @theme.get_template('layout').should == SAMPLE_DATA_PATH + 'themes/typography/templates/layout.rhtml'
28
+ end
29
+ end
@@ -9,7 +9,7 @@ baron = Baron::Server.new do
9
9
  set :disqus, true
10
10
 
11
11
  # Specify the title of your blog
12
- set :title, 'Robert Frost'
12
+ set :title, 'Robert Frost - Sample Data'
13
13
 
14
14
  # Specify a description for your blog
15
15
  set :description, 'The fake blog of Robert Frost'
@@ -0,0 +1,44 @@
1
+ <h1>Test Page</h1>
2
+ <p>
3
+ This page lists all the variables that are available to any renderingfile
4
+ (e.g. ends in .rhtml).
5
+ </p>
6
+ <p>
7
+ Access them through <code>&lt;%= @params[:page_name] %&gt;</code>, where
8
+ <code>:page_name</code> is the name of the attribute you would like to access.
9
+ </p>
10
+
11
+ <h2>@theme</h2>
12
+ <p>
13
+ Gives you access to metadata about the theme, including parameters defined in
14
+ the <code>themes/theme/theme_config.yml</code> file.
15
+ </p>
16
+ <section style="font-family:'Courier New'; padding-bottom:1em;"><%= @theme.inspect %></section>
17
+
18
+ <h2>@params</h2>
19
+ <p>
20
+ Gives you access to some useful data created during the page rendering.
21
+ </p>
22
+ <section style="font-family:'Courier New'; padding-bottom:1em;"><%= @params.inspect %></section>
23
+
24
+ <h2>@config</h2>
25
+ <p>
26
+ Gives you access to all the attribute/ value pairs specified in your
27
+ <code>config.ru</code> file.
28
+ </p>
29
+ <section style="font-family:'Courier New'; padding-bottom:1em;"><%= @config.inspect %></section>
30
+
31
+ <h2>@categories</h2>
32
+ <p>
33
+ Gives you access to your list of categories and associated metadata. Useful
34
+ for creating a nav bar.
35
+ </p>
36
+ <section style="font-family:'Courier New'; padding-bottom:1em;"><%= @categories.inspect %></section>
37
+
38
+ <h2>@articles</h2>
39
+ <p>
40
+ Gives you access to each article returned with your request (the most
41
+ recent <code>@config[:max_articles]</code>). This also includes any
42
+ additional attribute/ value pairs specified in the article header.
43
+ </p>
44
+ <section style="font-family:'Courier New'; padding-bottom:1em;"><%= @articles.inspect %></section>
@@ -12,9 +12,9 @@
12
12
  <script type="text/javascript" src="//use.typekit.net/xgg5zca.js"></script>
13
13
  <script type="text/javascript">try{Typekit.load();}catch(e){}</script>
14
14
 
15
- <link href="<%= @theme_root %>/css/bootstrap.css" rel="stylesheet">
16
- <link href="<%= @theme_root %>/css/app.css" rel="stylesheet">
17
- <link href="<%= @theme_root %>/css/bootstrap-responsive.css" rel="stylesheet">
15
+ <link href="<%= @theme.root %>/css/bootstrap.css" rel="stylesheet">
16
+ <link href="<%= @theme.root %>/css/app.css" rel="stylesheet">
17
+ <link href="<%= @theme.root %>/css/bootstrap-responsive.css" rel="stylesheet">
18
18
 
19
19
  <!-- [if lt IE 9]><script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
20
20
 
@@ -0,0 +1,9 @@
1
+ ###
2
+ # Theme Config File
3
+ #
4
+
5
+ # parameter comments
6
+ masthead_url: 'http://www.my-corporation.com'
7
+ Company_Description: Insert content here
8
+
9
+ param_test: "FOOBAR"
@@ -0,0 +1,58 @@
1
+ body {font-family:"source-sans-pro", sans-serif; font-size:18px; line-height:1.6em; color: #444; border-top:3px solid #069;}
2
+ h1, h2, h3 {font-family:"museo-sans", sans-serif; padding-top:0; margin-top:0;}
3
+ h1 {font-size:2.6em; line-height:1.3em; color:#444; text-align:center; }
4
+ h2 {color: #444; font-size: 1.4em;}
5
+ h3 {text-transform: uppercase; font-size:0.9em;}
6
+ h4 {text-transform: uppercase; font-size:0.76em;}
7
+
8
+ .small {font-size:0.8em;}
9
+ .center {text-align: center;}
10
+
11
+
12
+ a:link, a:hover, a:visited, a:active {color:#069;}
13
+ a:link.subtle, a:hover.subtle, a:visited.subtle, a:active.subtle {color:#444;}
14
+
15
+ /* Site Layout Template */
16
+
17
+ a:hover.logo {border:20px solid #eee; border-top-style:none; border-bottom-style:none; padding:0 2em 0 2em; border-radius:1em;}
18
+
19
+ div.content-strip {max-width: 38em; margin: 0 auto;}
20
+
21
+ #header {padding-top:2em;}
22
+ #header-image {display:block; text-align:center;}
23
+ #blog-title {text-align:center; font-size:1.8em; line-height:1.8em; padding-top:1em;}
24
+ .blog-title {font-size:1.2em;}
25
+
26
+ #content {padding-top:2em; padding-bottom:5em;}
27
+
28
+ #navigation {padding-top:1em;}
29
+ #navigation a:link, #navigation a:hover, #navigation a:visited, #navigation a:active {color:#08c;}
30
+ .navigation-wrapper {background-color:#eee;}
31
+ #navigation ul {list-style-type:none; margin-left:0;}
32
+ #navigation li {padding-top:0.3em; padding-bottom: 0.3em;}
33
+
34
+
35
+ #footer {text-align:center; font-size:0.8em; line-height:0.8em; padding-top:1em; padding-bottom:1em;}
36
+ #footer p {margin:1em 0 1em 0}
37
+ .footer-wrapper {background-color:#eee;}
38
+
39
+ /* Index Template */
40
+
41
+ #articles {font-size: 1.3em;}
42
+ #articles ol {list-style-type:none; margin-left:0;}
43
+ #articles li {width:100%; line-height:1.3em; padding-top:0.5em; padding-bottom: 0.5em; border-bottom:solid 1px #cecece;}
44
+ #articles .article-title {float: left;}
45
+ #articles time {float:right; color:#999; text-transform:uppercase; font-size:0.8em; vertical-align:baseline;}
46
+ #articles span {color:#ccc; font-size:0.5em; text-transform:uppercase;}
47
+ /*#articles a {overflow:hidden; text-overflow:ellipsis; white-space:nowrap; width:22em;}*/
48
+
49
+ #pagination {padding-top:1em;}
50
+
51
+
52
+ /* Article Template */
53
+
54
+ .post-details {font-size:0.8em; color:#888; padding-top:0.7em; padding-bottom:1.3em; text-align:center;}
55
+
56
+ article li {line-height:1.3em; padding-top:0.3em; padding-bottom:0.3em;}
57
+ article p {padding:0.5em 0 0.5em 0;}
58
+ article table, article th, article td {border: 1px solid #444;}