[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