File: XML.pm

package info (click to toggle)
freej 0.10git20080824-1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 13,504 kB
  • ctags: 19,398
  • sloc: ansic: 135,255; cpp: 32,550; sh: 9,318; perl: 2,932; asm: 2,355; yacc: 1,178; makefile: 1,119; java: 136; lex: 94; python: 16
file content (72 lines) | stat: -rw-r--r-- 1,891 bytes parent folder | download | duplicates (7)
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
61
62
63
64
65
66
67
68
69
70
71
72
package JSDoc::XML;

use strict;
use warnings;
use HTML::Template;

sub new {
    my ($package, $location) = @_;
    bless { location => "${location}JSDoc/" }, $package;
}

sub output {
    my ($self, $classes) = @_;
    my @classes = _preprocess(
        grep {defined($_->{classname})} values %$classes);
    my $template = HTML::Template->new(
        filename    => $self->{location} . 'xml.tmpl',
        die_on_bad_params => 1);

    $template->param(classes => \@classes);
    return $template->output;
}

sub _preprocess {
    my @classes = @_;
    for (@classes){
        $_->{inherits} = _preprocess_inherits($_->{inherits});
        $_->{constructor_vars} = _preprocess_vars($_->{constructor_vars});
        for my $method (@{$_->{instance_methods}}, @{$_->{class_methods}}){
            $method->{vars} = _preprocess_vars($method->{vars});
        }
        for my $field (@{$_->{instance_fields}}, @{$_->{class_fields}}){
            $field->{field_vars} = _preprocess_vars($field->{field_vars});
        }
    }
    @classes;
}

sub _preprocess_inherits {
    my ($inherits) = @_;
    my @inherits;
    for my $class (keys %$inherits){
        my $inherit = {
            class   => $class,
            methods => [map { name => $_ }, 
                            @{$inherits->{$class}->{instance_methods}}]}; 
        push @inherits, $inherit;
    }
    \@inherits;
}

sub _preprocess_vars {
    my ($vars) = @_;
    return $vars if ref($vars) eq 'ARRAY'; 
    my @vars;
    for my $key (keys %$vars){
        my $var;
        if (ref($vars->{$key}) eq 'ARRAY'){
            $var = { 
                '@name' => $key,
                values  => [map { val => $_ }, @{$vars->{$key}}] };
        } else {
            $var = {
                '@name' => $key,
                values  => [ { val => $vars->{$key} } ] };
        }
        push @vars, $var;
    }
    \@vars;
}

1;