| ... | ... |
@@ -18,12 +18,12 @@ GEM |
| 18 | 18 |
directory_watcher (>= 1.1.1) |
| 19 | 19 |
liquid (>= 1.9.0) |
| 20 | 20 |
maruku (>= 0.5.9) |
| 21 |
- kramdown (0.13.3) |
|
| 22 | 21 |
liquid (2.2.2) |
| 23 | 22 |
maruku (0.6.0) |
| 24 | 23 |
syntax (>= 1.0.0) |
| 25 | 24 |
rake (0.9.0) |
| 26 | 25 |
rb-fsevent (0.4.0) |
| 26 |
+ rdiscount (1.6.8) |
|
| 27 | 27 |
rubypants (0.2.0) |
| 28 | 28 |
sass (3.1.2) |
| 29 | 29 |
syntax (1.0.0) |
| ... | ... |
@@ -36,7 +36,7 @@ DEPENDENCIES |
| 36 | 36 |
compass (>= 0.11) |
| 37 | 37 |
haml (>= 3.1) |
| 38 | 38 |
jekyll |
| 39 |
- kramdown |
|
| 40 | 39 |
rake |
| 41 | 40 |
rb-fsevent |
| 41 |
+ rdiscount |
|
| 42 | 42 |
rubypants |
| ... | ... |
@@ -11,9 +11,10 @@ author: Your Name |
| 11 | 11 |
subscribe_rss: /atom.xml |
| 12 | 12 |
subscribe_email: |
| 13 | 13 |
|
| 14 |
-markdown: kramdown |
|
| 14 |
+markdown: rdiscount |
|
| 15 | 15 |
pygments: true |
| 16 |
-recent_posts: 1 |
|
| 16 |
+posts_per_page: 10 |
|
| 17 |
+recent_posts: 5 |
|
| 17 | 18 |
simple_search: http://google.com/search |
| 18 | 19 |
|
| 19 | 20 |
# Optional configurations |
| ... | ... |
@@ -2,21 +2,21 @@ |
| 2 | 2 |
# Author: Brandon Mathis |
| 3 | 3 |
# Based on the work of: Josediaz Gonzalez - https://github.com/josegonzalez/josediazgonzalez.com/blob/master/_plugins/blockquote.rb |
| 4 | 4 |
# |
| 5 |
+# Outputs a string with a given attribution as a quote |
|
| 6 |
+# |
|
| 7 |
+# {% blockquote Bobby Willis http://google.com/blah the search for bobby's mom %}
|
|
| 8 |
+# Wheeee! |
|
| 9 |
+# {% endblockquote %}
|
|
| 10 |
+# ... |
|
| 11 |
+# <blockquote> |
|
| 12 |
+# <p>Wheeee!</p> |
|
| 13 |
+# <footer> |
|
| 14 |
+# <strong>John Paul Jones</strong><cite><a href="http://google.com/blah">The Search For Bobby's Mom</a> |
|
| 15 |
+# </blockquote> |
|
| 16 |
+# |
|
| 5 | 17 |
require './_plugins/titlecase.rb' |
| 6 | 18 |
module Jekyll |
| 7 | 19 |
|
| 8 |
- # Outputs a string with a given attribution as a quote |
|
| 9 |
- # |
|
| 10 |
- # {% blockquote Bobby Willis http://google.com/blah the search for bobby's mom %}
|
|
| 11 |
- # Wheeee! |
|
| 12 |
- # {% endblockquote %}
|
|
| 13 |
- # ... |
|
| 14 |
- # <blockquote> |
|
| 15 |
- # <p>Wheeee!</p> |
|
| 16 |
- # <footer> |
|
| 17 |
- # <strong>John Paul Jones</strong><cite><a href="http://google.com/blah">The Search For Bobby's Mom</a> |
|
| 18 |
- # </blockquote> |
|
| 19 |
- # |
|
| 20 | 20 |
class Blockquote < Liquid::Block |
| 21 | 21 |
FullCiteWithTitle = /([\w\s]+)(https?:\/\/)(\S+\s)([\w\s]+)/i |
| 22 | 22 |
FullCite = /([\w\s]+)(https?:\/\/)(\S+)/i |
| ... | ... |
@@ -1,11 +1,16 @@ |
| 1 | 1 |
#custom filters for Octopress |
| 2 | 2 |
|
| 3 | 3 |
module OctopressFilters |
| 4 |
- def exerpt(input, url, url_text="Reade more…", permalink_text=false) |
|
| 4 |
+ def auto_exerpt(input, url, url_text="Read more …") |
|
| 5 | 5 |
if input.index(/<!--\s?more\s?-->/i) |
| 6 |
- input.split(/<!--\s?more\s?-->/i)[0] + "<p><a href='#{url}'>#{url_text}</a></p>"
|
|
| 7 |
- elsif permalink_text |
|
| 8 |
- input + "<p><a href='#{url}'>#{permalink_text}</a></p>"
|
|
| 6 |
+ input.split(/<!--\s?more\s?-->/i)[0] + "<p><a rel='full-article' href='#{url}'>#{url_text}</a></p>"
|
|
| 7 |
+ else |
|
| 8 |
+ input |
|
| 9 |
+ end |
|
| 10 |
+ end |
|
| 11 |
+ def exerpt(input) |
|
| 12 |
+ if input.index(/<!--\s*more\s*-->/i) |
|
| 13 |
+ input.split(/<!--\s*more\s*-->/i)[0] |
|
| 9 | 14 |
else |
| 10 | 15 |
input |
| 11 | 16 |
end |
| ... | ... |
@@ -35,7 +40,7 @@ module OctopressFilters |
| 35 | 35 |
end |
| 36 | 36 |
def ordinalize(date) |
| 37 | 37 |
date = datetime(date) |
| 38 |
- "#{date.strftime('%B')} #{ordinal(date.strftime('%e').to_i)}, #{date.strftime('%Y')}"
|
|
| 38 |
+ "#{date.strftime('%b')} #{ordinal(date.strftime('%e').to_i)}, #{date.strftime('%Y')}"
|
|
| 39 | 39 |
end |
| 40 | 40 |
def ordinal(number) |
| 41 | 41 |
if (11..13).include?(number.to_i % 100) |
| ... | ... |
@@ -56,4 +61,3 @@ module OctopressFilters |
| 56 | 56 |
end |
| 57 | 57 |
end |
| 58 | 58 |
Liquid::Template.register_filter OctopressFilters |
| 59 |
- |
| 60 | 59 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,31 @@ |
| 0 |
+require 'pathname' |
|
| 1 |
+ |
|
| 2 |
+module Jekyll |
|
| 3 |
+ |
|
| 4 |
+ class IncludePartialTag < Liquid::Tag |
|
| 5 |
+ def initialize(tag_name, file, tokens) |
|
| 6 |
+ super |
|
| 7 |
+ @file = file.strip |
|
| 8 |
+ end |
|
| 9 |
+ |
|
| 10 |
+ def render(context) |
|
| 11 |
+ file_dir = (context.registers[:site].source || 'source') |
|
| 12 |
+ file_path = Pathname.new(file_dir).expand_path |
|
| 13 |
+ file = file_path + @file |
|
| 14 |
+ |
|
| 15 |
+ unless file.file? |
|
| 16 |
+ return "File #{file} could not be found"
|
|
| 17 |
+ end |
|
| 18 |
+ |
|
| 19 |
+ Dir.chdir(file_path) do |
|
| 20 |
+ partial = Liquid::Template.parse(file.read) |
|
| 21 |
+ context.stack do |
|
| 22 |
+ partial.render(context) |
|
| 23 |
+ end |
|
| 24 |
+ end |
|
| 25 |
+ end |
|
| 26 |
+ end |
|
| 27 |
+end |
|
| 28 |
+ |
|
| 29 |
+Liquid::Template.register_tag('include_partial', Jekyll::IncludePartialTag)
|
|
| 30 |
+ |
| 0 | 31 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,42 @@ |
| 0 |
+# |
|
| 1 |
+# Author: Brandon Mathis |
|
| 2 |
+# Based on the sematic pullquote technique by Maykel Loomans at http://miekd.com/articles/pull-quotes-with-html5-and-css/ |
|
| 3 |
+# |
|
| 4 |
+# Outputs a span with a data-pullquote attribute set from the marked pullquote. Example: |
|
| 5 |
+# |
|
| 6 |
+# {% pullquote %}
|
|
| 7 |
+# 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. |
|
| 8 |
+# 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
|
|
| 9 |
+# to use a CSS only technique for styling pullquotes. |
|
| 10 |
+# {% endpullquote %}
|
|
| 11 |
+# ...will output... |
|
| 12 |
+# <p> |
|
| 13 |
+# <span data-pullquote="pullquotes are merely visual in presentation and should not appear twice in the text."> |
|
| 14 |
+# 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. |
|
| 15 |
+# 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. |
|
| 16 |
+# </span> |
|
| 17 |
+# </p> |
|
| 18 |
+# |
|
| 19 |
+ |
|
| 20 |
+module Jekyll |
|
| 21 |
+ |
|
| 22 |
+ class PullquoteTag < Liquid::Block |
|
| 23 |
+ PullQuoteMarkup = /\{(.+)\}/i
|
|
| 24 |
+ |
|
| 25 |
+ def initialize(tag_name, markup, tokens) |
|
| 26 |
+ super |
|
| 27 |
+ end |
|
| 28 |
+ |
|
| 29 |
+ def render(context) |
|
| 30 |
+ output = super |
|
| 31 |
+ if output.join =~ /\{"\s*(.+)\s*"\}/
|
|
| 32 |
+ @quote = $1 |
|
| 33 |
+ "<span class='has-pullquote' data-pullquote='#{@quote}'>#{output.join.gsub(/\{"\s*|\s*"\}/, '')}</span>"
|
|
| 34 |
+ else |
|
| 35 |
+ return "Surround your pullquote like this {! text to be quoted !}"
|
|
| 36 |
+ end |
|
| 37 |
+ end |
|
| 38 |
+ end |
|
| 39 |
+end |
|
| 40 |
+ |
|
| 41 |
+Liquid::Template.register_tag('pullquote', Jekyll::PullquoteTag)
|
| ... | ... |
@@ -31,8 +31,11 @@ body {
|
| 31 | 31 |
} |
| 32 | 32 |
h1 {
|
| 33 | 33 |
font-size: 3.2em; |
| 34 |
- line-height: 1.2em |
|
| 34 |
+ line-height: 1.2em; |
|
| 35 |
+ @media only screen and (max-width: 768px) { font-size: 2.2em; }
|
|
| 35 | 36 |
} |
| 37 |
+ |
|
| 38 |
+ |
|
| 36 | 39 |
h2, section h1 {
|
| 37 | 40 |
font-size: 1.5em; |
| 38 | 41 |
} |
| ... | ... |
@@ -116,3 +119,24 @@ blockquote {
|
| 116 | 116 |
a { font-style: italic; }
|
| 117 | 117 |
} |
| 118 | 118 |
} |
| 119 |
+ |
|
| 120 |
+.has-pullquote:before {
|
|
| 121 |
+ /* Reset metrics. */ |
|
| 122 |
+ padding: 0; |
|
| 123 |
+ border: none; |
|
| 124 |
+ |
|
| 125 |
+ /* Content */ |
|
| 126 |
+ content: attr(data-pullquote); |
|
| 127 |
+ |
|
| 128 |
+ /* Pull out to the right, modular scale based margins. */ |
|
| 129 |
+ float: right; |
|
| 130 |
+ width: 45%; |
|
| 131 |
+ margin: 1em 0 1em 1.5em; |
|
| 132 |
+ |
|
| 133 |
+ /* Baseline correction */ |
|
| 134 |
+ position: relative; |
|
| 135 |
+ top: 6px; |
|
| 136 |
+ font-size: 1.4em; |
|
| 137 |
+ line-height: 1.45em; |
|
| 138 |
+} |
|
| 139 |
+ |
| ... | ... |
@@ -14,16 +14,17 @@ $border: inline-image('dotted-border.png');
|
| 14 | 14 |
padding-top: 0; |
| 15 | 15 |
} |
| 16 | 16 |
} |
| 17 |
- .byline + time:before, .byline + time +time:before {
|
|
| 17 |
+ time + .byline:before, .byline + time +time:before {
|
|
| 18 | 18 |
content: "\2022 "; |
| 19 | 19 |
padding: 0 .3em 0 .2em; |
| 20 | 20 |
display: inline-block; |
| 21 | 21 |
@include opacity(.5); |
| 22 | 22 |
} |
| 23 | 23 |
header {
|
| 24 |
+ position: relative; |
|
| 24 | 25 |
padding-top: 2em; |
| 25 | 26 |
margin-bottom: 1.5em; |
| 26 |
- padding-bottom: 1.5em; |
|
| 27 |
+ padding-bottom: 1em; |
|
| 27 | 28 |
background: $border bottom left repeat-x; |
| 28 | 29 |
h1 {
|
| 29 | 30 |
margin: 0; |
| ... | ... |
@@ -33,11 +34,24 @@ $border: inline-image('dotted-border.png');
|
| 33 | 33 |
p {
|
| 34 | 34 |
font-size: .9em; |
| 35 | 35 |
color: $type-color-light; |
| 36 |
- border: none; |
|
| 37 |
- padding-top: 0; |
|
| 38 | 36 |
margin: 0; |
| 39 |
- font-style: italic; |
|
| 40 | 37 |
@extend .sans; |
| 38 |
+ &.meta {
|
|
| 39 |
+ text-transform: uppercase; |
|
| 40 |
+ position: absolute; |
|
| 41 |
+ top: 0; |
|
| 42 |
+ } |
|
| 43 |
+ } |
|
| 44 |
+ @media only screen and (max-width: 768px) {
|
|
| 45 |
+ padding-bottom: 1em; |
|
| 46 |
+ margin-bottom: 1em; |
|
| 47 |
+ background: $border bottom left repeat-x; |
|
| 48 |
+ p.meta { position: static; }
|
|
| 49 |
+ } |
|
| 50 |
+ |
|
| 51 |
+ &.feature h1 {
|
|
| 52 |
+ font-size: 2.0em; font-style: italic; |
|
| 53 |
+ line-height: 1.3em; |
|
| 41 | 54 |
} |
| 42 | 55 |
} |
| 43 | 56 |
.entry-content {
|
| ... | ... |
@@ -66,23 +80,33 @@ $border: inline-image('dotted-border.png');
|
| 66 | 66 |
} |
| 67 | 67 |
} |
| 68 | 68 |
} |
| 69 |
- header.feature h1 {
|
|
| 70 |
- font-size: 2.0em; font-style: italic; |
|
| 71 |
- line-height: 1.3em; |
|
| 72 |
- } |
|
| 73 | 69 |
#disqus_thread { }
|
| 74 |
- .meta {
|
|
| 75 |
- border-bottom: 1px dashed #dddddd; |
|
| 76 |
- text-transform: uppercase; |
|
| 77 |
- color: #777777; |
|
| 78 |
- padding: 8px 0 5px; |
|
| 79 |
- margin-bottom: 1.5em; |
|
| 80 |
- font-size: 75%; |
|
| 81 |
- letter-spacing: 1px; |
|
| 82 |
- } |
|
| 83 | 70 |
|
| 84 |
- .footer {
|
|
| 71 |
+ footer {
|
|
| 85 | 72 |
padding-top: 15px; |
| 73 |
+ time, .author { color: $light-text; }
|
|
| 74 |
+ } |
|
| 75 |
+ } |
|
| 76 |
+} |
|
| 77 |
+article + article {
|
|
| 78 |
+ background: $border top left repeat-x; |
|
| 79 |
+} |
|
| 80 |
+#articles.blog-index {
|
|
| 81 |
+ article header { background: none; padding-bottom: 0; }
|
|
| 82 |
+ article h1 {
|
|
| 83 |
+ font-size: 2.2em; |
|
| 84 |
+ a { color: inherit; &:hover{ color: $link-color-hover; } }
|
|
| 85 |
+ } |
|
| 86 |
+ a[rel=full-article] {
|
|
| 87 |
+ background: darken($main-bg, 5); |
|
| 88 |
+ display: inline-block; |
|
| 89 |
+ padding: .4em .8em; |
|
| 90 |
+ margin-right: .5em; |
|
| 91 |
+ text-decoration: none; |
|
| 92 |
+ @include transition(background-color, .5s); |
|
| 93 |
+ &:hover {
|
|
| 94 |
+ background: $link-color-hover; |
|
| 95 |
+ color: $main-bg; |
|
| 86 | 96 |
} |
| 87 | 97 |
} |
| 88 | 98 |
} |
| ... | ... |
@@ -10,22 +10,19 @@ |
| 10 | 10 |
{% else %}
|
| 11 | 11 |
<h1 class="entry-title">{{ page.title | titlecase }}</h1>
|
| 12 | 12 |
{% endif %}
|
| 13 |
- {% unless page.no_meta %}
|
|
| 14 |
- <p> |
|
| 15 |
- {% if page.date %}
|
|
| 16 |
- <time datetime="{{ page.date | datetime }}" pubdate {% if page.updated %} updated {% endif %}>{{ page.date | ordinalize }}</time>
|
|
| 17 |
- {% endif %}
|
|
| 18 |
- {% if page.updated %}
|
|
| 19 |
- <time class="updated" datetime="{{ page.updated | datetime }}"></time>
|
|
| 20 |
- {% endif %}
|
|
| 21 |
- {% if author %}<span class="byline author vcard">By <span class="fn">{{ author }}</span></span>{% endif %}
|
|
| 22 |
- </p> |
|
| 23 |
- {% endunless %}
|
|
| 13 |
+ {% unless page.no_meta or !index %}<p class="meta">{% include post_meta.html %}</p>{% endunless %}
|
|
| 24 | 14 |
</header> |
| 25 | 15 |
{% endunless %}
|
| 26 | 16 |
{% if index %}
|
| 27 |
-<div class="entry-content">{{ content | exerpt(content, page.url, 'Continue reading »') | smart_quotes }}</div>
|
|
| 17 |
+<div class="entry-content">{{ content | exerpt | smart_quotes }}</div>
|
|
| 18 |
+<footer> |
|
| 19 |
+ <p> |
|
| 20 |
+ {% if content contains "<!-- more -->" or content contains "<!--more-->" %}
|
|
| 21 |
+ <a rel="full-article" href="{{ page.url }}">Read more …</a>
|
|
| 22 |
+ {% endif %}
|
|
| 23 |
+ {% include post_meta.html %}
|
|
| 24 |
+ </p> |
|
| 25 |
+</footer> |
|
| 28 | 26 |
{% else %}
|
| 29 | 27 |
<div class="entry-content">{{ content | smart_quotes }}</div>
|
| 30 | 28 |
{% endif %}
|
| 31 |
- |
| 32 | 29 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,7 @@ |
| 0 |
+{% if page.date %}
|
|
| 1 |
+<time datetime="{{ page.date | datetime }}" pubdate {% if page.updated %} updated {% endif %}>{{ page.date | ordinalize }}</time>
|
|
| 2 |
+{% endif %}
|
|
| 3 |
+{% if page.updated %}
|
|
| 4 |
+<time class="updated" datetime="{{ page.updated | datetime }}"></time>
|
|
| 5 |
+{% endif %}
|
|
| 6 |
+{% if author %}<span class="byline author vcard"><span class="fn">{{ author }}</span></span>{% endif %}
|
| ... | ... |
@@ -4,7 +4,7 @@ |
| 4 | 4 |
<nav>{% include navigation.html %}</nav>
|
| 5 | 5 |
<div> |
| 6 | 6 |
<div> |
| 7 |
- <div id="articles">{{ content }}</div>
|
|
| 7 |
+ <div id="articles" {% if page.blog_index %} class="blog-index" {% endif %}>{{ content }}</div>
|
|
| 8 | 8 |
{% unless page.sidebar == 'none' %}
|
| 9 | 9 |
<aside>{% include sidebar.html %}</aside>
|
| 10 | 10 |
{% endunless %}
|
| ... | ... |
@@ -1,9 +1,10 @@ |
| 1 | 1 |
--- |
| 2 | 2 |
layout: default |
| 3 |
+blog_index: true |
|
| 3 | 4 |
--- |
| 4 |
-{% for page in site.posts limit:3 %}
|
|
| 5 |
-{% assign content = page.content %}
|
|
| 6 | 5 |
{% assign index = true %}
|
| 6 |
+{% for page in site.posts limit:site.posts_per_page %}
|
|
| 7 |
+{% assign content = page.content %}
|
|
| 7 | 8 |
<article> |
| 8 | 9 |
{% include article.html %}
|
| 9 | 10 |
</article> |