54 lines
1.2 KiB
Ruby
54 lines
1.2 KiB
Ruby
|
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
|