source: app/src/tags/uam.tag2re @ 25ae32e

help
Last change on this file since 25ae32e was 25ae32e, checked in by obrebski <obrebski@…>, 16 years ago

git-svn-id: svn://atos.wmid.amu.edu.pl/utt@4 e293616e-ec6a-49c2-aa92-f4a8b91c5d16

  • Property mode set to 100755
File size: 1.7 KB
Line 
1#!/usr/bin/perl
2
3use locale;
4
5my $input = <>;
6chomp $input;
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
15print pre($input);
16
17sub parse ($)
18{
19    my ($dstr)=@_;
20    my $avs={};
21    my ($cat,$attrlist) = split '/', $dstr;
22  ATTR:
23    while( $attrlist =~ /($attr_re)($val_re+)/g )
24    {
25        my ($attrstr,$valstr)=($1,$2);
26        my %vals;
27        while($valstr =~ /$val_re/g)
28        {
29            my $val = $&;
30            next ATTR if $val eq '*';
31            $val =~ s/^<([[:lower:]])>$/$1/;
32            $vals{$val}=1;
33        }
34       
35        $avs->{$attrstr} = \%vals; # dlaczego to dziala? %vals jest lokalne
36    }
37    [$cat, $avs];
38}
39
40sub unparse (\@)
41{
42    my ($cat,$avs)= @{shift @_};
43    my $dstr=$cat;
44    my @attrs = keys %$avs;
45    if(@attrs)
46    {
47        $dstr .= '/';
48        for my $attr ( sort @attrs )
49        {
50            $dstr .= $attr . (join '', sort keys %{$avs->{$attr}});
51        }
52    }
53    $dstr;
54}
55
56sub canonize ($)
57{
58    unparse @{parse shift} ;
59}
60
61sub pre
62{
63    my $pos_res    = '[[:upper:]]+';
64    my $attr_res   = '[[:upper:]]+';
65    my $val_res    = '[[:lower:][:digit:]+?!*-]|<[^>\n[:cntrl:]]+>';
66    my $av_res     = "$attr_res($val_res)+";
67    my $avlist_res = "($av_res)+";
68
69    my $pat = canonize(shift);
70    my $ret;
71    my ($pos,$avlist) = split /\//, $pat;
72    $ret = $pos.'(\/';
73    while ($avlist =~ /($attr_res)(${val_res}+)/g)
74    {
75        my $attr = $1;
76        my $vals = $2;
77        my $vals = "($val_res)*(".join('|',($vals =~ /$val_res/g)).")($val_res)*";
78        $ret .= "($av_res)*$attr$vals";
79    }
80    $ret .= "($av_res)*)?";
81    return $ret;
82}
83
Note: See TracBrowser for help on using the repository browser.