octopress-filters 1.0.0 → 1.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d40675a0cd8630124d45612741f89126ae9a2cb0
4
- data.tar.gz: 05aad8da4369126ecc078e1528507efc132a2392
3
+ metadata.gz: 01bc72327b02e3212f41ef3a045e85cc6c57311c
4
+ data.tar.gz: 7aea28624451226fab505cb081908e682aff8e9f
5
5
  SHA512:
6
- metadata.gz: 09c6d4be84f20a2de65dff01847873fcf9d221aff3a89f58f46e27041d38fb21d7b3ac9ed751afc50b9552674fc22f68e5ad90ac8ea6fa799659dd9e1a4747f1
7
- data.tar.gz: 0e736abdddd45f4f7292a634ab47dc87906f9368b531204390088f4a3436d487809708428e40b092fee90d21ccc0cb52325b1f8c7fad965297668ec7f1c02b85
6
+ metadata.gz: bbf8bd4f1fab1c633fbe03742b3f9a682e49eb42913b7a71f246d6aefb984aa3d365a3e85d1fa5301ab38d2d45338e3ca572492a72dd33c140b875396edc62df
7
+ data.tar.gz: a29c5f96babd2df342ca6f54a766d415c0985a64349c6db0f0baf10c47806d9e0a8f5b5e15d619fbd0e9659fed835e420e68379300e0bbf60f11673f287e4546
data/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # Changelog
2
+
3
+ ### 1.1.0 2014-07-21
4
+
5
+ - Added smart quotes filter.
6
+ - Added canonical_url filter.
7
+ - Now relying on gem for titlecase and smartypants.
8
+
9
+ ### 1.0.0 - 2014-07-20
10
+
11
+ - Initial release.
data/README.md CHANGED
@@ -2,8 +2,11 @@
2
2
 
3
3
  A set of handy liquid filters used by Octopress.
4
4
 
5
- - full_urls - Replace relative urls with absolute urls.
6
- - titlecase - Properly capitalize titles based on John Gruber's [Title Case](http://daringfireball.net/2008/05/title_case).
5
+ - full_urls - Replace relative urls with absolute urls (searches for `href` and `src` properties).
6
+ - full_url - Replace a relative url with an absolute url.
7
+ - canonical_url - Convert a url to the proper canonical version.
8
+ - titlecase - Properly capitalize titles with John Gruber’s [Title Case](http://daringfireball.net/2008/05/title_case).
9
+ - smartquotes - Smartly curl your quotation marks with John Gruber’s [Smarty Pants](http://daringfireball.net/projects/smartypants/).
7
10
  - unorphan - Insert a non-breaking space between the last two words in a title.
8
11
  - sluggify - Replaces all non-word characters in a string with dashes.
9
12
  - classify - An alias for sluggify (seems appropriate when working with CSS class names).
@@ -37,17 +40,35 @@ Next add it to your gems list in Jekyll's `_config.yml`
37
40
 
38
41
  ### Full urls
39
42
 
40
- If you're working on an RSS feed, you'll need to be sure all of your relative urls are converted to full urls. In that case, when
41
- rendering the content of a page, just do this:
43
+ Any relative links in your site will be expanded with the `url` configuration in Jekyll's `_config.yml`. This filter only affects urls
44
+ beginning with `/` inside of `href` or `src` attributes.
42
45
 
43
46
  {{ post.content | full_urls }}
44
47
 
45
- Now any relative links in your site will be expanded with the `url` configuration in Jekyll's `_config.yml`.
48
+ You might use this if you're working on an RSS feed, you'll need to be sure all relative urls in your content are expanded to full urls.
49
+
50
+ ### Full url
51
+
52
+ This filter prepends input with the `url` configuration in Jekyll's `_config.yml`.
53
+
54
+ {{ post.url | full_url }}
55
+
56
+ ### Canonical url
57
+
58
+ This filter expands the url to be a full url, then removes "index.html" if it is present. Here are some examples.
59
+
60
+ {{ "about/index.html" | canonical_url }} //=> http://example.com/about/
61
+ {{ "about.html" | canonical_url }} //=> http://example.com/about.html
62
+ {{ "/" | canonical_url }} //=> http://example.com/
46
63
 
47
64
  ### Titlecase
48
65
 
49
66
  {{ post.title | titlecase }} //=> This Is a Properly Capitalized Title
50
67
 
68
+ ### Smartquote
69
+
70
+ {{ post.content | smartquotes }}
71
+
51
72
  ### Unorphan
52
73
 
53
74
  {{ post.title | unorphan }} //=> This Is a Properly Capitalized Title
@@ -1,7 +1,7 @@
1
1
  module Octopress
2
2
  module Tags
3
3
  module Filters
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.0"
5
5
  end
6
6
  end
7
7
  end
@@ -1,15 +1,23 @@
1
1
  require "octopress-filters/version"
2
- require "octopress-filters/utils"
3
2
 
4
3
  unless defined? Octopress::Ink
5
4
  require "octopress-filters/generator"
6
5
  end
7
6
 
8
7
  require "jekyll"
8
+ require "rubypants-unicode"
9
+ require "titlecase"
9
10
 
10
11
  module Octopress
11
12
  module Filters
12
13
 
14
+ # Returns the site's config root or '/' if the config isn't set
15
+ #
16
+ def root
17
+ root_url = Ink.site.config['root']
18
+ root_url.nil? ? '/' : File.join('/', root_url)
19
+ end
20
+
13
21
  # Escapes HTML content for XML
14
22
  def cdata_escape(input)
15
23
  input.gsub(/<!\[CDATA\[/, '&lt;![CDATA[').gsub(/\]\]>/, ']]&gt;')
@@ -18,7 +26,11 @@ module Octopress
18
26
  # Returns a title cased string based on John Gruber's title case
19
27
  # Info: http://daringfireball.net/2008/08/title_case_update
20
28
  def titlecase(input)
21
- Octopress::Utils.titlecase!(input)
29
+ input.titlecase
30
+ end
31
+
32
+ def smartquotes(input)
33
+ RubyPants.new(input).to_html
22
34
  end
23
35
 
24
36
  # Formats a string for use as a css classname, removing illegal characters
@@ -43,34 +55,10 @@ module Octopress
43
55
  input.sub(/\s+(\S+)\s*$/, '&nbsp;\1')
44
56
  end
45
57
 
46
- # Prepends input with a url fragment
58
+ # Convert url input into a standard canonical url
47
59
  #
48
- # input - An absolute url, e.g. /images/awesome.gif
49
- # url - The fragment to prepend the input, e.g. /blog
50
- #
51
- # Returns the modified url, e.g /blog
52
- #
53
- def expand_url(input, url=nil)
54
- url ||= root
55
- if input =~ /^#{url}/
56
- input
57
- else
58
- File.join(url, input)
59
- end
60
- end
61
-
62
- # Prepend all absolute urls with a url fragment
63
- #
64
- # input - The content of a page or post
65
- # url - The fragment to prepend absolute urls
66
- #
67
- # Returns input with modified urls
68
- #
69
- def expand_urls(input, url=nil)
70
- url ||= root
71
- input.gsub /(\s+(href|src|rel)\s*=\s*["|']{1})(\/[^\/>]{1}[^\"'>]*)/ do
72
- $1 + expand_url($3, url)
73
- end
60
+ def canonical_url(input)
61
+ full_url(input).downcase.sub(/index\.html/, '')
74
62
  end
75
63
 
76
64
  # Prepend all urls with the full site url
@@ -105,17 +93,39 @@ module Octopress
105
93
  end
106
94
  end
107
95
 
108
- module_function *instance_methods
109
- public *private_instance_methods
110
-
111
- private
96
+ # Prepends input with a url fragment
97
+ #
98
+ # input - An absolute url, e.g. /images/awesome.gif
99
+ # url - The fragment to prepend the input, e.g. /blog
100
+ #
101
+ # Returns the modified url, e.g /blog
102
+ #
103
+ def expand_url(input, url=nil)
104
+ url ||= root
105
+ if input =~ /^#{url}/
106
+ input
107
+ else
108
+ File.join(url, input)
109
+ end
110
+ end
112
111
 
113
- # Returns the site's config root or '/' if the config isn't set
112
+ # Prepend all absolute urls with a url fragment
114
113
  #
115
- def root
116
- root_url = Ink.site.config['root']
117
- root_url.nil? ? '/' : File.join('/', root_url)
114
+ # input - The content of a page or post
115
+ # url - The fragment to prepend absolute urls
116
+ #
117
+ # Returns input with modified urls
118
+ #
119
+ def expand_urls(input, url=nil)
120
+ url ||= root
121
+ input.gsub /(\s+(href|src)\s*=\s*["|']{1})(\/[^\/>]{1}[^\"'>]*)/ do
122
+ $1 + expand_url($3, url)
123
+ end
118
124
  end
125
+
126
+ module_function *instance_methods
127
+ public *private_instance_methods.reject!{ |m| [:root].include?(m) }
128
+
119
129
  end
120
130
  end
121
131
 
@@ -19,6 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_runtime_dependency "jekyll"
22
+ spec.add_runtime_dependency "rubypants-unicode"
23
+ spec.add_runtime_dependency "titlecase"
22
24
 
23
25
  spec.add_development_dependency "bundler", "~> 1.6"
24
26
  spec.add_development_dependency "rake"
data/test/Gemfile CHANGED
@@ -3,4 +3,5 @@ source 'https://rubygems.org'
3
3
  gem 'octopress-filters', path: '../'
4
4
  gem 'pry-debugger'
5
5
  gem 'octopress-filter-tag'
6
+ gem 'rubypants'
6
7
  gem 'clash'
@@ -0,0 +1,4 @@
1
+ http://yourdomain.com/canonical.html
2
+ http://yourdomain.com/
3
+ http://yourdomain.com/foo/
4
+ http://yourdomain.com/foo/
@@ -0,0 +1,27 @@
1
+ “A first example”
2
+ “A first “nested” example”
3
+ ”.
4
+ “a
5
+ ’.
6
+ ‘a
7
+ <p>He said, “‘Quoted’ words in a larger quote.”</p>
8
+ “I like the 70’s”
9
+ “I like the ’70s”
10
+ “I like the ‘70!”
11
+
12
+ pre”post
13
+ pre “post
14
+ pre&nbsp;“post
15
+ pre–“post
16
+ pre–”!
17
+
18
+ pre’post
19
+ pre ‘post
20
+ pre&nbsp;‘post
21
+ pre–‘post
22
+ pre–’!
23
+ <b>‘</b>
24
+ foo<b>’</b>
25
+
26
+ <pre>"this shouldn't be curled"</pre>
27
+ <code>"this shouldn't be curled"</code>
@@ -0,0 +1,6 @@
1
+ ---
2
+ ---
3
+ {{ page.url | canonical_url }}
4
+ {{ "/index.html" | canonical_url }}
5
+ {{ "foo/index.html" | canonical_url }}
6
+ {{ "/foo/index.html" | canonical_url }}
@@ -0,0 +1,31 @@
1
+ ---
2
+ ---
3
+ {% filter smartquotes %}
4
+ "A first example"
5
+ "A first "nested" example"
6
+ ".
7
+ "a
8
+ '.
9
+ 'a
10
+ <p>He said, "'Quoted' words in a larger quote."</p>
11
+ "I like the 70's"
12
+ "I like the '70s"
13
+ "I like the '70!"
14
+
15
+ pre"post
16
+ pre "post
17
+ pre&nbsp;"post
18
+ pre--"post
19
+ pre--"!
20
+
21
+ pre'post
22
+ pre 'post
23
+ pre&nbsp;'post
24
+ pre--'post
25
+ pre--'!
26
+ <b>'</b>
27
+ foo<b>'</b>
28
+
29
+ <pre>"this shouldn't be curled"</pre>
30
+ <code>"this shouldn't be curled"</code>
31
+ {% endfilter %}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octopress-filters
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Mathis
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubypants-unicode
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: titlecase
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: bundler
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -89,28 +117,32 @@ extra_rdoc_files: []
89
117
  files:
90
118
  - ".gitignore"
91
119
  - ".travis.yml"
120
+ - CHANGELOG.md
92
121
  - Gemfile
93
122
  - LICENSE.txt
94
123
  - README.md
95
124
  - Rakefile
96
125
  - lib/octopress-filters.rb
97
126
  - lib/octopress-filters/generator.rb
98
- - lib/octopress-filters/utils.rb
99
127
  - lib/octopress-filters/version.rb
100
128
  - octopress-filters.gemspec
101
129
  - test/.clash.yml
102
130
  - test/Gemfile
103
131
  - test/_config.yml
132
+ - test/_expected/canonical.html
104
133
  - test/_expected/classify.html
105
134
  - test/_expected/compact_newlines.html
106
135
  - test/_expected/full_urls.html
107
136
  - test/_expected/join_lines.html
137
+ - test/_expected/smartquotes.html
108
138
  - test/_expected/titlecase.html
109
139
  - test/_expected/unorphan.html
140
+ - test/canonical.html
110
141
  - test/classify.html
111
142
  - test/compact_newlines.html
112
143
  - test/full_urls.html
113
144
  - test/join_lines.html
145
+ - test/smartquotes.html
114
146
  - test/titlecase.html
115
147
  - test/unorphan.html
116
148
  homepage: https://github.com/octopress/filters
@@ -141,15 +173,19 @@ test_files:
141
173
  - test/.clash.yml
142
174
  - test/Gemfile
143
175
  - test/_config.yml
176
+ - test/_expected/canonical.html
144
177
  - test/_expected/classify.html
145
178
  - test/_expected/compact_newlines.html
146
179
  - test/_expected/full_urls.html
147
180
  - test/_expected/join_lines.html
181
+ - test/_expected/smartquotes.html
148
182
  - test/_expected/titlecase.html
149
183
  - test/_expected/unorphan.html
184
+ - test/canonical.html
150
185
  - test/classify.html
151
186
  - test/compact_newlines.html
152
187
  - test/full_urls.html
153
188
  - test/join_lines.html
189
+ - test/smartquotes.html
154
190
  - test/titlecase.html
155
191
  - test/unorphan.html
@@ -1,42 +0,0 @@
1
- module Octopress
2
- module Utils
3
- # Smart capitalization for titles
4
- #
5
- def self.titlecase(input)
6
- small_words = %w(a an and as at but by en for if in of on or the to v v. via vs vs.)
7
-
8
- x = input.split(" ").map do |word|
9
- # note: word could contain non-word characters!
10
- # downcase all small_words, capitalize the rest
11
- small_words.include?(word.gsub(/\W/, "").downcase) ? word.downcase! : smart_capitalize!(word)
12
- word
13
- end
14
- # capitalize first and last words
15
- smart_capitalize!(x.first)
16
- smart_capitalize!(x.last)
17
- # small words are capitalized after colon, period, exclamation mark, question mark
18
- x.join(" ").gsub(/(:|\.|!|\?)\s?(\W*#{small_words.join("|")}\W*)\s/) { "#{$1} #{smart_capitalize($2)} " }
19
- end
20
-
21
- def self.titlecase!(input)
22
- input.replace(titlecase(input))
23
- end
24
-
25
- def self.smart_capitalize(input)
26
- target = input.dup
27
- # ignore any leading crazy characters and capitalize the first real character
28
- if target =~ /^['"\(\[']*([a-z])/
29
- i = input.index($1)
30
- x = target[i,target.length]
31
- # word with capitals and periods mid-word are left alone
32
- target[i,1] = target[i,1].upcase unless x =~ /[A-Z]/ or x =~ /\.\w+/
33
- end
34
- target
35
- end
36
-
37
- def self.smart_capitalize!(input)
38
- input.replace(smart_capitalize(input))
39
- end
40
- end
41
- end
42
-