Move the colordefs to the profile def
[dbsrgits/SQL-Abstract.git] / lib / SQL / Abstract / Tree.pm
index e8e5ff3..4cede05 100644 (file)
@@ -31,6 +31,7 @@ use base 'Class::Accessor::Grouped';
 
 __PACKAGE__->mk_group_accessors( simple => $_ ) for qw(
    newline indent_string indent_amount colormap indentmap fill_in_placeholders
+   placeholder_surround
 );
 
 # Parser states for _recurse_parse()
@@ -125,14 +126,43 @@ my %indents = (
 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",
@@ -141,6 +171,7 @@ my %profiles = (
    },
    html => {
       fill_in_placeholders => 1,
+      placeholder_surround => ['<span class="placeholder">', '</span>'],
       indent_string => '&nbsp;',
       indent_amount => 2,
       newline       => "<br />\n",
@@ -167,29 +198,6 @@ my %profiles = (
    },
 );
 
-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 || {};
@@ -310,7 +318,7 @@ my %starters = (
    'delete from' => 1,
 );
 
-sub whitespace_keyword {
+sub pad_keyword {
    my ($self, $keyword, $depth) = @_;
 
    my $before = '';
@@ -330,14 +338,15 @@ sub _is_key {
    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 '?'
 }
@@ -359,7 +368,7 @@ sub unparse {
   }
   elsif ($car eq 'LITERAL') {
     if ($cdr->[0] eq '?') {
-      return $self->_fill_in_placeholder($bindargs)
+      return $self->fill_in_placeholder($bindargs)
     }
     return $cdr->[0];
   }
@@ -373,7 +382,7 @@ sub unparse {
     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);
   }
 }
@@ -403,6 +412,8 @@ sub format { my $self = shift; $self->unparse($self->parse($_[0]), $_[1]) }
  $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
@@ -458,8 +469,50 @@ Transform "tree" into SQL, applying various transforms on the way.
 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>
+