satanic_pages 0.2.0 → 0.3.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7f12bb06b37c9fb4c72dd76b00d111ab35f58dde16ff29f41e0350d8804d63b
4
- data.tar.gz: 73ef5b7324c50858573da13826bcda8d78b25bb67095a155a080b78cfdd95cec
3
+ metadata.gz: e5264574e1f6d505ba74598a648526837b38b6b0d499cd89c9886936b8fcacbc
4
+ data.tar.gz: c7f5f44b3d10490aa7d54cc7418001cc99bb4818376af7cee3d9330ef0539ab3
5
5
  SHA512:
6
- metadata.gz: 3cb2f5dbba04939875fa95820be43e2b77a83533f6c40c1829be5830626589383be67f9eaccfe2e84c9c7e6a34826537ede83623913c43baa49ca9481d3b0fb8
7
- data.tar.gz: bdc640c0ca7eb05ad61d2add08038cdf34ac03a236683bbc8a278008c710e4be0895aede818cd4adfab02820ec51c19f02e9d09c9e3b6316c123f63c1bf5066e
6
+ metadata.gz: 1e2803848dd5f2566d400c91e7915d2b745d388f5f345ed00073fe763bbc71896de0e930cd7206e17da873925b80aeadd02a7e7a40ea00ca33c2ef48d0ddc421
7
+ data.tar.gz: 0c0285c9ce293391d743d636a2fbec4cc2f7317d254bda9ee09123b71d4401196f1da37b3899c3cb529fa6018154fee04b598b91be9c539b0d4ed071dfaf210a
data/README.md CHANGED
@@ -39,6 +39,28 @@ In `app/views/layouts/pages.html.erb`:
39
39
  <% end %>
40
40
  ```
41
41
 
42
+ Frontmatter is supplied as a struct like object.
43
+
44
+ Given this frontmatter:
45
+
46
+ ```yaml
47
+ ---
48
+ author: Beelzebub
49
+ ---
50
+ ```
51
+
52
+ Use `!` and `?` method helpers for added strictness.
53
+
54
+ ```ruby
55
+ data.author # => "Beelzebub"
56
+ data.author! # => "Beelzebub"
57
+ data.author? # => true
58
+
59
+ data.title # => nil
60
+ data.title! # => raises SatanicPages::Frontmatter::MissingAttributeError
61
+ data.title? # => false
62
+ ```
63
+
42
64
  ## Installation
43
65
  Add this line to your application's Gemfile:
44
66
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SatanicPages
2
4
  module Controller
3
5
  extend ActiveSupport::Concern
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SatanicPages
4
+ class Frontmatter
5
+ class MissingAttributeError < StandardError
6
+ end
7
+
8
+ def initialize(hash)
9
+ @hash = (hash&.with_indifferent_access || {}).freeze
10
+ end
11
+
12
+ def to_h
13
+ @hash
14
+ end
15
+
16
+ def method_missing(name, *args)
17
+ if name.to_s.end_with?("!")
18
+ attribute = name.to_s.chomp("!").to_sym
19
+
20
+ unless @hash[attribute]
21
+ raise MissingAttributeError, "Missing attribute: #{name.to_s.chomp("!")}"
22
+ end
23
+
24
+ @hash[attribute]
25
+
26
+ elsif name.to_s.end_with?("?")
27
+ @hash[name.to_s.chomp("?").to_sym].present?
28
+
29
+ else
30
+ @hash[name]
31
+ end
32
+ end
33
+
34
+ def self.parse(source)
35
+ frontmatter = nil
36
+
37
+ rest = source.gsub(/\A---\n(.*?)\n---\n/m) do
38
+ begin
39
+ frontmatter = YAML.safe_load($1)
40
+ ""
41
+ rescue => e
42
+ Rails.logger.error("Error parsing frontmatter: #{e.message}")
43
+ $&
44
+ end
45
+ end
46
+
47
+ [new(frontmatter), rest]
48
+ end
49
+ end
50
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SatanicPages
2
4
  module LayoutHelper
3
5
  # Thank you Sitepress for this lil' goodie
@@ -1,21 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SatanicPages
2
4
  class MarkdownTemplateHandler < MarkdownRails::Renderer::Rails
3
- def preprocess(source)
4
- frontmatter = {}
5
+ include Redcarpet::Render::SmartyPants
5
6
 
6
- content = source.gsub(/\A---\n(.*?)\n---\n/m) do
7
- begin
8
- frontmatter = YAML.safe_load($1)
9
- ""
10
- rescue => e
11
- Rails.logger.error("Error parsing frontmatter: #{e.message}")
12
- $&
13
- end
14
- end
15
-
16
- data = OpenStruct.new(frontmatter)
7
+ def preprocess(source)
8
+ frontmatter, rest = Frontmatter.parse(source)
17
9
 
18
- render(inline: content, handler: :erb, locals: {data:})
10
+ render(inline: rest, handler: :erb, locals: {data: frontmatter})
19
11
  # Remove template comments
20
12
  .gsub(/<!-- (BEGIN|END) (.*) -->/, "")
21
13
  # Force HTML tags to be inline
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "ostruct"
4
-
5
3
  module SatanicPages
6
4
  class Page
7
5
  def initialize(full_path, base_path)
@@ -28,17 +26,7 @@ module SatanicPages
28
26
 
29
27
  @raw = File.read(full_path)
30
28
 
31
- @content = @raw.gsub(/\A---\n(.*?)\n---\n/m) do
32
- begin
33
- @data = OpenStruct.new(YAML.safe_load($1))
34
- nil
35
- rescue => e
36
- Rails.logger.error("Error parsing frontmatter: #{e.message}")
37
- $&
38
- end
39
- end
40
-
41
- @data ||= OpenStruct.new
29
+ @data, @content = Frontmatter.parse(@raw)
42
30
  end
43
31
  end
44
32
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SatanicPages
2
4
  class Railtie < ::Rails::Railtie
3
5
  initializer("satanic_pages.view_helpers") do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SatanicPages
2
- VERSION = "0.2.0"
4
+ VERSION = "0.3.1"
3
5
  end
data/lib/satanic_pages.rb CHANGED
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "markdown-rails"
2
4
 
3
5
  require "satanic_pages/version"
4
6
  require "satanic_pages/railtie"
5
7
 
6
- require "satanic_pages/page"
7
- require "satanic_pages/page_list"
8
-
9
8
  require "satanic_pages/controller"
9
+ require "satanic_pages/frontmatter"
10
10
  require "satanic_pages/layout_helper"
11
+ require "satanic_pages/page"
12
+ require "satanic_pages/page_list"
11
13
 
12
14
  module SatanicPages
13
15
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: satanic_pages
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikkel Malmberg
@@ -9,20 +9,6 @@ bindir: bin
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
- - !ruby/object:Gem::Dependency
13
- name: ostruct
14
- requirement: !ruby/object:Gem::Requirement
15
- requirements:
16
- - - ">="
17
- - !ruby/object:Gem::Version
18
- version: '0.6'
19
- type: :runtime
20
- prerelease: false
21
- version_requirements: !ruby/object:Gem::Requirement
22
- requirements:
23
- - - ">="
24
- - !ruby/object:Gem::Version
25
- version: '0.6'
26
12
  - !ruby/object:Gem::Dependency
27
13
  name: rails
28
14
  requirement: !ruby/object:Gem::Requirement
@@ -63,6 +49,7 @@ files:
63
49
  - Rakefile
64
50
  - lib/satanic_pages.rb
65
51
  - lib/satanic_pages/controller.rb
52
+ - lib/satanic_pages/frontmatter.rb
66
53
  - lib/satanic_pages/layout_helper.rb
67
54
  - lib/satanic_pages/markdown_template_handler.rb
68
55
  - lib/satanic_pages/page.rb