- my %keep = map { $_ => 1 } @kw;
- my %add = %keep;
- my @rm;
- my $end = $doc->termlist_end;
- for (my $cur = $doc->termlist_begin; $cur != $end; $cur++) {
- $cur->skip_to('K');
- last if $cur == $end;
- my $kw = $cur->get_termname;
- $kw =~ s/\AK//s or next;
- $keep{$kw} ? delete($add{$kw}) : push(@rm, $kw);
- }
- return unless (scalar(@rm) + scalar(keys %add));
- $doc->remove_term('K'.$_) for @rm;
- $doc->add_boolean_term('K'.$_) for (keys %add);
+ my ($end, @rm, @add);
+ my @x = @VMD_MAP;
+ while (my ($field, $pfx) = splice(@x, 0, 2)) {
+ my $set = $vmd->{$field} // next;
+ my %keep = map { $_ => 1 } @$set;
+ my %add = %keep;
+ $end //= $doc->termlist_end;
+ for (my $cur = $doc->termlist_begin; $cur != $end; $cur++) {
+ $cur->skip_to($pfx);
+ last if $cur == $end;
+ my $v = $cur->get_termname;
+ $v =~ s/\A$pfx//s or next;
+ $keep{$v} ? delete($add{$v}) : push(@rm, $pfx.$v);
+ }
+ push(@add, map { $pfx.$_ } keys %add);
+ }
+ return unless scalar(@rm) || scalar(@add);
+ $doc->remove_term($_) for @rm;
+ $doc->add_boolean_term($_) for @add;