blob: 5ee3c08c8a733e09a4310aa4ae9e5a37d7c66c98 [file] [log] [blame]
module Rouge
module Guessers
class Source < Guesser
attr_reader :source
def initialize(source)
@source = source
end
def filter(lexers)
# don't bother reading the input if
# we've already filtered to 1
return lexers if lexers.size == 1
# If we're filtering against *all* lexers, we only use confident return
# values from analyze_text. But if we've filtered down already, we can trust
# the analysis more.
threshold = lexers.size < 10 ? 0 : 0.5
source_text = case @source
when String
@source
when ->(s){ s.respond_to? :read }
@source.read
else
raise 'invalid source'
end
Lexer.assert_utf8!(source_text)
source_text = TextAnalyzer.new(source_text)
collect_best(lexers, threshold: threshold) do |lexer|
next unless lexer.methods(false).include? :analyze_text
lexer.analyze_text(source_text)
end
end
end
end
end