Module: Banzai::Renderer

Defined in:
lib/banzai/renderer.rb

Class Method Summary collapse

Class Method Details

.post_process(html, context) ⇒ Object

Perform post-processing on an HTML String

This method is used to perform state-dependent changes to a String of HTML, such as removing references that the current user doesn't have permission to make (`RedactorFilter`).

html - String to process context - Hash of options to customize output

:pipeline  - Symbol pipeline type
:project   - Project
:user      - User object

Returns an HTML-safe String


55
56
57
58
59
60
61
62
63
64
# File 'lib/banzai/renderer.rb', line 55

def self.post_process(html, context)
  context = Pipeline[context[:pipeline]].transform_context(context)

  pipeline = Pipeline[:post_process]
  if context[:xhtml]
    pipeline.to_document(html, context).to_html(save_with: Nokogiri::XML::Node::SaveOptions::AS_XHTML)
  else
    pipeline.to_html(html, context)
  end.html_safe
end

.pre_process(text, context) ⇒ Object


36
37
38
39
40
# File 'lib/banzai/renderer.rb', line 36

def self.pre_process(text, context)
  pipeline = Pipeline[:pre_process]

  pipeline.to_html(text, context)
end

.render(text, context = {}) ⇒ Object

Convert a Markdown String into an HTML-safe String of HTML

Note that while the returned HTML will have been sanitized of dangerous HTML, it may post a risk of information leakage if it's not also passed through `post_process`.

Also note that the returned String is always HTML, not XHTML. Views requiring XHTML, such as Atom feeds, need to call `post_process` on the result, providing the appropriate `pipeline` option.

markdown - Markdown String context - Hash of context options passed to our HTML Pipeline

Returns an HTML-safe String


17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/banzai/renderer.rb', line 17

def self.render(text, context = {})
  cache_key = context.delete(:cache_key)
  cache_key = full_cache_key(cache_key, context[:pipeline])

  if cache_key
    Gitlab::Metrics.measure(:banzai_cached_render) do
      Rails.cache.fetch(cache_key) do
        cacheless_render(text, context)
      end
    end
  else
    cacheless_render(text, context)
  end
end

.render_result(text, context = {}) ⇒ Object


32
33
34
# File 'lib/banzai/renderer.rb', line 32

def self.render_result(text, context = {})
  Pipeline[context[:pipeline]].call(text, context)
end