Sha256: 0a92d1c33dba1f1903e5d554c06178800eb6294654abd0b6fec51eb238bb0b15

Contents?: true

Size: 1.27 KB

Versions: 7

Compression:

Stored size: 1.27 KB

Contents

# frozen_string_literal: true
require_relative 'lexers_db'

module Snibbets
  # Lexer definitions
  module Lexers
    class << self
      def lexers
        @lexers ||= build_lexers
      end

      def build_lexers
        lex = []
        LEXERS_DB.split(/\n/).each do |line|
          key = line.match(/(?mi)^((, )?[^,]+?)+?(?=\[)/)[0]
          keys = key.split(/,/).map(&:strip)
          value = line.match(/\[(.*?)\]/)[1]
          values = value.split(/,/).map(&:strip)

          lex << {
            lexer: keys.shift,
            aliases: keys,
            extensions: values
          }
        end

        lex
      end

      def ext_to_lang(ext)
        return nil if ext.nil?

        matches = lexers.select { |lex| lex[:extensions].map(&:downcase).include?(ext.downcase) }
        matches.map { |lex| lex[:lexer] }.first || ext
      end

      def lang_to_ext(lexer)
        return nil if lexer.nil?

        matches = lexers.select { |lex| lex[:lexer] == lexer || lex[:aliases].map(&:downcase).include?(lexer.downcase) }
        matches.map { |lex| lex[:extensions].first }.first || lexer
      end

      def syntax_from_extension(filename)
        exts = filename.split(/\./)[1..-2]
        return nil if exts.count.zero?

        ext_to_lang(exts[-1])
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
snibbets-2.0.32 lib/snibbets/lexers.rb
snibbets-2.0.31 lib/snibbets/lexers.rb
snibbets-2.0.30 lib/snibbets/lexers.rb
snibbets-2.0.29 lib/snibbets/lexers.rb
snibbets-2.0.28 lib/snibbets/lexers.rb
snibbets-2.0.27 lib/snibbets/lexers.rb
snibbets-2.0.26 lib/snibbets/lexers.rb