Add YamlFrontMatterFilter to the PreProcessPipeline
This filter will detect YAML Front Matter and convert it to an HTML table for prettier formatting.
This commit is contained in:
parent
74751791a8
commit
8eaeda0816
|
@ -0,0 +1,28 @@
|
||||||
|
require 'html/pipeline/filter'
|
||||||
|
require 'yaml'
|
||||||
|
|
||||||
|
module Banzai
|
||||||
|
module Filter
|
||||||
|
class YamlFrontMatterFilter < HTML::Pipeline::Filter
|
||||||
|
DELIM = '---'.freeze
|
||||||
|
|
||||||
|
# Hat-tip to Middleman: https://git.io/v2e0z
|
||||||
|
PATTERN = %r{
|
||||||
|
\A(?:[^\r\n]*coding:[^\r\n]*\r?\n)?
|
||||||
|
(?<start>#{DELIM})[ ]*\r?\n
|
||||||
|
(?<frontmatter>.*?)[ ]*\r?\n?
|
||||||
|
^(?<stop>#{DELIM})[ ]*\r?\n?
|
||||||
|
\r?\n?
|
||||||
|
(?<content>.*)
|
||||||
|
}mx.freeze
|
||||||
|
|
||||||
|
def call
|
||||||
|
match = PATTERN.match(html)
|
||||||
|
|
||||||
|
return html unless match
|
||||||
|
|
||||||
|
"```yaml\n#{match['frontmatter']}\n```\n\n#{match['content']}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,7 +2,8 @@ module Banzai
|
||||||
module Pipeline
|
module Pipeline
|
||||||
class PreProcessPipeline < BasePipeline
|
class PreProcessPipeline < BasePipeline
|
||||||
def self.filters
|
def self.filters
|
||||||
[
|
FilterArray[
|
||||||
|
Filter::YamlFrontMatterFilter
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe Banzai::Filter::YamlFrontMatterFilter, lib: true do
|
||||||
|
include FilterSpecHelper
|
||||||
|
|
||||||
|
it 'allows for `encoding:` before the frontmatter' do
|
||||||
|
content = <<-MD.strip_heredoc
|
||||||
|
# encoding: UTF-8
|
||||||
|
---
|
||||||
|
foo: foo
|
||||||
|
---
|
||||||
|
|
||||||
|
# Header
|
||||||
|
|
||||||
|
Content
|
||||||
|
MD
|
||||||
|
|
||||||
|
output = filter(content)
|
||||||
|
|
||||||
|
expect(output).not_to match 'encoding'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'converts YAML frontmatter to a fenced code block' do
|
||||||
|
content = <<-MD.strip_heredoc
|
||||||
|
---
|
||||||
|
bar: :bar_symbol
|
||||||
|
---
|
||||||
|
|
||||||
|
# Header
|
||||||
|
|
||||||
|
Content
|
||||||
|
MD
|
||||||
|
|
||||||
|
output = filter(content)
|
||||||
|
|
||||||
|
aggregate_failures do
|
||||||
|
expect(output).not_to include '---'
|
||||||
|
expect(output).to include "```yaml\nbar: :bar_symbol\n```"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'on content without frontmatter' do
|
||||||
|
it 'returns the content unmodified' do
|
||||||
|
content = <<-MD.strip_heredoc
|
||||||
|
# This is some Markdown
|
||||||
|
|
||||||
|
It has no YAML frontmatter to parse.
|
||||||
|
MD
|
||||||
|
|
||||||
|
expect(filter(content)).to eq content
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue