use TeX::Hyphen;
use Carp;
my $hyp;
sub break_TeX
{
$hyp ||= TeX::Hyphen->new() or croak "Can't open hyphenation file";
return sub {
my ($str_ref, $length, $ws) = @_;
$ws ||= qr/(?!)/;
(my $text = substr($$str_ref, pos $$str_ref)) =~ s/$ws|\n|\r/ /g;
return ("",0) unless $text =~ /\S/;
my $result = "";
for my $chunk ($text =~ /(\S+\s*)/g) {
$result .= $chunk and next if length($result.$chunk) <= $length;
my ($word, $space) = $chunk =~ /(\S+)(\s*)/g;
$result .= $word and last if length($result.$word) <= $length;
for my $break (reverse $hyp->hyphenate($word)) {
if (length($result)+$break < $length) {
$result .= substr($word,0,$break);
$result .= '-' and pos($$str_ref)-- if $result !~ /-$/;
last;
}
}
$result ||= do{ pos($$str_ref)--; substr($text,0,$length-1).'-' };
last;
}
pos $$str_ref += length($result);
return ($result, substr($$str_ref, pos $$str_ref) =~ /\S/);
}
}
use Perl6::Form;
$data = "You can play no part but Pyramus;\n"
. "for Pyramus is a sweet-faced man; ";
print form {break=>break_TeX()}, "|{[[[[[}|", $data;