diff options
| author | Benjamin Sanders <ben@Benjamins-MacBook-Pro.local> | 2025-10-11 10:34:24 -0400 |
|---|---|---|
| committer | Benjamin Sanders <ben@Benjamins-MacBook-Pro.local> | 2025-10-11 10:34:24 -0400 |
| commit | 5571dc766e2143e39762ff0b47c41d1c2e154f4c (patch) | |
| tree | f4f124d314a7e76c04484515aa0fd1f2e271a601 /vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers | |
| parent | 359f3309c97fc894b63e0a295c76ab298504d635 (diff) | |
Vendor bundled gems for deployment
Diffstat (limited to 'vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers')
7 files changed, 361 insertions, 0 deletions
diff --git a/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/disambiguation.rb b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/disambiguation.rb new file mode 100644 index 0000000..6f2cfd5 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/disambiguation.rb @@ -0,0 +1,162 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + class Disambiguation < Guesser + include Util + include Lexers + + def initialize(filename, source) + @filename = File.basename(filename) + @source = source + end + + def filter(lexers) + return lexers if lexers.size == 1 + return lexers if lexers.size == Lexer.all.size + + @analyzer = TextAnalyzer.new(get_source(@source)) + + self.class.disambiguators.each do |disambiguator| + next unless disambiguator.match?(@filename) + + filtered = disambiguator.decide!(self) + return filtered if filtered + end + + return lexers + end + + def contains?(text) + return @analyzer.include?(text) + end + + def matches?(re) + return !!(@analyzer =~ re) + end + + @disambiguators = [] + def self.disambiguate(*patterns, &decider) + @disambiguators << Disambiguator.new(patterns, &decider) + end + + def self.disambiguators + @disambiguators + end + + class Disambiguator + include Util + + def initialize(patterns, &decider) + @patterns = patterns + @decider = decider + end + + def decide!(guesser) + out = guesser.instance_eval(&@decider) + case out + when Array then out + when nil then nil + else [out] + end + end + + def match?(filename) + @patterns.any? { |p| test_glob(p, filename) } + end + end + + disambiguate '*.cfg' do + next CiscoIos if matches?(/\A\s*(version|banner|interface)\b/) + + INI + end + + disambiguate '*.pl' do + next Perl if contains?('my $') + next Prolog if contains?(':-') + next Prolog if matches?(/\A\w+(\(\w+\,\s*\w+\))*\./) + end + + disambiguate '*.h' do + next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/) + next ObjectiveC if contains?('@"') + next Cpp if matches?(/^\s*(?:catch|class|constexpr|namespace|private| + protected|public|template|throw|try|using)\b/x) + + C + end + + disambiguate '*.m' do + next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/) + next ObjectiveC if contains?('@"') + + next Mathematica if contains?('(*') + next Mathematica if contains?(':=') + + next Mason if matches?(/<%(def|method|text|doc|args|flags|attr|init|once|shared|perl|cleanup|filter)([^>]*)(>)/) + + next Matlab if matches?(/^\s*?%/) + + next Mason if matches? %r!(</?%|<&)! + end + + disambiguate '*.php' do + # PHP always takes precedence over Hack + PHP + end + + disambiguate '*.hh' do + next Cpp if matches?(/^\s*#include/) + next Hack if matches?(/^<\?hh/) + next Hack if matches?(/(\(|, ?)\$\$/) + + Cpp + end + + disambiguate '*.plist' do + next XML if matches?(/\A<\?xml\b/) + + Plist + end + + disambiguate '*.sc' do + next Python if matches?(/^#/) + next SuperCollider if matches?(/(?:^~|;$)/) + + next Python + end + + disambiguate 'Messages' do + next MsgTrans if matches?(/^[^\s:]+:[^\s:]+/) + + next PlainText + end + + disambiguate '*.cls' do + next TeX if matches?(/\A\s*(?:\\|%)/) + next OpenEdge if matches?(/(no\-undo|BLOCK\-LEVEL|ROUTINE\-LEVEL|&ANALYZE\-SUSPEND)/i) + next Apex + end + + disambiguate '*.pp' do + next Puppet if matches?(/(::)?([a-z]\w*::)/) + next Pascal if matches?(/^(function|begin|var)\b/) + next Pascal if matches?(/\b(end(;|\.))/) + + Puppet + end + + disambiguate '*.p' do + next Prolog if contains?(':-') + next Prolog if matches?(/\A\w+(\(\w+\,\s*\w+\))*\./) + next OpenEdge + end + + disambiguate '*.st' do + next IecST if matches?(/^\s*END_/i) + next Smalltalk + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/filename.rb b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/filename.rb new file mode 100644 index 0000000..2f01b4c --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/filename.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + class Filename < Guesser + attr_reader :fname + def initialize(filename) + @filename = filename + end + + # returns a list of lexers that match the given filename with + # equal specificity (i.e. number of wildcards in the pattern). + # This helps disambiguate between, e.g. the Nginx lexer, which + # matches `nginx.conf`, and the Conf lexer, which matches `*.conf`. + # In this case, nginx will win because the pattern has no wildcards, + # while `*.conf` has one. + def filter(lexers) + mapping = {} + lexers.each do |lexer| + mapping[lexer.name] = lexer.filenames || [] + end + + GlobMapping.new(mapping, @filename).filter(lexers) + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/glob_mapping.rb b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/glob_mapping.rb new file mode 100644 index 0000000..615ac2b --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/glob_mapping.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + # This class allows for custom behavior + # with glob -> lexer name mappings + class GlobMapping < Guesser + include Util + + def self.by_pairs(mapping, filename) + glob_map = {} + mapping.each do |(glob, lexer_name)| + lexer = Lexer.find(lexer_name) + + # ignore unknown lexers + next unless lexer + + glob_map[lexer.name] ||= [] + glob_map[lexer.name] << glob + end + + new(glob_map, filename) + end + + attr_reader :glob_map, :filename + def initialize(glob_map, filename) + @glob_map = glob_map + @filename = filename + end + + def filter(lexers) + basename = File.basename(filename) + + collect_best(lexers) do |lexer| + (@glob_map[lexer.name] || []).map do |pattern| + if test_glob(pattern, basename) + # specificity is better the fewer wildcards there are + -pattern.scan(/[*?\[]/).size + end + end.compact.min + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/mimetype.rb b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/mimetype.rb new file mode 100644 index 0000000..92a1d43 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/mimetype.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + class Mimetype < Guesser + attr_reader :mimetype + def initialize(mimetype) + @mimetype = mimetype + end + + def filter(lexers) + lexers.select { |lexer| lexer.mimetypes.include? @mimetype } + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/modeline.rb b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/modeline.rb new file mode 100644 index 0000000..9754798 --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/modeline.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + class Modeline < Guesser + include Util + + # [jneen] regexen stolen from linguist + EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i + + # First form vim modeline + # [text]{white}{vi:|vim:|ex:}[white]{options} + # ex: 'vim: syntax=ruby' + VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i + + # Second form vim modeline (compatible with some versions of Vi) + # [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text] + # ex: 'vim set syntax=ruby:' + VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i + + MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2] + + def initialize(source, opts={}) + @source = source + @lines = opts[:lines] || 5 + end + + def filter(lexers) + # don't bother reading the stream if we've already decided + return lexers if lexers.size == 1 + + source_text = get_source(@source) + + lines = source_text.split(/\n/) + + search_space = (lines.first(@lines) + lines.last(@lines)).join("\n") + + matches = MODELINES.map { |re| re.match(search_space) }.compact + return lexers unless matches.any? + + match_set = Set.new(matches.map { |m| m[1] }) + lexers.select { |l| match_set.include?(l.tag) || l.aliases.any? { |a| match_set.include?(a) } } + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/source.rb b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/source.rb new file mode 100644 index 0000000..90a51cd --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/source.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + class Source < Guesser + include Util + + 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 + + source_text = get_source(@source) + + Lexer.assert_utf8!(source_text) + + source_text = TextAnalyzer.new(source_text) + + collect_best(lexers) do |lexer| + next unless lexer.detectable? + lexer.detect?(source_text) ? 1 : nil + end + end + end + end +end diff --git a/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/util.rb b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/util.rb new file mode 100644 index 0000000..89c50be --- /dev/null +++ b/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/guessers/util.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +module Rouge + module Guessers + module Util + module SourceNormalizer + UTF8_BOM = "\xEF\xBB\xBF" + UTF8_BOM_RE = /\A#{UTF8_BOM}/ + + # @param [String,nil] source + # @return [String,nil] + def self.normalize(source) + source.sub(UTF8_BOM_RE, '').gsub(/\r\n/, "\n") + end + end + + def test_glob(pattern, path) + File.fnmatch?(pattern, path, File::FNM_DOTMATCH | File::FNM_CASEFOLD) + end + + # @param [String,IO] source + # @return [String] + def get_source(source) + if source.respond_to?(:to_str) + SourceNormalizer.normalize(source.to_str) + elsif source.respond_to?(:read) + SourceNormalizer.normalize(source.read) + else + raise ArgumentError, "Invalid source: #{source.inspect}" + end + end + end + end +end |
