1 package SQL::Abstract::Formatter;
3 require SQL::Abstract::Parts; # it loads us too, don't cross the streams
7 has indent_by => (is => 'ro', default => ' ');
8 has max_width => (is => 'ro', default => 78);
12 return SQL::Abstract::Parts::stringify(\@_);
16 my ($self, $join, @parts) = @_;
17 $self->_fold_sql('', '', @{$self->_simplify($join, @parts)});
21 my ($self, $join, @parts) = @_;
22 return '' unless @parts;
23 return $parts[0] if @parts == 1 and !ref($parts[0]);
24 return $self->_simplify(@{$parts[0]}) if @parts == 1;
25 return [ $join, map ref() ? $self->_simplify(@$_) : $_, @parts ];
29 my ($self, $indent0, $indent, $join, @parts) = @_;
31 my $w = $self->max_width;
33 (s/, \Z/,\n/ and $join_len = 1)
36 for my $line_join = $join;
37 my ($nl_pre, $nl_post) = split "\n", $line_join;
39 my $next_indent = $indent.$self->indent_by;
40 PART: foreach my $idx (0..$#parts) {
42 my $pre = $idx ? $join : '';
43 my $j_part = $pre.(my $j = ref($p) ? $self->_join(@$p) : $p);
44 if (length($j_part) + length($line) + $join_len <= $w) {
47 if (ref($p) and $p->[1] eq '(' and $p->[-1] eq ')') {
48 push @res, $line.$join.'('."\n";
49 my (undef, undef, $inner) = @$p;
50 my $folded = $self->_fold_sql($indent, $indent, @$inner);
51 push @res, $nl_post.$folded."\n";
55 push @res, $line.$nl_pre."\n" if $line =~ /\S/;
56 if (length($line = $indent.$nl_post.$j) <= $w) {
59 my $folded = $self->_fold_sql($indent.$nl_post, $next_indent, @$p);
61 push @res, $folded.$nl_pre."\n";
62 $line = $idx == $#parts ? '' : $indent.$nl_post;
65 return join '', @res, $line;