aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Eric Janouch <p@janouch.name>2021-10-07 16:26:57 +0200
committerPřemysl Eric Janouch <p@janouch.name>2021-10-07 16:28:44 +0200
commit20fcf2a0c79b8433bf67594d45af54001ca1b613 (patch)
tree4237e3a4cf46b9e1875ad1a236f613f54e45e911
parented8b1bcdad7c430af1eef5fbe78b6ec4eb3eb60e (diff)
downloadtdv-20fcf2a0c79b8433bf67594d45af54001ca1b613.tar.gz
tdv-20fcf2a0c79b8433bf67594d45af54001ca1b613.tar.xz
tdv-20fcf2a0c79b8433bf67594d45af54001ca1b613.zip
tabfile: make it possible to set metadata
And some related clean-up.
-rwxr-xr-xdicts/slovnik-cizich-slov.sh6
-rw-r--r--src/add-pronunciation.c24
-rw-r--r--src/stardict-private.h2
-rw-r--r--src/stardict.c24
-rw-r--r--src/tabfile.c60
-rw-r--r--src/transform.c25
6 files changed, 85 insertions, 56 deletions
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 <glib.h>
#include <gio/gio.h>
+#include <unicode/ucol.h>
+
+#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 ("<br>", 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[])
{