Text::Snippet::TabStop::WithTransformer - Tab stop that modifies the replacement value supplied by the user


Text-Snippet documentation Contained in the Text-Snippet distribution.

Index


Code Index:

NAME

Top

Text::Snippet::TabStop::WithTransformer - Tab stop that modifies the replacement value supplied by the user

VERSION

Top

version 0.04

EXAMPLE SYNTAX

Top

* simple search/replace
	${1/search/replace/}

* supports standard regex flags (global, case-insensitive in this example)
	${1/something/else/gi}

* supports captures (capitalizes first character of replacement)
	${1/^(.)/\U$1/}

* for TextMate compatibility, $0 returns the entire matched string (think $&)
	# capitalize the entire replacement value
	${1/.+/\U$0/g}

CLASS METHODS

Top

parse

This method parses the index and transforming regular expression that are specified in the tab stop.

INSTANCE METHODS

Top

* transformer

Returns a CodeRef that takes a single argument (a string) and returns a modified version of that string after applying a transformation to that string.

* to_string

Augments super-class' to_string method and returns the modified value after applying the transformation specified in the tab stop.

AUTHOR

Top

  Brian Phillips <bphillips@cpan.org>

COPYRIGHT AND LICENSE

Top


Text-Snippet documentation Contained in the Text-Snippet distribution.

package Text::Snippet::TabStop::WithTransformer;
BEGIN {
  $Text::Snippet::TabStop::WithTransformer::VERSION = '0.04';
}

# ABSTRACT: Tab stop that modifies the replacement value supplied by the user

use strict;
use warnings;
use base qw(Text::Snippet::TabStop);
use Carp qw(croak);
use Class::XSAccessor getters => { transformer => 'transformer' };


sub to_string {
	my $self = shift;
	my $output = $self->SUPER::to_string;
	return $self->transformer->($output);
}
sub parse {
	my $class = shift;
	my $src   = shift;
	if ( $src =~ m{^\$\{(\d+)/([^/]+?)/([^/]*)/(.*?)\}$} ) {
		my ( $tab_index, $search, $replace, $flags ) = ( $1, $2, $3, $4 );
		$replace =~ s/\$0/\$&/g;
		if ( length($flags) ) {
			$search = "(?$flags$search)";
		}
		my $transformer = sub {
			my $out = shift;
			if ( $out =~ m/$search/ ) {
				eval "\$out =~ s{\$search}{$replace}g";
				die $@ if($@);
			}
			return $out;
		};
		return $class->_new( src => $src, index => $tab_index, transformer => $transformer );
	}
	return;
}

1;

__END__