/* * This file is part of smolbote. It's copyrighted by the contributors recorded * in the version control history of the file, available from its original * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote * * SPDX-License-Identifier: GPL-3.0 */ #include "builtins.h" #include "bookmarkmodel.h" #include "configuration.h" #include #include #include #include int builtins::bookmarks(const std::string &progname, std::vector::const_iterator beginargs, std::vector::const_iterator endargs) { args::ArgumentParser parser("bookmarks", "If an output location is not specified, this command will append imported bookmarks to the browser's bookmarks.\n" "If an output location is specified, this command will load all XBEL-format bookmarks, then all JSON-format bookmarks, and write them to the output location."); parser.Prog(progname); args::HelpFlag help(parser, "help", "Display this help message and exit.", { 'h', "help" }); args::ValueFlag save(parser, "file, stdout", "Output location.", { 'e', "export" }); args::ValueFlagList import_xbel(parser, "bookmarks.xbel", "Import xbel format.", { 'x', "import-xbel" }); args::ValueFlagList import_json(parser, "bookmarks.json", "Import json format.", { 'j', "import-json" }); try { parser.ParseArgs(beginargs, endargs); } catch(args::Help &) { std::cout << parser; return 0; } catch(args::Error &e) { std::cerr << e.what() << std::endl; std::cerr << parser; return -1; } auto *model = new BookmarkModel; // implicit bookmarks.path import if(!save) { Configuration conf; QFile f(conf.value("bookmarks.path").value()); if(f.open(QIODevice::ReadOnly | QIODevice::Text)) { BookmarkFormat(&f) >> model; f.close(); } } for(const auto &i : args::get(import_xbel)) { QFile f(QString::fromStdString(i)); if(f.open(QIODevice::ReadOnly | QIODevice::Text)) { BookmarkFormat(&f) >> model; f.close(); } else { spdlog::error("Could not open %s", i); return -1; } } for(const auto &i : args::get(import_json)) { QFile f(QString::fromStdString(i)); if(f.open(QIODevice::ReadOnly | QIODevice::Text)) { BookmarkFormat(&f) >> model; f.close(); } else { spdlog::error("Could not open %s", i); return -1; } } QIODevice *output = nullptr; if(save && args::get(save) == "stdout") { output = new QBuffer; QObject::connect(output, &QIODevice::aboutToClose, [output]() { output->seek(0); std::cout << qUtf8Printable(output->readAll()) << std::endl; }); output->open(QIODevice::ReadWrite | QIODevice::Text); } else if(!save) { Configuration conf; output = new QFile(conf.value("bookmarks.path").value()); } else { output = new QFile(QString::fromStdString(args::get(save))); } if(!output->isOpen()) { if(!output->open(QIODevice::ReadWrite | QIODevice::Text)) { spdlog::error("Could not open output"); return -1; } } BookmarkFormat format(output); format << model; output->close(); delete output; return 0; }