source: lib/attr.pm @ 5f4d9c3

Last change on this file since 5f4d9c3 was 5f4d9c3, checked in by Maciej Prill <mprill@…>, 13 years ago

Rewritten the build system, added lem UTF-8 version.

  • Property mode set to 100644
File size: 2.5 KB
Line 
1package attr;
2
3use locale;
4use strict;
5
6use Data::Dumper;
7
8our $pos_re    = qr/(?:[[:upper:]]+)/;
9our $attr_re   = qr/(?:[[:upper:]]+)/;
10our $val_re    = qr/(?:[[:lower:][:digit:]+?!*-]|<[^>\n]+>)/;
11our $av_re     = qr/(?:$attr_re$val_re+)/;
12our $avlist_re = qr/(?:$av_re+)/;
13our $cat_re    = qr/(?:$pos_re(?:\/$avlist_re)?)/;
14
15sub match(\@\@)
16{
17    my ($cat1,$avs1)= @{shift @_};
18    my ($cat2,$avs2)= @{shift @_};
19
20    if($cat1 ne $cat2 && $cat1 ne '*' && $cat2 ne '*')
21    {
22        return 0; 
23    }
24    else
25    {
26      ATTR:for my $attr (keys %$avs1)
27      {
28          if(exists $avs2->{$attr})
29          {
30              for my $val (keys %{$avs1->{$attr}})
31              {
32                  next ATTR if $avs2->{$attr}->{$val};
33              }
34              return 0;
35              last ATTR;
36          }
37      }
38    }
39
40    return 1;
41}
42
43sub agree(\@\@$)
44{
45    my $val1 = $_[0]->[1]->{$_[2]};
46    my $val2 = $_[1]->[1]->{$_[2]};
47
48    return 1 if !$val1 || !$val2;
49
50    for my $v (keys %$val1)
51    {
52        return 1 if exists $val2->{$v};
53    }
54    return 0;
55}
56
57# funkcja parse
58# arg:     deskrypcja
59# warto¶æ: referencja do tablicy [<cat>, <avs>],
60#          gdzie <avs> jest referencja do hasza, zawierajacego pary
61#          atrybut=>hasz warto¶ci (pary warto¶æ=>1), czyli np.
62
63#         [
64#           'ADJ',
65#           {
66#             'KOLEDZY' => {
67#                            '<alojzy>' => 1,
68#                            '<karol>' => 1,
69#                            '<jan>' => 1
70#                          },
71#             'C' => {
72#                      'p' => 1,
73#                      'a' => 1,
74#                      'i' => 1
75#                    },
76#             'N' => {
77#                      'p' => 1
78#                    }
79#           }
80#         ];
81
82sub parse ($)
83{
84    my ($dstr)=@_;
85    my $avs={};
86    my ($cat,$attrlist) = split '/', $dstr;
87  ATTR:
88#    while( $attrlist =~ /([[:upper:]]+)((?:[[:lower:][:digit:]+?!*-]|<[^>\n]+>)+)/g )
89    while( $attrlist =~ /($attr_re)($val_re+)/g )
90    {
91        my ($attrstr,$valstr)=($1,$2);
92        my %vals;
93        while($valstr =~ /$val_re/g)
94        {
95            my $val = $&;
96            next ATTR if $val eq '*';
97            $val =~ s/^<([[:lower:]])>$/$1/;
98            $vals{$val}=1;
99        }
100       
101        $avs->{$attrstr} = \%vals; # dlaczego to dziala? %vals jest lokalne
102    }
103    [$cat, $avs];
104}
105
106# funkcja unparse
107# arg:     jak warto¶æ parse
108# warto¶æ: deskrypcja - napis
109
110sub unparse (\@)
111{
112    my ($cat,$avs)= @{shift @_};
113    my $dstr=$cat;
114    my @attrs = keys %$avs;
115    if(@attrs)
116    {
117        $dstr .= '/';
118        for my $attr ( sort @attrs )
119        {
120            $dstr .= $attr . (join '', sort keys %{$avs->{$attr}});
121        }
122    }
123    $dstr;
124}
125
126
127sub canonize ($)
128{
129    unparse @{parse @_[0]} ;
130}
131
132
1331;
Note: See TracBrowser for help on using the repository browser.