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

Sign up to get free protection for your applications and to get access to all the features.
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
+