URI: 
       tFix choiceoverride - transliterate - Transliteration engine
  HTML git clone git://lumidify.org/transliterate.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 659fb098117bc50efc4cb92d586afa267c727489
   DIR parent 9ceb2478425536bef95dcf3d4cc4e4c2d0bd51f4
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Mon,  6 Apr 2020 15:43:26 +0200
       
       Fix choiceoverride
       
       Diffstat:
         A tests/data/override.txt             |       1 +
         A tests/test6/README                  |       2 ++
         A tests/test6/config                  |      16 ++++++++++++++++
         A tests/test6/descr.txt               |       1 +
         A tests/test6/err.txt                 |       6 ++++++
         A tests/test6/expected.txt            |       6 ++++++
         A tests/test6/input.txt               |       6 ++++++
         M transliterate.pl                    |      16 ++++++++++++----
       
       8 files changed, 50 insertions(+), 4 deletions(-)
       ---
   DIR diff --git a/tests/data/override.txt b/tests/data/override.txt
       t@@ -0,0 +1 @@
       +word0_replaced$word0_replaced2        word0_replaced2
   DIR diff --git a/tests/test6/README b/tests/test6/README
       t@@ -0,0 +1,2 @@
       +This can be used to play around with "choiceoverride", but it won't
       +work with "--nochoices".
   DIR diff --git a/tests/test6/config b/tests/test6/config
       t@@ -0,0 +1,16 @@
       +split "[ \n]+"
       +beforeword " "
       +afterword "[ \n]"
       +
       +ignore "../data/ignore.txt"
       +table words "../data/words.txt"
       +table endings "../data/endings.txt"
       +choiceoverride "../data/override.txt"
       +
       +expand words endings
       +
       +match "\d+" "num_replaced" beginword
       +
       +group beginword endword
       +replace words
       +endgroup
   DIR diff --git a/tests/test6/descr.txt b/tests/test6/descr.txt
       t@@ -0,0 +1 @@
       +Basic test
   DIR diff --git a/tests/test6/err.txt b/tests/test6/err.txt
       t@@ -0,0 +1,6 @@
       +Unknown word: "word20"
       +Unknown word: "word01231"
       +Word "word0_replaced$word0_replaced2" with 2 word choices.
       +Unknown word: "aword1"
       +Unknown word: "end3"
       +Word "word0_replacedend3_replaced$word0_replaced2end3_replaced" with 2 word choices.
   DIR diff --git a/tests/test6/expected.txt b/tests/test6/expected.txt
       t@@ -0,0 +1,6 @@
       +word1_replaced word2_replaced
       +num_replacedword1_replaced       word9_replaced   num_replaced   word4_replaced
       +word20 word01231    word0_replaced2
       +aword1
       +word1_replacedend1_replaced  word0_replacedend3_replaced$word0_replaced2end3_replaced   end3
       +num_replacedword2_replacedend1_replaced
   DIR diff --git a/tests/test6/input.txt b/tests/test6/input.txt
       t@@ -0,0 +1,6 @@
       +word1 word2
       +123word1       word9   123   word4
       +word20 word01231    word0
       +aword1
       +word1end1  word0end3   end3
       +432word2end1
   DIR diff --git a/transliterate.pl b/transliterate.pl
       t@@ -5,6 +5,9 @@
        # NOTE: If you're wondering why the error codes used by the functions are so
        # inconsistent, go ask my former self
        
       +# NOTE 2: This codebase has grown as new features were needed, so it's quite
       +# ugly now, but I haven't had time to clean it up.
       +
        use strict;
        use warnings;
        use utf8;
       t@@ -525,7 +528,7 @@ sub open_file_rel_abs {
        
        # Load a file of replacement words into a hash table
        sub load_table {
       -        my ($filename, $args, $config, $revert) = @_;
       +        my ($filename, $args, $config, $src_verbatim, $revert) = @_;
                my $fh = open_file_rel_abs $filename, $args->{"config"};
                return if !$fh;
                my %table;
       t@@ -547,7 +550,7 @@ sub load_table {
                                $word = NFD $words[0];
                                $replacement = NFD $words[1];
                        }
       -                my @word_choices = split /\Q$config->{choicesep}\E/, $word;
       +                my @word_choices = $src_verbatim ? ($word) : split /\Q$config->{choicesep}\E/, $word;
                        foreach my $word_choice (@word_choices) {
                                if (exists $table{$word_choice}) {
                                        if ($args->{"checkduplicates"}) {
       t@@ -722,7 +725,7 @@ sub interpret_config {
                                        if (exists $path_to_table{$table_path}) {
                                                $table = $path_to_table{$table_path};
                                        } else {
       -                                        $table = load_table $table_path, $args, \%config, $table_args{"revert"};
       +                                        $table = load_table $table_path, $args, \%config, 0, $table_args{"revert"};
                                                return if !defined $table;
                                                $path_to_table{$table_path} = $table;
                                        }
       t@@ -737,7 +740,10 @@ sub interpret_config {
                                        $config{"display_tables"}->{$table_path} = 1 if !exists $table_args{"nodisplay"};
                                } elsif ($cmd_name eq "choiceoverride") {
                                        my $table_path = $cmd->[1]->{"value"};
       -                                my $table = load_table $table_path, $args, \%config;
       +                                # argument $src_verbatim to load_table forces it to take the entire
       +                                # source word without splitting it up with "choicesep", since here,
       +                                # we explicitly want to replace multiple choices with one
       +                                my $table = load_table $table_path, $args, \%config, 1;
                                        return if !defined $table;
                                        if (exists $config{"choiceoverride"}) {
                                                warn "Duplicate specification of \"choiceoverride\" option.\n";
       t@@ -1825,6 +1831,8 @@ Note that this does not sort the choices before comparison and they have to
        be matched exactly, so when a new choice is added, that needs to be added to
        this mapping as well, in exactly the same order.
        
       +Like B<targetdiacritics>, this has no effect if B<--nochoices> is set.
       +
        To clarify the order in which choices are added (if they are not explicitly
        specified):