retter 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +90 -12
- data/lib/generator/newretter.rb +19 -6
- data/lib/generator/skel/images/orange/bg_body.jpg +0 -0
- data/lib/generator/skel/images/orange/bg_entry.jpg +0 -0
- data/lib/generator/skel/images/orange/bg_header.png +0 -0
- data/lib/generator/skel/layouts/entry.html.haml +2 -1
- data/lib/generator/skel/layouts/retter.html.haml +5 -2
- data/lib/generator/skel/stylesheets/base.css +8 -0
- data/lib/generator/skel/stylesheets/orange.css +154 -0
- data/lib/generator/skel/stylesheets/{application.css → retter.css} +3 -0
- data/lib/retter/command.rb +27 -11
- data/lib/retter/config.rb +9 -4
- data/lib/retter/stationery/binder.rb +14 -12
- data/lib/retter/stationery/previewer.rb +21 -20
- data/lib/retter/stationery/renderer.rb +1 -1
- data/lib/retter/stationery/view.rb +16 -7
- data/lib/retter/version.rb +1 -1
- data/retter.gemspec +1 -1
- data/spec/command/commit_spec.rb +16 -2
- data/spec/command/edit_spec.rb +15 -1
- data/spec/command/rebind_spec.rb +13 -0
- metadata +37 -31
data/README.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
# RETTER (レッター) Lightweight diary workflow.
|
2
2
|
|
3
|
-
|
3
|
+
簡単さにこだわったシンプルな記事作成ツール。以下のような特徴があります。
|
4
|
+
|
5
|
+
* CLIでの操作を前提としています
|
6
|
+
* どこにいてもすぐに記事を編集できます(Markdown)
|
7
|
+
* オフラインで簡単にプレビューできます
|
8
|
+
* だいたいどんなサーバ上でも動作します(静的HTMLまたはRackアプリとして)
|
9
|
+
* RSSフィードを吐きます
|
10
|
+
* トラックバック、コメントなどの機能はありません
|
4
11
|
|
5
12
|
## Installation
|
6
13
|
|
@@ -22,13 +29,15 @@ use `new` sub-command.
|
|
22
29
|
|
23
30
|
### Settings
|
24
31
|
|
25
|
-
**retter
|
32
|
+
**retter requires `$EDITOR` variable.**
|
26
33
|
|
27
34
|
~~~~
|
28
35
|
$ echo "export EDITOR=vim" >> ~/.bash_profile
|
29
36
|
$ . ~/.bash_profile
|
30
37
|
~~~~
|
31
38
|
|
39
|
+
ファイルシステム上のどこに居ても `retter` コマンドを使って編集から公開まで行えるよう、 事前に `$RETTER_HOME` 環境変数を設定しておくことができます。
|
40
|
+
|
32
41
|
You can use `retter` command anywhere, If you set `$RETTER_HOME` variable.
|
33
42
|
|
34
43
|
~~~~
|
@@ -36,40 +45,87 @@ You can use `retter` command anywhere, If you set `$RETTER_HOME` variable.
|
|
36
45
|
$ . ~/.bash_profile
|
37
46
|
~~~~
|
38
47
|
|
39
|
-
### Write
|
48
|
+
### Write an article
|
49
|
+
|
50
|
+
`retter` コマンドは設定されているエディタを起動します。Markdownで記事を書くことができます。
|
40
51
|
|
41
|
-
`retter`
|
42
|
-
The article will be draft.
|
52
|
+
`retter` opens `$EDITOR`. Write an article with Markdown. That article will be the draft.
|
43
53
|
|
44
54
|
~~~~
|
45
55
|
$ retter
|
46
56
|
~~~~
|
47
57
|
|
48
|
-
`preview`
|
58
|
+
`preview` で書きかけの最新記事をブラウザで確認することができます(デフォルトブラウザが起動します)。
|
59
|
+
|
60
|
+
`preview` opens the draft article by your default browser.
|
49
61
|
|
50
62
|
~~~~
|
51
63
|
$ retter preview
|
52
64
|
~~~~
|
53
65
|
|
54
|
-
`bind
|
55
|
-
|
66
|
+
`bind`, `rebind` は下書きの記事をその日の記事として保存し、すべてのHTMLを再生成します。
|
67
|
+
|
68
|
+
`bind` and `rebind` binds the draft article. And re-generates actual html web pages. All html pages will be overwritten.
|
56
69
|
|
57
70
|
~~~~
|
58
71
|
$ retter bind
|
59
72
|
~~~~
|
60
73
|
|
74
|
+
### Publish
|
61
75
|
|
62
|
-
|
76
|
+
記事を公開するには、すべてのファイルを git リポジトリにコミットし、リモートサーバに push するか単純にファイルをアップロードします。
|
77
|
+
|
78
|
+
To publish, use the git command. Or, upload the file to your server.
|
79
|
+
|
80
|
+
#### Basic flow
|
81
|
+
|
82
|
+
最も原始的な方法は、gitコマンドを直接使う方法です。
|
63
83
|
|
64
84
|
~~~~
|
85
|
+
$ cd $RETTER_HOME
|
65
86
|
$ git add .
|
66
87
|
$ git commit -m 'commit message'
|
67
88
|
$ git push [remote] [branch] # heroku, github pages, etc..
|
68
89
|
~~~~
|
69
90
|
|
70
|
-
|
91
|
+
#### Using shortcut commands
|
92
|
+
|
93
|
+
いくつかのショートカットを使い、コミットメッセージを書くことを省略したりすることができます。
|
94
|
+
|
95
|
+
~~~~
|
96
|
+
$ retter commit # Shortcut of `git add . ; git commit -m 'Retter commit'`
|
97
|
+
$ retter home # Open a new shell at $RETTER_HOME
|
98
|
+
(retter) git push [remote] [branch] # heroku, github pages, etc..
|
99
|
+
~~~~
|
100
|
+
|
101
|
+
#### Using Callbacks
|
102
|
+
|
103
|
+
コールバックを定義しておくことで、公開の作業を無意識に実行することができます。
|
104
|
+
|
105
|
+
Callback is enabled in `edit`, `bind`, `rebind` and `commit` sub-command.
|
106
|
+
|
107
|
+
~~~~ruby
|
108
|
+
after [command], [invoke command or proc]
|
109
|
+
~~~~
|
110
|
+
|
111
|
+
以下のような内容を Retterfile に記述しておくことで、rebind または bind が実行されると即座に公開までの処理も実行されます。
|
71
112
|
|
72
|
-
|
113
|
+
In Retterfile:
|
114
|
+
|
115
|
+
~~~~ruby
|
116
|
+
after :rebind, :commit
|
117
|
+
|
118
|
+
after :commit do
|
119
|
+
system "cd #{config.retter_home}"
|
120
|
+
system 'git push origin master'
|
121
|
+
end
|
122
|
+
~~~~
|
123
|
+
|
124
|
+
`--silent` option skip the callback.
|
125
|
+
|
126
|
+
### Edit article (specific date).
|
127
|
+
|
128
|
+
過去や未来の日付を指定して記事を編集・プレビューするには、 `--date` オプションを用います。
|
73
129
|
|
74
130
|
`--date` option is available in `edit` `preview` sub-command.
|
75
131
|
|
@@ -80,7 +136,9 @@ Or, upload the file to your server.
|
|
80
136
|
|
81
137
|
### Browse offline
|
82
138
|
|
83
|
-
|
139
|
+
生成されるすべてのページは静的HTMLです。`open` でサーバにデプロイしたものとほぼ同じようにオフラインでも閲覧することができます。rackでもOK。
|
140
|
+
|
141
|
+
`open` sub-command opens your (static) website by your default browser.
|
84
142
|
|
85
143
|
~~~~
|
86
144
|
$ retter open # visit file://path/to/my_sweet_diary/index.html
|
@@ -93,6 +151,26 @@ Or, Use rack if needed.
|
|
93
151
|
$ bundle exec rackup
|
94
152
|
~~~~
|
95
153
|
|
154
|
+
### Pre-installed themes
|
155
|
+
|
156
|
+
スタイルシートを変更することでテーマを変更できます。HTMLのヘッダを変更するには `layouts/retter.html.haml` を編集します。
|
157
|
+
|
158
|
+
#### Default
|
159
|
+
|
160
|
+
~~~~haml
|
161
|
+
%link{href: '/stylesheets/default.css', media: 'screen', rel: 'stylesheet', type: 'text/css'}
|
162
|
+
~~~~
|
163
|
+
|
164
|
+
![Default](http://hibariya.github.com/images/theme_samples/retter_default.jpg)
|
165
|
+
|
166
|
+
#### Orange
|
167
|
+
|
168
|
+
~~~~haml
|
169
|
+
%link{href: '/stylesheets/orange.css', media: 'screen', rel: 'stylesheet', type: 'text/css'}
|
170
|
+
~~~~
|
171
|
+
|
172
|
+
![Orange](http://hibariya.github.com/images/theme_samples/retter_orange.jpg)
|
173
|
+
|
96
174
|
## LICENSE
|
97
175
|
|
98
176
|
The MIT License
|
data/lib/generator/newretter.rb
CHANGED
@@ -7,22 +7,31 @@ require 'bundler/cli'
|
|
7
7
|
require 'retter'
|
8
8
|
|
9
9
|
class Newretter < Thor::Group
|
10
|
-
|
11
|
-
.gitignore
|
12
|
-
Gemfile
|
10
|
+
TEMPLATES = %w(
|
13
11
|
Retterfile
|
12
|
+
Gemfile
|
14
13
|
config.ru
|
14
|
+
index.html
|
15
15
|
layouts/entries.html.haml
|
16
16
|
layouts/entry.html.haml
|
17
17
|
layouts/profile.html.haml
|
18
18
|
layouts/index.html.haml
|
19
19
|
layouts/retter.html.haml
|
20
|
+
)
|
21
|
+
|
22
|
+
FILES = %w(
|
23
|
+
.gitignore
|
24
|
+
retters/.gitkeep
|
20
25
|
images/.gitkeep
|
21
|
-
index.html
|
22
26
|
entries/.gitkeep
|
23
27
|
javascripts/.gitkeep
|
24
|
-
stylesheets/
|
25
|
-
|
28
|
+
stylesheets/base.css
|
29
|
+
stylesheets/retter.css
|
30
|
+
|
31
|
+
stylesheets/orange.css
|
32
|
+
images/orange/bg_body.jpg
|
33
|
+
images/orange/bg_entry.jpg
|
34
|
+
images/orange/bg_header.png
|
26
35
|
)
|
27
36
|
|
28
37
|
include Thor::Actions
|
@@ -35,6 +44,10 @@ class Newretter < Thor::Group
|
|
35
44
|
|
36
45
|
def create_files
|
37
46
|
FILES.each do |file|
|
47
|
+
copy_file("skel/#{file}", "#{name}/#{file}")
|
48
|
+
end
|
49
|
+
|
50
|
+
TEMPLATES.each do |file|
|
38
51
|
template("skel/#{file}", "#{name}/#{file}")
|
39
52
|
end
|
40
53
|
end
|
Binary file
|
Binary file
|
Binary file
|
@@ -4,7 +4,8 @@
|
|
4
4
|
%title= config.title
|
5
5
|
%meta{:'http-equiv' => 'Content-Type', content: 'text/html', charset: 'utf-8'}
|
6
6
|
%link{rel: 'icon', type: 'image/png', href: '/favicon.png'}
|
7
|
-
%link{href: '/stylesheets/
|
7
|
+
%link{href: '/stylesheets/base.css', media: 'screen', rel: 'stylesheet', type: 'text/css'}
|
8
|
+
%link{href: '/stylesheets/retter.css', media: 'screen', rel: 'stylesheet', type: 'text/css'}
|
8
9
|
%link{rel: 'alternate', type: 'application/rss+xml', title: 'RSS', href: '/entries.rss'}
|
9
10
|
%body
|
10
11
|
#header
|
@@ -18,8 +19,10 @@
|
|
18
19
|
%li
|
19
20
|
%a{href: '/entries.html'} Archives
|
20
21
|
%li
|
21
|
-
%a{href: '/entries.rss'} RSS
|
22
|
+
%a{href: '/entries.rss', target: '_blank'} RSS
|
22
23
|
#page
|
23
24
|
#content= content
|
24
25
|
#footer
|
25
26
|
#{config.title} (C) #{config.author}
|
27
|
+
Generated by
|
28
|
+
%a{href: 'https://github.com/hibariya/retter', target: '_blank'} Retter
|
@@ -0,0 +1,154 @@
|
|
1
|
+
@charset "utf-8";
|
2
|
+
|
3
|
+
html {
|
4
|
+
height: 100%;
|
5
|
+
}
|
6
|
+
|
7
|
+
body {
|
8
|
+
margin: 0 auto 0 auto;
|
9
|
+
padding: 0;
|
10
|
+
font-family: sans-serif;
|
11
|
+
background: #EEE;
|
12
|
+
background-image:url("../images/orange/bg_body.jpg");
|
13
|
+
height: 100%;
|
14
|
+
}
|
15
|
+
|
16
|
+
ul {
|
17
|
+
list-style: none;
|
18
|
+
}
|
19
|
+
|
20
|
+
a {
|
21
|
+
text-decoration: none;
|
22
|
+
color: rgb(25,30,10);
|
23
|
+
}
|
24
|
+
|
25
|
+
#header {
|
26
|
+
padding: 0;
|
27
|
+
margin: 0;
|
28
|
+
}
|
29
|
+
|
30
|
+
#header h1 {
|
31
|
+
margin: 0;
|
32
|
+
padding: 0.2em 0 0.2em 1em;
|
33
|
+
color: rgb(77,144,253);
|
34
|
+
height:40px;
|
35
|
+
background-image:url("../images/orange/bg_header.png");
|
36
|
+
background-repeat:repeat-x;
|
37
|
+
}
|
38
|
+
|
39
|
+
#header h1 a {
|
40
|
+
color:#FFF;
|
41
|
+
}
|
42
|
+
|
43
|
+
#header ul#menu {
|
44
|
+
margin: 0.5em 0 3em 0;
|
45
|
+
padding: 0 0 0 2em;
|
46
|
+
}
|
47
|
+
|
48
|
+
#header ul#menu{
|
49
|
+
}
|
50
|
+
|
51
|
+
#header ul#menu li {
|
52
|
+
float: left;
|
53
|
+
margin-right: 0.5em;
|
54
|
+
background:rgba(255,255,255,0.5);
|
55
|
+
padding:5px;
|
56
|
+
}
|
57
|
+
|
58
|
+
#header ul#menu li a {
|
59
|
+
color:#336;
|
60
|
+
}
|
61
|
+
|
62
|
+
#header ul#menu li a:hover {
|
63
|
+
color:#09C;
|
64
|
+
}
|
65
|
+
|
66
|
+
#page {
|
67
|
+
clear: both;
|
68
|
+
margin: 0 auto 0 auto;
|
69
|
+
width: 800px;
|
70
|
+
position: relative;
|
71
|
+
min-height: 100%;
|
72
|
+
}
|
73
|
+
|
74
|
+
article {
|
75
|
+
color:#603;
|
76
|
+
border-radius: 10px;
|
77
|
+
border: 3px #FFC solid;
|
78
|
+
-moz-border-radius: 10px;
|
79
|
+
-webkit-border-radius: 10px;
|
80
|
+
padding: 1em 1.5em 1em 1.5em;
|
81
|
+
margin: 1em 0 1em 0;
|
82
|
+
width 100%;
|
83
|
+
background-image:url("../images/orange/bg_entry.jpg");
|
84
|
+
position:relative;
|
85
|
+
}
|
86
|
+
|
87
|
+
article .date {
|
88
|
+
font-size: 1em;
|
89
|
+
text-align: center;
|
90
|
+
background-color:#036;
|
91
|
+
padding:10px;
|
92
|
+
width:100px;
|
93
|
+
float:right;
|
94
|
+
|
95
|
+
position:absolute;
|
96
|
+
top:-24px;
|
97
|
+
left:650px;
|
98
|
+
}
|
99
|
+
|
100
|
+
article .date a {
|
101
|
+
color:#FFF;
|
102
|
+
}
|
103
|
+
|
104
|
+
article .date a:visited {
|
105
|
+
color:#FFF;
|
106
|
+
}
|
107
|
+
|
108
|
+
article .date a:hover {
|
109
|
+
color:#669;
|
110
|
+
}
|
111
|
+
|
112
|
+
article ul#entries > li {
|
113
|
+
margin-top: 1em;
|
114
|
+
}
|
115
|
+
|
116
|
+
article ul#entries {
|
117
|
+
line-height: 1.5em;
|
118
|
+
}
|
119
|
+
|
120
|
+
#entries {
|
121
|
+
width 100%;
|
122
|
+
}
|
123
|
+
|
124
|
+
pre {
|
125
|
+
background: #EEE;
|
126
|
+
color: rgb(0,30,67);
|
127
|
+
padding: 1em;
|
128
|
+
border-radius: 10px;
|
129
|
+
border: 1px #BBB solid;
|
130
|
+
-moz-border-radius: 10px;
|
131
|
+
-webkit-border-radius: 10px;
|
132
|
+
}
|
133
|
+
|
134
|
+
#footer {
|
135
|
+
text-align: center;
|
136
|
+
margin: 1em 0 0 0;
|
137
|
+
padding: 0.5em 0.5em 0.5em 1em;
|
138
|
+
background: #036;
|
139
|
+
color: #FFF;
|
140
|
+
position: relative; bottom: 0;
|
141
|
+
}
|
142
|
+
|
143
|
+
#footer a {
|
144
|
+
color: #FFF;
|
145
|
+
}
|
146
|
+
|
147
|
+
#footer a:visited {
|
148
|
+
color: #FFF;
|
149
|
+
}
|
150
|
+
|
151
|
+
#footer a:hover {
|
152
|
+
color: #669;
|
153
|
+
}
|
154
|
+
|
data/lib/retter/command.rb
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
class Retter::Command < Thor
|
4
4
|
desc 'edit', 'Open $EDITOR. Write an article with Markdown.'
|
5
|
-
method_options date: :string
|
5
|
+
method_options date: :string, silent: :boolean
|
6
6
|
def edit
|
7
7
|
system config.editor, detected_retter_file.to_s
|
8
8
|
|
9
|
-
invoke_after :edit
|
9
|
+
invoke_after :edit unless options[:silent]
|
10
10
|
end
|
11
11
|
|
12
12
|
default_task :edit
|
@@ -26,19 +26,25 @@ class Retter::Command < Thor
|
|
26
26
|
end
|
27
27
|
|
28
28
|
desc 'rebind', 'Bind the draft article, re-generate all html pages.'
|
29
|
+
method_options silent: :boolean
|
29
30
|
def rebind
|
30
31
|
binder = Retter::Stationery.binder(config)
|
31
32
|
|
32
33
|
binder.commit_wip_file
|
33
34
|
binder.rebind!
|
34
35
|
|
35
|
-
|
36
|
+
unless options[:silent]
|
37
|
+
invoke_after :bind
|
38
|
+
invoke_after :rebind
|
39
|
+
end
|
36
40
|
end
|
37
41
|
|
38
42
|
desc 'bind', 'Re-bind the draft article, re-generate all html pages.'
|
43
|
+
method_options silent: :boolean
|
39
44
|
alias_method :bind, :rebind
|
40
45
|
|
41
46
|
desc 'commit', "cd $RETTER_HOME && git add . && git commit -m 'Retter commit'"
|
47
|
+
method_options silent: :boolean
|
42
48
|
def commit
|
43
49
|
working_dir = config.retter_home.to_s
|
44
50
|
git = Grit::Repo.new(working_dir)
|
@@ -47,7 +53,15 @@ class Retter::Command < Thor
|
|
47
53
|
say git.add(working_dir), :green
|
48
54
|
say git.commit_all('Retter commit'), :green
|
49
55
|
|
50
|
-
invoke_after :commit
|
56
|
+
invoke_after :commit unless options[:silent]
|
57
|
+
end
|
58
|
+
|
59
|
+
desc 'home', 'Open a new shell in $RETTER_HOME'
|
60
|
+
def home
|
61
|
+
Dir.chdir config.retter_home.to_s
|
62
|
+
|
63
|
+
system %(PS1="(retter) " #{config.shell})
|
64
|
+
say 'bye', :green
|
51
65
|
end
|
52
66
|
|
53
67
|
desc 'new', 'Create a new site'
|
@@ -98,26 +112,28 @@ class Retter::Command < Thor
|
|
98
112
|
def self.usage
|
99
113
|
<<-EOM
|
100
114
|
Usage:
|
101
|
-
#
|
115
|
+
# Startup
|
102
116
|
cd /path/to/dir
|
103
117
|
retter new my_sweet_diary
|
104
118
|
echo "export EDITOR=vim" >> ~/.zshenv # retter requires $EDITOR.
|
105
119
|
echo "export RETTER_HOME=/path/to/my_sweet_diary" >> ~/.zshenv
|
106
120
|
. ~/.zshenv
|
107
121
|
|
108
|
-
#
|
122
|
+
# Write a article
|
109
123
|
retter # $EDITOR will open. Write an article with Markdown.
|
110
124
|
retter preview # Preview the draft article (browser will open).
|
125
|
+
|
126
|
+
# Publish
|
111
127
|
retter bind # bind the draft article, re-generate all html pages.
|
112
|
-
git add
|
113
|
-
|
114
|
-
git push [remote] [branch]
|
128
|
+
retter commit # shortcut of "cd $RETTER_HOME; git add .; git commit -m 'Retter commit'"
|
129
|
+
cd $RETTER_HOME
|
130
|
+
git push [remote] [branch] # or sftp, rsync, etc...
|
115
131
|
|
116
|
-
#
|
132
|
+
# Specific date
|
117
133
|
retter edit --date=20110101
|
118
134
|
retter preview --date=20110101
|
119
135
|
|
120
|
-
#
|
136
|
+
# Browse offline.
|
121
137
|
retter open # Open your (static) site top page (browser will open).
|
122
138
|
|
123
139
|
See also: https://github.com/hibariya/retter
|
data/lib/retter/config.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
3
|
class Retter::Config
|
4
|
-
ATTRIBUTES =
|
4
|
+
ATTRIBUTES = [
|
5
5
|
:editor,
|
6
|
+
:shell,
|
6
7
|
:title,
|
7
8
|
:description,
|
8
9
|
:url,
|
@@ -41,13 +42,12 @@ class Retter::Config
|
|
41
42
|
|
42
43
|
@retter_home = Pathname.new(@env['RETTER_HOME'])
|
43
44
|
load_defaults
|
44
|
-
|
45
|
-
retterfile = retter_home.join('Retterfile')
|
46
|
-
instance_eval retterfile.read if retterfile.exist?
|
45
|
+
load_retterfile_if_exists
|
47
46
|
end
|
48
47
|
|
49
48
|
def load_defaults
|
50
49
|
editor @env['EDITOR']
|
50
|
+
shell @env['SHELL']
|
51
51
|
url 'http://example.com'
|
52
52
|
retters_dir retter_home.join('retters/')
|
53
53
|
wip_file retters_dir.join('today.md')
|
@@ -64,6 +64,11 @@ class Retter::Config
|
|
64
64
|
feed_file retter_home.join('entries.rss')
|
65
65
|
end
|
66
66
|
|
67
|
+
def load_retterfile_if_exists
|
68
|
+
retterfile = retter_home.join('Retterfile')
|
69
|
+
instance_eval retterfile.read if retterfile.exist?
|
70
|
+
end
|
71
|
+
|
67
72
|
def detect_retter_home
|
68
73
|
# TODO こういうの上のディレクトリも見て判断するのを何か参考にして書く
|
69
74
|
@env['RETTER_HOME'] = Dir.pwd if File.exist? 'Retterfile'
|
@@ -12,18 +12,6 @@ module Retter::Stationery
|
|
12
12
|
@config = config
|
13
13
|
end
|
14
14
|
|
15
|
-
def view_scope
|
16
|
-
@view_scope ||= View::Scope.new(config, entries: entries)
|
17
|
-
end
|
18
|
-
|
19
|
-
def layout_renderer
|
20
|
-
@layout_renderer ||= Haml::Engine.new(layout_file.read, ugly: true)
|
21
|
-
end
|
22
|
-
|
23
|
-
def entry_renderer
|
24
|
-
@entry_renderer ||= Haml::Engine.new(entry_layout_file.read, ugly: true)
|
25
|
-
end
|
26
|
-
|
27
15
|
def rebind!
|
28
16
|
commit_wip_file
|
29
17
|
|
@@ -118,5 +106,19 @@ module Retter::Stationery
|
|
118
106
|
def entry_url(date, id = nil)
|
119
107
|
(URI.parse(url) + date.strftime('/entries/%Y%m%d.html')).to_s
|
120
108
|
end
|
109
|
+
|
110
|
+
private
|
111
|
+
|
112
|
+
def view_scope
|
113
|
+
@view_scope ||= View::Scope.new(config, entries: entries)
|
114
|
+
end
|
115
|
+
|
116
|
+
def layout_renderer
|
117
|
+
@layout_renderer ||= Haml::Engine.new(layout_file.read, ugly: true)
|
118
|
+
end
|
119
|
+
|
120
|
+
def entry_renderer
|
121
|
+
@entry_renderer ||= Haml::Engine.new(entry_layout_file.read, ugly: true)
|
122
|
+
end
|
121
123
|
end
|
122
124
|
end
|
@@ -16,24 +16,32 @@ module Retter::Stationery
|
|
16
16
|
load_wip_entry_if_needed
|
17
17
|
end
|
18
18
|
|
19
|
+
def print
|
20
|
+
build_entry
|
21
|
+
print_html
|
22
|
+
end
|
23
|
+
|
19
24
|
def file_path
|
20
25
|
config.retter_home.join '.preview.html'
|
21
26
|
end
|
22
27
|
|
23
|
-
|
24
|
-
Haml::Engine.new(layout_file.read, ugly: true)
|
25
|
-
end
|
28
|
+
private
|
26
29
|
|
27
|
-
def
|
28
|
-
|
30
|
+
def load_retter_file
|
31
|
+
retter_file = retter_file(@date)
|
32
|
+
@body = retter_file.exist? ? retter_file.read : ''
|
29
33
|
end
|
30
34
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
35
|
+
def load_wip_entry_if_needed
|
36
|
+
if @date == Date.today && wip_file.exist?
|
37
|
+
@body = [@body, wip_file.read].join("\n")
|
38
|
+
end
|
34
39
|
end
|
35
40
|
|
36
|
-
|
41
|
+
def build_entry
|
42
|
+
body_html = Retter::Stationery.markupper.render(@body)
|
43
|
+
@entry = Retter::Entry.new(date: @date, body: body_html)
|
44
|
+
end
|
37
45
|
|
38
46
|
def print_html
|
39
47
|
scope = View::Scope.new(config)
|
@@ -45,19 +53,12 @@ module Retter::Stationery
|
|
45
53
|
end
|
46
54
|
end
|
47
55
|
|
48
|
-
def
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
def load_retter_file
|
53
|
-
retter_file = retter_file(@date)
|
54
|
-
@body = retter_file.exist? ? retter_file.read : ''
|
56
|
+
def renderer
|
57
|
+
Haml::Engine.new(layout_file.read, ugly: true)
|
55
58
|
end
|
56
59
|
|
57
|
-
def
|
58
|
-
|
59
|
-
@body = [@body, wip_file.read].join("\n")
|
60
|
-
end
|
60
|
+
def entry_renderer
|
61
|
+
Haml::Engine.new(entry_layout_file.read, ugly: true)
|
61
62
|
end
|
62
63
|
end
|
63
64
|
end
|
@@ -7,6 +7,16 @@ module Retter::Stationery::View
|
|
7
7
|
def fix_path(html, prefix='./')
|
8
8
|
elements = Nokogiri::HTML(html)
|
9
9
|
|
10
|
+
fix_href_path(fix_src_path(elements, prefix), prefix).to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
def entry_path(date, id = nil)
|
14
|
+
date.strftime('/entries/%Y%m%d.html') + (id ? "##{id}" : '')
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def fix_src_path(elements, prefix = './')
|
10
20
|
elements.search("[src!=''][src!='']").each do |el|
|
11
21
|
src = el.attr('src').scan(/[^\.\/]{3}.*/).first
|
12
22
|
next if src =~ /^(?:http|https):\/\//
|
@@ -14,6 +24,10 @@ module Retter::Stationery::View
|
|
14
24
|
el.set_attribute 'src', [prefix, src].join
|
15
25
|
end
|
16
26
|
|
27
|
+
elements
|
28
|
+
end
|
29
|
+
|
30
|
+
def fix_href_path(elements, prefix = './')
|
17
31
|
elements.search("[href][href!='#']").each do |el|
|
18
32
|
href = el.attr('href')
|
19
33
|
next if href =~ /^(?:http|https):\/\//
|
@@ -25,12 +39,9 @@ module Retter::Stationery::View
|
|
25
39
|
end
|
26
40
|
end
|
27
41
|
|
28
|
-
elements
|
42
|
+
elements
|
29
43
|
end
|
30
44
|
|
31
|
-
def entry_path(date, id = nil)
|
32
|
-
date.strftime('/entries/%Y%m%d.html') + (id ? "##{id}" : '')
|
33
|
-
end
|
34
45
|
end
|
35
46
|
|
36
47
|
class Scope
|
@@ -43,9 +54,7 @@ module Retter::Stationery::View
|
|
43
54
|
def_delegators :@config, *Retter::Config.delegatables
|
44
55
|
|
45
56
|
[:entries].each do |meth|
|
46
|
-
define_method meth
|
47
|
-
@assigns[meth]
|
48
|
-
end
|
57
|
+
define_method(meth) { @assigns[meth] }
|
49
58
|
end
|
50
59
|
|
51
60
|
def initialize(config, assigns = {})
|
data/lib/retter/version.rb
CHANGED
data/retter.gemspec
CHANGED
@@ -5,7 +5,7 @@ require "retter/version"
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "retter"
|
7
7
|
s.version = Retter::VERSION
|
8
|
-
s.authors = ["hibariya"]
|
8
|
+
s.authors = ["hibariya", "uzura29"]
|
9
9
|
s.email = ["celluloid.key@gmail.com"]
|
10
10
|
s.homepage = "https://github.com/hibariya/retter"
|
11
11
|
s.summary = %q{Lightweight diary workflow}
|
data/spec/command/commit_spec.rb
CHANGED
@@ -15,9 +15,23 @@ describe 'Retter::Command#commit', clean: :all do
|
|
15
15
|
command.stub!(:say) { true }
|
16
16
|
wip_file.open('w') {|f| f.puts article }
|
17
17
|
command.rebind
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'with no options' do
|
21
|
+
before do
|
22
|
+
command.should_receive(:invoke_after).with(:commit)
|
23
|
+
command.commit
|
24
|
+
end
|
18
25
|
|
19
|
-
|
26
|
+
it { repo.commits.first.message.should == 'Retter commit' }
|
20
27
|
end
|
21
28
|
|
22
|
-
|
29
|
+
context 'with silent option' do
|
30
|
+
before do
|
31
|
+
command.stub!(:options) { {silent: true} }
|
32
|
+
command.should_not_receive(:invoke_after)
|
33
|
+
end
|
34
|
+
|
35
|
+
it { command.commit.should }
|
36
|
+
end
|
23
37
|
end
|
data/spec/command/edit_spec.rb
CHANGED
@@ -12,6 +12,7 @@ describe 'Retter::Command#edit', clean: :all do
|
|
12
12
|
|
13
13
|
context 'no options' do
|
14
14
|
before do
|
15
|
+
command.should_receive(:invoke_after).with(:edit)
|
15
16
|
command.edit
|
16
17
|
end
|
17
18
|
|
@@ -38,11 +39,13 @@ describe 'Retter::Command#edit', clean: :all do
|
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
41
|
-
context 'with date' do
|
42
|
+
context 'with date option' do
|
42
43
|
let(:date_str) { '20110101' }
|
43
44
|
|
44
45
|
before do
|
45
46
|
command.stub!(:options) { {date: date_str} }
|
47
|
+
|
48
|
+
command.should_receive(:invoke_after).with(:edit)
|
46
49
|
command.edit
|
47
50
|
end
|
48
51
|
|
@@ -54,4 +57,15 @@ describe 'Retter::Command#edit', clean: :all do
|
|
54
57
|
it { should written }
|
55
58
|
end
|
56
59
|
end
|
60
|
+
|
61
|
+
context 'with silent option' do
|
62
|
+
before do
|
63
|
+
command.stub!(:options) { {silent: true} }
|
64
|
+
|
65
|
+
command.should_not_receive(:invoke_after)
|
66
|
+
command.edit
|
67
|
+
end
|
68
|
+
|
69
|
+
it { wip_file.should written }
|
70
|
+
end
|
57
71
|
end
|
data/spec/command/rebind_spec.rb
CHANGED
@@ -28,6 +28,8 @@ describe 'Retter::Command#rebind', clean: :all do
|
|
28
28
|
wip_file.open('w') {|f| f.puts article }
|
29
29
|
Date.stub!(:today).and_return(Date.parse(date_str))
|
30
30
|
|
31
|
+
command.should_receive(:invoke_after).with(:bind)
|
32
|
+
command.should_receive(:invoke_after).with(:rebind)
|
31
33
|
command.rebind
|
32
34
|
end
|
33
35
|
|
@@ -58,4 +60,15 @@ describe 'Retter::Command#rebind', clean: :all do
|
|
58
60
|
it { texts_of(entry_html, '.entry h1').should == %w(2011/01/01 朝11時 夜1時) }
|
59
61
|
end
|
60
62
|
end
|
63
|
+
|
64
|
+
context 'with silent option' do
|
65
|
+
before do
|
66
|
+
wip_file.open('w') {|f| f.puts 'article' }
|
67
|
+
command.stub!(:options) { {silent: true} }
|
68
|
+
|
69
|
+
command.should_not_receive(:invoke_after)
|
70
|
+
end
|
71
|
+
|
72
|
+
it { command.rebind.should }
|
73
|
+
end
|
61
74
|
end
|
metadata
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: retter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- hibariya
|
9
|
+
- uzura29
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2011-09-
|
13
|
+
date: 2011-09-20 00:00:00.000000000Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: thor
|
16
|
-
requirement: &
|
17
|
+
requirement: &70099940455160 !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
18
19
|
requirements:
|
19
20
|
- - ! '>='
|
@@ -21,10 +22,10 @@ dependencies:
|
|
21
22
|
version: 0.14.6
|
22
23
|
type: :runtime
|
23
24
|
prerelease: false
|
24
|
-
version_requirements: *
|
25
|
+
version_requirements: *70099940455160
|
25
26
|
- !ruby/object:Gem::Dependency
|
26
27
|
name: builder
|
27
|
-
requirement: &
|
28
|
+
requirement: &70099940452260 !ruby/object:Gem::Requirement
|
28
29
|
none: false
|
29
30
|
requirements:
|
30
31
|
- - ! '>='
|
@@ -32,10 +33,10 @@ dependencies:
|
|
32
33
|
version: 3.0.0
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements: *
|
36
|
+
version_requirements: *70099940452260
|
36
37
|
- !ruby/object:Gem::Dependency
|
37
38
|
name: redcarpet
|
38
|
-
requirement: &
|
39
|
+
requirement: &70099940451680 !ruby/object:Gem::Requirement
|
39
40
|
none: false
|
40
41
|
requirements:
|
41
42
|
- - ! '>='
|
@@ -43,10 +44,10 @@ dependencies:
|
|
43
44
|
version: 2.0.0b3
|
44
45
|
type: :runtime
|
45
46
|
prerelease: false
|
46
|
-
version_requirements: *
|
47
|
+
version_requirements: *70099940451680
|
47
48
|
- !ruby/object:Gem::Dependency
|
48
49
|
name: coderay
|
49
|
-
requirement: &
|
50
|
+
requirement: &70099940451100 !ruby/object:Gem::Requirement
|
50
51
|
none: false
|
51
52
|
requirements:
|
52
53
|
- - ! '>='
|
@@ -54,10 +55,10 @@ dependencies:
|
|
54
55
|
version: 0.9.8
|
55
56
|
type: :runtime
|
56
57
|
prerelease: false
|
57
|
-
version_requirements: *
|
58
|
+
version_requirements: *70099940451100
|
58
59
|
- !ruby/object:Gem::Dependency
|
59
60
|
name: nokogiri
|
60
|
-
requirement: &
|
61
|
+
requirement: &70099940450560 !ruby/object:Gem::Requirement
|
61
62
|
none: false
|
62
63
|
requirements:
|
63
64
|
- - ! '>='
|
@@ -65,10 +66,10 @@ dependencies:
|
|
65
66
|
version: 1.5.0
|
66
67
|
type: :runtime
|
67
68
|
prerelease: false
|
68
|
-
version_requirements: *
|
69
|
+
version_requirements: *70099940450560
|
69
70
|
- !ruby/object:Gem::Dependency
|
70
71
|
name: launchy
|
71
|
-
requirement: &
|
72
|
+
requirement: &70099940450040 !ruby/object:Gem::Requirement
|
72
73
|
none: false
|
73
74
|
requirements:
|
74
75
|
- - ! '>='
|
@@ -76,10 +77,10 @@ dependencies:
|
|
76
77
|
version: 2.0.5
|
77
78
|
type: :runtime
|
78
79
|
prerelease: false
|
79
|
-
version_requirements: *
|
80
|
+
version_requirements: *70099940450040
|
80
81
|
- !ruby/object:Gem::Dependency
|
81
82
|
name: haml
|
82
|
-
requirement: &
|
83
|
+
requirement: &70099940449440 !ruby/object:Gem::Requirement
|
83
84
|
none: false
|
84
85
|
requirements:
|
85
86
|
- - ! '>='
|
@@ -87,10 +88,10 @@ dependencies:
|
|
87
88
|
version: 3.1.3
|
88
89
|
type: :runtime
|
89
90
|
prerelease: false
|
90
|
-
version_requirements: *
|
91
|
+
version_requirements: *70099940449440
|
91
92
|
- !ruby/object:Gem::Dependency
|
92
93
|
name: bundler
|
93
|
-
requirement: &
|
94
|
+
requirement: &70099940448860 !ruby/object:Gem::Requirement
|
94
95
|
none: false
|
95
96
|
requirements:
|
96
97
|
- - ! '>='
|
@@ -98,10 +99,10 @@ dependencies:
|
|
98
99
|
version: '1.0'
|
99
100
|
type: :runtime
|
100
101
|
prerelease: false
|
101
|
-
version_requirements: *
|
102
|
+
version_requirements: *70099940448860
|
102
103
|
- !ruby/object:Gem::Dependency
|
103
104
|
name: grit
|
104
|
-
requirement: &
|
105
|
+
requirement: &70099940448280 !ruby/object:Gem::Requirement
|
105
106
|
none: false
|
106
107
|
requirements:
|
107
108
|
- - ! '>='
|
@@ -109,10 +110,10 @@ dependencies:
|
|
109
110
|
version: 2.4.1
|
110
111
|
type: :runtime
|
111
112
|
prerelease: false
|
112
|
-
version_requirements: *
|
113
|
+
version_requirements: *70099940448280
|
113
114
|
- !ruby/object:Gem::Dependency
|
114
115
|
name: rake
|
115
|
-
requirement: &
|
116
|
+
requirement: &70099940447700 !ruby/object:Gem::Requirement
|
116
117
|
none: false
|
117
118
|
requirements:
|
118
119
|
- - ! '>='
|
@@ -120,10 +121,10 @@ dependencies:
|
|
120
121
|
version: 0.9.2
|
121
122
|
type: :development
|
122
123
|
prerelease: false
|
123
|
-
version_requirements: *
|
124
|
+
version_requirements: *70099940447700
|
124
125
|
- !ruby/object:Gem::Dependency
|
125
126
|
name: ir_b
|
126
|
-
requirement: &
|
127
|
+
requirement: &70099940447220 !ruby/object:Gem::Requirement
|
127
128
|
none: false
|
128
129
|
requirements:
|
129
130
|
- - ! '>='
|
@@ -131,10 +132,10 @@ dependencies:
|
|
131
132
|
version: 1.4.0
|
132
133
|
type: :development
|
133
134
|
prerelease: false
|
134
|
-
version_requirements: *
|
135
|
+
version_requirements: *70099940447220
|
135
136
|
- !ruby/object:Gem::Dependency
|
136
137
|
name: tapp
|
137
|
-
requirement: &
|
138
|
+
requirement: &70099940446620 !ruby/object:Gem::Requirement
|
138
139
|
none: false
|
139
140
|
requirements:
|
140
141
|
- - ! '>='
|
@@ -142,10 +143,10 @@ dependencies:
|
|
142
143
|
version: 1.1.0
|
143
144
|
type: :development
|
144
145
|
prerelease: false
|
145
|
-
version_requirements: *
|
146
|
+
version_requirements: *70099940446620
|
146
147
|
- !ruby/object:Gem::Dependency
|
147
148
|
name: rspec
|
148
|
-
requirement: &
|
149
|
+
requirement: &70099940446040 !ruby/object:Gem::Requirement
|
149
150
|
none: false
|
150
151
|
requirements:
|
151
152
|
- - ! '>='
|
@@ -153,10 +154,10 @@ dependencies:
|
|
153
154
|
version: 2.6.0
|
154
155
|
type: :development
|
155
156
|
prerelease: false
|
156
|
-
version_requirements: *
|
157
|
+
version_requirements: *70099940446040
|
157
158
|
- !ruby/object:Gem::Dependency
|
158
159
|
name: simplecov
|
159
|
-
requirement: &
|
160
|
+
requirement: &70099940445440 !ruby/object:Gem::Requirement
|
160
161
|
none: false
|
161
162
|
requirements:
|
162
163
|
- - ! '>='
|
@@ -164,7 +165,7 @@ dependencies:
|
|
164
165
|
version: 0.5.3
|
165
166
|
type: :development
|
166
167
|
prerelease: false
|
167
|
-
version_requirements: *
|
168
|
+
version_requirements: *70099940445440
|
168
169
|
description: Lightweight diary workflow. ruby-1.9.2 or later is required.
|
169
170
|
email:
|
170
171
|
- celluloid.key@gmail.com
|
@@ -186,6 +187,9 @@ files:
|
|
186
187
|
- lib/generator/skel/config.ru
|
187
188
|
- lib/generator/skel/entries/.gitkeep
|
188
189
|
- lib/generator/skel/images/.gitkeep
|
190
|
+
- lib/generator/skel/images/orange/bg_body.jpg
|
191
|
+
- lib/generator/skel/images/orange/bg_entry.jpg
|
192
|
+
- lib/generator/skel/images/orange/bg_header.png
|
189
193
|
- lib/generator/skel/index.html
|
190
194
|
- lib/generator/skel/javascripts/.gitkeep
|
191
195
|
- lib/generator/skel/layouts/entries.html.haml
|
@@ -194,7 +198,9 @@ files:
|
|
194
198
|
- lib/generator/skel/layouts/profile.html.haml
|
195
199
|
- lib/generator/skel/layouts/retter.html.haml
|
196
200
|
- lib/generator/skel/retters/.gitkeep
|
197
|
-
- lib/generator/skel/stylesheets/
|
201
|
+
- lib/generator/skel/stylesheets/base.css
|
202
|
+
- lib/generator/skel/stylesheets/orange.css
|
203
|
+
- lib/generator/skel/stylesheets/retter.css
|
198
204
|
- lib/retter.rb
|
199
205
|
- lib/retter/command.rb
|
200
206
|
- lib/retter/config.rb
|