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

83 lines
2.0 KiB
Perl
Raw Normal View History

package DDG::Goodie::CheatSheets;
# ABSTRACT: Load basic cheat sheets from JSON files
use JSON::XS;
use DDG::Goodie;
use DDP;
2015-08-14 04:51:09 -07:00
use File::Find::Rule;
no warnings 'uninitialized';
zci answer_type => 'cheat_sheet';
zci is_cached => 1;
triggers startend => (
'char', 'chars',
'character', 'characters',
'cheat sheet', 'cheatsheet',
'command', 'commands',
'example', 'examples',
'guide', 'help',
'quick reference', 'reference',
'shortcut', 'shortcuts',
'symbol', 'symbols',
2015-06-25 14:19:30 -07:00
'key bindings', 'keys', 'default keys'
);
sub getAliases {
my @files = File::Find::Rule->file()
->name("*.json")
->in(share());
2015-08-07 00:13:18 -07:00
my %results;
foreach my $file (@files) {
2015-08-07 11:30:02 -07:00
open my $fh, $file or warn "Error opening file: $file\n" and next;
my $json = do { local $/; <$fh> };
my $data = eval { decode_json($json) } or do {
2015-08-17 16:32:18 -07:00
warn "Failed to decode $file: $@";
next;
};
2015-08-07 11:30:02 -07:00
my $defaultName = File::Basename::fileparse($file);
2015-08-07 00:13:18 -07:00
$defaultName =~ s/-/ /g;
$defaultName =~ s/.json//;
2015-08-07 11:30:02 -07:00
$results{$defaultName} = $file;
2015-08-07 00:13:18 -07:00
if ($data->{'aliases'}) {
foreach my $alias (@{$data->{'aliases'}}) {
2015-08-07 11:30:02 -07:00
$results{$alias} = $file;
}
}
}
2015-08-07 00:13:18 -07:00
return \%results;
}
2015-08-07 00:13:18 -07:00
my $aliases = getAliases();
handle remainder => sub {
# If needed we could jump through a few more hoops to check
# terms against file names.
2015-08-07 11:30:02 -07:00
open my $fh, $aliases->{join(' ', split /\s+/o, lc($_))} or return;
my $json = do { local $/; <$fh> };
my $data = decode_json($json);
return 'Cheat Sheet', structured_answer => {
2015-05-01 13:13:44 -07:00
id => 'cheat_sheets',
dynamic_id => $data->{id},
name => 'Cheat Sheet',
data => $data,
templates => {
group => 'base',
item => 0,
options => {
content => "DDH.cheat_sheets.detail",
moreAt => 0
}
}
};
};
1;