aboutsummaryrefslogtreecommitdiff
path: root/lib/XML/LibXSLT/EXSLT.pm
blob: 9bf375f6a3b7ddf5d614cbdd02617383f713ee4d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package XML::LibXSLT::EXSLT; 
use strict;
use warnings;
use XML::LibXML;
use URI::Escape;
use Encode;
 
my $STRING_NS='http://exslt.org/strings';
 
my @funcs=(
    [$STRING_NS,'split',\&estr_split],
    [$STRING_NS,'encode-uri',\&estr_uri_escape],
);
 
sub apply_to {
    my (undef,$xslt)=@_;
 
    for my $f (@funcs) {
        my ($ns,$name,$code)=@$f;
        $xslt->register_function($ns,$name,$code);
    }
    return;
}
 
sub estr_split {
    my ($string,$sep)=@_;
 
    if (defined $sep) {
        $sep="$sep";
    }
    else {
        $sep=' ';
    }
 
    my @tokens=split /\Q$sep/,"$string";
    my $doc=XML::LibXML::DocumentFragment->new();
 
    for my $t (@tokens) {
        my $e=XML::LibXML::Element->new('token');
        $e->appendTextNode($t);
        $doc->appendChild($e);
    }
 
    return $doc;
}
 
sub estr_uri_escape {
    my ($string,$unsafe_mode,$encoding)=@_;
 
    $encoding||='utf8';
 
    my $unsafe=q{^a-zA-Z0-9\-_.!~*'()}#'; 
    if (!$unsafe_mode) {
        $unsafe.=q{;/?:@&=+$,\[\]};
    }
 
    return uri_escape(encode($encoding,$string),$unsafe);
}
 
1;