making reality adn the docs agree
[migration-tools.git] / Equinox-Migration / lib / Equinox / Migration / SubfieldMapper.pm
index ae33db0..5071a85 100644 (file)
@@ -189,8 +189,15 @@ sub generate {
         my $map = { mods => [], filt => [] };
         $map->{field} = shift @tokens;
         $map->{tag}   = shift @tokens;
-        for my $tok (@tokens) {
+        while (my $tok = shift @tokens) {
             last if ($tok =~ m/^#/);
+            if ($tok =~ m/^[a-z]:'/) {
+                $tok .= ' ' . shift @tokens
+                  until ($tokens[0] =~ m/'$/);
+                $tok .= ' ' . shift @tokens;
+                $tok =~ s/'//;
+                $tok =~ s/'$//;
+            }
             if ($tok =~ m/^m:/)
               { push @{$map->{mods}}, $tok }
             elsif ($tok =~ m/^f:/)
@@ -225,11 +232,18 @@ sub add {
     my ($self, $map) = @_;
 
     # trim the mods and filters
-    my $mods = []; my $filt = [];
-    for my $m (@{$map->{mods}})
-      { $m =~ s/^m://; push @{$mods}, $m }
-    for my $f (@{$map->{filt}})
-      { $f =~ s/^f://; push @{$filt}, $f }
+    my $mods = []; my %mods = ();
+    my $filt = []; my %filt = ();
+    for my $m (@{$map->{mods}}) {
+        die "Modifier collision '$m' at line $." if $mods{$m};
+        $m =~ s/^m://;
+        push @{$mods}, $m; $mods{$m} = 1;
+    }
+    for my $f (@{$map->{filt}}) {
+        die "Modifier collision '$f' at line $." if $filt{$f};
+        $f =~ s/^f://;
+        push @{$filt}, $f; $filt{$f} = 1;
+    }
     $map->{mods} = $mods;
     $map->{filt} = $filt;