From 17634d72ee42bf5c22f557978e1d4d7530912691 Mon Sep 17 00:00:00 2001 From: Travis Miller Date: Fri, 7 Dec 2018 22:05:40 +0000 Subject: Changed frontmatter filtering to support YAML, JSON, TOML, and arbitrary languages --- lib/banzai/filter/front_matter_filter.rb | 34 +++++++++++++++++++++++++++ lib/banzai/filter/yaml_front_matter_filter.rb | 27 --------------------- lib/banzai/pipeline/pre_process_pipeline.rb | 2 +- 3 files changed, 35 insertions(+), 28 deletions(-) create mode 100644 lib/banzai/filter/front_matter_filter.rb delete mode 100644 lib/banzai/filter/yaml_front_matter_filter.rb (limited to 'lib') diff --git a/lib/banzai/filter/front_matter_filter.rb b/lib/banzai/filter/front_matter_filter.rb new file mode 100644 index 00000000000..a27d18facd1 --- /dev/null +++ b/lib/banzai/filter/front_matter_filter.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Banzai + module Filter + class FrontMatterFilter < HTML::Pipeline::Filter + DELIM_LANG = { + '---' => 'yaml', + '+++' => 'toml', + ';;;' => 'json' + }.freeze + + DELIM = Regexp.union(DELIM_LANG.keys) + + PATTERN = %r{ + \A(?:[^\r\n]*coding:[^\r\n]*)? # optional encoding line + \s* + ^(?#{DELIM})[ \t]*(?\S*) # opening front matter marker (optional language specifier) + \s* + ^(?.*?) # front matter (not greedy) + \s* + ^\k # closing front matter marker + \s* + }mx + + def call + html.sub(PATTERN) do |_match| + lang = $~[:lang].presence || DELIM_LANG[$~[:delim]] + + ["```#{lang}", $~[:front_matter], "```", "\n"].join("\n") + end + end + end + end +end diff --git a/lib/banzai/filter/yaml_front_matter_filter.rb b/lib/banzai/filter/yaml_front_matter_filter.rb deleted file mode 100644 index 295964dd75d..00000000000 --- a/lib/banzai/filter/yaml_front_matter_filter.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -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)? - (?#{DELIM})[ ]*\r?\n - (?.*?)[ ]*\r?\n? - ^(?#{DELIM})[ ]*\r?\n? - \r?\n? - (?.*) - }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 diff --git a/lib/banzai/pipeline/pre_process_pipeline.rb b/lib/banzai/pipeline/pre_process_pipeline.rb index c937f783180..4c2b4ca1665 100644 --- a/lib/banzai/pipeline/pre_process_pipeline.rb +++ b/lib/banzai/pipeline/pre_process_pipeline.rb @@ -5,7 +5,7 @@ module Banzai class PreProcessPipeline < BasePipeline def self.filters FilterArray[ - Filter::YamlFrontMatterFilter, + Filter::FrontMatterFilter, Filter::BlockquoteFenceFilter, ] end -- cgit v1.2.1