From 3d476a8c4c022fccdb75497c99c4f38741fa728d Mon Sep 17 00:00:00 2001 From: SeradedStripes Date: Fri, 17 Jul 2026 22:38:23 +0200 Subject: [PATCH 1/5] Give Assembly back its file extensions --- config/languages_custom.yml | 6 ++++++ 1 file changed, 6 insertions(+) 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 From 2a21b47f236dd8384f82c78d6cf350ed2a389fdc Mon Sep 17 00:00:00 2001 From: SeradedStripes Date: Sat, 18 Jul 2026 01:33:31 +0200 Subject: [PATCH 2/5] Union arrays --- app/lib/language_utils.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/lib/language_utils.rb b/app/lib/language_utils.rb index 46a0941a7..4d553fafa 100644 --- a/app/lib/language_utils.rb +++ b/app/lib/language_utils.rb @@ -6,7 +6,9 @@ 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) + 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 + } end end From 8bc56939f7372482f6e8116d50b5fdba94b76caf Mon Sep 17 00:00:00 2001 From: SeradedStripes Date: Sat, 18 Jul 2026 01:48:03 +0200 Subject: [PATCH 3/5] Prune extensions stolen by other languages when custom entry overides it --- app/lib/language_utils.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/lib/language_utils.rb b/app/lib/language_utils.rb index 4d553fafa..ded43af4a 100644 --- a/app/lib/language_utils.rb +++ b/app/lib/language_utils.rb @@ -6,9 +6,19 @@ 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) { |_key, base_val, custom_val| + 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") + info["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 From 2569c84e32354fcf221b2a2d611f50a23c68d692 Mon Sep 17 00:00:00 2001 From: SeradedStripes Date: Sat, 18 Jul 2026 02:18:28 +0200 Subject: [PATCH 4/5] tests --- test/lib/language_utils_test.rb | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 test/lib/language_utils_test.rb 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 From 7386c27a3e07ec35f7bd80ffdb11aaf0272582a8 Mon Sep 17 00:00:00 2001 From: SeradedStripes Date: Sat, 18 Jul 2026 02:26:59 +0200 Subject: [PATCH 5/5] strip unioned extensions from conflicting languages in custom merge --- app/lib/language_utils.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/lib/language_utils.rb b/app/lib/language_utils.rb index ded43af4a..2425e1b34 100644 --- a/app/lib/language_utils.rb +++ b/app/lib/language_utils.rb @@ -11,7 +11,8 @@ def self.data } custom.each do |name, info| next unless info.key?("extensions") - info["extensions"].each do |ext| + 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)