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

- (Hash) default_options

Gets the default options.

Returns:

  • (Hash)

    The default options.



42
43
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
# File 'lib/mbrao/rendering_engines/html_pipeline.rb', line 42

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.is_a?(Hash) ? context.symbolize_keys : {}

    begin
      create_pipeline(options, context).call(get_body(content, options))[:output].to_s
    rescue Mbrao::Exceptions::UnavailableLocalization => le
      raise le
    rescue Exception => 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.collect {|v| v.ensure_array.flatten.compact.collect { |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.is_a?(Hash) ? value : {}
  end

  private
    # Sanitizes options.
    #
    # @param options [Hash] The options to sanitize.
    # @return [Hash] The sanitized options.
    def sanitize_options(options)
      options = options.is_a?(Hash) ? options.symbolize_keys : {}
      options = filter_filters(options)
      options[:pipeline_options] = self.default_options.merge((options[:pipeline_options].is_a?(Hash) ? options[:pipeline_options] : {}).symbolize_keys)

      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(:locale, ::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].collect {|f| ::Mbrao::Parser.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.collect(&:first)).collect(&:to_sym)
    end
end

- (Array) default_pipeline

Gets the default pipeline.

Returns:

  • (Array)

    The default pipeline.



42
43
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
# File 'lib/mbrao/rendering_engines/html_pipeline.rb', line 42

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.is_a?(Hash) ? context.symbolize_keys : {}

    begin
      create_pipeline(options, context).call(get_body(content, options))[:output].to_s
    rescue Mbrao::Exceptions::UnavailableLocalization => le
      raise le
    rescue Exception => 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.collect {|v| v.ensure_array.flatten.compact.collect { |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.is_a?(Hash) ? value : {}
  end

  private
    # Sanitizes options.
    #
    # @param options [Hash] The options to sanitize.
    # @return [Hash] The sanitized options.
    def sanitize_options(options)
      options = options.is_a?(Hash) ? options.symbolize_keys : {}
      options = filter_filters(options)
      options[:pipeline_options] = self.default_options.merge((options[:pipeline_options].is_a?(Hash) ? options[:pipeline_options] : {}).symbolize_keys)

      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(:locale, ::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].collect {|f| ::Mbrao::Parser.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.collect(&:first)).collect(&:to_sym)
    end
end

Instance Method Details

- (Object) render(content, options = {}, context = {})

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.



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

def render(content, options = {}, context = {})
  options = sanitize_options(options)
  context = context.is_a?(Hash) ? context.symbolize_keys : {}

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