contentfs 0.4.0 → 0.6.2

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: 9e66ff05acd68a19366aae10bfc7c25e0a97c00a498f4654c20e825f4e84a7a2
4
- data.tar.gz: 5da2c74e38cc0a0a05fe3fa942d1c1855bebf41fb8e2e643630d490e2c8241c0
3
+ metadata.gz: 44c0630662c386eee30711ce48061817fecc4d20b619d524b2496811472062a4
4
+ data.tar.gz: b605d224de8a8662cedfa5df0404206b6f5b05d66616954d1e781a1c0845dec6
5
5
  SHA512:
6
- metadata.gz: 5a3a49083b8935a1807b74166430cd3e18a130ba04e948703047a323c5de405c491482bd155fe6ed2f84ac4d1a040fb0e66aee2d76f10956ddb86b84385727f1
7
- data.tar.gz: 7d1ddf1d6454d2a2457bbc4a3bf771b56bcf024f19244edb744f92b9953e81f0fe0fc72a3a08e7e206740a58015858d103fffe01696e31710a55d4a803a07838
6
+ metadata.gz: f6fe40b8bbb1b4f05cd85b4bca5d5535b2cbe73886e679153e02a510a62d3bbe113ac5caa8b8c41b3f77b9c2331b2ff8f2b615a8aae507119394b9cdae3bb232
7
+ data.tar.gz: 50fe653eb6e89011b9ce39021c04e67c26e7037043b536c9776d03f7fc1212621b93a3663785c01e06897346f7d09a67e67ef2fdd9bb043e734fca723e08cc1a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,33 @@
1
+ ## [v0.6.2](https://github.com/metabahn/contentfs/releases/tag/v0.6.2)
2
+
3
+ *released on 2021-04-05*
4
+
5
+ * `fix` [#14](https://github.com/metabahn/contentfs/pull/14) Load metadata for root content ([bryanp](https://github.com/bryanp))
6
+
7
+ ## [v0.6.1](https://github.com/metabahn/contentfs/releases/tag/v0.6.1)
8
+
9
+ *released on 2021-04-02*
10
+
11
+ * `fix` [#13](https://github.com/metabahn/contentfs/pull/13) Resolve includes after rendering ([bryanp](https://github.com/bryanp))
12
+
13
+ ## [v0.6.0](https://github.com/metabahn/contentfs/releases/tag/v0.6.0)
14
+
15
+ *released on 2021-04-02*
16
+
17
+ * `add` [#12](https://github.com/metabahn/contentfs/pull/12) Provide a pattern for preprocessing content ([bryanp](https://github.com/bryanp))
18
+
19
+ ## [v0.5.1](https://github.com/metabahn/contentfs/releases/tag/v0.5.1)
20
+
21
+ *released on 2021-04-02*
22
+
23
+ * `fix` [#11](https://github.com/metabahn/contentfs/pull/11) Handle code blocks with no available lexer ([bryanp](https://github.com/bryanp))
24
+
25
+ ## [v0.5.0](https://github.com/metabahn/contentfs/releases/tag/v0.5.0)
26
+
27
+ *released on 2021-04-01*
28
+
29
+ * `chg` [#10](https://github.com/metabahn/contentfs/pull/10) Replace redcarpet with cmark ([bryanp](https://github.com/bryanp))
30
+
1
31
  ## [v0.4.0](https://github.com/metabahn/contentfs/releases/tag/v0.4.0)
2
32
 
3
33
  *released on 2021-04-01*
data/README.md CHANGED
@@ -40,7 +40,7 @@ The `content` name is special in that it defines content for the containing fold
40
40
 
41
41
  ### Formats
42
42
 
43
- Markdown is supported by default. Simply add the `redcarpet` gem to your project's `Gemfile`. For automatic syntax highlighting, add the `rouge` to your `Gemfile` as well.
43
+ Markdown is supported by default. Simply add the `commonmarker` gem to your project's `Gemfile`. For automatic syntax highlighting, add the `rouge` to your `Gemfile` as well.
44
44
 
45
45
  Unknown formats default to plain text.
46
46
 
@@ -12,8 +12,8 @@ module ContentFS
12
12
  #
13
13
  class Content
14
14
  class << self
15
- def load(path, database:, metadata: {}, namespace: [])
16
- new(path: path, database: database, metadata: metadata, namespace: namespace)
15
+ def load(path, database:, metadata: {}, namespace: [], &block)
16
+ new(path: path, database: database, metadata: metadata, namespace: namespace, &block)
17
17
  end
18
18
  end
19
19
 
@@ -22,7 +22,7 @@ module ContentFS
22
22
 
23
23
  attr_reader :format, :prefix, :slug, :metadata, :namespace
24
24
 
25
- def initialize(path:, database:, metadata: {}, namespace: [])
25
+ def initialize(path:, database:, metadata: {}, namespace: [], &block)
26
26
  path = Pathname.new(path)
27
27
  extname = path.extname
28
28
  name = path.basename(extname)
@@ -34,6 +34,7 @@ module ContentFS
34
34
  @database = database
35
35
 
36
36
  content = path.read
37
+ content = block.call(content) if block
37
38
  @metadata = metadata.merge(parse_metadata(content))
38
39
  @content = content.gsub(FRONT_MATTER_REGEXP, "")
39
40
  end
@@ -43,19 +44,23 @@ module ContentFS
43
44
  end
44
45
 
45
46
  def render
46
- working_content = @content.dup
47
+ if @format && (renderer = Renderers.resolve(@format))
48
+ resolve_includes(renderer.render(@content))
49
+ else
50
+ resolve_includes(to_s)
51
+ end
52
+ end
47
53
 
48
- @content.scan(INCLUDE_REGEXP).each do |match|
54
+ private def resolve_includes(content)
55
+ working_content = content.dup
56
+
57
+ content.scan(INCLUDE_REGEXP) do |match|
49
58
  if (include = @database.find_include(match[0]))
50
59
  working_content.gsub!($~.to_s, include.render)
51
60
  end
52
61
  end
53
62
 
54
- if @format && (renderer = Renderers.resolve(@format))
55
- renderer.render(working_content)
56
- else
57
- to_s
58
- end
63
+ working_content
59
64
  end
60
65
 
61
66
  private def parse_metadata(content)
@@ -11,8 +11,8 @@ module ContentFS
11
11
  #
12
12
  class Database
13
13
  class << self
14
- def load(path, parent: nil, namespace: [], root: true)
15
- new(path: path, parent: parent, namespace: namespace, root: root)
14
+ def load(path, parent: nil, namespace: [], root: true, &block)
15
+ new(path: path, parent: parent, namespace: namespace, root: root, &block)
16
16
  end
17
17
  end
18
18
 
@@ -20,7 +20,7 @@ module ContentFS
20
20
 
21
21
  attr_reader :prefix, :slug, :namespace, :metadata
22
22
 
23
- def initialize(path:, parent: nil, namespace: [], root: false)
23
+ def initialize(path:, parent: nil, namespace: [], root: false, &block)
24
24
  path = Pathname.new(path)
25
25
  name = path.basename(path.extname)
26
26
  prefix, remainder = Prefix.build(name)
@@ -43,8 +43,9 @@ module ContentFS
43
43
 
44
44
  content_path = path.join.glob("_content.*")[0]
45
45
 
46
- @content = if content_path&.exist?
47
- Content.load(content_path, database: self, metadata: @metadata, namespace: @namespace)
46
+ if content_path&.exist?
47
+ @content = Content.load(content_path, database: self, metadata: @metadata, namespace: @namespace, &block)
48
+ @metadata = @content.metadata.dup
48
49
  end
49
50
 
50
51
  children, nested, includes = {}, {}, {}
@@ -53,14 +54,14 @@ module ContentFS
53
54
  next if underscored && path.directory?
54
55
 
55
56
  if path.directory?
56
- database = Database.load(path, parent: self, namespace: @namespace, root: false)
57
+ database = Database.load(path, parent: self, namespace: @namespace, root: false, &block)
57
58
  nested[database.slug] = database
58
59
  elsif underscored
59
- content = Content.load(path, database: self, metadata: @metadata, namespace: @namespace)
60
+ content = Content.load(path, database: self, metadata: @metadata, namespace: @namespace, &block)
60
61
 
61
62
  includes[content.slug.to_s[1..].to_sym] = content
62
63
  else
63
- content = Content.load(path, database: self, metadata: @metadata, namespace: @namespace)
64
+ content = Content.load(path, database: self, metadata: @metadata, namespace: @namespace, &block)
64
65
 
65
66
  children[content.slug] = content
66
67
  end
@@ -1,39 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "redcarpet"
3
+ require "commonmarker"
4
4
 
5
5
  module ContentFS
6
6
  module Renderers
7
7
  # @api private
8
8
  class Markdown
9
9
  class << self
10
- OPTIONS = {
11
- autolink: true,
12
- footnotes: true,
13
- fenced_code_blocks: true,
14
- tables: true
15
- }.freeze
16
-
17
10
  def render(content)
18
- renderer.render(content)
19
- end
20
-
21
- def options
22
- OPTIONS
23
- end
24
-
25
- private def renderer
26
- @_renderer ||= Redcarpet::Markdown.new(Renderer, options)
27
- end
28
- end
29
-
30
- class Renderer < Redcarpet::Render::HTML
31
- def block_quote(quote)
32
- if (match = quote.match(/<p>\[(.*)\]/))
33
- %(<blockquote class="#{match[1]}">#{quote.gsub("[#{match[1]}]", "")}</blockquote>)
34
- else
35
- super
36
- end
11
+ CommonMarker.render_html(content, [:DEFAULT, :UNSAFE])
37
12
  end
38
13
  end
39
14
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rouge"
4
- require "rouge/plugins/redcarpet"
5
4
 
6
5
  require_relative "../markdown"
7
6
 
@@ -12,16 +11,31 @@ module ContentFS
12
11
  class Code
13
12
  class << self
14
13
  def render(content)
15
- renderer.render(content)
14
+ renderer.render(CommonMarker.render_doc(content))
16
15
  end
17
16
 
18
17
  private def renderer
19
- @_renderer ||= Redcarpet::Markdown.new(Renderer, Markdown.options)
18
+ SyntaxRenderer.new(options: [:DEFAULT, :UNSAFE])
20
19
  end
21
20
  end
22
21
 
23
- class Renderer < Markdown::Renderer
24
- include Rouge::Plugins::Redcarpet
22
+ class SyntaxRenderer < CommonMarker::HtmlRenderer
23
+ def code_block(node)
24
+ block do
25
+ language = node.fence_info.split(/\s+/)[0]
26
+ out("<div class=\"highlight\"><pre class=\"highlight #{language}\"><code>")
27
+ out(syntax_highlight(node.string_content, language))
28
+ out('</code></pre></div>')
29
+ end
30
+ end
31
+
32
+ private def syntax_highlight(source, language)
33
+ if (lexer = Rouge::Lexer.find(language))
34
+ Rouge::Formatters::HTML.new.format(lexer.lex(source))
35
+ else
36
+ source
37
+ end
38
+ end
25
39
  end
26
40
  end
27
41
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ContentFS
4
- VERSION = "0.4.0"
4
+ VERSION = "0.6.2"
5
5
 
6
6
  def self.version
7
7
  VERSION
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contentfs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Powell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-01 00:00:00.000000000 Z
11
+ date: 2021-04-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A structured content file system.
14
14
  email: bryan@metabahn.com