octopress-ink 1.0.0.alpha.12
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 +7 -0
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +38 -0
- data/Rakefile +1 -0
- data/lib/octopress-ink.rb +37 -0
- data/lib/octopress-ink/assets.rb +10 -0
- data/lib/octopress-ink/assets/asset.rb +71 -0
- data/lib/octopress-ink/assets/javascript.rb +9 -0
- data/lib/octopress-ink/assets/layout.rb +25 -0
- data/lib/octopress-ink/assets/sass.rb +64 -0
- data/lib/octopress-ink/assets/static_file.rb +26 -0
- data/lib/octopress-ink/assets/static_file_content.rb +13 -0
- data/lib/octopress-ink/assets/stylesheet.rb +24 -0
- data/lib/octopress-ink/assets/template.rb +20 -0
- data/lib/octopress-ink/generators/plugin_assets.rb +9 -0
- data/lib/octopress-ink/helpers/content_for.rb +29 -0
- data/lib/octopress-ink/jekyll/hooks.rb +12 -0
- data/lib/octopress-ink/plugin.rb +142 -0
- data/lib/octopress-ink/plugins.rb +232 -0
- data/lib/octopress-ink/plugins/sass.rb +18 -0
- data/lib/octopress-ink/tags.rb +14 -0
- data/lib/octopress-ink/tags/content_for.rb +17 -0
- data/lib/octopress-ink/tags/embed.rb +28 -0
- data/lib/octopress-ink/tags/footer.rb +10 -0
- data/lib/octopress-ink/tags/head.rb +10 -0
- data/lib/octopress-ink/tags/javascript.rb +18 -0
- data/lib/octopress-ink/tags/scripts.rb +10 -0
- data/lib/octopress-ink/tags/stylesheet.rb +18 -0
- data/lib/octopress-ink/tags/wrap_yield.rb +25 -0
- data/lib/octopress-ink/tags/yield.rb +16 -0
- data/lib/octopress-ink/version.rb +5 -0
- data/octopress-ink.gemspec +27 -0
- data/test/.gitignore +1 -0
- data/test/Gemfile +8 -0
- data/test/_config.yml +14 -0
- data/test/_custom/theme/layouts/default.html +17 -0
- data/test/_custom/theme/stylesheets/_bazz.scss +1 -0
- data/test/_custom/theme/stylesheets/bar.scss +4 -0
- data/test/_custom/theme/stylesheets/site.css +1 -0
- data/test/_plugins/bundler.rb +23 -0
- data/test/_plugins/theme/embeds/foo.html +1 -0
- data/test/_plugins/theme/files/test.html +1 -0
- data/test/_plugins/theme/javascripts/bar.js +1 -0
- data/test/_plugins/theme/javascripts/foo.js +1 -0
- data/test/_plugins/theme/layouts/default.html +18 -0
- data/test/_plugins/theme/layouts/test.html +4 -0
- data/test/_plugins/theme/stylesheets/_baz.scss +1 -0
- data/test/_plugins/theme/stylesheets/bar.scss +4 -0
- data/test/_plugins/theme/stylesheets/foo.css +1 -0
- data/test/_plugins/theme/stylesheets/print.css +1 -0
- data/test/_plugins/theme/stylesheets/site.css +3 -0
- data/test/index.md +13 -0
- data/test/stylesheets/_foo.scss +1 -0
- data/test/stylesheets/site.sass +7 -0
- metadata +177 -0
@@ -0,0 +1,12 @@
|
|
1
|
+
|
2
|
+
module Jekyll
|
3
|
+
module Convertible
|
4
|
+
alias_method :do_layout_orig, :do_layout
|
5
|
+
|
6
|
+
def do_layout(payload, layouts)
|
7
|
+
# The contentblock tags needs access to the converter to process it while rendering.
|
8
|
+
payload['converter'] = self.converter
|
9
|
+
do_layout_orig(payload, layouts)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
module Octopress
|
2
|
+
class Plugin
|
3
|
+
attr_accessor :name, :type, :asset_override, :assets_path,
|
4
|
+
:layouts_dir, :stylesheets_dir, :javascripts_dir, :files_dir, :embeds_dir, :images_dir,
|
5
|
+
:layouts, :embeds, :stylesheets, :javascripts, :images, :sass, :fonts, :files
|
6
|
+
|
7
|
+
def initialize(name, type)
|
8
|
+
@layouts_dir = 'layouts'
|
9
|
+
@files_dir = 'files'
|
10
|
+
@fonts_dir = 'fonts'
|
11
|
+
@images_dir = 'images'
|
12
|
+
@embeds_dir = 'embeds'
|
13
|
+
@javascripts_dir = 'javascripts'
|
14
|
+
@stylesheets_dir = 'stylesheets'
|
15
|
+
@name = name
|
16
|
+
@type = type
|
17
|
+
@layouts = []
|
18
|
+
@embeds = []
|
19
|
+
@stylesheets = []
|
20
|
+
@javascripts = []
|
21
|
+
@images = []
|
22
|
+
@sass = []
|
23
|
+
@fonts = []
|
24
|
+
@files = []
|
25
|
+
add_assets
|
26
|
+
add_layouts
|
27
|
+
add_embeds
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_assets
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
def namespace
|
35
|
+
if @type == 'local_plugin'
|
36
|
+
''
|
37
|
+
else
|
38
|
+
@type == 'theme' ? @type : @name
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def add_stylesheet(file, media=nil)
|
43
|
+
@stylesheets << Assets::Stylesheet.new(self, @stylesheets_dir, file, media)
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_sass(file, media=nil)
|
47
|
+
begin
|
48
|
+
require 'sass'
|
49
|
+
rescue LoadError
|
50
|
+
raise IOError.new "The #{@name} #{@type} uses the Sass gem. You'll need to add it to your Gemfile or run `gem install sass`"
|
51
|
+
end
|
52
|
+
@sass << Assets::Sass.new(self, @stylesheets_dir, file, media)
|
53
|
+
end
|
54
|
+
|
55
|
+
def add_javascript(file)
|
56
|
+
@javascripts << Assets::Javascript.new(self, @javascripts_dir, file)
|
57
|
+
end
|
58
|
+
|
59
|
+
def add_layouts
|
60
|
+
if @assets_path
|
61
|
+
base = File.join(@assets_path, @layouts_dir)
|
62
|
+
entries = []
|
63
|
+
Dir.chdir(base) { entries = Dir['**/*.*'] }
|
64
|
+
entries.each do |file|
|
65
|
+
@layouts << Assets::Layout.new(self, @layouts_dir, file)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def add_embeds
|
71
|
+
@embeds = Assets::Template.new(self, @embeds_dir)
|
72
|
+
end
|
73
|
+
|
74
|
+
def add_image(file)
|
75
|
+
@images << Assets::Asset.new(self, @images_dir, file)
|
76
|
+
end
|
77
|
+
|
78
|
+
def add_font(file)
|
79
|
+
@fonts << Assets::Asset.new(self, @fonts_dir, file)
|
80
|
+
end
|
81
|
+
|
82
|
+
def add_file(file)
|
83
|
+
@files << Assets::Asset.new(self, @files_dir, file)
|
84
|
+
end
|
85
|
+
|
86
|
+
def add_stylesheets(files, media=nil)
|
87
|
+
files.each { |f| add_stylesheet(f, media) }
|
88
|
+
end
|
89
|
+
|
90
|
+
def add_sass_files(files, media=nil)
|
91
|
+
files.each { |f| add_sass(f, media) }
|
92
|
+
end
|
93
|
+
|
94
|
+
def add_javascripts(files)
|
95
|
+
files.each { |f| add_javascript(f) }
|
96
|
+
end
|
97
|
+
|
98
|
+
def add_images(files)
|
99
|
+
files.each { |f| add_image(f) }
|
100
|
+
end
|
101
|
+
|
102
|
+
def add_fonts(files)
|
103
|
+
files.each { |f| add_font(f) }
|
104
|
+
end
|
105
|
+
|
106
|
+
def add_files(files)
|
107
|
+
files.each { |f| add_file(f) }
|
108
|
+
end
|
109
|
+
|
110
|
+
def stylesheet_paths(site)
|
111
|
+
get_paths(@stylesheets, site)
|
112
|
+
end
|
113
|
+
|
114
|
+
def javascript_paths(site)
|
115
|
+
get_paths(@javascripts, site)
|
116
|
+
end
|
117
|
+
|
118
|
+
def stylesheet_tags
|
119
|
+
get_tags(@stylesheets)
|
120
|
+
end
|
121
|
+
|
122
|
+
def sass_tags
|
123
|
+
get_tags(@sass)
|
124
|
+
end
|
125
|
+
|
126
|
+
def javascript_tags
|
127
|
+
get_tags(@javascripts)
|
128
|
+
end
|
129
|
+
|
130
|
+
def get_paths(files, site)
|
131
|
+
files.dup.map { |f| f.path(site) }
|
132
|
+
end
|
133
|
+
|
134
|
+
def get_tags(files)
|
135
|
+
files.dup.map { |f| f.tag }
|
136
|
+
end
|
137
|
+
|
138
|
+
def embed(file, site)
|
139
|
+
@embeds.file(file, site)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,232 @@
|
|
1
|
+
module Octopress
|
2
|
+
module Plugins
|
3
|
+
@plugins = []
|
4
|
+
@local_plugins = []
|
5
|
+
|
6
|
+
def self.theme
|
7
|
+
@theme
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.plugin(name)
|
11
|
+
if name == 'theme'
|
12
|
+
@theme
|
13
|
+
else
|
14
|
+
@plugins.concat(@local_plugins).each do |p|
|
15
|
+
return p if p.name == name
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.plugins
|
21
|
+
[@theme].concat(@plugins).concat(@local_plugins).compact
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.embed(name, file, site)
|
25
|
+
plugin(name).embed(file, site)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.register_plugin(plugin, name, type='plugin')
|
29
|
+
new_plugin = plugin.new(name, type)
|
30
|
+
|
31
|
+
if type == 'theme'
|
32
|
+
@theme = new_plugin
|
33
|
+
elsif type == 'local_plugin'
|
34
|
+
@plugins << new_plugin
|
35
|
+
else
|
36
|
+
@local_plugins << new_plugin
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.register_layouts(site)
|
41
|
+
plugins.each do |p|
|
42
|
+
p.layouts.clone.each { |layout| layout.register(site) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.custom_dir(site)
|
47
|
+
site.config['custom'] || CUSTOM_DIR
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.fingerprint(paths)
|
51
|
+
paths = [paths] unless paths.is_a? Array
|
52
|
+
Digest::MD5.hexdigest(paths.clone.map! { |path| "#{File.mtime(path).to_i}" }.join)
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.combined_stylesheet_path(media)
|
56
|
+
File.join('stylesheets', "site-#{media}-#{@combined_stylesheets[media][:fingerprint]}.css")
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.combined_javascript_path
|
60
|
+
print = @javascript_fingerprint || ''
|
61
|
+
File.join('javascripts', "site-#{print}.js")
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.write_files(site, source, dest)
|
65
|
+
site.static_files << StaticFileContent.new(source, dest)
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.compile_sass_file(path, options)
|
69
|
+
::Sass.compile_file(path, options)
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.compile_sass(contents, options)
|
73
|
+
::Sass.compile(contents, options)
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.sass_config(site, item, default)
|
77
|
+
if site.config['sass'] && site.config['sass'][item]
|
78
|
+
site.config['sass'][item]
|
79
|
+
else
|
80
|
+
default
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.sass_options(site)
|
85
|
+
options = {
|
86
|
+
style: sass_config(site, 'output_style', 'compressed').to_sym,
|
87
|
+
trace: sass_config(site, 'trace', false),
|
88
|
+
line_numbers: sass_config(site, 'line_numbers', false)
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.write_combined_stylesheet(site)
|
93
|
+
css = combine_stylesheets(site)
|
94
|
+
css.keys.each do |media|
|
95
|
+
options = sass_options(site)
|
96
|
+
options[:line_numbers] = false
|
97
|
+
contents = compile_sass(css[media][:contents], options)
|
98
|
+
write_files(site, contents, combined_stylesheet_path(media))
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.write_combined_javascript(site)
|
103
|
+
write_files(site, combine_javascripts(site), combined_javascript_path)
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.combine_stylesheets(site)
|
107
|
+
unless @combined_stylesheets
|
108
|
+
css = {}
|
109
|
+
paths = {}
|
110
|
+
plugins.each do |plugin|
|
111
|
+
plugin_header = "/* #{name} #{plugin.type} */\n"
|
112
|
+
stylesheets = plugin.stylesheets.clone.concat plugin.sass
|
113
|
+
stylesheets.each do |file|
|
114
|
+
css[file.media] ||= {}
|
115
|
+
css[file.media][:contents] ||= ''
|
116
|
+
css[file.media][:contents] << plugin_header
|
117
|
+
css[file.media][:paths] ||= []
|
118
|
+
|
119
|
+
# Add Sass files
|
120
|
+
if file.respond_to? :compile
|
121
|
+
css[file.media][:contents].concat file.compile(site)
|
122
|
+
else
|
123
|
+
css[file.media][:contents].concat file.path(site).read.strip
|
124
|
+
end
|
125
|
+
css[file.media][:paths] << file.path(site)
|
126
|
+
plugin_header = ''
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
css.keys.each do |media|
|
131
|
+
css[media][:fingerprint] = fingerprint(css[media][:paths])
|
132
|
+
end
|
133
|
+
@combined_stylesheets = css
|
134
|
+
end
|
135
|
+
@combined_stylesheets
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.combine_javascripts(site)
|
139
|
+
js = ''
|
140
|
+
plugins.each do |plugin|
|
141
|
+
paths = plugin.javascript_paths(site)
|
142
|
+
@javascript_fingerprint = fingerprint(paths)
|
143
|
+
paths.each do |file|
|
144
|
+
js.concat Pathname.new(file).read
|
145
|
+
end
|
146
|
+
end
|
147
|
+
js
|
148
|
+
end
|
149
|
+
|
150
|
+
def self.combined_stylesheet_tag(site)
|
151
|
+
tags = ''
|
152
|
+
combine_stylesheets(site).keys.each do |media|
|
153
|
+
tags.concat "<link href='/#{combined_stylesheet_path(media)}' media='#{media}' rel='stylesheet' type='text/css'>"
|
154
|
+
end
|
155
|
+
tags
|
156
|
+
end
|
157
|
+
|
158
|
+
def self.combined_javascript_tag
|
159
|
+
"<script src='/#{combined_javascript_path}'></script>"
|
160
|
+
end
|
161
|
+
|
162
|
+
def self.stylesheet_tags
|
163
|
+
css = []
|
164
|
+
plugins.each do |plugin|
|
165
|
+
css.concat plugin.stylesheet_tags
|
166
|
+
css.concat plugin.sass_tags
|
167
|
+
end
|
168
|
+
css
|
169
|
+
end
|
170
|
+
|
171
|
+
def self.javascript_tags
|
172
|
+
js = []
|
173
|
+
plugins.each do |plugin|
|
174
|
+
js.concat plugin.javascript_tags
|
175
|
+
end
|
176
|
+
js
|
177
|
+
end
|
178
|
+
|
179
|
+
def self.copy_javascripts(site)
|
180
|
+
plugins.each do |plugin|
|
181
|
+
copy(plugin.javascripts, site)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def self.copy_stylesheets(site)
|
186
|
+
plugins.each do |plugin|
|
187
|
+
stylesheets = plugin.stylesheets.clone.concat plugin.sass
|
188
|
+
copy(stylesheets, site)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
def self.add_static_files(site)
|
193
|
+
|
194
|
+
if site.config['sass'] and site.config['sass']['files']
|
195
|
+
plugin('sass').add_files site.config['sass']['files']
|
196
|
+
end
|
197
|
+
|
198
|
+
# Copy/Generate Stylesheets
|
199
|
+
#
|
200
|
+
if site.config['octopress'] && site.config['octopress']['combine_stylesheets'] != false
|
201
|
+
copy_stylesheets(site)
|
202
|
+
else
|
203
|
+
write_combined_stylesheet(site)
|
204
|
+
end
|
205
|
+
|
206
|
+
# Copy/Generate Javascripts
|
207
|
+
#
|
208
|
+
if site.config['octopress'] && site.config['octopress']['combine_javascripts'] != false
|
209
|
+
copy_javascripts(site)
|
210
|
+
else
|
211
|
+
write_combined_javascript(site)
|
212
|
+
end
|
213
|
+
|
214
|
+
# Copy other assets
|
215
|
+
#
|
216
|
+
copy_static_files(site)
|
217
|
+
end
|
218
|
+
|
219
|
+
def self.copy_static_files(site)
|
220
|
+
plugins.each do |plugin|
|
221
|
+
copy(plugin.files, site)
|
222
|
+
copy(plugin.images, site)
|
223
|
+
copy(plugin.fonts, site)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def self.copy(files, site)
|
228
|
+
files.each { |f| f.copy(site) }
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# The sass assets for this plugin are populated at runtime by the add_static_files method of
|
2
|
+
# the Plugins module.
|
3
|
+
#
|
4
|
+
module Octopress
|
5
|
+
class SassPlugin < Octopress::Plugin
|
6
|
+
def add_files(files)
|
7
|
+
files = [files] unless files.is_a? Array
|
8
|
+
files.each do |file|
|
9
|
+
if file.is_a? Array
|
10
|
+
add_sass file.first, file.last
|
11
|
+
else
|
12
|
+
add_sass file
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Octopress
|
2
|
+
module Tags
|
3
|
+
autoload :EmbedTag, 'octopress-ink/tags/embed'
|
4
|
+
autoload :JavascriptTag, 'octopress-ink/tags/javascript'
|
5
|
+
autoload :StylesheetTag, 'octopress-ink/tags/stylesheet'
|
6
|
+
autoload :ContentForBlock, 'octopress-ink/tags/content_for'
|
7
|
+
autoload :HeadBlock, 'octopress-ink/tags/head'
|
8
|
+
autoload :FooterBlock, 'octopress-ink/tags/footer'
|
9
|
+
autoload :YieldTag, 'octopress-ink/tags/yield'
|
10
|
+
autoload :ScriptsBlock, 'octopress-ink/tags/scripts'
|
11
|
+
autoload :WrapYieldBlock, 'octopress-ink/tags/wrap_yield'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Inspired by jekyll-contentblocks https://github.com/rustygeldmacher/jekyll-contentblocks
|
2
|
+
module Octopress
|
3
|
+
module Tags
|
4
|
+
class ContentForBlock < Liquid::Block
|
5
|
+
|
6
|
+
def initialize(tag_name, markup, tokens)
|
7
|
+
super
|
8
|
+
@block_name ||= Helpers::ContentFor.get_block_name(tag_name, markup)
|
9
|
+
end
|
10
|
+
|
11
|
+
def render(context)
|
12
|
+
Helpers::ContentFor.append_to_block(context, @block_name, super.strip)
|
13
|
+
''
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Octopress
|
2
|
+
module Tags
|
3
|
+
class EmbedTag < Liquid::Tag
|
4
|
+
EMBED_SYNTAX = /(.+?)\/(\S+)/
|
5
|
+
|
6
|
+
def initialize(tag_name, markup, tokens)
|
7
|
+
super
|
8
|
+
@markup = markup
|
9
|
+
if @markup.strip =~ EMBED_SYNTAX
|
10
|
+
@plugin = $1
|
11
|
+
@path = $2
|
12
|
+
else
|
13
|
+
raise IOError.new "Invalid Syntax: for embed tag. {% embed #{@markup.strip} %} should be {% embed plugin/file %}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def render(context)
|
18
|
+
content = Plugins.embed(@plugin, @path, context.registers[:site]).read
|
19
|
+
partial = Liquid::Template.parse(content)
|
20
|
+
context.stack {
|
21
|
+
context['embed'] = Jekyll::Tags::IncludeTag.new('include', @markup, []).parse_params(context)
|
22
|
+
partial.render!(context)
|
23
|
+
}.strip
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|