--- yelp-2.30.0/src/yelp-man.c.orig 2010-09-09 15:39:57.000000000 +0900 +++ yelp-2.30.0/src/yelp-man.c 2010-09-09 16:32:46.000000000 +0900 @@ -399,6 +399,44 @@ transform_final_func (YelpTransform *tra g_mutex_unlock (priv->mutex); } +static gchar * +get_language_from_filename (const gchar *filename) +{ + int i; + char *p; + char *prev = NULL; + char *language = NULL; + + g_return_val_if_fail (filename != NULL, NULL); + + /* filename format is "/usr/share/man/locale/man1/foo.1" */ + p = filename + strlen (filename); + for (i = 0; i < 3; i++) { + prev = p; + if ((p = g_strrstr_len (filename, p - filename, "/")) == NULL) { + return NULL; + } + if (p <= filename) { + return NULL; + } + p--; + } + p += 2; + + if (prev != NULL) { + language = g_strndup (p, prev + 1 - p); + } else { + language = g_strdup (p); + } + + if (g_strcmp0 (language, "man") == 0) { + g_free (language); + return NULL; + } + + return language; +} + /******************************************************************************/ /** Threaded ******************************************************************/ @@ -407,7 +445,7 @@ static void man_process (YelpMan *man) { YelpManPriv *priv; - const gchar *language; + gchar *language = NULL; const gchar *encoding; YelpManParser *parser; YelpError *error = NULL; @@ -434,14 +472,19 @@ man_process (YelpMan *man) } /* FIXME: get the language */ - language = "C"; + if (priv->filename != NULL) { + language = get_language_from_filename (priv->filename); + } + if (language == NULL) { + language = g_strdup ("C"); + } /* default encoding if the language doesn't match below */ encoding = g_getenv("MAN_ENCODING"); - if (encoding == NULL) - encoding = "ISO-8859-1"; - if (language != NULL) { + if (encoding == NULL && + g_getenv ("YELP_MAN_LEGACY_ENCODING") && + language != NULL) { for (i = 0; langmap[i].language != NULL; i++) { if (g_str_equal (language, langmap[i].language)) { encoding = langmap[i].encoding; @@ -450,6 +493,15 @@ man_process (YelpMan *man) } } + if (encoding == NULL) { + if (language == NULL || g_strcmp0 (language, "C") == 0) { + encoding = "ISO-8859-1"; + } else { + encoding = "UTF-8"; + } + } + g_free (language); + parser = yelp_man_parser_new (); priv->xmldoc = yelp_man_parser_parse_file (parser, priv->filename, encoding); yelp_man_parser_free (parser);