retter 0.2.5 → 1.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -11
- data/.travis.yml +4 -2
- data/ChangeLog.md +11 -5
- data/Gemfile +4 -1
- data/LICENSE.txt +22 -0
- data/README.md +163 -246
- data/Rakefile +25 -5
- data/bin/retter +2 -22
- data/lib/retter.rb +57 -43
- data/lib/retter/cli.rb +46 -0
- data/lib/retter/cli/edit.rb +33 -0
- data/lib/retter/cli/hooks.rb +46 -0
- data/lib/retter/cli/list.rb +15 -0
- data/lib/retter/cli/new.rb +20 -0
- data/lib/retter/cli/preview.rb +9 -0
- data/lib/retter/cli/publish.rb +22 -0
- data/lib/retter/deprecated.rb +160 -0
- data/lib/retter/entry.rb +31 -106
- data/lib/retter/entry/article.rb +36 -0
- data/lib/retter/entry/find_methods.rb +38 -0
- data/lib/retter/entry/model_base.rb +10 -0
- data/lib/retter/entry/pagination.rb +23 -0
- data/lib/retter/entry/sort_methods.rb +7 -0
- data/lib/retter/entry/utils.rb +12 -0
- data/lib/retter/initializing.rb +45 -0
- data/lib/retter/repository.rb +99 -12
- data/lib/retter/retterfile.rb +67 -0
- data/lib/retter/retterfile/context.rb +57 -0
- data/lib/retter/static_site.rb +34 -0
- data/lib/retter/static_site/app.rb +13 -0
- data/lib/retter/static_site/app/application.rb +94 -0
- data/lib/retter/{generator/skel/entries → static_site/app/assets/images}/.gitkeep +0 -0
- data/lib/retter/{generator/skel → static_site/app/assets}/images/orange/bg_body.jpg +0 -0
- data/lib/retter/{generator/skel → static_site/app/assets}/images/orange/bg_entry.jpg +0 -0
- data/lib/retter/{generator/skel → static_site/app/assets}/images/orange/bg_header.png +0 -0
- data/lib/retter/{generator/skel → static_site/app/assets}/images/orange/ic_li01.gif +0 -0
- data/lib/retter/{generator/skel/images → static_site/app/assets/javascripts}/.gitkeep +0 -0
- data/lib/retter/static_site/app/assets/stylesheets/application.css.scss +3 -0
- data/lib/retter/{generator/skel/stylesheets/base.css → static_site/app/assets/stylesheets/base.css.scss} +0 -0
- data/lib/retter/{generator/skel/stylesheets/pygments.css → static_site/app/assets/stylesheets/highlight.css.scss} +0 -0
- data/lib/retter/static_site/app/assets/stylesheets/orange.css.scss +262 -0
- data/lib/retter/static_site/app/assets/stylesheets/retter.css.scss +198 -0
- data/lib/retter/static_site/app/config.ru +7 -0
- data/lib/retter/static_site/app/controllers.rb +113 -0
- data/lib/retter/static_site/app/helpers.rb +36 -0
- data/lib/retter/{generator/skel/layouts/profile.html.haml → static_site/app/templates/about/show.html.haml} +0 -0
- data/lib/retter/static_site/app/templates/entries/articles/show.html.haml +7 -0
- data/lib/retter/static_site/app/templates/entries/index.html.haml +13 -0
- data/lib/retter/static_site/app/templates/entries/index.rss.haml +24 -0
- data/lib/retter/static_site/app/templates/entries/show.html.haml +11 -0
- data/lib/retter/static_site/app/templates/index/show.html.haml +14 -0
- data/lib/retter/static_site/app/templates/layouts/application.html.haml +34 -0
- data/lib/retter/static_site/builder.rb +106 -0
- data/lib/retter/static_site/cli.rb +25 -0
- data/lib/retter/static_site/cli/build.rb +85 -0
- data/lib/retter/static_site/cli/edit.rb +17 -0
- data/lib/retter/static_site/cli/migrate.rb +93 -0
- data/lib/retter/static_site/cli/new.rb +50 -0
- data/lib/retter/static_site/cli/preview.rb +66 -0
- data/lib/retter/static_site/markdown.rb +25 -0
- data/lib/retter/static_site/markdown/code_ray_renderer.rb +13 -0
- data/lib/retter/static_site/markdown/pygments_renderer.rb +18 -0
- data/lib/retter/static_site/markdown_entry.rb +111 -0
- data/lib/retter/static_site/monkey/sprockets_task.rb +10 -0
- data/lib/retter/version.rb +1 -1
- data/retter.gemspec +59 -43
- data/skel/.gitignore +2 -0
- data/skel/Retterfile +16 -0
- data/skel/config.ru +22 -0
- data/{lib/retter/generator/skel/javascripts → skel/retters}/.gitkeep +0 -0
- data/skel/retters/today.md +3 -0
- data/spec/cli/build_spec.rb +87 -0
- data/spec/cli/edit_spec.rb +76 -0
- data/spec/cli/invocation_spec.rb +19 -0
- data/spec/cli/list_spec.rb +64 -0
- data/spec/cli/migrate_spec.rb +65 -0
- data/spec/cli/new_spec.rb +30 -0
- data/{lib/retter/generator/skel → spec/fixtures/sites/site-0.2.5}/.gitignore +0 -0
- data/{lib/retter/generator/skel → spec/fixtures/sites/site-0.2.5}/Retterfile +6 -3
- data/{lib/retter/generator/skel → spec/fixtures/sites/site-0.2.5}/config.ru +0 -0
- data/{lib/retter/generator/skel/retters/.gitkeep → spec/fixtures/sites/site-0.2.5/entries.html} +0 -0
- data/spec/fixtures/sites/site-0.2.5/entries.rss +0 -0
- data/spec/fixtures/sites/site-0.2.5/entries/.gitkeep +0 -0
- data/spec/fixtures/sites/site-0.2.5/images/.gitkeep +0 -0
- data/spec/fixtures/sites/site-0.2.5/images/orange/bg_body.jpg +0 -0
- data/spec/fixtures/sites/site-0.2.5/images/orange/bg_entry.jpg +0 -0
- data/spec/fixtures/sites/site-0.2.5/images/orange/bg_header.png +0 -0
- data/{lib/retter/generator/skel → spec/fixtures/sites/site-0.2.5}/index.html +0 -0
- data/spec/fixtures/sites/site-0.2.5/javascripts/.gitkeep +0 -0
- data/{lib/retter/generator/skel → spec/fixtures/sites/site-0.2.5}/layouts/article.html.haml +0 -0
- data/{lib/retter/generator/skel → spec/fixtures/sites/site-0.2.5}/layouts/entries.html.haml +0 -0
- data/{lib/retter/generator/skel → spec/fixtures/sites/site-0.2.5}/layouts/entry.html.haml +0 -0
- data/{lib/retter/generator/skel → spec/fixtures/sites/site-0.2.5}/layouts/index.html.haml +0 -0
- data/spec/fixtures/sites/site-0.2.5/layouts/profile.html.haml +7 -0
- data/{lib/retter/generator/skel → spec/fixtures/sites/site-0.2.5}/layouts/retter.html.haml +0 -0
- data/spec/fixtures/sites/site-0.2.5/profile.html +0 -0
- data/spec/fixtures/sites/site-0.2.5/retters/.gitkeep +0 -0
- data/spec/fixtures/sites/site-0.2.5/stylesheets/base.css +22 -0
- data/{lib/retter/generator/skel → spec/fixtures/sites/site-0.2.5}/stylesheets/orange.css +0 -0
- data/spec/fixtures/sites/site-0.2.5/stylesheets/pygments.css +288 -0
- data/{lib/retter/generator/skel → spec/fixtures/sites/site-0.2.5}/stylesheets/retter.css +0 -0
- data/spec/retter/deprecated_spec.rb +106 -0
- data/spec/retter/initializing_spec.rb +86 -0
- data/spec/retter/retterfile_spec.rb +32 -0
- data/spec/spec_helper.rb +38 -27
- data/spec/support/example_helper.rb +46 -0
- data/spec/support/matchers.rb +14 -0
- data/spec/support/test_site.rb +59 -0
- metadata +329 -236
- data/lib/retter/binder.rb +0 -50
- data/lib/retter/command.rb +0 -192
- data/lib/retter/config.rb +0 -96
- data/lib/retter/configurable.rb +0 -26
- data/lib/retter/entries.rb +0 -115
- data/lib/retter/generator.rb +0 -7
- data/lib/retter/generator/base.rb +0 -65
- data/lib/retter/generator/creator.rb +0 -34
- data/lib/retter/generator/skel/Gemfile +0 -5
- data/lib/retter/markdown.rb +0 -31
- data/lib/retter/markdown/code_ray_renderer.rb +0 -11
- data/lib/retter/markdown/pygments_renderer.rb +0 -16
- data/lib/retter/page.rb +0 -43
- data/lib/retter/page/article.rb +0 -54
- data/lib/retter/page/base.rb +0 -97
- data/lib/retter/page/entries.rb +0 -17
- data/lib/retter/page/entry.rb +0 -46
- data/lib/retter/page/feed.rb +0 -63
- data/lib/retter/page/index.rb +0 -17
- data/lib/retter/page/profile.rb +0 -17
- data/lib/retter/page/view_helper.rb +0 -66
- data/lib/retter/preprint.rb +0 -34
- data/spec/command/callback_spec.rb +0 -27
- data/spec/command/clean_spec.rb +0 -20
- data/spec/command/commit_spec.rb +0 -40
- data/spec/command/edit_spec.rb +0 -119
- data/spec/command/list_spec.rb +0 -42
- data/spec/command/open_spec.rb +0 -12
- data/spec/command/preview_spec.rb +0 -40
- data/spec/command/rebind_spec.rb +0 -276
- data/spec/support/example_group_helper.rb +0 -98
data/lib/retter/binder.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
module Retter
|
4
|
-
class Binder
|
5
|
-
extend Configurable
|
6
|
-
|
7
|
-
configurable :allow_binding
|
8
|
-
|
9
|
-
def initialize(entries)
|
10
|
-
@entries = entries
|
11
|
-
@singleton_pages = find_singleton_pages
|
12
|
-
end
|
13
|
-
|
14
|
-
def bind!
|
15
|
-
bind_entries
|
16
|
-
|
17
|
-
@singleton_pages.each(&:bind)
|
18
|
-
end
|
19
|
-
|
20
|
-
def bind_entries
|
21
|
-
@entries.each do |entry|
|
22
|
-
entry_page = Page::Entry.new(entry)
|
23
|
-
entry_page.bind
|
24
|
-
|
25
|
-
entry.articles.each do |article|
|
26
|
-
article_page = Page::Article.new(article)
|
27
|
-
article_page.bind
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def find_singleton_pages
|
35
|
-
available_singleton_page_names.map {|name|
|
36
|
-
Page.const_get(name.capitalize).new
|
37
|
-
}
|
38
|
-
end
|
39
|
-
|
40
|
-
def available_singleton_page_names
|
41
|
-
availables = [:index]
|
42
|
-
|
43
|
-
unless allow_binding == :none
|
44
|
-
availables += allow_binding || [:profile, :entries, :feed]
|
45
|
-
end
|
46
|
-
|
47
|
-
availables.map(&:downcase).uniq
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
data/lib/retter/command.rb
DELETED
@@ -1,192 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
require 'thor'
|
4
|
-
require 'launchy'
|
5
|
-
require 'pathname'
|
6
|
-
|
7
|
-
module Retter
|
8
|
-
class Command < Thor
|
9
|
-
include Site
|
10
|
-
|
11
|
-
map '-v' => :version,
|
12
|
-
'-e' => :edit,
|
13
|
-
'-p' => :preview,
|
14
|
-
'-o' => :open,
|
15
|
-
'-r' => :rebind,
|
16
|
-
'-b' => :bind
|
17
|
-
|
18
|
-
desc :edit, %(Open $EDITOR. Write an article with Markdown.)
|
19
|
-
method_options date: :string, key: :string, silent: :boolean
|
20
|
-
def edit(identifier = options[:date] || options[:key])
|
21
|
-
entry = entries.detect_by_string(identifier)
|
22
|
-
|
23
|
-
system config.editor, entry.path.to_path
|
24
|
-
|
25
|
-
invoke_after :edit
|
26
|
-
end
|
27
|
-
|
28
|
-
default_task :edit
|
29
|
-
|
30
|
-
desc :preview, %(Preview the draft article (browser will open).)
|
31
|
-
method_options date: :string, key: :string
|
32
|
-
def preview(identifier = options[:date] || options[:key])
|
33
|
-
preprint = Preprint.new
|
34
|
-
entry = entries.detect_by_string(identifier)
|
35
|
-
|
36
|
-
preprint.bind entry
|
37
|
-
|
38
|
-
Launchy.open preprint.path.to_path
|
39
|
-
end
|
40
|
-
|
41
|
-
desc :open, %(Open your (static) site top page (browser will open).)
|
42
|
-
def open
|
43
|
-
index_page = Page::Index.new
|
44
|
-
|
45
|
-
Launchy.open index_page.path.to_path
|
46
|
-
end
|
47
|
-
|
48
|
-
desc :rebind, %(Bind the draft article, re-generate all html pages.)
|
49
|
-
method_options silent: :boolean
|
50
|
-
def rebind
|
51
|
-
entries.commit_wip_entry!
|
52
|
-
|
53
|
-
Binder.new(entries).bind!
|
54
|
-
|
55
|
-
invoke_after :bind
|
56
|
-
invoke_after :rebind
|
57
|
-
end
|
58
|
-
|
59
|
-
desc 'bind', %(Alias of rebind)
|
60
|
-
method_options silent: :boolean
|
61
|
-
alias_method :bind, :rebind
|
62
|
-
|
63
|
-
desc :commit, %(cd $RETTER_HOME && git add . && git commit -m 'Retter commit')
|
64
|
-
method_options silent: :boolean
|
65
|
-
def commit
|
66
|
-
Repository.open config.retter_home do |git|
|
67
|
-
say git.add(config.retter_home), :green
|
68
|
-
say git.commit_all('Retter commit'), :green
|
69
|
-
end
|
70
|
-
|
71
|
-
invoke_after :commit
|
72
|
-
end
|
73
|
-
|
74
|
-
desc :list, %(List retters)
|
75
|
-
def list
|
76
|
-
entries.each_with_index do |entry, n|
|
77
|
-
say "[e#{n}] #{entry.date}"
|
78
|
-
say " #{entry.articles.map(&:title).join(', ')}"
|
79
|
-
say
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
desc :clean, %(Clear all caches)
|
84
|
-
def clean
|
85
|
-
return unless config.cache.respond_to?(:clear)
|
86
|
-
|
87
|
-
config.cache.clear
|
88
|
-
end
|
89
|
-
|
90
|
-
desc :home, %(Open a new shell in $RETTER_HOME)
|
91
|
-
def home
|
92
|
-
Dir.chdir config.retter_home.to_path
|
93
|
-
|
94
|
-
system config.shell
|
95
|
-
|
96
|
-
say 'bye', :green
|
97
|
-
end
|
98
|
-
|
99
|
-
desc :callback, %(Call a callback process only)
|
100
|
-
method_options after: :string
|
101
|
-
def callback
|
102
|
-
invoke_after options[:after].intern
|
103
|
-
end
|
104
|
-
|
105
|
-
desc :new, %(Create a new site)
|
106
|
-
def new; end
|
107
|
-
|
108
|
-
desc :usage, %(Show usage.)
|
109
|
-
def usage
|
110
|
-
say Command.usage, :green
|
111
|
-
end
|
112
|
-
|
113
|
-
desc :version, %(Show version.)
|
114
|
-
def version
|
115
|
-
say "Retter version #{VERSION}"
|
116
|
-
end
|
117
|
-
|
118
|
-
private
|
119
|
-
|
120
|
-
def silent?
|
121
|
-
!options[:silent].nil?
|
122
|
-
end
|
123
|
-
|
124
|
-
def invoke_after(name)
|
125
|
-
return if silent?
|
126
|
-
|
127
|
-
case callback = after_callback(name)
|
128
|
-
when Proc
|
129
|
-
instance_eval &callback
|
130
|
-
when Symbol, String
|
131
|
-
__send__ callback
|
132
|
-
else
|
133
|
-
# noop
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
def after_callback(name)
|
138
|
-
config.after_callback(name)
|
139
|
-
end
|
140
|
-
|
141
|
-
def self.usage
|
142
|
-
<<-EOM
|
143
|
-
Usage:
|
144
|
-
# 1. Startup
|
145
|
-
cd /path/to/dir
|
146
|
-
retter new my_sweet_diary
|
147
|
-
echo "export EDITOR=vim" >> ~/.zshenv # retter requires $EDITOR.
|
148
|
-
echo "export RETTER_HOME=/path/to/my_sweet_diary" >> ~/.zshenv
|
149
|
-
. ~/.zshenv
|
150
|
-
|
151
|
-
# 2. Write a article
|
152
|
-
retter # $EDITOR will open. Write an article with Markdown.
|
153
|
-
retter preview # Preview the draft article (browser will open).
|
154
|
-
|
155
|
-
# 3. Publish
|
156
|
-
retter bind # bind the draft article, re-generate all html pages.
|
157
|
-
retter commit # shortcut of "cd $RETTER_HOME; git add .; git commit -m 'Retter commit'"
|
158
|
-
cd $RETTER_HOME
|
159
|
-
git push [remote] [branch] # or sftp, rsync, etc...
|
160
|
-
|
161
|
-
# Command options
|
162
|
-
retter edit 20110101
|
163
|
-
retter preview 20110101
|
164
|
-
|
165
|
-
retter edit today.md
|
166
|
-
retter edit 20110101.md
|
167
|
-
retter preview 20110101.md
|
168
|
-
|
169
|
-
# Browse entry list.
|
170
|
-
retter list
|
171
|
-
|
172
|
-
output examples:
|
173
|
-
[e0] 2011-11-07
|
174
|
-
entry3 title
|
175
|
-
|
176
|
-
[e1] 2011-10-25
|
177
|
-
entry2 title
|
178
|
-
|
179
|
-
[e2] 2011-10-22
|
180
|
-
entry1 title
|
181
|
-
|
182
|
-
to edit by keyword. run following command:
|
183
|
-
retter edit e1
|
184
|
-
|
185
|
-
# Browse offline.
|
186
|
-
retter open # Open your (static) site top page (browser will open).
|
187
|
-
|
188
|
-
See also: https://github.com/hibariya/retter
|
189
|
-
EOM
|
190
|
-
end
|
191
|
-
end
|
192
|
-
end
|
data/lib/retter/config.rb
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
require 'active_support/cache'
|
4
|
-
require 'forwardable'
|
5
|
-
require 'fileutils'
|
6
|
-
|
7
|
-
module Retter
|
8
|
-
class EnvError < RetterError; end
|
9
|
-
|
10
|
-
class Config
|
11
|
-
extend Forwardable
|
12
|
-
|
13
|
-
def_delegators Entries, :retters_dir, :wip_file, :markup, :cache
|
14
|
-
def_delegators Markdown, :renderer
|
15
|
-
def_delegators Binder, :allow_binding
|
16
|
-
def_delegators Page, :layouts_dir, :entries_dir
|
17
|
-
def_delegators Retter::Site, :title, :description, :url, :author
|
18
|
-
def_delegator Retter::Site, :home, :retter_home
|
19
|
-
|
20
|
-
def initialize(env)
|
21
|
-
@env = env
|
22
|
-
@after_callbacks = {}
|
23
|
-
@attributes = {}
|
24
|
-
|
25
|
-
detect_retter_home
|
26
|
-
environments_required
|
27
|
-
|
28
|
-
load_defaults
|
29
|
-
load_retterfile
|
30
|
-
rescue EnvError => e
|
31
|
-
$stderr.puts e.message, Command.usage
|
32
|
-
|
33
|
-
exit 1
|
34
|
-
end
|
35
|
-
|
36
|
-
def after_callback(name, sym = nil, &block)
|
37
|
-
if callback = sym || block
|
38
|
-
@after_callbacks[name] = callback
|
39
|
-
else
|
40
|
-
@after_callbacks[name]
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
alias_method :after, :after_callback
|
45
|
-
|
46
|
-
[ # base
|
47
|
-
:editor, :shell,
|
48
|
-
# extra
|
49
|
-
:disqus_shortname
|
50
|
-
].each do |att|
|
51
|
-
class_eval <<-EOM
|
52
|
-
def #{att}(val = nil)
|
53
|
-
val ? @attributes[:#{att}] = val : @attributes[:#{att}]
|
54
|
-
end
|
55
|
-
EOM
|
56
|
-
end
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
def detect_retter_home
|
61
|
-
@env['RETTER_HOME'] = Dir.pwd if File.exist? 'Retterfile'
|
62
|
-
end
|
63
|
-
|
64
|
-
def load_retterfile
|
65
|
-
retterfile = retter_home.join('Retterfile')
|
66
|
-
|
67
|
-
instance_eval retterfile.read, retterfile.to_path if retterfile.exist?
|
68
|
-
end
|
69
|
-
|
70
|
-
def environments_required
|
71
|
-
unless @env.values_at('EDITOR', 'RETTER_HOME').all?
|
72
|
-
raise EnvError, 'Set $RETTER_HOME and $EDITOR, first.'
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def load_defaults
|
77
|
-
retter_home Pathname.new(@env['RETTER_HOME'])
|
78
|
-
|
79
|
-
editor @env['EDITOR']
|
80
|
-
shell @env['SHELL']
|
81
|
-
url 'http://example.com'
|
82
|
-
|
83
|
-
renderer Retter::Markdown::CodeRayRenderer
|
84
|
-
retters_dir retter_home.join('retters/')
|
85
|
-
wip_file retters_dir.join('today.md')
|
86
|
-
|
87
|
-
layouts_dir retter_home.join('layouts/')
|
88
|
-
entries_dir retter_home.join('entries/')
|
89
|
-
|
90
|
-
cache_dir = retter_home.join('tmp/cache')
|
91
|
-
cache ActiveSupport::Cache::FileStore.new(cache_dir.to_path)
|
92
|
-
|
93
|
-
FileUtils.mkdir_p cache_dir.to_path unless cache_dir.directory? # for old versions
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
data/lib/retter/configurable.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
module Retter
|
4
|
-
module Configurable
|
5
|
-
def configurable(*names)
|
6
|
-
names.each do |name|
|
7
|
-
define_configurable_method name
|
8
|
-
define_instance_shortcut_method name
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def define_configurable_method(name)
|
13
|
-
instance_eval <<-EOM
|
14
|
-
def #{name}(val = nil)
|
15
|
-
val ? @#{name} = val : @#{name}
|
16
|
-
end
|
17
|
-
EOM
|
18
|
-
end
|
19
|
-
|
20
|
-
def define_instance_shortcut_method(name)
|
21
|
-
define_method name do
|
22
|
-
self.class.send(name)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
data/lib/retter/entries.rb
DELETED
@@ -1,115 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
require 'active_support/cache'
|
4
|
-
require 'digest/sha1'
|
5
|
-
require 'redcarpet'
|
6
|
-
require 'chronic'
|
7
|
-
|
8
|
-
module Retter
|
9
|
-
class EntryLoadError < RetterError; end
|
10
|
-
|
11
|
-
class Entries < Array
|
12
|
-
extend Configurable
|
13
|
-
|
14
|
-
configurable :retters_dir, :wip_file, :markup, :cache
|
15
|
-
|
16
|
-
def initialize
|
17
|
-
load_entries retters_dir
|
18
|
-
end
|
19
|
-
|
20
|
-
def retter_file(date)
|
21
|
-
retters_dir.join(date ? date.strftime('%Y%m%d.md') : 'today.md')
|
22
|
-
end
|
23
|
-
|
24
|
-
def detect_by_string(str)
|
25
|
-
entry =
|
26
|
-
case str
|
27
|
-
when nil, ''
|
28
|
-
detect_by_today || wip_entry
|
29
|
-
when /^e([0-9]+)$/
|
30
|
-
index = $1.to_i
|
31
|
-
self[index]
|
32
|
-
when /^([0-9a-z]+\.md)$/
|
33
|
-
detect_by_filename($1)
|
34
|
-
else
|
35
|
-
date = parse_date_string(str)
|
36
|
-
detect_by_date(date) || wip_entry(date)
|
37
|
-
end
|
38
|
-
|
39
|
-
raise EntryLoadError, "Entry not found with keyword '#{str}'" unless entry
|
40
|
-
|
41
|
-
entry
|
42
|
-
end
|
43
|
-
|
44
|
-
def detect_by_filename(filename)
|
45
|
-
case filename
|
46
|
-
when wip_file.basename.to_path
|
47
|
-
wip_entry
|
48
|
-
else
|
49
|
-
detect {|e| e.path.basename.to_path == filename }
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def detect_by_today
|
54
|
-
detect_by_date(Date.today)
|
55
|
-
end
|
56
|
-
|
57
|
-
def detect_by_date(date)
|
58
|
-
detect {|e| e.date == date }
|
59
|
-
end
|
60
|
-
|
61
|
-
def parse_date_string(date_str)
|
62
|
-
normalized = date_str.gsub(/\./, ' ')
|
63
|
-
|
64
|
-
(Chronic.parse(normalized) || Date.parse(normalized)).to_date
|
65
|
-
end
|
66
|
-
|
67
|
-
def wip_entry(date = nil)
|
68
|
-
file = retter_file(date)
|
69
|
-
date = date || Date.today
|
70
|
-
body = file.exist? ? file.read : ''
|
71
|
-
|
72
|
-
Entry.new date: date, body: rendered_body(body), path: file, entries: self
|
73
|
-
end
|
74
|
-
|
75
|
-
def commit_wip_entry!
|
76
|
-
if wip_file.exist?
|
77
|
-
copy = wip_file.read
|
78
|
-
retter_file(Date.today).open('a') {|f| f.puts copy }
|
79
|
-
wip_file.unlink
|
80
|
-
end
|
81
|
-
|
82
|
-
reload
|
83
|
-
end
|
84
|
-
|
85
|
-
def load_entries(path)
|
86
|
-
date_files = find_markup_files(path).map {|file|
|
87
|
-
date_str = file.basename('.*').to_path
|
88
|
-
[Date.parse(date_str), file]
|
89
|
-
}.sort_by(&:first)
|
90
|
-
|
91
|
-
date_files.reverse_each {|date, file|
|
92
|
-
self << Entry.new(date: date, body: rendered_body(file.read), entries: self)
|
93
|
-
}
|
94
|
-
end
|
95
|
-
|
96
|
-
def reload
|
97
|
-
clear
|
98
|
-
|
99
|
-
load_entries retters_dir
|
100
|
-
end
|
101
|
-
|
102
|
-
def find_markup_files(path)
|
103
|
-
path = Pathname.new(path).realpath
|
104
|
-
Dir.open(path, &:to_a).grep(/^\d{4}(?:0[1-9]|1[012])(?:0[1-9]|[12][0-9]|3[01])\..*$/).map {|f| path.join f }
|
105
|
-
end
|
106
|
-
|
107
|
-
def rendered_body(body)
|
108
|
-
key = Digest::SHA1.hexdigest('entry_' + body)
|
109
|
-
|
110
|
-
cache.fetch(key) do
|
111
|
-
(markup || Markdown.instance).render(body)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|