Esempio n. 1
0
int main(int argc, char *argv[]) try {
    setlocale(LC_ALL, "");
#if ENABLE_NLS
    bindtextdomain("sdcv",
                   //"./locale"//< for testing
                   GETTEXT_TRANSLATIONS_PATH //< should be
                   );
    textdomain("sdcv");
#endif

    gboolean show_version = FALSE;
    gboolean show_list_dicts = FALSE;
    glib::StrArr use_dict_list;
    gboolean non_interactive = FALSE;
    gboolean json_output = FALSE;
    gboolean no_fuzzy = FALSE;
    gboolean utf8_output = FALSE;
    gboolean utf8_input = FALSE;
    glib::CharStr opt_data_dir;
    gboolean only_data_dir = FALSE;
    gboolean colorize = FALSE;

    const GOptionEntry entries[] = {
        { "version", 'v', 0, G_OPTION_ARG_NONE, &show_version,
          _("display version information and exit"), nullptr },
        { "list-dicts", 'l', 0, G_OPTION_ARG_NONE, &show_list_dicts,
          _("display list of available dictionaries and exit"), nullptr },
        { "use-dict", 'u', 0, G_OPTION_ARG_STRING_ARRAY, get_addr(use_dict_list),
          _("for search use only dictionary with this bookname"),
          _("bookname") },
        { "non-interactive", 'n', 0, G_OPTION_ARG_NONE, &non_interactive,
          _("for use in scripts"), nullptr },
        { "json-output", 'j', 0, G_OPTION_ARG_NONE, &json_output,
          _("print the result formatted as JSON"), nullptr },
        { "exact-search", 'e', 0, G_OPTION_ARG_NONE, &no_fuzzy,
          _("do not fuzzy-search for similar words, only return exact matches"), nullptr },
        { "utf8-output", '0', 0, G_OPTION_ARG_NONE, &utf8_output,
          _("output must be in utf8"), nullptr },
        { "utf8-input", '1', 0, G_OPTION_ARG_NONE, &utf8_input,
          _("input of sdcv in utf8"), nullptr },
        { "data-dir", '2', 0, G_OPTION_ARG_STRING, get_addr(opt_data_dir),
          _("use this directory as path to stardict data directory"),
          _("path/to/dir") },
        { "only-data-dir", 'x', 0, G_OPTION_ARG_NONE, &only_data_dir,
          _("only use the dictionaries in data-dir, do not search in user and system directories"), nullptr },
        { "color", 'c', 0, G_OPTION_ARG_NONE, &colorize,
          _("colorize the output"), nullptr },
        {},
    };

    glib::Error error;
    GOptionContext *context = g_option_context_new(_(" words"));
    g_option_context_set_help_enabled(context, TRUE);
    g_option_context_add_main_entries(context, entries, nullptr);
    const gboolean parse_res = g_option_context_parse(context, &argc, &argv, get_addr(error));
    g_option_context_free(context);
    if (!parse_res) {
        fprintf(stderr, _("Invalid command line arguments: %s\n"),
                error->message);
        return EXIT_FAILURE;
    }

    if (show_version) {
        printf(_("Console version of Stardict, version %s\n"), gVersion);
        return EXIT_SUCCESS;
    }

    const gchar *stardict_data_dir = g_getenv("STARDICT_DATA_DIR");
    std::string data_dir;
    if (!opt_data_dir) {
        if (!only_data_dir) {
            if (stardict_data_dir)
                data_dir = stardict_data_dir;
            else
                data_dir = "/usr/share/stardict/dic";
        }
    } else {
        data_dir = get_impl(opt_data_dir);
    }

    const char *homedir = g_getenv("HOME");
    if (!homedir)
        homedir = g_get_home_dir();

    std::list<std::string> dicts_dir_list;
    if (!only_data_dir)
        dicts_dir_list.push_back(std::string(homedir) + G_DIR_SEPARATOR + ".stardict" + G_DIR_SEPARATOR + "dic");
    dicts_dir_list.push_back(data_dir);
    if (show_list_dicts) {
        list_dicts(dicts_dir_list, json_output);
        return EXIT_SUCCESS;
    }

    std::list<std::string> disable_list;

    std::map<std::string, std::string> bookname_to_ifo;
    for_each_file(dicts_dir_list, ".ifo", std::list<std::string>(), std::list<std::string>(),
                  [&bookname_to_ifo](const std::string &fname, bool) {
                      DictInfo dict_info;
                      const bool load_ok = dict_info.load_from_ifo_file(fname, false);
                      if (!load_ok)
                          return;
                      bookname_to_ifo[dict_info.bookname] = dict_info.ifo_file_name;
                  });

    std::list<std::string> order_list;
    if (use_dict_list != nullptr) {
        for (auto &&x : bookname_to_ifo) {
            gchar **p = get_impl(use_dict_list);
            for (; *p != nullptr; ++p)
                if (x.first.compare(*p) == 0) {
                    break;
                }
            if (*p == nullptr) {
                disable_list.push_back(x.second);
            }
        }

        // add bookname to list
        gchar **p = get_impl(use_dict_list);
        while (*p) {
            order_list.push_back(bookname_to_ifo.at(*p));
            ++p;
        }
    } else {
        const std::string odering_cfg_file = std::string(homedir) + G_DIR_SEPARATOR_S ".sdcv_ordering";
        FILE *ordering_file = fopen(odering_cfg_file.c_str(), "r");
        if (ordering_file != nullptr) {
            std::string line;
            while (stdio_getline(ordering_file, line)) {
                order_list.push_back(bookname_to_ifo.at(line));
            }
            fclose(ordering_file);
        }
    }

    const std::string conf_dir = std::string(g_get_home_dir()) + G_DIR_SEPARATOR + ".stardict";
    if (g_mkdir(conf_dir.c_str(), S_IRWXU) == -1 && errno != EEXIST) {
        fprintf(stderr, _("g_mkdir failed: %s\n"), strerror(errno));
    }

    Library lib(utf8_input, utf8_output, colorize, json_output, no_fuzzy);
    lib.load(dicts_dir_list, order_list, disable_list);

    std::unique_ptr<IReadLine> io(create_readline_object());
    if (optind < argc) {
        for (int i = optind; i < argc; ++i)
            if (!lib.process_phrase(argv[i], *io, non_interactive)) {
                return EXIT_FAILURE;
            }
    } else if (!non_interactive) {

        std::string phrase;
        while (io->read(_("Enter word or phrase: "), phrase)) {
            if (!lib.process_phrase(phrase.c_str(), *io))
                return EXIT_FAILURE;
            phrase.clear();
        }

        putchar('\n');
    } else {
        fprintf(stderr, _("There are no words/phrases to translate.\n"));
    }
    return EXIT_SUCCESS;
} catch (const std::exception &ex) {
    fprintf(stderr, "Internal error: %s\n", ex.what());
    exit(EXIT_FAILURE);
}
Esempio n. 2
0
File: sdcv.cpp Progetto: 7799/sdcv
int main(int argc, char *argv[])
{
	setlocale(LC_ALL, "");
#if ENABLE_NLS
	bindtextdomain (PACKAGE, LOCALEDIR);
	textdomain (PACKAGE);
#endif	 
	int optc;
	bool h = false, v = false, show_list_dicts=false, 
		use_book_name=false, non_interactive=false, 
		utf8_output=false, utf8_input=false;
	strlist_t enable_list;
	string data_dir;
	int option_index = 0;
	while ((optc = getopt_long (argc, argv, "hvu:ln", longopts, 
				    &option_index))!=-1)
		switch (optc){
		case 0:
			utf8_output=true;
			break;
		case 1:   
			utf8_input=true;
			break;
		case 2:
			data_dir=optarg;
			break;
		case 'v':
			v = true;
			break;
		case 'h':
			h = true;
			break;
		case 'l':
			show_list_dicts=true;
			break;
		case 'u':
			use_book_name=true;
			enable_list.push_back(locale_to_utf8(optarg));
			break;
		case 'n':
			non_interactive=true;
			break;
		case '?':
			fprintf(stderr, 
				_("Unknown option.\nTry '%s --help' for more information.\n"), 
				argv[0]);
			return EXIT_FAILURE;
		}
  
	if (h) {
		printf("sdcv - console version of StarDict.\n");
		printf(_("Usage: %s [OPTIONS] words\n"), argv[0]);
		printf(_("-h, --help               display this help and exit\n"));
		printf(_("-v, --version            display version information and exit\n"));
		printf(_("-l, --list-dicts         display list of available dictionaries and exit\n"));
		printf(_("-u, --use-dict bookname  for search use only dictionary with this bookname\n"));
		printf(_("-n, --non-interactive    for use in scripts\n"));
		printf(_("--utf8-output            output must be in utf8\n"));
		printf(_("--utf8-input             input of sdcv in utf8\n"));
		printf(_("--data-dir path/to/dir   use this directory as path to stardict data directory\n"));

		return EXIT_SUCCESS;
	}

	if (v) {
		printf(_("Console version of Stardict, version %s\n"), gVersion);
		return EXIT_SUCCESS;
	}

	const gchar *stardict_data_dir=g_getenv("STARDICT_DATA_DIR");
	if (data_dir.empty()) {
		if (stardict_data_dir)
			data_dir=stardict_data_dir;
		else
			data_dir="/usr/share/stardict/dic";
	}



	strlist_t dicts_dir_list;

	dicts_dir_list.push_back(std::string(g_get_home_dir())+G_DIR_SEPARATOR+
				 ".stardict"+G_DIR_SEPARATOR+"dic");
	dicts_dir_list.push_back(data_dir);   

	if (show_list_dicts) {
		printf(_("Dictionary's name   Word count\n"));
		PrintDictInfo print_dict_info;
		strlist_t order_list, disable_list;
		for_each_file(dicts_dir_list, ".ifo",  order_list, 
			      disable_list, print_dict_info); 
    
		return EXIT_SUCCESS;
	}

	strlist_t disable_list;
	//DictInfoList  dict_info_list;
  
	if (use_book_name) {
		strlist_t empty_list;
		CreateDisableList create_disable_list(enable_list, disable_list);
		for_each_file(dicts_dir_list, ".ifo", empty_list, 
			      empty_list, create_disable_list);
	}

    
	string conf_dir = string(g_get_home_dir())+G_DIR_SEPARATOR+".stardict";
	if (g_mkdir(conf_dir.c_str(), S_IRWXU)==-1 && errno!=EEXIST)
		fprintf(stderr, _("g_mkdir failed: %s\n"), strerror(errno));

  
	Library lib(utf8_input, utf8_output);
	strlist_t empty_list;
	lib.load(dicts_dir_list, empty_list, disable_list);


	std::auto_ptr<read_line> io(create_readline_object());
	if (optind < argc) {
		for(int i=optind; i<argc; ++i)
			if (!lib.process_phrase(argv[i], *io, non_interactive))
				return EXIT_FAILURE;
	} else if (!non_interactive) {

		string phrase;
		while (io->read(_("Enter word or phrase: "), phrase)) {
			if (!lib.process_phrase(phrase.c_str(), *io))
				return EXIT_FAILURE;
			phrase.clear();
		}

		putchar('\n');
	} else
		fprintf(stderr, _("There are no words/phrases to translate.\n"));
	
    
	return EXIT_SUCCESS;
}
Esempio n. 3
0
File: sdcv.cpp Progetto: biji/sdcv
int main(int argc, char *argv[]) try {
    setlocale(LC_ALL, "");
#if ENABLE_NLS
    bindtextdomain("sdcv",
                   //"./locale"//< for testing
                   GETTEXT_TRANSLATIONS_PATH //< should be
                   );
    textdomain("sdcv");
#endif

    gboolean show_version = FALSE;
    gboolean show_list_dicts = FALSE;
    glib::StrArr use_dict_list;
    gboolean non_interactive = FALSE;
    gboolean utf8_output = FALSE;
    gboolean utf8_input = FALSE;
    glib::CharStr opt_data_dir;
    gboolean colorize = FALSE;

    const GOptionEntry entries[] = {
        { "version", 'v', 0, G_OPTION_ARG_NONE, &show_version,
          _("display version information and exit"), nullptr },
        { "list-dicts", 'l', 0, G_OPTION_ARG_NONE, &show_list_dicts,
          _("display list of available dictionaries and exit"), nullptr },
        { "use-dict", 'u', 0, G_OPTION_ARG_STRING_ARRAY, get_addr(use_dict_list),
          _("for search use only dictionary with this bookname"),
          _("bookname") },
        { "non-interactive", 'n', 0, G_OPTION_ARG_NONE, &non_interactive,
          _("for use in scripts"), nullptr },
        { "utf8-output", '0', 0, G_OPTION_ARG_NONE, &utf8_output,
          _("output must be in utf8"), nullptr },
        { "utf8-input", '1', 0, G_OPTION_ARG_NONE, &utf8_input,
          _("input of sdcv in utf8"), nullptr },
        { "data-dir", '2', 0, G_OPTION_ARG_STRING, get_addr(opt_data_dir),
          _("use this directory as path to stardict data directory"),
          _("path/to/dir") },
        { "color", 'c', 0, G_OPTION_ARG_NONE, &colorize,
          _("colorize the output"), nullptr },
        { nullptr },
    };

    glib::Error error;
    GOptionContext *context = g_option_context_new(_(" words"));
    g_option_context_set_help_enabled(context, TRUE);
    g_option_context_add_main_entries(context, entries, nullptr);
    const gboolean parse_res = g_option_context_parse(context, &argc, &argv, get_addr(error));
    g_option_context_free(context);
    if (!parse_res) {
        fprintf(stderr, _("Invalid command line arguments: %s\n"),
                error->message);
        return EXIT_FAILURE;
    }

    if (show_version) {
        printf(_("Console version of Stardict, version %s\n"), gVersion);
        return EXIT_SUCCESS;
    }

    const gchar *stardict_data_dir = g_getenv("STARDICT_DATA_DIR");
    std::string data_dir;
    if (!opt_data_dir) {
        if (stardict_data_dir)
            data_dir = stardict_data_dir;
        else
            data_dir = "/usr/share/stardict/dic";
    } else {
        data_dir = get_impl(opt_data_dir);
    }

    const char *homedir = g_getenv("HOME");
    if (!homedir)
        homedir = g_get_home_dir();

    const std::list<std::string> dicts_dir_list = {
        std::string(homedir) + G_DIR_SEPARATOR + ".stardict" + G_DIR_SEPARATOR + "dic",
        data_dir
    };

    if (show_list_dicts) {
        printf(_("Dictionary's name   Word count\n"));
        std::list<std::string> order_list, disable_list;
        for_each_file(dicts_dir_list, ".ifo", order_list,
                      disable_list, [](const std::string &filename, bool) -> void {
                          DictInfo dict_info;
                          if (dict_info.load_from_ifo_file(filename, false)) {
                              const std::string bookname = utf8_to_locale_ign_err(dict_info.bookname);
                              printf("%s    %d\n", bookname.c_str(), dict_info.wordcount);
                          }
                      });

        return EXIT_SUCCESS;
    }

    std::list<std::string> disable_list;

    if (use_dict_list) {
        std::list<std::string> empty_list;

        for_each_file(dicts_dir_list, ".ifo", empty_list, empty_list,
                      [&disable_list, &use_dict_list](const std::string &filename, bool) -> void {
                          DictInfo dict_info;
                          const bool load_ok = dict_info.load_from_ifo_file(filename, false);
                          if (!load_ok)
                              return;

                          for (gchar **p = get_impl(use_dict_list); *p != nullptr; ++p)
                              if (strcmp(*p, dict_info.bookname.c_str()) == 0)
                                  return;
                          disable_list.push_back(dict_info.ifo_file_name);
                      });
    }

    const std::string conf_dir = std::string(g_get_home_dir()) + G_DIR_SEPARATOR + ".stardict";
    if (g_mkdir(conf_dir.c_str(), S_IRWXU) == -1 && errno != EEXIST)
        fprintf(stderr, _("g_mkdir failed: %s\n"), strerror(errno));

    Library lib(utf8_input, utf8_output, colorize);
    std::list<std::string> empty_list;
    lib.load(dicts_dir_list, empty_list, disable_list);

    std::unique_ptr<IReadLine> io(create_readline_object());
    if (optind < argc) {
        for (int i = optind; i < argc; ++i)
            if (!lib.process_phrase(argv[i], *io, non_interactive))
                return EXIT_FAILURE;
    } else if (!non_interactive) {

        std::string phrase;
        while (io->read(_("Enter word or phrase: "), phrase)) {
            if (!lib.process_phrase(phrase.c_str(), *io))
                return EXIT_FAILURE;
            phrase.clear();
        }

        putchar('\n');
    } else {
        fprintf(stderr, _("There are no words/phrases to translate.\n"));
    }
    return EXIT_SUCCESS;
} catch (const std::exception &ex) {
    fprintf(stderr, "Internal error: %s\n", ex.what());
    exit(EXIT_FAILURE);
}