zeroclickinfo-goodies/lib/DDG/Goodie/LoremIpsum.pm

111 lines
3.3 KiB
Perl

package DDG::Goodie::LoremIpsum;
# ABSTRACT: generates random latin
use strict;
use warnings;
use DDG::Goodie;
use utf8;
use Text::Lorem::More;
use Lingua::EN::Numericalize;
triggers any => 'lorem ipsum', 'lipsum', 'latin';
zci is_cached => 0;
zci answer_type => 'lorem_ipsum';
sub pluralise {
my ($amount, $to_pluralise) = @_;
return $amount == 1 ? $to_pluralise : ($to_pluralise . 's');
}
my $types = qr/(?<type>word|sentence|paragraph)/i;
my $modifier_re = qr/(?<modifier>random|regular)/i;
my $amountre = qr/(?<amount>\d+)/;
my $lorem_re = qr/(?:latin|l(?:orem )?ipsum)/i;
my $forms = qr/^(?:
(((?<amount>\d+)\s)?($types)s?\sof((?!$modifier_re).)*(?<modifier>$modifier_re)?+.*($lorem_re))
|((?<amount>\d+)\s(?<modifier>$modifier_re)?\s*($lorem_re)\s($types)s?)
)$/xi;
# Generates a string containing all the nonsense words/sentences.
sub generate_latin {
my ($amount, $modifier, $type) = @_;
my $word = Text::Lorem::More->new();
my $words;
if ($type eq 'sentence') {
$words = $word->sentences($amount);
} elsif ($type eq 'word') {
$words = $word->words($amount);
} elsif ($type eq 'paragraph') {
$words = $word->paragraphs($amount);
};
return $words;
}
sub get_result_and_formatted {
my $query = shift;
# Treat 'a' as 'one' for the purposes of amounts.
$query =~ s/^a /one /i;
$query =~ s/line/sentence/g;
# Convert initial words into numbers if possible.
my $formatted = $query =~ s/^\w+[a-rt-z](?=\b)/str2nbr($&)/ier;
return unless $formatted =~ $forms;
my $amount = $+{'amount'} // 1;
my $modifier = $+{'modifier'} // 'regular';
my $type = $+{'type'};
my $result = generate_latin($amount, $modifier, $type);
# Proper-case modifier (latin -> Latin)
my $fmodifier = $modifier =~ s/^\w/\u$&/r;
# E.g, "3 words of lorem ipsum"
my $formatted_input = "$amount @{[pluralise $amount, $type]} of Lorem Ipsum";
return ($result, $formatted_input);
}
sub build_infobox_element {
my $query = shift;
my @split = split ' ', $query;
return {
label => $query,
url => 'https://duckduckgo.com/?q=' . (join '+', @split) . '&ia=answer',
};
}
my $infobox = [ { heading => "Example Queries", },
build_infobox_element('5 sentences of lorem ipsum'),
build_infobox_element('20 words of random latin'),
build_infobox_element('10 paragraphs of lorem ipsum'),
];
handle query_lc => sub {
my $query = $_;
my $default = "5 paragraphs of lorem ipsum" if $query =~ /^\s*l(orem )?ipsum\s*$/;
my ($result, $formatted_input) = get_result_and_formatted($default // $query) or return;
my @paragraphs = split "\n\n", $result;
return $result, structured_answer => {
data => {
title => "$formatted_input",
lorem_paragraphs => \@paragraphs,
use_paragraphs => $#paragraphs ? 1 : 0,
infoboxData => $default ? $infobox : 0,
},
meta => {
sourceName => "Lipsum",
sourceUrl => "http://lipsum.com/"
},
templates => {
group => 'info',
options => {
moreAt => 1,
content => 'DDH.lorem_ipsum.content',
chompContent => 1,
}
}
};
};
1;