File Coverage

blib/lib/Data/Stag/SxprWriter.pm
Criterion Covered Total %
statement 59 72 81.9
branch 19 28 67.8
condition 8 9 88.8
subroutine 10 12 83.3
pod 3 9 33.3
total 99 130 76.1


line stmt bran cond sub pod time code
1             package Data::Stag::SxprWriter;
2              
3             =head1 NAME
4              
5             Data::Stag::SxprWriter - writes Stag S-expression format
6              
7             =head1 SYNOPSIS
8              
9              
10             =cut
11              
12             =head1 DESCRIPTION
13              
14             writes lisp style s-expressions
15              
16             note: more limited than normal s-expressions; all nodes are treated as
17             functions with one argument.
18              
19             all leaf/data elements treated as functions with one argument
20              
21             all other elements treated as functions with list arguments
22              
23             =head1 PUBLIC METHODS -
24              
25             =cut
26              
27 7     7   45 use strict;
  7         15  
  7         338  
28 7     7   41 use base qw(Data::Stag::Writer Data::Stag::Writer);
  7         15  
  7         1519  
29              
30 7     7   42 use vars qw($VERSION);
  7         14  
  7         6773  
31             $VERSION="0.14";
32              
33             sub fmtstr {
34 0     0 0 0 return 'sxpr';
35             }
36              
37             sub indent_txt {
38 495     495 0 511 my $self = shift;
39 495         1065 my $stack = $self->stack;
40 495         1318 return " " x scalar(@$stack);
41             }
42              
43             sub this_line {
44 2484     2484 0 2617 my $self = shift;
45 2484 100       4537 $self->{_this_line} = shift if @_;
46 2484         8599 return $self->{_this_line};
47             }
48              
49             sub o {
50 687     687 0 910 my $self = shift;
51 687         1381 my $o = "@_";
52 687         742 my $pre = " ";
53              
54 687 100 100     1061 if (($self->this_line &&
      100        
55             length($self->this_line) + length($o) >
56             60) ||
57             # $o =~ /^[\(\)]/) {
58             $o =~ /^\(/) {
59 253 100       445 if ($self->indent_txt) {
60 242         413 $pre = "\n" . $self->indent_txt;
61             }
62             else {
63 11         21 $pre = "'";
64             }
65 253         652 $self->this_line($pre.$o);
66             }
67             else {
68 434 100       1163 if ($o =~ /^\)/) {
69 253         331 $pre = "";
70             }
71 434         713 $self->this_line($self->this_line . $pre.$o);
72             }
73 687         2272 $self->addtext( $pre.$o );
74              
75             }
76              
77             sub start_event {
78 253     253 1 273 my $self = shift;
79 253         738 my $ev = shift;
80 253 100       551 if (!defined($ev)) {
81 2         4 $ev = '';
82             }
83 253         604 my $stack = $self->stack;
84 253 50       648 if ($self->use_color) {
85 0         0 $self->o(color('white'));
86 0         0 $self->o('('.color('red').$ev);
87             }
88             else {
89 253         642 $self->o("($ev");
90             }
91 253         722 push(@$stack, $ev);
92             }
93             sub end_event {
94 253     253 1 286 my $self = shift;
95 253         293 my $ev = shift;
96 253         565 my $stack = $self->stack;
97 253         386 my $popped = pop(@$stack);
98 253 50 66     1011 if ($ev && $popped ne $ev) {
99 0         0 warn("uh oh; $ev ne $popped");
100             }
101 253 50       615 if ($self->use_color) {
102             # $self->o(color('white'));
103 0         0 $self->o(')');
104             }
105             else {
106 253         448 $self->o(')');
107             }
108 253 100       571 if (!@$stack) {
109 11         38 $self->o("\n");
110             }
111 253         741 return $ev;
112             }
113             sub evbody {
114 170     170 1 211 my $self = shift;
115 170         186 my $body = shift;
116 170         162 my $str;
117 170 50       382 if ($self->use_color) {
118 0 0       0 if (!defined($body)) {
    0          
119 0         0 $str = color('white').'""';
120             }
121             elsif ($body eq '0') {
122 0         0 $str = color('white').'"'.color('green').'0'.color('white').'"';
123             }
124             else {
125 0         0 $body =~ s/\(/\\\(/g;
126 0         0 $body =~ s/\)/\\\)/g;
127 0         0 $body =~ s/\"/\\\"/g;
128 0         0 $str = color('white').'"'.color('green').$body.color('white').'"';
129             }
130             }
131             else {
132 170         267 $str = lispesc($body);
133             }
134 170         369 $self->o($str);
135 170         367 return;
136             }
137              
138             sub lispesc {
139 170     170 0 367 my $w = shift;
140 170 100       319 return '""' unless defined $w;
141 168 50       321 return '"0"' if $w eq '0';
142 168         245 $w =~ s/\(/\\\(/g;
143 168         202 $w =~ s/\)/\\\)/g;
144 168         166 $w =~ s/\"/\\\"/g;
145 168         396 return '"'.$w.'"';
146             }
147              
148             sub color {
149 0     0 0   Term::ANSIColor::color(@_);
150             }
151              
152              
153             1;