octopress 3.0.0.rc.23 → 3.0.0.rc.24

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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/assets/docs/docs.md +28 -0
  4. data/lib/octopress.rb +2 -1
  5. data/lib/octopress/commands/docs.rb +41 -0
  6. data/lib/octopress/docs.rb +256 -0
  7. data/lib/octopress/docs/doc.rb +91 -0
  8. data/lib/octopress/docs/hooks.rb +19 -0
  9. data/lib/octopress/docs/jekyll/convertible.rb +32 -0
  10. data/lib/octopress/docs/jekyll/page.rb +52 -0
  11. data/lib/octopress/docs/liquid_filters.rb +14 -0
  12. data/lib/octopress/version.rb +1 -1
  13. data/local/Gemfile +11 -0
  14. data/local/_config.yml +5 -0
  15. data/local/_includes/nav.html +7 -0
  16. data/local/_layouts/default.html +12 -0
  17. data/local/_layouts/docs.html +15 -0
  18. data/local/_layouts/docs_index.html +7 -0
  19. data/local/_plugins/docs.rb +5 -0
  20. data/local/_sass/_solarized.scss +1 -0
  21. data/local/index.html +13 -0
  22. data/local/stylesheets/site.scss +3 -0
  23. data/site/Gemfile +12 -0
  24. data/site/_config.yml +7 -0
  25. data/site/_includes/nav.html +7 -0
  26. data/site/_layouts/default.html +14 -0
  27. data/site/_layouts/docs.html +15 -0
  28. data/site/_layouts/docs_index.html +7 -0
  29. data/site/_plugins/docs.rb +2 -0
  30. data/site/index.html +13 -0
  31. data/site/stylesheets/site.scss +2 -0
  32. metadata +50 -82
  33. data/.clash.yml +0 -164
  34. data/.gitignore +0 -21
  35. data/.travis.yml +0 -8
  36. data/Gemfile +0 -4
  37. data/Rakefile +0 -1
  38. data/octopress.gemspec +0 -35
  39. data/scaffold/_templates/draft +0 -4
  40. data/scaffold/_templates/page +0 -4
  41. data/scaffold/_templates/post +0 -5
  42. data/test/Gemfile +0 -3
  43. data/test/_config.yml +0 -3
  44. data/test/_expected/blank/_config.yml +0 -1
  45. data/test/_expected/blank/_templates/draft +0 -4
  46. data/test/_expected/blank/_templates/page +0 -4
  47. data/test/_expected/blank/_templates/post +0 -5
  48. data/test/_expected/blank/index.html +0 -0
  49. data/test/_expected/integrate/_posts/2011-11-11-a-random-post.markdown +0 -6
  50. data/test/_expected/integrate/_posts/2012-11-11-another-random-post.markdown +0 -6
  51. data/test/_expected/integrate/_posts/2013-11-11-this-post-is-happy.markdown +0 -6
  52. data/test/_expected/isolate-path/_posts/2011-11-11-a-random-post.markdown +0 -6
  53. data/test/_expected/isolate-path/_posts/_exile/2012-11-11-another-random-post.markdown +0 -6
  54. data/test/_expected/isolate-path/_posts/_exile/2013-11-11-this-post-is-happy.markdown +0 -6
  55. data/test/_expected/isolate-search/_posts/2011-11-11-a-random-post.markdown +0 -6
  56. data/test/_expected/isolate-search/_posts/2012-11-11-another-random-post.markdown +0 -6
  57. data/test/_expected/isolate-search/_posts/_exile/2013-11-11-this-post-is-happy.markdown +0 -6
  58. data/test/_expected/isolate/_posts/2013-11-11-this-post-is-happy.markdown +0 -6
  59. data/test/_expected/isolate/_posts/_exile/2011-11-11-a-random-post.markdown +0 -6
  60. data/test/_expected/isolate/_posts/_exile/2012-11-11-another-random-post.markdown +0 -6
  61. data/test/_expected/new-draft-slug/_drafts/idea.markdown +0 -5
  62. data/test/_expected/new-draft/_drafts/some-cool-idea.markdown +0 -6
  63. data/test/_expected/new-page-date/pages/awesome-page.html +0 -6
  64. data/test/_expected/new-page-extension/pages/awesome-page.md +0 -5
  65. data/test/_expected/new-page-index/pages/index.html +0 -5
  66. data/test/_expected/new-page-template/pages/awesome-page.html +0 -6
  67. data/test/_expected/new-page/pages/awesome-page.html +0 -5
  68. data/test/_expected/new-post-dir/_posts/stuff/2014-02-11-some-stuff.markdown +0 -6
  69. data/test/_expected/new-post-slug/_posts/2014-03-13-awesome.markdown +0 -6
  70. data/test/_expected/new-post/_posts/2014-03-12-awesome-stuff.markdown +0 -6
  71. data/test/_expected/publish-draft-date/_posts/2014-03-11-some-cool-idea.markdown +0 -6
  72. data/test/_expected/publish-draft-dir/_posts/ideas/2014-03-10-some-cool-idea.markdown +0 -6
  73. data/test/_expected/publish-draft/_posts/2014-03-10-some-cool-idea.markdown +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6e523447917ea22e1ab48694250218ccd5f33a4a
4
- data.tar.gz: 8e6e25505a1162bed932bc5b27fb37d9bd81600d
3
+ metadata.gz: 80b8a068d4811564da346c04165ff5958a72545b
4
+ data.tar.gz: 38db301d32c4ab9eebcfc5a4ad9ea9df4e5bb08a
5
5
  SHA512:
6
- metadata.gz: 01a45cfc7ee54255478289f8e21a29bf888d8a59aa9f7df25fb2d5a937c7998cb7fa2b466c57826b4e75ac62d10dc2a96023d052f7e5434f616b8ec6f2713518
7
- data.tar.gz: f97fb94fc513b972c6ee6c170dcdcb659c123c6b75b9474c20075e6f3f3c2364e8d19dd51ef0dd8616903760691622a2aa69eef4508925f5f88e74a8fd2094b7
6
+ metadata.gz: bc120b3c743aa1d11bc6ab6f553f6a4c08f7b295a983560c609439119d162a9f86f45a4c9981d5608da0dc76f536b4cbebfb1732950dae9fa93444f521e10c1e
7
+ data.tar.gz: 060dfc709a8f52b7fb910d3a3ff194490b64bd67a16820432fc43f2b99ebd421c820a5b61a0f28799c560b864bb2390388badd171de94fbeed37fd116cdcf53f
@@ -1,5 +1,9 @@
1
1
  # Octopress Changelog
2
2
 
3
+ ### 3.0.0 RC24 - 2015-01-02
4
+
5
+ - Absorbed Octopress Docs features
6
+
3
7
  ### 3.0.0 RC23 - 2014-12-19
4
8
 
5
9
  - Fixed issue with site configuration caching
@@ -0,0 +1,28 @@
1
+ ---
2
+ title: Documentation Plugins
3
+ permalink: /docs/
4
+ ---
5
+
6
+ # Octopress Docs
7
+
8
+ If you have the Octopress gem installed, run `$ octopress docs` from the root of your Jekyll site, and a website will mount at `http://localhost:4444` with documentation for Octopress and any plugins which support this feature.
9
+
10
+ ## Adding docs to your plugin
11
+
12
+ If your plugin is built on Octopress Ink, these documentation pages are added automatically. If not, use
13
+ the code below to automatically add your plugin's Readme, Changelog and any pages in your gem path under `assets/docs`.
14
+
15
+ ```ruby
16
+ if defined? Octopress::Docs
17
+ Octopress::Docs.add({
18
+ name: "Your Plugin",
19
+ description: "This plugin causes awesomeness",
20
+ path: File.expand_path(File.join(File.dirname(__FILE__), "../")), # gem root
21
+ slug: "your-plugin", # optional
22
+ source_url: "https://github.com/some/project", # optional
23
+ website: "http://example.com", # optional
24
+ })
25
+ end
26
+ ```
27
+
28
+ It's a bit odd, but the `if defined? Octopress::Docs` allows you to register doc pages if possible, without having to add the octopress gem as a dependency.
@@ -5,11 +5,12 @@ module Octopress
5
5
  require 'octopress/command'
6
6
  require 'octopress/version'
7
7
  require 'octopress/commands/new'
8
+ require 'octopress/commands/docs'
8
9
  require 'octopress/commands/init'
9
10
  require 'octopress/commands/publish'
10
11
  require 'octopress/commands/isolate'
11
12
  require 'octopress/isolate'
12
- require 'octopress-docs'
13
+ require 'octopress/docs'
13
14
 
14
15
  autoload :Page, 'octopress/page'
15
16
  autoload :Post, 'octopress/post'
@@ -0,0 +1,41 @@
1
+ module Octopress
2
+ module Docs
3
+ class Commands < Octopress::Command
4
+ def self.init_with_program(p)
5
+ p.command(:docs) do |c|
6
+ c.syntax 'octopress docs'
7
+ c.description "Launch local server with docs for Octopress v#{Octopress::VERSION} and Octopress plugins."
8
+
9
+ c.option 'port', '-P', '--port [PORT]', 'Port to listen on'
10
+ c.option 'host', '-H', '--host [HOST]', 'Host to bind to'
11
+ if ENV['OCTODEV']
12
+ c.option 'watch', '--watch', 'Watch docs site for changes and rebuild. (For docs development)'
13
+ end
14
+
15
+ c.action do |args, options|
16
+ serve_docs(options)
17
+ end
18
+ end
19
+ end
20
+
21
+ def self.serve_docs(options)
22
+
23
+ # Activate dependencies for serving docs.
24
+ #
25
+ options = Docs.load_docs(options)
26
+ Octopress::Ink.load_plugin_assets = false
27
+
28
+
29
+ Jekyll.logger.log_level = :error
30
+ Jekyll::Commands::Build.process(options)
31
+ url = "http://#{options['host']}:#{options['port']}"
32
+ puts "Serving Docs site: #{url}"
33
+ puts " press ctrl-c to stop."
34
+ Jekyll::Commands::Serve.process(options)
35
+ Jekyll.logger.log_level = :info
36
+ end
37
+
38
+ end
39
+ end
40
+ end
41
+
@@ -0,0 +1,256 @@
1
+ require "find"
2
+ require "octopress/docs/doc"
3
+
4
+ module Octopress
5
+ module Docs
6
+ attr_reader :docs
7
+ @docs = {}
8
+ @enabled = false
9
+
10
+ autoload :Doc, 'octopress/docs/doc'
11
+
12
+ def self.pages
13
+ doc_pages.values.flatten
14
+ end
15
+
16
+ def self.enabled?
17
+ @enabled
18
+ end
19
+
20
+ def self.doc_pages
21
+ if !@pages
22
+ @pages = @docs.dup
23
+
24
+ @pages.each do |slug, docs|
25
+
26
+ # Convert docs to pages
27
+ #
28
+ docs.map! { |doc| doc.page }
29
+
30
+ # Inject docs links from other docs pages
31
+ #
32
+ docs.map! do |doc|
33
+ doc.data = doc.data.merge({
34
+ 'docs' => plugin_page_links(@pages[slug])
35
+ })
36
+ doc
37
+ end
38
+ end
39
+ end
40
+ @pages
41
+ end
42
+
43
+ def self.plugin_page_links(pages)
44
+ pages.clone.map { |page|
45
+ data = page.data
46
+ title = data['link_title'] || data['title'] || page.basename
47
+ url = File.join('/', data['plugin']['url'], page.url.sub('index.html', ''))
48
+
49
+ {
50
+ 'title' => title,
51
+ 'url' => url
52
+ }
53
+ }.sort_by { |i|
54
+ # Sort by depth of url
55
+ i['url'].split('/').size
56
+ }
57
+ end
58
+
59
+
60
+ # Return a hash of plugin docs information
61
+ # for Jekyll site payload
62
+ #
63
+ def self.pages_info
64
+ docs = {}
65
+
66
+ # Retrieve plugin info from docs
67
+ #
68
+ doc_pages.each do |slug, pages|
69
+ data = pages.first.data
70
+ docs[slug] = data['plugin'].merge({
71
+ 'pages' => data['docs']
72
+ })
73
+ end
74
+
75
+ # Sort docs alphabetically by name
76
+ #
77
+ docs = Hash[docs.sort_by { |k,v| v['name'] }]
78
+
79
+ @pages_info = { 'plugin_docs' => docs }
80
+ end
81
+
82
+ def self.add_plugin_docs(plugin)
83
+ options = plugin_options(plugin)
84
+ options[:docs] ||= %w{readme docs}
85
+
86
+ plugin_doc_pages = add_asset_docs(options)
87
+ plugin_doc_pages.concat add_root_docs(options, plugin_doc_pages)
88
+ plugin_doc_pages
89
+ end
90
+
91
+ def self.plugin_options(plugin)
92
+ options = {
93
+ name: plugin.name,
94
+ slug: plugin.slug,
95
+ type: plugin.type,
96
+ path: plugin.path,
97
+ source_url: plugin.source_url,
98
+ website: plugin.website,
99
+ docs_path: File.join(plugin.assets_path, 'docs'),
100
+ docs: %w{readme changelog}
101
+ }
102
+
103
+ options[:base_url] = base_url(options)
104
+ options
105
+ end
106
+
107
+ def self.default_options(options)
108
+ options[:docs] ||= %w{readme changelog}
109
+ options[:type] ||= 'plugin'
110
+ options[:slug] = slug(options)
111
+ options[:base_url] = base_url(options)
112
+ options[:path] ||= '.'
113
+ options[:docs_path] ||= File.join(options[:path], 'assets', 'docs')
114
+ options
115
+ end
116
+
117
+ def self.slug(options)
118
+ slug = options[:slug] || options[:name]
119
+ options[:type] == 'theme' ? 'theme' : Jekyll::Utils.slugify(slug)
120
+ end
121
+
122
+ def self.base_url(options)
123
+ options[:base_url] || if options[:type] == 'theme'
124
+ 'theme'
125
+ else
126
+ if options[:source_url] =~ /github\.com\/(octopress|imathis)/
127
+ File.join('octopress', options[:slug].sub(/octopress-/,''))
128
+ else
129
+ File.join('plugins', options[:slug])
130
+ end
131
+ end
132
+ end
133
+
134
+ # Add doc pages for a plugin
135
+ #
136
+ # Input: options describing a plugin
137
+ #
138
+ # Output: array of docs
139
+ #
140
+ def self.add(options)
141
+ options = default_options(options)
142
+ docs = []
143
+ docs.concat add_asset_docs(options)
144
+ docs.concat add_root_docs(options, docs)
145
+ docs.compact!
146
+ end
147
+
148
+ # Add pages from the root of a gem (README, CHANGELOG, etc)
149
+ #
150
+ def self.add_root_docs(options, asset_docs=[])
151
+ root_docs = []
152
+ options[:docs].each do |doc|
153
+ doc_data = {
154
+ 'title' => doc.capitalize
155
+ }
156
+
157
+ if doc =~ /readme/ && asset_docs.select {|d| d.file =~ /^index/ }.empty?
158
+ doc_data['permalink'] = '/'
159
+ end
160
+
161
+ root_docs << add_root_doc(doc, options.merge(data: doc_data))
162
+ end
163
+ root_docs
164
+ end
165
+
166
+ # Add a single root doc
167
+ #
168
+ def self.add_root_doc(filename, options)
169
+ if file = select_first(options[:path], filename)
170
+ add_doc_page(options.merge({file: file}))
171
+ end
172
+ end
173
+
174
+ # Register a new doc page for a plugin
175
+ #
176
+ def self.add_doc_page(options)
177
+ page = Docs::Doc.new(options)
178
+ @docs[options[:slug]] ||= []
179
+ @docs[options[:slug]] << page
180
+ page
181
+ end
182
+
183
+ private
184
+
185
+ # Add doc pages from /asset/docs
186
+ #
187
+ def self.add_asset_docs(options)
188
+ docs = []
189
+ find_doc_pages(options[:docs_path]).each do |doc|
190
+ unless doc =~ /^_/
191
+ opts = options.merge({file: doc, path: options[:docs_path]})
192
+ docs << add_doc_page(opts)
193
+ end
194
+ end
195
+ docs
196
+ end
197
+
198
+ # Find all files in a directory recursively
199
+ #
200
+ def self.find_doc_pages(dir)
201
+
202
+ return [] unless Dir.exist? dir
203
+
204
+ Find.find(dir).to_a.reject do |f|
205
+ File.directory? f
206
+ end.map do |f|
207
+ # truncate file to relative path
208
+ f.sub(dir+'/', '')
209
+ end
210
+ end
211
+
212
+ def self.select_first(dir, match)
213
+ Dir.new(dir).select { |f| f =~/#{match}/i}.first
214
+ end
215
+
216
+ def self.load_docs(options=nil)
217
+ @enabled = true
218
+
219
+ require "octopress-hooks"
220
+ require "octopress/docs/hooks"
221
+ require "octopress/docs/liquid_filters"
222
+ require "octopress/docs/jekyll/convertible"
223
+ require "octopress/docs/jekyll/page"
224
+
225
+ if !options.nil?
226
+ # Look at the local site and require all of its plugins
227
+ # Ensuring their documentation is loaded into the docs site
228
+ #
229
+ site = Octopress.read_site({'config'=>options['config']})
230
+ site.plugin_manager.conscientious_require
231
+
232
+ # Require escape code last to set Octopress hook priority.
233
+ #
234
+ options = Docs.site.config.merge(options)
235
+ end
236
+
237
+ require "octopress-escape-code"
238
+ options
239
+ end
240
+
241
+ def self.site(options={})
242
+ @site ||= Octopress.site(site_options.merge(options))
243
+ end
244
+
245
+ def self.site_options
246
+ source = Octopress.gem_dir('local')
247
+ {
248
+ 'source' => source,
249
+ 'destination' => File.join(source, '/_site'),
250
+ 'layouts' => File.join(source, '/_layouts'),
251
+ 'port' => '4444',
252
+ 'serving' => true,
253
+ }
254
+ end
255
+ end
256
+ end
@@ -0,0 +1,91 @@
1
+ module Octopress
2
+ module Docs
3
+ class Doc
4
+ attr_reader :filename, :plugin_name, :plugin_slug, :base_url, :plugin_type, :description, :source_url
5
+
6
+ def initialize(options={})
7
+ @file = options[:file]
8
+ @path = options[:path] ||= '.'
9
+ @file_dir = File.dirname(@file)
10
+ @plugin_name = options[:name]
11
+ @plugin_slug = options[:slug]
12
+ @plugin_type = options[:type]
13
+ @base_url = options[:base_url]
14
+ @source_url = options[:source_url]
15
+ @description = options[:description]
16
+ @data = options[:data] || {}
17
+ end
18
+
19
+ # Add doc page to Jekyll pages
20
+ #
21
+ def add
22
+ Octopress.site.pages << page
23
+ end
24
+
25
+ def disabled?
26
+ false
27
+ end
28
+
29
+ def file
30
+ File.basename(@file)
31
+ end
32
+
33
+ def info
34
+ " - #{permalink.ljust(35)}"
35
+ end
36
+
37
+ def page
38
+ @page ||= begin
39
+ p = Octopress::Docs::Page.new(Octopress.site, @path, page_dir, file, {'path'=>@base_url})
40
+ p.data['layout'] = 'docs'
41
+ p.data['escape_code'] = true
42
+
43
+ p.data['plugin'] = {
44
+ 'name' => @plugin_name,
45
+ 'slug' => @plugin_slug,
46
+ 'type' => @plugin_type,
47
+ 'source_url' => @source_url,
48
+ 'description' => @description,
49
+ 'url' => @base_url
50
+ }
51
+
52
+ p.data['dir'] = doc_dir
53
+ p.data = @data.merge(p.data)
54
+ p.data.merge!(comment_yaml(p.content))
55
+ p
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def permalink
62
+ File.basename(file, ".*")
63
+ end
64
+
65
+ def read
66
+ File.open(File.join(@path, @file)).read
67
+ end
68
+
69
+ def plugin_slug
70
+ Jekyll::Utils.slugify(@plugin_type == 'theme' ? 'theme' : @plugin_slug)
71
+ end
72
+
73
+ def page_dir
74
+ @file_dir == '.' ? '' : @file_dir
75
+ end
76
+
77
+ def doc_dir
78
+ File.join(@path, page_dir, File.dirname(@file))
79
+ end
80
+
81
+ def comment_yaml(content)
82
+ if content =~ /<!-{3}\s+(.+)?-{3}>/m
83
+ SafeYAML.load($1)
84
+ else
85
+ {}
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+