Class: Mbrao::RenderingEngines::HtmlPipeline

Inherits:
Base
  • Object
show all
Defined in:
lib/mbrao/rendering_engines/html_pipeline.rb

Overview

A renders which use the html-pipeline gem.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#default_optionsHash

Gets the default options.

Returns:

  • (Hash)

    The default options.



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/mbrao/rendering_engines/html_pipeline.rb', line 44

class HtmlPipeline < Mbrao::RenderingEngines::Base
  attr_accessor :default_pipeline
  attr_accessor :default_options

  # Renders a content.
  #
  # @param content [Content|String] The content to parse.
  # @param options [Hash] A list of options for renderer.
  # @param context [Hash] A context for rendering.
  def render(content, options = {}, context = {})
    options = sanitize_options(options)
    context = context.ensure_hash(:symbols)

    begin
      create_pipeline(options, context).call(get_body(content, options))[:output].to_s
    rescue Mbrao::Exceptions::UnavailableLocalization => le
      raise le
    rescue => e
      raise ::Mbrao::Exceptions::Rendering.new(e.to_s)
    end
  end

  # Gets the default pipeline.
  #
  # @return [Array] The default pipeline.
  def default_pipeline
    @default_pipeline || [[:kramdown], [:table_of_contents, :toc], [:autolink, :links], [:emoji], [:image_max_width]]
  end

  # Sets the default pipeline.
  #
  # @return [Array] The default pipeline.
  def default_pipeline=(value)
    @default_pipeline = value.ensure_array(nil, false, false) {|v| v.ensure_array(nil, true, true, true) { |p| p.ensure_string.to_sym } }
  end

  # Gets the default options.
  #
  # @return [Hash] The default options.
  def default_options
    @default_options || {gfm: true, asset_root: "/"}
  end

  # Sets the default options.
  #
  # @param value [Object] The new default options.
  def default_options=(value)
    @default_options = value.ensure_hash
  end

  private
    # Sanitizes options.
    #
    # @param options [Hash] The options to sanitize.
    # @return [Hash] The sanitized options.
    def sanitize_options(options)
      options = options.ensure_hash(:symbols)
      options = filter_filters(options)
      options[:pipeline_options] = self.default_options.merge(options[:pipeline_options].ensure_hash(:symbols))

      options
    end

    # Get body of a content.
    #
    # @param content [Content|String] The content to sanitize.
    # @param options [Hash] A list of options for renderer.
    # @return [Array] The body to parse.
    def get_body(content, options)
      content = ::Mbrao::Content.create(nil, content.ensure_string) if !content.is_a?(::Mbrao::Content)
      content.get_body(options.fetch(:locales, ::Mbrao::Parser.locale).ensure_string)
    end

    # Creates the pipeline for rendering.
    #
    # @param options [Hash] A list of options for renderer.
    # @param context [Hash] A context for rendering.
    # @return [HTML::Pipeline] The pipeline
    def create_pipeline(options, context)
      ::HTML::Pipeline.new(
        options[:pipeline].map {|f| ::Lazier.find_class(f, "::HTML::Pipeline::%CLASS%Filter", true) },
        options[:pipeline_options].merge(context)
      )
    end

    # Filters pipeline filters basing on the options provided.
    #
    # @param options [Hash] The original options.
    # @return [Hash] The options with the new set of filters.
    def filter_filters(options)
      options[:pipeline] = get_pipeline(options)

      self.default_pipeline.each do |f|
        options[:pipeline].delete(f.first) if !options.fetch(f.last, true)
      end

      options
    end

    # Gets the pipeline for the current options.
    #
    # @param options [Hash] The options to parse.
    # @return [Array] The pipeline to process.
    def get_pipeline(options)
      options.fetch(:pipeline, self.default_pipeline.map(&:first)).map(&:to_sym)
    end
end

#default_pipelineArray

Gets the default pipeline.

Returns:

  • (Array)

    The default pipeline.



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/mbrao/rendering_engines/html_pipeline.rb', line 44

class HtmlPipeline < Mbrao::RenderingEngines::Base
  attr_accessor :default_pipeline
  attr_accessor :default_options

  # Renders a content.
  #
  # @param content [Content|String] The content to parse.
  # @param options [Hash] A list of options for renderer.
  # @param context [Hash] A context for rendering.
  def render(content, options = {}, context = {})
    options = sanitize_options(options)
    context = context.ensure_hash(:symbols)

    begin
      create_pipeline(options, context).call(get_body(content, options))[:output].to_s
    rescue Mbrao::Exceptions::UnavailableLocalization => le
      raise le
    rescue => e
      raise ::Mbrao::Exceptions::Rendering.new(e.to_s)
    end
  end

  # Gets the default pipeline.
  #
  # @return [Array] The default pipeline.
  def default_pipeline
    @default_pipeline || [[:kramdown], [:table_of_contents, :toc], [:autolink, :links], [:emoji], [:image_max_width]]
  end

  # Sets the default pipeline.
  #
  # @return [Array] The default pipeline.
  def default_pipeline=(value)
    @default_pipeline = value.ensure_array(nil, false, false) {|v| v.ensure_array(nil, true, true, true) { |p| p.ensure_string.to_sym } }
  end

  # Gets the default options.
  #
  # @return [Hash] The default options.
  def default_options
    @default_options || {gfm: true, asset_root: "/"}
  end

  # Sets the default options.
  #
  # @param value [Object] The new default options.
  def default_options=(value)
    @default_options = value.ensure_hash
  end

  private
    # Sanitizes options.
    #
    # @param options [Hash] The options to sanitize.
    # @return [Hash] The sanitized options.
    def sanitize_options(options)
      options = options.ensure_hash(:symbols)
      options = filter_filters(options)
      options[:pipeline_options] = self.default_options.merge(options[:pipeline_options].ensure_hash(:symbols))

      options
    end

    # Get body of a content.
    #
    # @param content [Content|String] The content to sanitize.
    # @param options [Hash] A list of options for renderer.
    # @return [Array] The body to parse.
    def get_body(content, options)
      content = ::Mbrao::Content.create(nil, content.ensure_string) if !content.is_a?(::Mbrao::Content)
      content.get_body(options.fetch(:locales, ::Mbrao::Parser.locale).ensure_string)
    end

    # Creates the pipeline for rendering.
    #
    # @param options [Hash] A list of options for renderer.
    # @param context [Hash] A context for rendering.
    # @return [HTML::Pipeline] The pipeline
    def create_pipeline(options, context)
      ::HTML::Pipeline.new(
        options[:pipeline].map {|f| ::Lazier.find_class(f, "::HTML::Pipeline::%CLASS%Filter", true) },
        options[:pipeline_options].merge(context)
      )
    end

    # Filters pipeline filters basing on the options provided.
    #
    # @param options [Hash] The original options.
    # @return [Hash] The options with the new set of filters.
    def filter_filters(options)
      options[:pipeline] = get_pipeline(options)

      self.default_pipeline.each do |f|
        options[:pipeline].delete(f.first) if !options.fetch(f.last, true)
      end

      options
    end

    # Gets the pipeline for the current options.
    #
    # @param options [Hash] The options to parse.
    # @return [Array] The pipeline to process.
    def get_pipeline(options)
      options.fetch(:pipeline, self.default_pipeline.map(&:first)).map(&:to_sym)
    end
end

Instance Method Details

#render(content, options = {}, context = {}) ⇒ Object

Renders a content.

Parameters:

  • content (Content|String)

    The content to parse.

  • options (Hash) (defaults to: {})

    A list of options for renderer.

  • context (Hash) (defaults to: {})

    A context for rendering.



53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/mbrao/rendering_engines/html_pipeline.rb', line 53

def render(content, options = {}, context = {})
  options = sanitize_options(options)
  context = context.ensure_hash(:symbols)

  begin
    create_pipeline(options, context).call(get_body(content, options))[:output].to_s
  rescue Mbrao::Exceptions::UnavailableLocalization => le
    raise le
  rescue => e
    raise ::Mbrao::Exceptions::Rendering.new(e.to_s)
  end
end