diff --git a/app/lib/language_utils.rb b/app/lib/language_utils.rb index 46a0941a7..2425e1b34 100644 --- a/app/lib/language_utils.rb +++ b/app/lib/language_utils.rb @@ -6,7 +6,20 @@ def self.data base = YAML.load_file(Rails.root.join("config/languages.yml")) custom_path = Rails.root.join("config/languages_custom.yml") custom = File.exist?(custom_path) ? YAML.load_file(custom_path) : {} - base.deep_merge(custom) + merged = base.deep_merge(custom) { |_key, base_val, custom_val| + base_val.is_a?(Array) && custom_val.is_a?(Array) ? base_val | custom_val : custom_val + } + custom.each do |name, info| + next unless info.key?("extensions") + merged_extensions = merged.dig(name, "extensions") || [] + merged_extensions.each do |ext| + merged.each do |other_name, other_info| + next if other_name == name + other_info["extensions"]&.delete(ext) + end + end + end + merged end end diff --git a/config/languages_custom.yml b/config/languages_custom.yml index e7de2d090..b4a66754c 100644 --- a/config/languages_custom.yml +++ b/config/languages_custom.yml @@ -11,3 +11,9 @@ Lapse: AsciiDoc: extensions: - ".ad" + +Assembly: + extensions: + - ".asm" + - ".s" + - ".S" \ No newline at end of file diff --git a/test/lib/language_utils_test.rb b/test/lib/language_utils_test.rb new file mode 100644 index 000000000..8d5f9b9db --- /dev/null +++ b/test/lib/language_utils_test.rb @@ -0,0 +1,33 @@ +require "test_helper" + +class LanguageUtilsTest < Minitest::Test + def setup + LanguageUtils.instance_variable_set(:@data, nil) + LanguageUtils.instance_variable_set(:@extension_map, nil) + LanguageUtils.instance_variable_set(:@alias_map, nil) + LanguageUtils.instance_variable_set(:@filename_map, nil) + end + + def teardown + LanguageUtils.instance_variable_set(:@data, nil) + LanguageUtils.instance_variable_set(:@extension_map, nil) + LanguageUtils.instance_variable_set(:@alias_map, nil) + LanguageUtils.instance_variable_set(:@filename_map, nil) + end + + def test_custom_assembly_extensions_override_other_languages + assert_equal "Assembly", LanguageUtils.detect_from_extension("foo.asm") + assert_equal "Assembly", LanguageUtils.detect_from_extension("foo.a51") + assert_equal "Assembly", LanguageUtils.detect_from_extension("foo.nasm") + assert_equal "Assembly", LanguageUtils.detect_from_extension("foo.s") + assert_equal "Assembly", LanguageUtils.detect_from_extension("foo.S") + end + + def test_custom_language_additions + assert_equal "AsciiDoc", LanguageUtils.detect_from_extension("foo.ad") + end + + def test_custom_language_without_extension_conflict + assert_equal "Lapse", LanguageUtils.find_name("Lapse") + end +end