octopress 3.0.0.rc.25 → 3.0.0.rc.26
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 +4 -4
- data/CHANGELOG.md +5 -1
- data/README.md +2 -1
- data/assets/docs/index.md +42 -25
- data/lib/octopress.rb +2 -0
- data/lib/octopress/commands/helpers.rb +80 -3
- data/lib/octopress/commands/isolate.rb +18 -8
- data/lib/octopress/commands/publish.rb +17 -3
- data/lib/octopress/commands/unpublish.rb +31 -0
- data/lib/octopress/draft.rb +10 -55
- data/lib/octopress/isolate.rb +19 -72
- data/lib/octopress/post.rb +63 -0
- data/lib/octopress/version.rb +1 -1
- data/site/Gemfile +4 -0
- data/site/_data/_plugins.yml +5 -3
- data/site/_templates/draft +4 -0
- data/site/_templates/page +4 -0
- data/site/_templates/post +5 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 727ee7d51be4119ea57bded0308bd58cb049f6d3
|
4
|
+
data.tar.gz: 07414b0416d58b6cbcc92d2672433e6b45bb7379
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 637af731d6d9020efc0564eea32ea76f7b77c4f20b3652c611bf63d09442cdc297d61a03f92b1a9ba2c9e127a5e1894e85f895b5f8f878a0d1223a19ba5c0438
|
7
|
+
data.tar.gz: d6ebdda6680265da6d21133aa732bc400c5478c8ab56b18e0cff2d1614a2fcdb122818336f1d7b2e4666b69fc8e1fb7c5e574c47bf0f5a4883a5c518f5e15a91
|
data/CHANGELOG.md
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
# Octopress Changelog
|
2
2
|
|
3
|
+
### 3.0.0 RC26 - 2015-01-02
|
4
|
+
|
5
|
+
- Added `unpublish` command for converting posts into drafts
|
6
|
+
|
3
7
|
### 3.0.0 RC25 - 2015-01-02
|
4
8
|
|
5
9
|
- Fixed missing scaffolding.
|
6
10
|
|
7
11
|
### 3.0.0 RC24 - 2015-01-02
|
8
12
|
|
9
|
-
- Absorbed Octopress Docs features
|
13
|
+
- Absorbed Octopress Docs features.
|
10
14
|
|
11
15
|
### 3.0.0 RC23 - 2014-12-19
|
12
16
|
|
data/README.md
CHANGED
@@ -31,7 +31,8 @@ Here are the commands for Octopress.
|
|
31
31
|
| `octopress new page <PATH>` | Add a new page to your site |
|
32
32
|
| `octopress new draft <TITLE>` | Add a new draft post to your site |
|
33
33
|
| `octopress publish <PATH>` | Publish a draft from _drafts to _posts |
|
34
|
-
| `octopress
|
34
|
+
| `octopress unpublish <POST>` | Convert a post into a draft |
|
35
|
+
| `octopress isolate <POST>` | Isolate one or more posts for a faster build |
|
35
36
|
| `octopress integrate` | Restores all posts, reverting isolation. |
|
36
37
|
|
37
38
|
Run `octopress [command] --help` to learn more about any command and see its options.
|
data/assets/docs/index.md
CHANGED
@@ -8,14 +8,17 @@ title: Using Octopress
|
|
8
8
|
|
9
9
|
Here are the subcommands for Octopress.
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
11
|
+
```
|
12
|
+
init <PATH> # Adds Octopress scaffolding to your site
|
13
|
+
new <PATH> # Like `jekyll new` + `octopress init`
|
14
|
+
new post <TITLE> # Add a new post to your site
|
15
|
+
new page <PATH> # Add a new page to your site
|
16
|
+
new draft <TITLE> # Add a new draft post to your site
|
17
|
+
publish <POST> # Publish a draft from _drafts to _posts
|
18
|
+
unpublish <POST> # Search for a post and convert it into a draft
|
19
|
+
isolate [POST] # Stash all posts but the one you're workign on for a faster build
|
20
|
+
integrate # Restores all posts, doing the opposite of the isolate command
|
21
|
+
```
|
19
22
|
|
20
23
|
Run `octopress --help` to list sub commands and `octopress <subcommand> --help` to learn more about any subcommand and see its options.
|
21
24
|
|
@@ -96,12 +99,12 @@ you will have the `--date` option to add a date to a page.
|
|
96
99
|
|
97
100
|
### New Draft
|
98
101
|
|
102
|
+
This will create a new post in your `_drafts` directory.
|
103
|
+
|
99
104
|
```sh
|
100
105
|
$ octopress new draft "My Title"
|
101
106
|
```
|
102
107
|
|
103
|
-
This will create a new post in your `_drafts` directory.
|
104
|
-
|
105
108
|
| Option | Description |
|
106
109
|
|:-------------------|:------------------------------------------|
|
107
110
|
| `--template PATH` | Use a template from <path> |
|
@@ -109,13 +112,17 @@ This will create a new post in your `_drafts` directory.
|
|
109
112
|
| `--slug SLUG` | The slug for the new post. |
|
110
113
|
| `--force` | Overwrite exsiting file. |
|
111
114
|
|
112
|
-
### Publish draft
|
115
|
+
### Publish a draft
|
116
|
+
|
117
|
+
Use the `publish` command to publish a draft to the `_posts` folder. This will also rename the file with the proper date format.
|
113
118
|
|
114
119
|
```sh
|
115
|
-
$ octopress publish _drafts/some-post.md
|
120
|
+
$ octopress publish _drafts/some-cool-post.md
|
121
|
+
$ octopress publish cool
|
116
122
|
```
|
117
|
-
|
118
|
-
|
123
|
+
In the first example, a draft is published using the path. The publish command can also search for a post by filename. The second command
|
124
|
+
would work the same as the first. If other drafts match your search, you will be prompted to select them from a menu. This is often much
|
125
|
+
faster than typing out the full path.
|
119
126
|
|
120
127
|
| Option | Description |
|
121
128
|
|:-------------------|:------------------------------------------|
|
@@ -126,6 +133,18 @@ This will move your draft to the `_posts` directory and rename the file with the
|
|
126
133
|
|
127
134
|
When publishing a draft, the new post will use the draft's date. Pass the option `--date now` to the publish command to set the new post date from your system clock. As usual, you can pass any compatible date string as well.
|
128
135
|
|
136
|
+
### Unpublish a post
|
137
|
+
|
138
|
+
Use the `unpublish` command to move a post to the `_drafts` directory, renaming the file according to the drafts convention.
|
139
|
+
|
140
|
+
```sh
|
141
|
+
$ octopress unpublish _posts/2015-01-10-some-post.md
|
142
|
+
$ octopress unpublish some post
|
143
|
+
```
|
144
|
+
|
145
|
+
Just like the publish command, you can either pass a path or a search string to match the file name. If more than one match is found, you
|
146
|
+
will be prompted to select from a menu of posts.
|
147
|
+
|
129
148
|
### Templates for Posts and pages
|
130
149
|
|
131
150
|
Octopress post and page templates look like this.
|
@@ -163,19 +182,17 @@ File name extensions are unnecessary since they're just plain text anyway.
|
|
163
182
|
|
164
183
|
## Isolate
|
165
184
|
|
166
|
-
|
185
|
+
The `isolate` command will allow you to stash posts in `_posts/_exile` where they will be ignored by Jekyll during the build process.
|
186
|
+
Run `octopress integrate` to restore all exiled posts. This can be helpful if you have a very large site and you want to quickly preview a build
|
187
|
+
for a single post or page.
|
167
188
|
|
189
|
+
```sh
|
190
|
+
$ octopress isolate # Move all posts
|
191
|
+
$ octopress isolate _posts/2014-10-11-kittens.md # Move post at path
|
192
|
+
$ octopress isolate kittens # Move post matching search
|
168
193
|
```
|
169
|
-
octopress isolate [SEARCH] [options]
|
170
|
-
```
|
171
|
-
|
172
|
-
This will copy all other posts into `_posts/_exile` where they will be ignored by Jekyll during the build process. Here are some examples:
|
173
|
-
|
174
|
-
- `octopress isolate` isolates the most recently dated post.
|
175
|
-
- `octopress isolate cats` isolates all posts with the word 'cats' in the filename.
|
176
|
-
- `octopress isolate --path _posts/2014-10-11-kittens.md` isolates the post at the given path.
|
177
194
|
|
178
|
-
|
195
|
+
In the third example, if multiple posts match the search a prompt will ask you to select a post from a menu.
|
179
196
|
|
180
197
|
## Configuration
|
181
198
|
|
@@ -197,7 +214,7 @@ titlecase: true
|
|
197
214
|
|
198
215
|
## Contributing
|
199
216
|
|
200
|
-
1. Fork it
|
217
|
+
1. Fork it ( https://github.com/octopress/octopress/fork )
|
201
218
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
202
219
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
203
220
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/lib/octopress.rb
CHANGED
@@ -4,10 +4,12 @@ require 'titlecase'
|
|
4
4
|
module Octopress
|
5
5
|
require 'octopress/command'
|
6
6
|
require 'octopress/version'
|
7
|
+
require 'octopress/utils'
|
7
8
|
require 'octopress/commands/new'
|
8
9
|
require 'octopress/commands/docs'
|
9
10
|
require 'octopress/commands/init'
|
10
11
|
require 'octopress/commands/publish'
|
12
|
+
require 'octopress/commands/unpublish'
|
11
13
|
require 'octopress/commands/isolate'
|
12
14
|
require 'octopress/isolate'
|
13
15
|
require 'octopress/docs'
|
@@ -1,13 +1,90 @@
|
|
1
1
|
module Octopress
|
2
2
|
module CommandHelpers
|
3
|
-
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def add_page_options(c)
|
4
6
|
c.option 'template', '--template PATH', "New #{c.name.to_s} from a template."
|
5
7
|
c.option 'date', '--date DATE', "Use 'now' or a String that is parseable by Time#parse."
|
6
8
|
c.option 'force', '--force', 'Overwrite file if it already exists'
|
7
9
|
end
|
8
10
|
|
9
|
-
def
|
10
|
-
c.option 'config',
|
11
|
+
def add_common_options(c)
|
12
|
+
c.option 'config', '--config <CONFIG_FILE>[,CONFIG_FILE2,...]', Array, 'Custom Jekyll configuration file'
|
13
|
+
end
|
14
|
+
|
15
|
+
def select_posts(search, action)
|
16
|
+
posts = (action == 'publish' ? find_drafts : find_posts)
|
17
|
+
posts = search_posts(search, posts)
|
18
|
+
|
19
|
+
if posts.size > 1
|
20
|
+
post = prompt_for_selection(posts, search, action)
|
21
|
+
|
22
|
+
if post.is_a? Integer
|
23
|
+
posts[post - 1]
|
24
|
+
else
|
25
|
+
abort "#{action.capitalize} canceled: You didn't enter number."
|
26
|
+
end
|
27
|
+
else
|
28
|
+
posts.first
|
29
|
+
end
|
11
30
|
end
|
31
|
+
|
32
|
+
def find_drafts
|
33
|
+
@drafts ||= begin
|
34
|
+
dir = File.join(Octopress.site.source, '_drafts')
|
35
|
+
Find.find(dir).to_a.reject do |f|
|
36
|
+
File.directory?(f)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def find_all_posts
|
42
|
+
@posts ||= begin
|
43
|
+
dir = File.join(Octopress.site.source, '_posts')
|
44
|
+
Find.find(dir).to_a.reject do |f|
|
45
|
+
File.directory?(f)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def find_posts
|
51
|
+
find_all_posts.reject { |f| f =~ /_exile\// }
|
52
|
+
end
|
53
|
+
|
54
|
+
def find_exiled_posts
|
55
|
+
find_all_posts.select { |f| f =~ /_exile\// }
|
56
|
+
end
|
57
|
+
|
58
|
+
def search_posts(search, posts)
|
59
|
+
posts = posts.select do |p|
|
60
|
+
p =~ /#{search.gsub(/\s/, '-')}/i
|
61
|
+
end
|
62
|
+
if posts.empty?
|
63
|
+
abort (STDOUT.tty? ? "No posts found matching: #{search}".red : '')
|
64
|
+
else
|
65
|
+
posts
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def prompt_for_selection(posts, search, action)
|
70
|
+
abort if !STDOUT.tty?
|
71
|
+
|
72
|
+
puts "Found #{posts.size} posts matching: '#{search}'"
|
73
|
+
posts.each_with_index do |p, i|
|
74
|
+
post = p.sub(/#{Octopress.site.source}\/_(posts|drafts)\//, '')
|
75
|
+
puts " #{i+1}) #{post}"
|
76
|
+
end
|
77
|
+
|
78
|
+
print "Which do you want to #{action}? (enter a number): "
|
79
|
+
$stdout.flush
|
80
|
+
post = $stdin.gets.strip.to_i
|
81
|
+
|
82
|
+
# Give a newline for further output
|
83
|
+
puts ''
|
84
|
+
|
85
|
+
# Handle invalid input (because "oops".to_i == 0)
|
86
|
+
(post == 0 ? nil : post)
|
87
|
+
end
|
88
|
+
|
12
89
|
end
|
13
90
|
end
|
@@ -3,16 +3,18 @@ module Octopress
|
|
3
3
|
class Isolate < Command
|
4
4
|
def self.init_with_program(p)
|
5
5
|
p.command(:isolate) do |c|
|
6
|
-
c.syntax 'isolate
|
7
|
-
c.description "Move posts
|
8
|
-
|
9
|
-
c.option 'config', '--config <CONFIG_FILE>[,CONFIG_FILE2,...]', Array, 'Custom Jekyll configuration file'
|
6
|
+
c.syntax 'isolate <POST> [options]'
|
7
|
+
c.description "Move all posts not matching selected psot to _posts/_exile. Command accepts path to post or search string."
|
8
|
+
CommandHelpers.add_common_options c
|
10
9
|
|
11
10
|
c.action do |args, options|
|
12
|
-
|
13
|
-
|
11
|
+
options['path'] = args.first
|
12
|
+
|
13
|
+
if options['path'] && !File.exist?(options['path'])
|
14
|
+
options['path'] = CommandHelpers.select_posts(options['path'], 'isolate')
|
14
15
|
end
|
15
|
-
|
16
|
+
|
17
|
+
isolate_post(options)
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
@@ -22,10 +24,18 @@ module Octopress
|
|
22
24
|
c.option 'config', '--config <CONFIG_FILE>[,CONFIG_FILE2,...]', Array, 'Custom Jekyll configuration file'
|
23
25
|
|
24
26
|
c.action do |args, options|
|
25
|
-
|
27
|
+
integrate_posts(options)
|
26
28
|
end
|
27
29
|
end
|
28
30
|
end
|
31
|
+
|
32
|
+
def self.isolate_post(options)
|
33
|
+
Octopress::Isolate.new(options).isolate
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.integrate_posts(options)
|
37
|
+
Octopress::Isolate.new(options).integrate
|
38
|
+
end
|
29
39
|
end
|
30
40
|
end
|
31
41
|
end
|
@@ -2,7 +2,7 @@ module Octopress
|
|
2
2
|
class Publish < Command
|
3
3
|
def self.init_with_program(p)
|
4
4
|
p.command(:publish) do |c|
|
5
|
-
c.syntax 'publish <
|
5
|
+
c.syntax 'publish <DRAFT> [options]'
|
6
6
|
c.description 'Convert a draft to a normal published post.'
|
7
7
|
c.option 'date', '--date DATE', 'String that is parseable by Time#parse. (default: Time.now.iso8601)'
|
8
8
|
c.option 'force', '--force', 'Overwrite file if it already exists'
|
@@ -10,13 +10,27 @@ module Octopress
|
|
10
10
|
CommandHelpers.add_common_options c
|
11
11
|
|
12
12
|
c.action do |args, options|
|
13
|
-
abort "You
|
13
|
+
abort "You didn't specify a post." if args.empty?
|
14
14
|
options['path'] = args.first
|
15
15
|
options['type'] = 'post from draft'
|
16
|
-
|
16
|
+
|
17
|
+
if !options['path']
|
18
|
+
abort "Publish failed: Please provide a path or a search string to select your post."
|
19
|
+
end
|
20
|
+
|
21
|
+
if File.exist?(options['path'])
|
22
|
+
publish_post(options)
|
23
|
+
else
|
24
|
+
options['path'] = CommandHelpers.select_posts(options['path'], 'publish')
|
25
|
+
publish_post(options)
|
26
|
+
end
|
17
27
|
end
|
18
28
|
end
|
19
29
|
end
|
30
|
+
|
31
|
+
def self.publish_post(options)
|
32
|
+
Draft.new(Octopress.site(options), options).publish
|
33
|
+
end
|
20
34
|
end
|
21
35
|
end
|
22
36
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Octopress
|
2
|
+
class Unpublish < Command
|
3
|
+
def self.init_with_program(p)
|
4
|
+
p.command(:unpublish) do |c|
|
5
|
+
c.syntax 'unpublish <POST> [options]'
|
6
|
+
c.description 'Convert a post to a draft. Command accepts path to post or search string.'
|
7
|
+
CommandHelpers.add_common_options c
|
8
|
+
|
9
|
+
c.action do |args, options|
|
10
|
+
options['path'] = args.first
|
11
|
+
options['type'] = 'draft from post'
|
12
|
+
|
13
|
+
if !options['path']
|
14
|
+
abort "Unpublish failed: Please provide a path or a search string to select your post."
|
15
|
+
end
|
16
|
+
if File.exist?(options['path'])
|
17
|
+
unpublish_post(options)
|
18
|
+
else
|
19
|
+
options['path'] = CommandHelpers.select_posts(options['path'], 'unpublish')
|
20
|
+
unpublish_post(options)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.unpublish_post(options)
|
27
|
+
Post.new(Octopress.site(options), options).unpublish
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
data/lib/octopress/draft.rb
CHANGED
@@ -3,6 +3,11 @@ module Octopress
|
|
3
3
|
|
4
4
|
def set_default_options
|
5
5
|
@options['type'] ||= 'draft'
|
6
|
+
|
7
|
+
if @options['title'].nil? && @options[:type] == 'post'
|
8
|
+
raise "Draft not created: Please choose a title.\n".red + " For example: " + "octopress new draft 'The merits of napping'".yellow
|
9
|
+
end
|
10
|
+
|
6
11
|
@options['layout'] = @config['post_layout']
|
7
12
|
@options['dir'] ||= ''
|
8
13
|
@options['extension'] ||= @config['post_ext']
|
@@ -18,23 +23,20 @@ module Octopress
|
|
18
23
|
File.join(site.source, '_drafts', name)
|
19
24
|
end
|
20
25
|
|
21
|
-
# -----
|
22
|
-
# Methods for publishing drafts
|
23
|
-
# -----
|
24
|
-
|
25
26
|
# Create a new post from draft file
|
26
27
|
#
|
27
28
|
# Sets post options based on draft file contents
|
28
29
|
# and options passed to the publish command
|
29
30
|
#
|
30
31
|
def publish
|
31
|
-
@options['date'] ||=
|
32
|
+
@options['date'] ||= read_post_date || Time.now.iso8601
|
33
|
+
@options['title'] = read_post_title
|
32
34
|
|
33
35
|
post_options = {
|
34
|
-
'title' =>
|
36
|
+
'title' => @options['title'],
|
35
37
|
'date' => @options['date'],
|
36
|
-
'slug' =>
|
37
|
-
'content' =>
|
38
|
+
'slug' => title_slug,
|
39
|
+
'content' => read_post_content,
|
38
40
|
'dir' => @options['dir'],
|
39
41
|
'type' => 'post from draft'
|
40
42
|
}
|
@@ -49,53 +51,6 @@ module Octopress
|
|
49
51
|
|
50
52
|
end
|
51
53
|
|
52
|
-
# Get the slug from options or filename
|
53
|
-
#
|
54
|
-
def publish_slug
|
55
|
-
@options['slug'] || File.basename(@options['path'], '.*')
|
56
|
-
end
|
57
|
-
|
58
|
-
# Reads the file from _drafts/[path]
|
59
|
-
#
|
60
|
-
def read
|
61
|
-
if @draft_content
|
62
|
-
@draft_content
|
63
|
-
else
|
64
|
-
file = @options['path']
|
65
|
-
abort "File #{file} not found." if !File.exist? file
|
66
|
-
@draft_content = File.open(file).read
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
# Get title from draft post file
|
71
|
-
#
|
72
|
-
def read_draft_title
|
73
|
-
match = read.match(/title:\s+(.+)?$/)
|
74
|
-
match[1] if match
|
75
|
-
end
|
76
|
-
|
77
|
-
# read_draft_date
|
78
|
-
#
|
79
|
-
def read_draft_date
|
80
|
-
match = read.match(/date:\s+(\d.+)$/)
|
81
|
-
match[1] if match
|
82
|
-
end
|
83
|
-
|
84
|
-
# Get content from draft post file
|
85
|
-
# also update the draft's date configuration
|
86
|
-
#
|
87
|
-
def read_draft_content
|
88
|
-
if @options['date']
|
89
|
-
# remove date if it exists
|
90
|
-
content = read.sub(/date:.*$\n/, "")
|
91
|
-
|
92
|
-
# Insert date after title
|
93
|
-
content.sub(/(title:.+$)/i, '\1'+"\ndate: #{@options['date']}")
|
94
|
-
else
|
95
|
-
read
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
54
|
def default_template
|
100
55
|
'draft'
|
101
56
|
end
|
data/lib/octopress/isolate.rb
CHANGED
@@ -2,100 +2,47 @@ require 'find'
|
|
2
2
|
|
3
3
|
module Octopress
|
4
4
|
class Isolate
|
5
|
+
attr_accessor :site
|
6
|
+
|
5
7
|
def initialize(options)
|
6
8
|
@options = options
|
7
|
-
|
8
|
-
@site = Jekyll::Site.new(Jekyll.configuration(@options))
|
9
|
-
Jekyll.logger.log_level = :info
|
9
|
+
@site = Octopress.site(@options)
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
13
|
-
dir = File.join(
|
12
|
+
def integrate
|
13
|
+
dir = File.join(site.source, '_posts')
|
14
14
|
exile_dir = File.join(dir, '_exile')
|
15
15
|
if Dir.exist?(exile_dir)
|
16
|
-
posts = find_exiled_posts
|
16
|
+
posts = CommandHelpers.find_exiled_posts
|
17
17
|
if posts.size > 0
|
18
18
|
FileUtils.mv(posts, dir)
|
19
19
|
FileUtils.rmdir(File.join(dir, '_exile'))
|
20
20
|
|
21
21
|
puts "Reintegrated #{posts.size} post#{'s' if posts.size != 1} from _posts/_exile"
|
22
22
|
else
|
23
|
-
|
23
|
+
abort "There aren't any posts in _posts/_exile."
|
24
24
|
end
|
25
25
|
else
|
26
|
-
|
26
|
+
abort "There aren't any posts in _posts/_exile."
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
30
|
+
def isolate
|
31
|
+
post = File.expand_path(@options['path']) if @options['path']
|
32
|
+
others = (post ? find_other_posts(post) : CommandHelpers.find_posts)
|
33
|
+
exile_dir = File.join(site.source, '_posts/_exile')
|
31
34
|
|
32
|
-
|
33
|
-
|
34
|
-
if File.exist? path
|
35
|
-
isolate_except(path)
|
36
|
-
else
|
37
|
-
puts "File not found: #{@options['path']}"
|
38
|
-
end
|
39
|
-
elsif @options['search']
|
40
|
-
isolate_search(@options['search'])
|
41
|
-
else
|
42
|
-
isolate_latest
|
43
|
-
end
|
44
|
-
end
|
35
|
+
FileUtils.mkdir_p(exile_dir)
|
36
|
+
FileUtils.mv(others, exile_dir)
|
45
37
|
|
46
|
-
|
47
|
-
def isolate_search(string)
|
48
|
-
posts = find_posts.select { |p| p =~ /#{string.gsub(/\s/, '-')}/i }
|
49
|
-
isolate_except(posts)
|
50
|
-
end
|
38
|
+
count = (post ? others.size : "all #{others.size}")
|
51
39
|
|
52
|
-
|
53
|
-
|
54
|
-
post = @site.read_posts('').sort_by(&:date).last
|
55
|
-
path = File.join(@site.source, post.path)
|
56
|
-
isolate_except(path)
|
40
|
+
puts "Moved #{count} post#{'s' if others.size != 1} into _posts/_exile"
|
41
|
+
puts "Isolated: " << "#{post.sub(Octopress.site.source + '/_posts/', '')}".yellow if post
|
57
42
|
end
|
58
43
|
|
59
|
-
def
|
60
|
-
|
61
|
-
posts = default_array(posts)
|
62
|
-
exile_dir = @site.source, '_posts/_exile'
|
63
|
-
|
64
|
-
|
65
|
-
if posts.size > 0
|
66
|
-
FileUtils.mkdir_p(exile_dir)
|
67
|
-
FileUtils.mv(others, exile_dir)
|
68
|
-
|
69
|
-
puts "Isolated #{posts.size} post#{'s' if posts.size != 1}:"
|
70
|
-
posts.each do |p|
|
71
|
-
puts " - #{p.sub(@site.source+'/_posts/', '')}"
|
72
|
-
end
|
73
|
-
puts "Moved #{others.size} post#{'s' if others.size != 1} into _posts/_exile"
|
74
|
-
else
|
75
|
-
puts "No matching posts were found."
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def find_other_posts(paths)
|
80
|
-
paths = default_array(paths)
|
81
|
-
|
82
|
-
find_posts.reject do |p|
|
83
|
-
paths.include?(p)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def find_posts
|
88
|
-
dir = File.join(@site.source, '_posts')
|
89
|
-
Find.find(dir).to_a.reject do |f|
|
90
|
-
File.directory?(f) || f =~ /_exile\//
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
def find_exiled_posts
|
95
|
-
dir = File.join(@site.source, '_posts/_exile')
|
96
|
-
Find.find(dir).to_a.reject do |f|
|
97
|
-
File.directory?(f)
|
98
|
-
end
|
44
|
+
def find_other_posts(path)
|
45
|
+
CommandHelpers.find_posts.reject { |p| p == path }
|
99
46
|
end
|
100
47
|
|
101
48
|
def default_array(input)
|
data/lib/octopress/post.rb
CHANGED
@@ -3,6 +3,11 @@ module Octopress
|
|
3
3
|
|
4
4
|
def set_default_options
|
5
5
|
@options['type'] ||= 'post'
|
6
|
+
|
7
|
+
if @options['title'].nil? && @options[:type] == 'post'
|
8
|
+
raise "Post not created: Please choose a title.\n".red + " For example: " + "octopress new post \"Friendship with a tomato?\"".yellow
|
9
|
+
end
|
10
|
+
|
6
11
|
@options['layout'] = @config['post_layout']
|
7
12
|
@options['date'] = convert_date @options['date']
|
8
13
|
@options['extension'] ||= @config['post_ext']
|
@@ -27,5 +32,63 @@ module Octopress
|
|
27
32
|
front_matter %w{layout title date}
|
28
33
|
end
|
29
34
|
|
35
|
+
def unpublish
|
36
|
+
@options['date'] = read_post_date
|
37
|
+
@options['title'] = read_post_title
|
38
|
+
|
39
|
+
post_options = {
|
40
|
+
'title' => @options['title'],
|
41
|
+
'date' => @options['date'],
|
42
|
+
'slug' => title_slug,
|
43
|
+
'content' => read_post_content,
|
44
|
+
'dir' => @options['dir'],
|
45
|
+
'type' => 'draft from post'
|
46
|
+
}
|
47
|
+
Draft.new(site, post_options).write
|
48
|
+
|
49
|
+
# Remove the old post file
|
50
|
+
#
|
51
|
+
FileUtils.rm @options['path']
|
52
|
+
end
|
53
|
+
|
54
|
+
# Reads the file from options[path]
|
55
|
+
#
|
56
|
+
def read
|
57
|
+
@post_content ||= begin
|
58
|
+
file = @options['path']
|
59
|
+
raise "File #{file} not found." if !File.exist? file
|
60
|
+
File.read(file)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Get title from post file
|
65
|
+
#
|
66
|
+
def read_post_title
|
67
|
+
match = read.match(/title:\s+(.+)?$/)
|
68
|
+
match[1] if match
|
69
|
+
end
|
70
|
+
|
71
|
+
# Read date from post file
|
72
|
+
#
|
73
|
+
def read_post_date
|
74
|
+
match = read.match(/date:\s+(\d.+)$/)
|
75
|
+
match[1] if match
|
76
|
+
end
|
77
|
+
|
78
|
+
# Get content from draft post file
|
79
|
+
# also update the draft's date configuration
|
80
|
+
#
|
81
|
+
def read_post_content
|
82
|
+
if @options['date']
|
83
|
+
# remove date if it exists
|
84
|
+
content = read.sub(/date:.*$\n/, "")
|
85
|
+
|
86
|
+
# Insert date after title
|
87
|
+
content.sub(/(title:.+$)/i, '\1'+"\ndate: #{@options['date']}")
|
88
|
+
else
|
89
|
+
read
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
30
93
|
end
|
31
94
|
end
|
data/lib/octopress/version.rb
CHANGED
data/site/Gemfile
CHANGED
@@ -18,6 +18,10 @@ group :jekyll_plugins do
|
|
18
18
|
gem "octopress-render-tag"#, path: "../../render-tag"
|
19
19
|
gem "octopress-return-tag"#, path: "../../return-tag"
|
20
20
|
gem "octopress-minify-html"#, path: "../../minify-html"
|
21
|
+
gem "octopress-quote-tag"#, path: "../../quote-tag"
|
22
|
+
gem "octopress-pullquote-tag"#, path: "../../pullquote-tag"
|
23
|
+
gem "octopress-image-tag"#, path: "../../image-tag"
|
24
|
+
gem "octopress-video-tag"#, path: "../../video-tag"
|
21
25
|
gem "clash", path: "../../clash"
|
22
26
|
end
|
23
27
|
|
data/site/_data/_plugins.yml
CHANGED
@@ -2,11 +2,10 @@ site_tools:
|
|
2
2
|
- octopress
|
3
3
|
- octopress-deploy
|
4
4
|
- octopress-linkblog
|
5
|
-
- octopress-asset-pipeline
|
6
|
-
- octopress-blockquote-tag
|
7
|
-
- octopress-date-format
|
8
5
|
- octopress-feed
|
6
|
+
- octopress-asset-pipeline
|
9
7
|
- octopress-minify-html
|
8
|
+
- octopress-date-format
|
10
9
|
|
11
10
|
themes:
|
12
11
|
- octopress-genesis-theme
|
@@ -21,6 +20,9 @@ developer_tools:
|
|
21
20
|
- clash
|
22
21
|
|
23
22
|
liquid_plugins:
|
23
|
+
- octopress-quote-tag
|
24
|
+
- octopress-image-tag
|
25
|
+
- octopress-video-tag
|
24
26
|
- octopress-include-tag
|
25
27
|
- octopress-render-tag
|
26
28
|
- octopress-wrap-tag
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: octopress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.rc.
|
4
|
+
version: 3.0.0.rc.26
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Mathis
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-01-
|
12
|
+
date: 2015-01-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mercenary
|
@@ -189,6 +189,7 @@ files:
|
|
189
189
|
- lib/octopress/commands/isolate.rb
|
190
190
|
- lib/octopress/commands/new.rb
|
191
191
|
- lib/octopress/commands/publish.rb
|
192
|
+
- lib/octopress/commands/unpublish.rb
|
192
193
|
- lib/octopress/docs.rb
|
193
194
|
- lib/octopress/docs/doc.rb
|
194
195
|
- lib/octopress/docs/hooks.rb
|
@@ -224,6 +225,9 @@ files:
|
|
224
225
|
- site/_layouts/docs.html
|
225
226
|
- site/_layouts/docs_index.html
|
226
227
|
- site/_plugins/docs.rb
|
228
|
+
- site/_templates/draft
|
229
|
+
- site/_templates/page
|
230
|
+
- site/_templates/post
|
227
231
|
- site/index.html
|
228
232
|
- site/stylesheets/site.scss
|
229
233
|
homepage: http://octopress.org
|