diff --git a/dicts/slovnik-cizich-slov.sh b/dicts/slovnik-cizich-slov.sh index cb99ea1..bc6bd9a 100755 --- a/dicts/slovnik-cizich-slov.sh +++ b/dicts/slovnik-cizich-slov.sh @@ -5,4 +5,8 @@ curl -Lo- https://slovnik-cizich-slov.abz.cz/export.php | \ iconv -f latin2 -t UTF-8 | perl -CSD -F\\\| -le ' print "$_\t" . $F[2] =~ s/\\/\\\\/gr =~ s/; /\\n/gr for split(", ", $F[0]) -' | sort -u | tabfile slovnik-cizich-slov +' | sort -u | tabfile slovnik-cizich-slov \ + --book-name="Slovník cizích slov" \ + --website=https://slovnik-cizich-slov.abz.cz \ + --date="$(date +%F)" \ + --collation=cs_CZ diff --git a/src/add-pronunciation.c b/src/add-pronunciation.c index d409c9d..9aedd42 100644 --- a/src/add-pronunciation.c +++ b/src/add-pronunciation.c @@ -250,30 +250,6 @@ worker (WorkerData *data) // --- Main -------------------------------------------------------------------- -/// Copy the contents of one StardictInfo object into another. Ignores path. -static void -stardict_info_copy (StardictInfo *dest, const StardictInfo *src) -{ - dest->version = src->version; - - guint i; - for (i = 0; i < _stardict_ifo_keys_length; i++) - { - const struct stardict_ifo_key *key = &_stardict_ifo_keys[i]; - if (key->type == IFO_STRING) - { - gchar **p = &G_STRUCT_MEMBER (gchar *, dest, key->offset); - gchar *q = G_STRUCT_MEMBER (gchar *, src, key->offset); - - g_free (*p); - *p = q ? g_strdup (q) : NULL; - } - else - G_STRUCT_MEMBER (gulong, dest, key->offset) = - G_STRUCT_MEMBER (gulong, src, key->offset); - } -} - int main (int argc, char *argv[]) { diff --git a/src/stardict-private.h b/src/stardict-private.h index 3d5b73a..6b8e75b 100644 --- a/src/stardict-private.h +++ b/src/stardict-private.h @@ -79,4 +79,6 @@ extern const struct stardict_ifo_key _stardict_ifo_keys[]; /// Denotes the length of _stardict_ifo_keys. extern gsize _stardict_ifo_keys_length; +void stardict_info_copy (StardictInfo *dest, const StardictInfo *src); + #endif // ! STARDICTPRIVATE_H diff --git a/src/stardict.c b/src/stardict.c index a757590..d371eb1 100644 --- a/src/stardict.c +++ b/src/stardict.c @@ -209,6 +209,30 @@ const struct stardict_ifo_key _stardict_ifo_keys[] = gsize _stardict_ifo_keys_length = G_N_ELEMENTS (_stardict_ifo_keys); +/// Copy the contents of one StardictInfo object into another. Ignores path. +void +stardict_info_copy (StardictInfo *dest, const StardictInfo *src) +{ + dest->version = src->version; + + guint i; + for (i = 0; i < _stardict_ifo_keys_length; i++) + { + const struct stardict_ifo_key *key = &_stardict_ifo_keys[i]; + if (key->type == IFO_STRING) + { + gchar **p = &G_STRUCT_MEMBER (gchar *, dest, key->offset); + gchar *q = G_STRUCT_MEMBER (gchar *, src, key->offset); + + g_free (*p); + *p = q ? g_strdup (q) : NULL; + } + else + G_STRUCT_MEMBER (gulong, dest, key->offset) = + G_STRUCT_MEMBER (gulong, src, key->offset); + } +} + static gboolean load_ifo (StardictInfo *sti, const gchar *path, GError **error) { diff --git a/src/tabfile.c b/src/tabfile.c index 10700b0..b2ceefa 100644 --- a/src/tabfile.c +++ b/src/tabfile.c @@ -25,11 +25,15 @@ #include #include +#include + +#include "config.h" #include "stardict.h" #include "stardict-private.h" #include "generator.h" #include "utils.h" + static gboolean set_data_error (GError **error, const gchar *message) { @@ -119,6 +123,17 @@ transform (FILE *fsorted, Generator *generator, GError **error) return TRUE; } +static void +validate_collation_locale (const gchar *locale) +{ + UErrorCode error = U_ZERO_ERROR; + UCollator *collator = ucol_open (locale, &error); + if (!collator) + fatal ("failed to create a collator for %s: %s\n", + locale, u_errorName (error)); + ucol_close (collator); +} + int main (int argc, char *argv[]) { @@ -129,13 +144,50 @@ main (int argc, char *argv[]) GOptionContext *ctx = g_option_context_new ("output-basename < input"); g_option_context_set_summary (ctx, "Create a StarDict dictionary from plaintext."); + + StardictInfo template = + { + .same_type_sequence = "m", + }; + GOptionEntry entries[] = + { + { "book-name", 'b', 0, G_OPTION_ARG_STRING, &template.book_name, + "Set the book name field", "TEXT" }, + { "author", 'a', 0, G_OPTION_ARG_STRING, &template.author, + "Set the author field ", "NAME" }, + { "e-mail", 'e', 0, G_OPTION_ARG_STRING, &template.email, + "Set the e-mail field", "ADDRESS" }, + { "website", 'w', 0, G_OPTION_ARG_STRING, &template.website, + "Set the website field", "LINK" }, + { "description", 'd', 0, G_OPTION_ARG_STRING, &template.description, + "Set the description field (newlines supported)", "TEXT" }, + { "date", 'D', 0, G_OPTION_ARG_STRING, &template.date, + "Set the date field", "DATE" }, + { "collation", 'c', 0, G_OPTION_ARG_STRING, &template.collation, + "Set the collation field (for ICU)", "LOCALE" }, + { } + }; + + g_option_context_add_main_entries (ctx, entries, GETTEXT_PACKAGE); if (!g_option_context_parse (ctx, &argc, &argv, &error)) fatal ("Error: option parsing failed: %s\n", error->message); - if (argc != 2) fatal ("%s", g_option_context_get_help (ctx, TRUE, FALSE)); g_option_context_free (ctx); + if (!template.book_name) + template.book_name = argv[1]; + if (template.description) + { + gchar **lines = g_strsplit (template.description, "\n", -1); + g_free (template.description); + gchar *in_one_line = g_strjoinv ("
", lines); + g_strfreev (lines); + template.description = in_one_line; + } + if (template.collation) + validate_collation_locale (template.collation); + // This actually implements stardict_strcmp(), POSIX-compatibly. // Your sort(1) is not expected to be stable by default, like bsdsort is. FILE *fsorted = popen ("LC_ALL=C sort -t'\t' -k1f,1", "r"); @@ -149,11 +201,7 @@ main (int argc, char *argv[]) StardictInfo *info = generator->info; info->version = SD_VERSION_3_0_0; - info->book_name = g_strdup (argv[1]); - info->same_type_sequence = g_strdup ("m"); - - // This gets incremented each time an entry is finished - info->word_count = 0; + stardict_info_copy (info, &template); if (!transform (fsorted, generator, &error) || !generator_finish (generator, &error)) diff --git a/src/transform.c b/src/transform.c index 2144c6b..38bdad6 100644 --- a/src/transform.c +++ b/src/transform.c @@ -140,31 +140,6 @@ update_from_filter (StardictDict *dict, Generator *generator, return TRUE; } -// FIXME: copied from add-pronunciation.c, should merge it somewhere (utils?) -/// Copy the contents of one StardictInfo object into another. Ignores path. -static void -stardict_info_copy (StardictInfo *dest, const StardictInfo *src) -{ - dest->version = src->version; - - guint i; - for (i = 0; i < _stardict_ifo_keys_length; i++) - { - const struct stardict_ifo_key *key = &_stardict_ifo_keys[i]; - if (key->type == IFO_STRING) - { - gchar **p = &G_STRUCT_MEMBER (gchar *, dest, key->offset); - gchar *q = G_STRUCT_MEMBER (gchar *, src, key->offset); - - g_free (*p); - *p = q ? g_strdup (q) : NULL; - } - else - G_STRUCT_MEMBER (gulong, dest, key->offset) = - G_STRUCT_MEMBER (gulong, src, key->offset); - } -} - int main (int argc, char *argv[]) {