Mercurial > pub > Impl
annotate _test/temp.pl @ 205:891c04080658
IMPL::Web::View fixed template selection, release candidate
| author | sergey |
|---|---|
| date | Thu, 03 May 2012 01:00:02 +0400 |
| parents | 68a59c3358ff |
| children | a8db61d0ed33 |
| rev | line source |
|---|---|
| 83 | 1 #!/usr/bin/perl |
| 93 | 2 use strict; |
|
197
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
sergey
parents:
194
diff
changeset
|
3 |
| 203 | 4 use Data::Dumper(); |
| 5 | |
| 6 =pod | |
| 7 | |
| 8 { | |
| 9 bar => { | |
| 10 next => { | |
| 11 foo => { | |
| 12 data => 'teo' | |
| 13 }, | |
| 14 baz => { | |
| 15 data => 'ioh' | |
| 16 } | |
| 17 }, | |
| 18 data => 'duo' | |
| 19 }, | |
| 20 wee => { | |
| 21 data => 'iwy' | |
| 22 } | |
| 23 } | |
| 24 | |
| 25 =cut | |
| 26 | |
| 27 my $tree = {}; | |
| 28 | |
| 29 foreach my $selector( | |
| 30 { path => [qw( foo bar )], data => 'teo' }, | |
| 31 { path => [qw( {x:.*} zoo bar )], data => 'view/{x}'}, | |
| 32 { path => [qw( foo >zoo >bar )], data => 'ilo' }, | |
| 33 { path => [qw( bar )], data => 'duo' }, | |
| 34 { path => [qw( wee )], data => 'iwy'}, | |
| 35 { path => [qw( foo wee )], data => 'fwy'}, | |
| 36 { path => [qw( {x:\w+} )], data => 'x:{x}'}, | |
| 37 { path => [qw( boo {x:\w+} )], data => 'boo/{x}'}, | |
| 38 ) { | |
| 39 my $t = $tree; | |
| 40 my @path = reverse @{$selector->{path}}; | |
| 41 my $last = pop @path; | |
| 42 my $level = 1; | |
| 43 foreach my $prim (@path ) { | |
| 44 $t = ($t->{$prim}->{next} ||= {}); | |
| 45 $level ++; | |
| 46 } | |
| 47 $t->{$last}->{level} = $level; | |
| 48 $t->{$last}->{data} = $selector->{data}; | |
| 49 } | |
| 50 | |
| 51 my @target = qw( foo zoo bar ); | |
| 52 my @results; | |
| 53 my $alternatives = [ { selector => $tree, immediate => 1 } ]; | |
| 54 | |
| 55 $alternatives = MatchAlternatives($_,$alternatives,\@results) foreach reverse @target; | |
| 56 | |
| 57 | |
| 58 sub MatchAlternatives { | |
| 59 my ($segment,$alternatives,$results) = @_; | |
| 60 | |
| 61 warn "alternatives: ", scalar @$alternatives,", segment: $segment"; | |
| 62 | |
| 63 my @next; | |
| 64 | |
| 65 foreach my $alt (@$alternatives) { | |
| 66 while (my ($selector,$match) = each %{$alt->{selector}} ) { | |
| 67 warn $selector; | |
| 68 | |
| 69 warn "\timmediate" if $alt->{immediate}; | |
| 70 warn "\thas children" if $match->{next}; | |
| 71 | |
| 72 my $context = { | |
| 73 vars => \%{ $alt->{vars} || {} }, | |
| 74 selector => $match->{next} | |
| 75 }; | |
| 76 | |
| 77 if ($selector =~ s/^>//) { | |
| 78 $context->{immediate} = 1; | |
| 79 } | |
| 80 | |
| 81 if (my ($name,$rx) = ($selector =~ m/^\{(?:(\w+)\:)?(.*)\}$/) ) { | |
| 82 #this is a regexp | |
| 83 warn "\tregexp: [$name] $rx"; | |
| 84 | |
| 85 if ( my @captures = ($segment =~ m/($rx)/) ) { | |
| 86 $context->{success} = 1; | |
| 87 | |
| 88 warn "\t",join(',',@captures); | |
| 89 | |
| 90 if ($name) { | |
| 91 $context->{vars}->{$name} = \@captures; | |
| 92 } | |
| 93 } | |
| 94 } else { | |
| 95 #this is a segment name | |
| 96 if ($segment eq $selector) { | |
| 97 $context->{success} = 1; | |
| 98 } | |
| 99 } | |
| 100 | |
| 101 # test if there were a match | |
| 102 if (delete $context->{success}) { | |
| 103 warn "\tmatch"; | |
| 104 if (my $data = $match->{data}) { | |
| 105 # interpolate data | |
| 106 $data =~ s/{(\w+)(?:\:(\d+))?}/ | |
| 107 my ($name,$index) = ($1,$2 || 0); | |
| 108 | |
| 109 if ($context->{vars}{$name}) { | |
| 110 $context->{vars}{$name}[$index]; | |
| 111 } else { | |
| 112 ""; | |
| 113 } | |
| 114 /gex; | |
| 115 | |
| 116 push @$results, { level => $match->{level}, result => $data }; | |
| 117 } | |
| 118 warn "\tnext" if $context->{selector}; | |
| 119 push @next, $context if $context->{selector}; | |
| 120 } else { | |
| 121 #repeat current alternative if it's not required to be immediate | |
| 122 push @next, { | |
| 123 selector => { $selector, $match }, | |
| 124 vars => $alt->{vars} | |
| 125 } unless $alt->{immediate}; | |
| 126 } | |
| 127 } | |
| 128 } | |
| 129 | |
| 130 warn "end, next trip: ",scalar @next, " alternatives"; | |
| 131 | |
| 132 return \@next; | |
| 133 } | |
| 134 | |
| 135 print Data::Dumper->Dump([$tree,\@results],[qw(tree results)]); |
