Add JSON output.

Closes: #3
This commit is contained in:
tastytea 2021-06-01 19:17:44 +02:00
parent 7b4b9edfe5
commit f1cb16f6d0
Signed by: tastytea
GPG Key ID: CFC39497F1B26E07
6 changed files with 36 additions and 4 deletions

View File

@ -81,6 +81,8 @@ suppresses errors related to them.
*--debug*:: *--debug*::
Write debug output to the terminal and log file. Write debug output to the terminal and log file.
*--json*::
Output JSON instead of plain text.
== USAGE == USAGE

View File

@ -233,7 +233,14 @@ int main(int argc, char *argv[])
for (const auto &matches : matches_all) for (const auto &matches : matches_all)
{ {
output::print_matches(matches, opts, input_files.size() == 1); if (opts.json)
{
output::json(matches);
}
else
{
output::print_matches(matches, opts, input_files.size() == 1);
}
} }
LOG(log::sev::info) << "Exiting program with return code " << return_code; LOG(log::sev::info) << "Exiting program with return code " << return_code;

View File

@ -93,6 +93,8 @@ options parse_options(int argc, char *argv[])
translate("Ignore errors about wrong file formats.") .str().data()) translate("Ignore errors about wrong file formats.") .str().data())
("debug", ("debug",
translate("Enable debug output.") .str().data()) translate("Enable debug output.") .str().data())
("json",
translate("Output JSON instead of plain text.") .str().data())
; ;
po::options_description options_hidden("Hidden options"); po::options_description options_hidden("Hidden options");
@ -232,6 +234,7 @@ options parse_again(const po::variables_map &vm)
opts.dereference_recursive = vm.count("dereference-recursive") > 0; opts.dereference_recursive = vm.count("dereference-recursive") > 0;
opts.ignore_archive_errors = vm.count("ignore-archive-errors") > 0; opts.ignore_archive_errors = vm.count("ignore-archive-errors") > 0;
opts.debug = vm.count("debug") > 0; opts.debug = vm.count("debug") > 0;
opts.json = vm.count("json") > 0;
if (vm.count("regexp") > 0) if (vm.count("regexp") > 0)
{ {

View File

@ -57,6 +57,7 @@ struct options
std::vector<std::string> input_file; std::vector<std::string> input_file;
bool ignore_archive_errors{false}; bool ignore_archive_errors{false};
bool debug{false}; bool debug{false};
bool json{false};
//! For the debug output. //! For the debug output.
friend std::ostream &operator<<(std::ostream &out, const options &opts); friend std::ostream &operator<<(std::ostream &out, const options &opts);

View File

@ -19,6 +19,7 @@
#include <boost/locale/message.hpp> #include <boost/locale/message.hpp>
#include <fmt/format.h> #include <fmt/format.h>
#include <fmt/ostream.h> // For compatibility with fmt 4. #include <fmt/ostream.h> // For compatibility with fmt 4.
#include <nlohmann/json.hpp>
#include <termcolor/termcolor.hpp> #include <termcolor/termcolor.hpp>
#include <iostream> #include <iostream>
@ -39,15 +40,15 @@ void print_matches(const std::vector<search::match> &matches,
{ {
if (!single_file && !opts.no_fn_fs) if (!single_file && !opts.no_fn_fs)
{ {
if (match.epub_filepath != last_epub) if (match.filepath_epub != last_epub)
{ {
if (!opts.nocolor) if (!opts.nocolor)
{ {
cout << termcolor::yellow; cout << termcolor::yellow;
} }
cout << format(translate(" In {0:s}: \n").str(), cout << format(translate(" In {0:s}: \n").str(),
fs::relative(match.epub_filepath)); fs::relative(match.filepath_epub));
last_epub = match.epub_filepath; last_epub = match.filepath_epub;
if (!opts.nocolor) if (!opts.nocolor)
{ {
cout << termcolor::reset; cout << termcolor::reset;
@ -110,4 +111,20 @@ void print_matches(const std::vector<search::match> &matches,
} }
} }
void json(const std::vector<search::match> &matches)
{
nlohmann::json json;
for (const auto &match : matches)
{
json[match.filepath_epub].push_back(
{{"filepath", match.filepath_inside},
{"match", match.text},
{"context", match.context},
{"headline", match.headline},
{"page", match.page}});
}
std::cout << json.dump(2) << '\n';
}
} // namespace epubgrep::output } // namespace epubgrep::output

View File

@ -28,6 +28,8 @@ namespace epubgrep::output
void print_matches(const std::vector<search::match> &matches, void print_matches(const std::vector<search::match> &matches,
const options::options &opts, bool single_file); const options::options &opts, bool single_file);
void json(const std::vector<search::match> &matches);
} // namespace epubgrep::output } // namespace epubgrep::output
#endif // EPUBGREP_OUTPUT_HPP #endif // EPUBGREP_OUTPUT_HPP