serif 0.5.2 → 0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +58 -21
- data/LICENSE +1 -1
- data/README.md +11 -13
- data/lib/serif.rb +3 -2
- data/lib/serif/admin_server.rb +10 -10
- data/lib/serif/commands.rb +2 -2
- data/lib/serif/config.rb +1 -1
- data/lib/serif/content_file.rb +9 -9
- data/lib/serif/draft.rb +1 -1
- data/lib/serif/errors.rb +1 -1
- data/lib/serif/markup_renderer.rb +28 -17
- data/lib/serif/post.rb +1 -1
- data/lib/serif/server.rb +1 -1
- data/lib/serif/site.rb +5 -29
- data/rakefile +3 -6
- data/serif.gemspec +9 -3
- data/statics/assets/js/attachment.js +3 -3
- data/statics/skeleton/_config.yml +1 -1
- data/statics/skeleton/_layouts/default.html +1 -1
- data/statics/skeleton/_templates/archive_page.html +1 -1
- data/statics/skeleton/_templates/post.html +1 -1
- data/statics/skeleton/archive.html +1 -1
- data/statics/skeleton/index.html +1 -1
- data/statics/templates/admin/bookmarks.liquid +1 -1
- data/statics/templates/admin/edit_draft.liquid +1 -1
- data/statics/templates/admin/index.liquid +1 -1
- data/statics/templates/admin/layout.liquid +6 -4
- data/statics/templates/admin/new_draft.liquid +1 -1
- metadata +123 -127
- data/test/commands_spec.rb +0 -77
- data/test/config_spec.rb +0 -55
- data/test/content_file_spec.rb +0 -113
- data/test/draft_spec.rb +0 -275
- data/test/file_digest_tag_spec.rb +0 -38
- data/test/filters_spec.rb +0 -90
- data/test/liquid_filter_date_extension_spec.rb +0 -15
- data/test/markup_renderer_spec.rb +0 -47
- data/test/post_spec.rb +0 -139
- data/test/site_dir/_config.yml +0 -18
- data/test/site_dir/_drafts/another-sample-draft +0 -3
- data/test/site_dir/_drafts/sample-draft +0 -3
- data/test/site_dir/_layouts/alt-layout.html +0 -3
- data/test/site_dir/_layouts/default.html +0 -8
- data/test/site_dir/_posts/2012-01-05-sample-post +0 -4
- data/test/site_dir/_posts/2013-01-01-second-post +0 -4
- data/test/site_dir/_posts/2013-03-07-post-with-custom-layout +0 -5
- data/test/site_dir/_posts/2399-01-01-penultimate-post +0 -4
- data/test/site_dir/_posts/2400-01-01-final-post +0 -4
- data/test/site_dir/_templates/archive_page.html +0 -9
- data/test/site_dir/_templates/post.html +0 -10
- data/test/site_dir/archive.html +0 -7
- data/test/site_dir/file-digest-test.html +0 -4
- data/test/site_dir/index.html +0 -9
- data/test/site_dir/page-alt-layout.html +0 -3
- data/test/site_dir/page-header-but-no-layout.html +0 -3
- data/test/site_dir/test-smarty-filter.html +0 -3
- data/test/site_dir/test-stylesheet.css +0 -3
- data/test/site_generation_spec.rb +0 -204
- data/test/site_spec.rb +0 -189
- data/test/test_helper.rb +0 -61
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b61c8d068281185219f5f139140b82536a96f3a0
|
4
|
+
data.tar.gz: cef7780b4d90162f5fa472274d0430fe2036b141
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2d083eb99ab7f1bc4e3161b9402d6bffea20700c3e624fdf01287caadda0605a70fcc6ef33ccc8301e9f5f8a3bf8ab284c32a719cbc44c684e1fb7ec09caaf9b
|
7
|
+
data.tar.gz: 792eefd28de31b30f1a096d90fdb37f828f889d18d6938dd9f45199860647d1cd2240bcdda425002666c41df756c50971f89f5cbc0a546c8933e4184d099cfcc
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,20 +1,29 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
serif (0.
|
4
|
+
serif (0.5.2)
|
5
|
+
kramdown (~> 1.3)
|
5
6
|
liquid (~> 2.4)
|
6
7
|
nokogiri (~> 1.5)
|
7
8
|
rack (~> 1.0)
|
8
|
-
redcarpet (~> 2.2)
|
9
9
|
redhead (~> 0.0.8)
|
10
|
-
reverse_markdown
|
10
|
+
reverse_markdown
|
11
11
|
rouge (~> 0.3.2)
|
12
|
+
rubypants
|
12
13
|
sinatra (~> 1.3)
|
13
14
|
timeout_cache
|
14
15
|
|
15
16
|
GEM
|
16
17
|
remote: http://rubygems.org/
|
17
18
|
specs:
|
19
|
+
capybara (2.2.1)
|
20
|
+
mime-types (>= 1.16)
|
21
|
+
nokogiri (>= 1.3.3)
|
22
|
+
rack (>= 1.0.0)
|
23
|
+
rack-test (>= 0.5.4)
|
24
|
+
xpath (~> 2.0)
|
25
|
+
cliver (0.3.2)
|
26
|
+
coderay (1.1.0)
|
18
27
|
colorize (0.5.8)
|
19
28
|
coveralls (0.6.3)
|
20
29
|
colorize
|
@@ -22,55 +31,83 @@ GEM
|
|
22
31
|
rest-client
|
23
32
|
simplecov (>= 0.7)
|
24
33
|
thor
|
25
|
-
diff-lcs (1.2.
|
34
|
+
diff-lcs (1.2.5)
|
35
|
+
gherkin (2.12.2)
|
36
|
+
multi_json (~> 1.3)
|
26
37
|
json (1.7.7)
|
27
|
-
|
38
|
+
kramdown (1.3.3)
|
39
|
+
liquid (2.6.1)
|
40
|
+
method_source (0.8.2)
|
28
41
|
mime-types (1.22)
|
42
|
+
mini_portile (0.5.3)
|
29
43
|
multi_json (1.7.2)
|
30
|
-
nokogiri (1.
|
44
|
+
nokogiri (1.6.1)
|
45
|
+
mini_portile (~> 0.5.0)
|
46
|
+
poltergeist (1.5.0)
|
47
|
+
capybara (~> 2.1)
|
48
|
+
cliver (~> 0.3.1)
|
49
|
+
multi_json (~> 1.0)
|
50
|
+
websocket-driver (>= 0.2.0)
|
51
|
+
pry (0.9.12.6)
|
52
|
+
coderay (~> 1.0)
|
53
|
+
method_source (~> 0.8)
|
54
|
+
slop (~> 3.4)
|
31
55
|
rack (1.5.2)
|
32
|
-
rack-protection (1.5.
|
56
|
+
rack-protection (1.5.3)
|
33
57
|
rack
|
58
|
+
rack-test (0.6.2)
|
59
|
+
rack (>= 1.0)
|
34
60
|
rake (0.9.6)
|
35
61
|
rdoc (4.0.1)
|
36
62
|
json (~> 1.4)
|
37
|
-
|
38
|
-
redhead (0.0.8)
|
63
|
+
redhead (0.0.9)
|
39
64
|
rest-client (1.6.7)
|
40
65
|
mime-types (>= 1.16)
|
41
|
-
reverse_markdown (0.
|
66
|
+
reverse_markdown (0.5.1)
|
42
67
|
nokogiri
|
43
|
-
rouge (0.3.
|
68
|
+
rouge (0.3.10)
|
44
69
|
thor
|
45
|
-
rspec (2.
|
46
|
-
rspec-core (~> 2.
|
47
|
-
rspec-expectations (~> 2.
|
48
|
-
rspec-mocks (~> 2.
|
49
|
-
rspec-core (2.
|
50
|
-
rspec-expectations (2.
|
70
|
+
rspec (2.14.1)
|
71
|
+
rspec-core (~> 2.14.0)
|
72
|
+
rspec-expectations (~> 2.14.0)
|
73
|
+
rspec-mocks (~> 2.14.0)
|
74
|
+
rspec-core (2.14.7)
|
75
|
+
rspec-expectations (2.14.5)
|
51
76
|
diff-lcs (>= 1.1.3, < 2.0)
|
52
|
-
rspec-mocks (2.
|
77
|
+
rspec-mocks (2.14.5)
|
78
|
+
rubypants (0.2.0)
|
53
79
|
simplecov (0.7.1)
|
54
80
|
multi_json (~> 1.0)
|
55
81
|
simplecov-html (~> 0.7.1)
|
56
82
|
simplecov-html (0.7.1)
|
57
|
-
sinatra (1.4.
|
58
|
-
rack (~> 1.
|
83
|
+
sinatra (1.4.5)
|
84
|
+
rack (~> 1.4)
|
59
85
|
rack-protection (~> 1.4)
|
60
86
|
tilt (~> 1.3, >= 1.3.4)
|
87
|
+
slop (3.4.7)
|
61
88
|
thor (0.18.1)
|
62
|
-
tilt (1.
|
89
|
+
tilt (1.4.1)
|
63
90
|
timecop (0.6.1)
|
64
91
|
timeout_cache (0.0.2)
|
92
|
+
turnip (1.2.1)
|
93
|
+
gherkin (>= 2.5)
|
94
|
+
rspec (>= 2.0, < 4.0)
|
95
|
+
websocket-driver (0.3.2)
|
96
|
+
xpath (2.0.0)
|
97
|
+
nokogiri (~> 1.3)
|
65
98
|
|
66
99
|
PLATFORMS
|
67
100
|
ruby
|
68
101
|
|
69
102
|
DEPENDENCIES
|
103
|
+
capybara
|
70
104
|
coveralls
|
105
|
+
poltergeist
|
106
|
+
pry
|
71
107
|
rake (~> 0.9)
|
72
108
|
rdoc (~> 4.0.0)
|
73
109
|
rspec (~> 2.5)
|
74
110
|
serif!
|
75
111
|
simplecov (~> 0.7)
|
76
112
|
timecop (~> 0.6.1)
|
113
|
+
turnip
|
data/LICENSE
CHANGED
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
18
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
19
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
20
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
THE SOFTWARE.
|
21
|
+
THE SOFTWARE.
|
data/README.md
CHANGED
@@ -56,14 +56,12 @@ Serif is sort of a blend between Jekyll, [Second Crack](https://github.com/marco
|
|
56
56
|
|
57
57
|
Serif is released under the MIT license. See LICENSE for details.
|
58
58
|
|
59
|
-
Any contributions will be assumed by default to be under the same terms.
|
60
|
-
|
61
59
|
The quickest way to get changes contributed:
|
62
60
|
|
63
61
|
1. Visit the [GitHub repository for Serif](https://github.com/aprescott/serif).
|
64
62
|
2. [Fork the repository](https://help.github.com/articles/fork-a-repo).
|
65
63
|
3. Check out a branch on the latest master for your change: `git checkout -b master new-feature` --- do not make changes on `master`! Make sure that anything added or changed has a test in the `test/` directory. Use the existing files as examples. All tests for new/changed behaviour should pass.
|
66
|
-
4. [Send a pull request on GitHub](https://help.github.com/articles/fork-a-repo), including a description of what you've changed.
|
64
|
+
4. [Send a pull request on GitHub](https://help.github.com/articles/fork-a-repo), including a description of what you've changed.
|
67
65
|
|
68
66
|
For more info on development, see the section at the bottom of this README.
|
69
67
|
|
@@ -162,7 +160,7 @@ Drafts go in `_drafts`, posts go in `_posts`. Simple enough.
|
|
162
160
|
|
163
161
|
Posts must have filenames in the format of `YYYY-MM-DD-your-post`. Drafts do not have a date part, since they're drafts and not published.
|
164
162
|
|
165
|
-
All files in these directories are assumed to be written in Markdown, with simple HTTP-style headers. The Markdown renderer is [
|
163
|
+
All files in these directories are assumed to be written in Markdown, with simple HTTP-style headers. The Markdown renderer is [Kramdown](http://kramdown.gettalong.org/), with Smarty for punctuation tweaks, and Pygments to get syntax highlighting for [GitHub-flavoured fenced code blocks](https://help.github.com/articles/github-flavored-markdown#syntax-highlighting) (although you'll need your own CSS).
|
166
164
|
|
167
165
|
Here's an example post:
|
168
166
|
|
@@ -427,30 +425,30 @@ These tags can be used in templates, in addition to the [standard Liquid filters
|
|
427
425
|
## List of filters
|
428
426
|
|
429
427
|
* `date` with `'now'`
|
430
|
-
|
428
|
+
|
431
429
|
This is a standard filter, but there is a [workaround](https://github.com/Shopify/liquid/pull/117) for
|
432
430
|
`{{ 'now' | date: "%Y" }}` to work, so you can use this in templates.
|
433
431
|
|
434
432
|
* `markdown`
|
435
|
-
|
433
|
+
|
436
434
|
e.g., `{{ post.content | markdown }}`.
|
437
435
|
|
438
436
|
This runs the given input through a Markdown + SmartyPants renderer, with fenced codeblocks enabled.
|
439
437
|
|
440
438
|
* `smarty`
|
441
|
-
|
439
|
+
|
442
440
|
e.g., `{{ post.title | smarty }}`.
|
443
441
|
|
444
442
|
This runs the given input through a SmartyPants processor, so quotes, dashes and ellipses come out better. Note that the **`markdown` filter already does SmartyPants** processing.
|
445
443
|
|
446
444
|
* `strip`
|
447
|
-
|
445
|
+
|
448
446
|
Strips trailing and leading whitespace.
|
449
447
|
|
450
448
|
e.g., `{{ " hello " | strip }}` will render as `hello`.
|
451
449
|
|
452
450
|
* `xmlschema`
|
453
|
-
|
451
|
+
|
454
452
|
e.g., `{{ post.created | xmlschema }}`.
|
455
453
|
|
456
454
|
Takes a Time value and returns an ISO8601-format string, as per Ruby's `Time#xmlschema` definition.
|
@@ -460,7 +458,7 @@ These tags can be used in templates, in addition to the [standard Liquid filters
|
|
460
458
|
If the time value is in UTC: 2013-02-16T22:55:22Z
|
461
459
|
|
462
460
|
* `encode_uri_component`
|
463
|
-
|
461
|
+
|
464
462
|
e.g., `example.com/foo?url=http://mysite.com{{ post.url | encode_uri_component }}`
|
465
463
|
|
466
464
|
Intended to provide the functionality of JavaScript's `encode_uri_component()` function. Essentially:
|
@@ -469,9 +467,9 @@ These tags can be used in templates, in addition to the [standard Liquid filters
|
|
469
467
|
## List of tags
|
470
468
|
|
471
469
|
* `file_digest <path> [prefix:<prefix>]`
|
472
|
-
|
470
|
+
|
473
471
|
(Note: For this tag to return anything, `ENV=production` must be set as an environment variable.)
|
474
|
-
|
472
|
+
|
475
473
|
Computes a hex digest of the contents of `<path>`, optionally prefixed with `<prefix>`. `<path>` is delimited by whitespace.
|
476
474
|
|
477
475
|
Useful for URL fingerprinting for long-lived caching.
|
@@ -537,7 +535,7 @@ Variable | Value
|
|
537
535
|
## Directory structure
|
538
536
|
|
539
537
|
* `lib/serif/` is generally where files go.
|
540
|
-
* `
|
538
|
+
* `spec/` contains the test files. Any new files should have `require "spec_helper"` at the top of the, which pulls in `spec/test_helper.rb`.
|
541
539
|
|
542
540
|
# Changes and what's new
|
543
541
|
|
data/lib/serif.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require "time"
|
2
2
|
|
3
3
|
require "liquid"
|
4
|
-
require "
|
4
|
+
require "kramdown"
|
5
|
+
require "rubypants"
|
5
6
|
require "rouge"
|
6
7
|
require "redhead"
|
7
8
|
require "timeout_cache"
|
@@ -20,4 +21,4 @@ require "serif/site"
|
|
20
21
|
require "serif/config"
|
21
22
|
|
22
23
|
module Serif
|
23
|
-
end
|
24
|
+
end
|
data/lib/serif/admin_server.rb
CHANGED
@@ -71,7 +71,7 @@ class AdminServer
|
|
71
71
|
html_content = document.to_html
|
72
72
|
|
73
73
|
html_content = "<blockquote>#{html_content}</blockquote>"
|
74
|
-
markdown = ReverseMarkdown.
|
74
|
+
markdown = ReverseMarkdown.convert(html_content, github_flavored: true, unknown_tags: :bypass)
|
75
75
|
|
76
76
|
# markdown URLs need to have any )s escaped
|
77
77
|
markdown = "[#{title}](#{url.gsub(")", "\\)")}):\n\n#{markdown}"
|
@@ -88,7 +88,7 @@ class AdminServer
|
|
88
88
|
# there is actually an overall site conflict, then
|
89
89
|
# keep on trucking so it doesn't interrupt the user.
|
90
90
|
if site.conflicts(draft)
|
91
|
-
liquid :new_draft, locals: { conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), post: draft, error_message: "There is a conflict on this draft." }
|
91
|
+
liquid :new_draft, locals: { draft_content: draft.content, conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), post: draft, error_message: "There is a conflict on this draft." }
|
92
92
|
else
|
93
93
|
draft.save(markdown)
|
94
94
|
|
@@ -109,7 +109,7 @@ class AdminServer
|
|
109
109
|
get "/admin/new/draft" do
|
110
110
|
content = Draft.new(site)
|
111
111
|
autofocus = "slug"
|
112
|
-
liquid :new_draft, locals: { conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), post: content, autofocus: autofocus }
|
112
|
+
liquid :new_draft, locals: { draft_content: content.content.to_s, conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), post: content, autofocus: autofocus }
|
113
113
|
end
|
114
114
|
|
115
115
|
post "/admin/new/draft" do
|
@@ -128,11 +128,11 @@ class AdminServer
|
|
128
128
|
autofocus = "title" unless params[:title]
|
129
129
|
autofocus = "slug" unless params[:slug]
|
130
130
|
|
131
|
-
liquid :new_draft, locals: { conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), error_message: error_message, post: content, autofocus: autofocus }
|
131
|
+
liquid :new_draft, locals: { draft_content: params[:markdown].to_s, conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), error_message: error_message, post: content, autofocus: autofocus }
|
132
132
|
else
|
133
133
|
if Draft.exist?(site, params[:slug])
|
134
134
|
error_message = "Draft already eixsts with the given slug #{params[:slug]}."
|
135
|
-
liquid :new_draft, locals: { conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), error_message: error_message, post: content, autofocus: autofocus }
|
135
|
+
liquid :new_draft, locals: { draft_content: params[:markdown].to_s, conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), error_message: error_message, post: content, autofocus: autofocus }
|
136
136
|
else
|
137
137
|
content.save(params[:markdown])
|
138
138
|
begin
|
@@ -179,10 +179,10 @@ class AdminServer
|
|
179
179
|
error_message = "You must pick a URL to use"
|
180
180
|
end
|
181
181
|
|
182
|
-
liquid :edit_draft, locals: { conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), error_message: error_message, post: content, private_url: site.private_url(content) }
|
182
|
+
liquid :edit_draft, locals: { draft_content: params[:markdown].to_s, conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), error_message: error_message, post: content, private_url: site.private_url(content) }
|
183
183
|
elsif (conflicts = site.conflicts)
|
184
184
|
error_message = "The site has a conflict and cannot be generated."
|
185
|
-
liquid :edit_draft, locals: { conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), error_message: error_message, post: content, private_url: site.private_url(content) }
|
185
|
+
liquid :edit_draft, locals: { draft_content: params[:markdown].to_s, conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), error_message: error_message, post: content, private_url: site.private_url(content) }
|
186
186
|
else
|
187
187
|
content.save(params[:markdown])
|
188
188
|
|
@@ -233,7 +233,7 @@ class AdminServer
|
|
233
233
|
redirect to("/admin") unless params[:slug]
|
234
234
|
|
235
235
|
content = Draft.from_slug(site, params[:slug])
|
236
|
-
liquid :edit_draft, locals: { conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), post: content, autofocus: "markdown", private_url: site.private_url(content) }
|
236
|
+
liquid :edit_draft, locals: { draft_content: content.content, conflicts: @conflicts, images_path: site.config.image_upload_path.gsub(/"/, '\"'), post: content, autofocus: "markdown", private_url: site.private_url(content) }
|
237
237
|
end
|
238
238
|
|
239
239
|
post "/admin/delete/?" do
|
@@ -247,7 +247,7 @@ class AdminServer
|
|
247
247
|
content = params["content"]
|
248
248
|
|
249
249
|
if request.xhr?
|
250
|
-
|
250
|
+
Serif::Markdown.render(content).strip
|
251
251
|
end
|
252
252
|
end
|
253
253
|
|
@@ -289,4 +289,4 @@ class AdminServer
|
|
289
289
|
app.run!
|
290
290
|
end
|
291
291
|
end
|
292
|
-
end
|
292
|
+
end
|
data/lib/serif/commands.rb
CHANGED
data/lib/serif/config.rb
CHANGED
data/lib/serif/content_file.rb
CHANGED
@@ -50,7 +50,7 @@ class ContentFile
|
|
50
50
|
|
51
51
|
@cached_headers = nil
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
# Returns true if the file is in the directory for draft content, or
|
55
55
|
# has no saved path yet.
|
56
56
|
def draft?
|
@@ -68,7 +68,7 @@ class ContentFile
|
|
68
68
|
|
69
69
|
File.dirname(path) == File.join(site.directory, Post.dirname)
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
def content(include_headers = false)
|
73
73
|
include_headers ? "#{@source.headers.to_s}\n\n#{@source.to_s}" : @source.to_s
|
74
74
|
end
|
@@ -82,7 +82,7 @@ class ContentFile
|
|
82
82
|
return nil if !@source
|
83
83
|
(headers[:updated] || created).utc
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
def headers
|
87
87
|
return @cached_headers if @cached_headers
|
88
88
|
|
@@ -97,7 +97,7 @@ class ContentFile
|
|
97
97
|
if key == :created || key == :updated
|
98
98
|
value = Time.parse(value)
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
converted_headers[key] = value
|
102
102
|
end
|
103
103
|
|
@@ -106,7 +106,7 @@ class ContentFile
|
|
106
106
|
|
107
107
|
def save(markdown = nil)
|
108
108
|
markdown ||= content if @source
|
109
|
-
|
109
|
+
|
110
110
|
save_path = path || "#{self.class.dirname}/#{@slug}"
|
111
111
|
|
112
112
|
# TODO: when a draft is being saved, it will call set_publish_time
|
@@ -115,7 +115,7 @@ class ContentFile
|
|
115
115
|
# between the update time of a brand new published post and the
|
116
116
|
# creation time.
|
117
117
|
set_updated_time(Time.now)
|
118
|
-
|
118
|
+
|
119
119
|
File.open(save_path, "w") do |f|
|
120
120
|
f.puts %Q{#{@source.headers.to_s}
|
121
121
|
|
@@ -127,11 +127,11 @@ class ContentFile
|
|
127
127
|
|
128
128
|
true # always return true for now
|
129
129
|
end
|
130
|
-
|
130
|
+
|
131
131
|
def inspect
|
132
132
|
%Q{<#{self.class} #{headers.inspect}>}
|
133
133
|
end
|
134
|
-
|
134
|
+
|
135
135
|
protected
|
136
136
|
|
137
137
|
def set_publish_time(time)
|
@@ -160,4 +160,4 @@ class ContentFile
|
|
160
160
|
@cached_headers = nil
|
161
161
|
end
|
162
162
|
end
|
163
|
-
end
|
163
|
+
end
|
data/lib/serif/draft.rb
CHANGED
data/lib/serif/errors.rb
CHANGED
@@ -1,21 +1,32 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
1
|
+
module Kramdown
|
2
|
+
module Converter
|
3
|
+
class SerifCustom < Html
|
4
|
+
def convert_codeblock(el, indent)
|
5
|
+
attr = el.attr.dup
|
6
|
+
language = extract_code_language!(attr)
|
7
|
+
if language
|
8
|
+
out = Rouge.highlight(el.value, language, "html")
|
9
|
+
out.sub!(/^(<pre class=\"highlight\">)/, '\1<code>')
|
10
|
+
out.sub!(/<\/pre>\z/, "</code></pre>\n")
|
11
|
+
else
|
12
|
+
super
|
13
|
+
end
|
14
|
+
end
|
12
15
|
end
|
16
|
+
end
|
17
|
+
end
|
13
18
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
+
module Serif
|
20
|
+
class Markdown
|
21
|
+
def self.render(markdown)
|
22
|
+
options = {
|
23
|
+
input: "GFM",
|
24
|
+
auto_id_stripping: true,
|
25
|
+
enable_coderay: false,
|
26
|
+
hard_wrap: false,
|
27
|
+
parse_block_html: false
|
28
|
+
}
|
29
|
+
Kramdown::Document.new(markdown, options).to_serif_custom
|
19
30
|
end
|
20
31
|
end
|
21
|
-
end
|
32
|
+
end
|