[mb-commits] r9721 - in mb_server/trunk: . cgi-bin/MusicBrainz/Server t
root at musicbrainz.org
root at musicbrainz.org
Sat Mar 8 23:12:09 UTC 2008
Author: luks
Date: 2008-03-08 23:12:09 +0000 (Sat, 08 Mar 2008)
New Revision: 9721
Added:
mb_server/trunk/t/
mb_server/trunk/t/replace_ar_attribs.t
Modified:
mb_server/trunk/cgi-bin/MusicBrainz/Server/Attribute.pm
Log:
Support attr1+attr2 syntax in AR phrases (needed to use instrument and vocal attributes in the same AR type)
Modified: mb_server/trunk/cgi-bin/MusicBrainz/Server/Attribute.pm
===================================================================
--- mb_server/trunk/cgi-bin/MusicBrainz/Server/Attribute.pm 2008-03-08 20:43:11 UTC (rev 9720)
+++ mb_server/trunk/cgi-bin/MusicBrainz/Server/Attribute.pm 2008-03-08 23:12:09 UTC (rev 9721)
@@ -155,60 +155,82 @@
}
}
- foreach my $attr (keys %temp)
- {
- my $rep_name;
+ $phrase = _replace_attributes($phrase, \%temp);
+ $rphrase = _replace_attributes($rphrase, \%temp);
+ return ($phrase, $rphrase);
+}
- if (scalar(@{$temp{$attr}}) == 1)
- {
- $rep_name = shift @{$temp{$attr}};
+sub _join_words
+{
+ my ($words) = @_;
+ my @words = @$words;
+ my $numwords = scalar(@words);
+ my ($last, $result);
+
+ if ($numwords == 1) {
+ return $words[0];
+ }
+ elsif ($numwords == 2) {
+ $result = $words[0];
+ $last = $words[1];
+ }
+ else {
+ $last = pop(@words);
+ $result = join(", ", @words);
+ }
+ return $result . " and " . $last;
+}
+
+sub _replace_attributes
+{
+ my ($phrase, $attrs) = @_;
+
+ my @result;
+ my @tokens = split /({.*?}\s*)/, $phrase;
+ my $is_tag = 0;
+
+ foreach my $token (@tokens) {
+
+ if ($is_tag) {
+
+ $token =~ /{(.*?)(?::(.*?))?(?:\|(.*?))?}(\s*)/;
+ my $name = $1;
+ my $alternative_replacement = $2;
+ my $unset_replacement = $3;
+ my $space = $4;
+
+ my $replacement = $attrs->{"__$name"};
+ if (!defined($replacement)) {
+ my @values;
+ for my $n (split(/\+/, $name)) {
+ my $attr = $attrs->{$n};
+ if (defined($attr) && @$attr) {
+ push @values, @$attr;
+ }
+ }
+ $replacement = @values ? lc(_join_words(\@values)) : "";
+ $attrs->{"__$name"} = $replacement;
+ }
+
+ if ($replacement) {
+ $token = $replacement;
+ if ($alternative_replacement) {
+ $alternative_replacement =~ s/%/$token/;
+ $token = $alternative_replacement;
+ }
+ }
+ else {
+ $token = $unset_replacement;
+ }
+
+ $token .= $space if $token;
}
- elsif (scalar(@{$temp{$attr}}) == 2)
- {
- $rep_name = shift @{$temp{$attr}};
- $rep_name .= " and " . shift @{$temp{$attr}};
- }
- else
- {
- my $last = pop @{$temp{$attr}};
- $rep_name = join ", ", @{$temp{$attr}};
- $rep_name .= " and " . $last;
- }
- $rep_name =~ s/\s*?(.*?)\s*/$1/;
- $rep_name =~ tr/A-Z/a-z/;
-
- # replace simple {$attr}
- $phrase =~ s/\{$attr\}/$rep_name/;
- $rphrase =~ s/\{$attr\}/$rep_name/;
-
- # replace {attr: phrase} => phrase (compile only once)
- my $re_inner = qr/\{$attr:([^|}]*)(?:\|[^}]*)?\}/;
- if ($phrase =~ /$re_inner/)
- {
- my $saved = $1;
- $saved =~ s/%/$rep_name/;
- $phrase =~ s/$re_inner/$saved/;
- }
- if ($rphrase =~ /$re_inner/)
- {
- my $saved = $1;
- $saved =~ s/%/$rep_name/;
- $rphrase =~ s/$re_inner/$saved/;
- }
+
+ push @result, $token;
+ $is_tag = !$is_tag;
}
-
- # pattern: unset attribute with alternative
- # {attr: phrase|unset-phrase} => unset-phrase
- my $re_unsetalt = qr/\{[^|}]*\|([^}]*)\}/;
- $phrase =~ s/$re_unsetalt/$1/g;
- $rphrase =~ s/$re_unsetalt/$1/g;
- # pattern: any other unset attribute
- my $re_unset = qr/\{[^|}]*\}\s*/;
- $phrase =~ s/$re_unset//g;
- $rphrase =~ s/$re_unset//g;
-
- return ($phrase, $rphrase);
+ return join "", @result;
}
sub Exists
Added: mb_server/trunk/t/replace_ar_attribs.t
More information about the MusicBrainz-commits
mailing list