summaryrefslogtreecommitdiff
path: root/lib/banzai/reference_extractor.rb
blob: 2c197d31898cb39b21f695de15c4d6daee91a6a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
require 'banzai'

module Banzai
  # Extract possible GFM references from an arbitrary String for further processing.
  class ReferenceExtractor
    class << self
      LAZY_KEY = :banzai_reference_extractor_lazy

      def lazy?
        Thread.current[LAZY_KEY]
      end

      def lazily(values = nil, &block)
        return (values || block.call).uniq if lazy?

        begin
          Thread.current[LAZY_KEY] = true

          values ||= block.call

          Banzai::LazyReference.load(values.uniq).uniq
        ensure
          Thread.current[LAZY_KEY] = false
        end
      end
    end

    def initialize
      @texts = []
    end

    def analyze(text, context = {})
      @texts << Renderer.render(text, context)
    end

    def references(type, context = {})
      filter = Banzai::Filter["#{type}_reference"]

      context.merge!(
        pipeline: :reference_extraction,

        # ReferenceGathererFilter
        reference_filter: filter
      )

      self.class.lazily do
        @texts.flat_map do |html|
          text_context = context.dup
          result = Renderer.render_result(html, text_context)
          result[:references][type]
        end.uniq
      end
    end
  end
end