__PACKAGE__->mk_group_accessors( simple => $_ ) for qw(
newline indent_string indent_amount colormap indentmap fill_in_placeholders
+ placeholder_surround
);
# Parser states for _recurse_parse()
my %profiles = (
console => {
fill_in_placeholders => 1,
+ placeholder_surround => ['?/', ''],
indent_string => ' ',
indent_amount => 2,
newline => "\n",
colormap => {},
indentmap => { %indents },
+
+ eval { require Term::ANSIColor }
+ ? do {
+ my $c = \&Term::ANSIColor::color;
+ (
+ placeholder_surround => [$c->('black on_cyan'), $c->('reset')],
+ colormap => {
+ select => [$c->('red'), $c->('reset')],
+ 'insert into' => [$c->('red'), $c->('reset')],
+ update => [$c->('red'), $c->('reset')],
+ 'delete from' => [$c->('red'), $c->('reset')],
+
+ set => [$c->('cyan'), $c->('reset')],
+ from => [$c->('cyan'), $c->('reset')],
+
+ where => [$c->('green'), $c->('reset')],
+ values => [$c->('yellow'), $c->('reset')],
+
+ join => [$c->('magenta'), $c->('reset')],
+ 'left join' => [$c->('magenta'), $c->('reset')],
+ on => [$c->('blue'), $c->('reset')],
+
+ 'group by' => [$c->('yellow'), $c->('reset')],
+ 'order by' => [$c->('yellow'), $c->('reset')],
+ }
+ );
+ } : (),
},
console_monochrome => {
fill_in_placeholders => 1,
+ placeholder_surround => ['?/', ''],
indent_string => ' ',
indent_amount => 2,
newline => "\n",
},
html => {
fill_in_placeholders => 1,
+ placeholder_surround => ['<span class="placeholder">', '</span>'],
indent_string => ' ',
indent_amount => 2,
newline => "<br />\n",
},
);
-eval {
- require Term::ANSIColor;
- $profiles{console}->{colormap} = {
- select => [Term::ANSIColor::color('red'), Term::ANSIColor::color('reset')],
- 'insert into' => [Term::ANSIColor::color('red'), Term::ANSIColor::color('reset')],
- update => [Term::ANSIColor::color('red'), Term::ANSIColor::color('reset')],
- 'delete from' => [Term::ANSIColor::color('red'), Term::ANSIColor::color('reset')],
-
- set => [Term::ANSIColor::color('cyan'), Term::ANSIColor::color('reset')],
- from => [Term::ANSIColor::color('cyan'), Term::ANSIColor::color('reset')],
-
- where => [Term::ANSIColor::color('green'), Term::ANSIColor::color('reset')],
- values => [Term::ANSIColor::color('yellow'), Term::ANSIColor::color('reset')],
-
- join => [Term::ANSIColor::color('magenta'), Term::ANSIColor::color('reset')],
- 'left join' => [Term::ANSIColor::color('magenta'), Term::ANSIColor::color('reset')],
- on => [Term::ANSIColor::color('blue'), Term::ANSIColor::color('reset')],
-
- 'group by' => [Term::ANSIColor::color('yellow'), Term::ANSIColor::color('reset')],
- 'order by' => [Term::ANSIColor::color('yellow'), Term::ANSIColor::color('reset')],
- };
-};
-
sub new {
my $class = shift;
my $args = shift || {};
'delete from' => 1,
);
-sub whitespace_keyword {
+sub pad_keyword {
my ($self, $keyword, $depth) = @_;
my $before = '';
defined $tree && defined $self->indentmap->{lc $tree};
}
-sub _fill_in_placeholder {
+sub fill_in_placeholder {
my ($self, $bindargs) = @_;
if ($self->fill_in_placeholders) {
my $val = pop @{$bindargs} || '';
+ my ($left, $right) = @{$self->placeholder_surround};
$val =~ s/\\/\\\\/g;
$val =~ s/'/\\'/g;
- return qq('$val')
+ return qq('$left$val$right')
}
return '?'
}
}
elsif ($car eq 'LITERAL') {
if ($cdr->[0] eq '?') {
- return $self->_fill_in_placeholder($bindargs)
+ return $self->fill_in_placeholder($bindargs)
}
return $cdr->[0];
}
return join (" $car ", map $self->unparse($_, $bindargs, $depth), @{$cdr});
}
else {
- my ($l, $r) = @{$self->whitespace_keyword($car, $depth)};
+ my ($l, $r) = @{$self->pad_keyword($car, $depth)};
return sprintf "$l%s %s$r", $self->format_keyword($car), $self->unparse($cdr, $bindargs, $depth);
}
}
$args = {
profile => 'console', # predefined profile to use (default: 'none')
fill_in_placeholders => 1, # true for placeholder population
+ placeholder_surround => # The strings that will be wrapped around
+ [GREEN, RESET], # populated placeholders if the above is set
indent_string => ' ', # the string used when indenting
indent_amount => 2, # how many of above string to use for a single
# indent level
Currently this just takes a keyword and puts the C<colormap> stuff around it.
Later on it may do more and allow for coderef based transforms.
-=head2 whitespace_keyword
+=head2 pad_keyword
- my ($before, $after) = @{$sqlat->whitespace_keyword('SELECT')};
+ my ($before, $after) = @{$sqlat->pad_keyword('SELECT')};
Returns whitespace to be inserted around a keyword.
+
+=head2 fill_in_placeholder
+
+ my $value = $sqlat->fill_in_placeholder(\@bindargs)
+
+Removes last arg from passed arrayref and returns it, surrounded with
+the values in placeholder_surround, and then surrounded with single quotes.
+
+=head2 indent
+
+Returns as many indent strings as indent amounts times the first argument.
+
+=head1 ACCESSORS
+
+=head2 colormap
+
+See L</new>
+
+=head2 fill_in_placeholders
+
+See L</new>
+
+=head2 indent_amount
+
+See L</new>
+
+=head2 indent_string
+
+See L</new>
+
+=head2 indentmap
+
+See L</new>
+
+=head2 newline
+
+See L</new>
+
+=head2 placeholder_surround
+
+See L</new>
+