diff --git a/lib/govuk_markdown.rb b/lib/govuk_markdown.rb index 8c4cdaf..f9a9f58 100644 --- a/lib/govuk_markdown.rb +++ b/lib/govuk_markdown.rb @@ -4,6 +4,7 @@ require_relative "./govuk_markdown/version" require_relative "./govuk_markdown/preprocessor" require_relative "./govuk_markdown/renderer" +require_relative "./govuk_markdown/renderer/mixin" module GovukMarkdown def self.render(markdown, govuk_options = {}) diff --git a/lib/govuk_markdown/renderer.rb b/lib/govuk_markdown/renderer.rb index 787a601..3cf6c1c 100644 --- a/lib/govuk_markdown/renderer.rb +++ b/lib/govuk_markdown/renderer.rb @@ -1,6 +1,9 @@ module GovukMarkdown class Renderer < ::Redcarpet::Render::HTML - include Redcarpet::Render::SmartyPants + autoload :Mixin, "govuk_markdown/renderer/mixin" + + include ::Redcarpet::Render::SmartyPants + include Mixin def initialize(govuk_options, options = {}) @headings_start_with = govuk_options[:headings_start_with] @@ -8,97 +11,5 @@ def initialize(govuk_options, options = {}) super options end - - def table(header, body) - <<~HTML - - - #{header} - - - #{body} - -
- HTML - end - - def table_row(content) - <<~HTML - - #{content} - - HTML - end - - def table_cell(content, _alignment, header) - if header - <<~HTML - - #{content} - - HTML - else - <<~HTML - - #{content} - - HTML - end - end - - def header(text, header_level) - valid_header_sizes = %w[xl l m s].freeze - - start_size = valid_header_sizes.include?(@headings_start_with) ? @headings_start_with : "xl" - - start_size_index = valid_header_sizes.find_index(start_size) - - header_size = valid_header_sizes[start_size_index + header_level - 1] || "s" - - id_attribute = @options[:with_toc_data] ? " id=\"#{text.parameterize}\"" : "" - <<~HTML - #{text} - HTML - end - - def paragraph(text) - <<~HTML -

#{text}

- HTML - end - - def list(contents, list_type) - case list_type - when :unordered - <<~HTML - - HTML - when :ordered - <<~HTML -
    - #{contents} -
- HTML - else - raise "Unexpected type #{list_type.inspect}" - end - end - - def hrule - <<~HTML -
- HTML - end - - def preprocess(document) - Preprocessor - .new(document) - .inject_inset_text - .inject_details - .strip_front_matter(@strip_front_matter) - .output - end end end diff --git a/lib/govuk_markdown/renderer/mixin.rb b/lib/govuk_markdown/renderer/mixin.rb new file mode 100644 index 0000000..0a7624a --- /dev/null +++ b/lib/govuk_markdown/renderer/mixin.rb @@ -0,0 +1,97 @@ +module GovukMarkdown + # Renderer::Mixin overrides methods in Redcarpet::Render::HTML. + # See `GovukMarkdown::Renderer` for an example of how to include it. + module Renderer::Mixin + def table(header, body) + <<~HTML + + + #{header} + + + #{body} + +
+ HTML + end + + def table_row(content) + <<~HTML + + #{content} + + HTML + end + + def table_cell(content, _alignment, header) + if header + <<~HTML + + #{content} + + HTML + else + <<~HTML + + #{content} + + HTML + end + end + + def header(text, header_level) + valid_header_sizes = %w[xl l m s].freeze + + start_size = valid_header_sizes.include?(@headings_start_with) ? @headings_start_with : "xl" + + start_size_index = valid_header_sizes.find_index(start_size) + + header_size = valid_header_sizes[start_size_index + header_level - 1] || "s" + + id_attribute = @options[:with_toc_data] ? " id=\"#{text.parameterize}\"" : "" + <<~HTML + #{text} + HTML + end + + def paragraph(text) + <<~HTML +

#{text}

+ HTML + end + + def list(contents, list_type) + case list_type + when :unordered + <<~HTML + + HTML + when :ordered + <<~HTML +
    + #{contents} +
+ HTML + else + raise "Unexpected type #{list_type.inspect}" + end + end + + def hrule + <<~HTML +
+ HTML + end + + def preprocess(document) + Preprocessor + .new(document) + .inject_inset_text + .inject_details + .strip_front_matter(@strip_front_matter) + .output + end + end +end