Acme-AwesomeQuotes

 view release on metacpan or  search on metacpan

lib/Acme/AwesomeQuotes.pm  view on Meta::CPAN

use strict;
use warnings;
use utf8;
use 5.008_003;

package Acme::AwesomeQuotes;
BEGIN {
  $Acme::AwesomeQuotes::VERSION = '0.02';
}

binmode STDIN,  ':utf8';
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';

use Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(GetAwesome);
our @EXPORT    = qw(GetAwesome);

use Carp qw(croak);
use Unicode::Normalize qw(NFC NFD);

# ABSTRACT: Make your text awesome!


my %chartypes = (
                 'all'      => qr/[\x{030C}\x{0300}\x{0301}]/,
                 'notgrave' => qr/[^\P{NonspacingMark}\x{0300}]/,
                 'notacute' => qr/[^\P{NonspacingMark}\x{0301}]/,
                 'notcaron' => qr/[^\P{NonspacingMark}\x{030C}]/,
                 'puncsep'  => qr/[\p{Separator}\p{Punctuation}]/,
                );


sub GetAwesome {
	(my $string = NFD($_[0])) =~ s/(?:^${chartypes{puncsep}}+|${chartypes{puncsep}}+$)//g;

	eval {checkstring($string)} or croak $@;

	# For individual characters, use a caron instead of terminal acute/grave accents:
	if ($string =~ /^\p{Letter}\p{NonspacingMark}*$/) {
		# Prep string – remove extant carons/accents:
		$string =~ s/^(\p{Letter}${chartypes{notcaron}}*)${chartypes{all}}+(${chartypes{notcaron}}*)$/$1$2/;

		# Make string awesome!
		$string = NFC($string);
		$string =~ s/^(.*)$/`$1\x{030C}´/;
	}
	else {
		# If there are initial acute/terminal grave accents, use a caron instead:
		my $initialaccent = ($string =~ s/^(\p{Letter}\p{NonspacingMark}*)[\x{0301}\x{030C}]+/${1}/g)
		  ? "\x{030C}" : "\x{0300}";
		my $finalaccent   = ($string =~ s/(\p{Letter}\p{NonspacingMark}*)[\x{0300}\x{030C}]+(\p{NonspacingMark}*)$/${1}${2}/g)
		  ? "\x{030C}" : "\x{0301}";

		# Prep string – remove extant terminal acute/grave accents:
		$string =~ s/^(\p{Letter}${chartypes{notgrave}}*)\x{0300}/$1/;
		$string =~ s/(\p{Letter}${chartypes{notacute}}*)\x{0301}(${chartypes{notacute}}*)$/$1$2/;

		# Make string awesome!
		$string = NFC($string);
		$string =~ s/^(\p{Letter}\p{ModifierLetter}*)/`${1}${initialaccent}/;
		$string =~ s/(\p{Letter}\p{ModifierLetter}*)$/${1}${finalaccent}´/;
	}

	return(NFC($string));
}


sub checkstring {
	my $string = $_[0];
	if ($string eq '') {
		die "String is empty!\n";



( run in 0.710 second using v1.01-cache-2.11-cpan-64ef6c95b5d )