diff --git a/dictsource/lv_rules b/dictsource/lv_rules index afece51a..dd2e73a8 100644 --- a/dictsource/lv_rules +++ b/dictsource/lv_rules @@ -4,7 +4,7 @@ .replace ó ȯ // replace o-acute with o-dot, as it is more logical for "short o" - + ḩ h // +---------------------------+ // | Suffixes of nouns | // +---------------------------+ @@ -156,10 +156,12 @@ .group c c ts + L55) c (L55 ts> c (C ts_! .group č č tS + L55) č (L55 tS> .group d d d @@ -173,7 +175,7 @@ ei (+ ei // narrow e ---------------------------------------------------------------------- // - a) e (ro e // internationalsms + a) e (ro e // internationalisms e (o e // international consonants e (JL41+ e @@ -380,6 +382,7 @@ .group f f f + L55) f (L55 f> .group g g g @@ -389,6 +392,7 @@ .group h h h + L55) h (L55 h> .group i i i @@ -410,10 +414,12 @@ .group k k k + L55) k (L55 k> k (ļ k} // tiny pause between k and ļ .group ķ ķ c + L55) ķ (L55 c> ķ (L55 c} // tiny pause for sharper sound before short vowels .group l @@ -1459,8 +1465,8 @@ L46L45L45) o (<< uo .group p p p - // pus..number stress on next syllable - _) pus (vien p%us + L55) p (L55 p> + _) pus (vien p%us // pus..number stress on next syllable _) pus (div p%us _) pus (otr p%us _) pus (trij p%us @@ -1487,12 +1493,15 @@ L46L45L45) o (<< uo sh s_!h_! // probably no need to make distinct in other places _) s (L61 s_ // make s distinct at start of the word before unvocied consonants s s + L55) s (L55 s> .group š š S + L55) š (L55 S> .group t t t + L55) t (L55 t> .group u ui ui diff --git a/src/libespeak-ng/dictionary.c b/src/libespeak-ng/dictionary.c index d3f03d62..cc7f3724 100644 --- a/src/libespeak-ng/dictionary.c +++ b/src/libespeak-ng/dictionary.c @@ -672,6 +672,7 @@ static int LetterGroupNo(char *rule) static int IsLetterGroup(Translator *tr, char *word, int group, int pre) { /* Match the word against a list of utf-8 strings. + * returns length of matching letter group or -1 * * How this works: * @@ -705,20 +706,11 @@ static int IsLetterGroup(Translator *tr, char *word, int group, int pre) } else w = word; - // If no character is allowed in group - // at the start (for pre-rule) or end (post-rule) - // of the checked letter in the word, return true. - if (*p == '~' && *w == ' ') // word end checked because of comment below - return 1; - /* TODO: Need to investigate why word end mark _ doesn't work properly - * for post rule somewhere in MatchRule() function. or e.g.: - * - * .L01 ~ b c - * .group a - * _L01) a i // this works - * a (L01_ u // this doesn't work - */ + // If '~' (no character) is allowed in group, return 0. + if (*p == '~') + return 0; + // Check current group while ((*p == *w) && (*w != 0)) { w++; p++; @@ -733,7 +725,8 @@ static int IsLetterGroup(Translator *tr, char *word, int group, int pre) while (*p++ != 0) ; } - return 0; + // Not found + return -1; } static int IsLetter(Translator *tr, int letter, int group) @@ -1767,9 +1760,10 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ break; case RULE_LETTERGP2: // match against a list of utf-8 strings letter_group = LetterGroupNo(rule++); - if ((n_bytes = IsLetterGroup(tr, post_ptr-1, letter_group, 0)) > 0) { + if ((n_bytes = IsLetterGroup(tr, post_ptr-1, letter_group, 0)) >= 0) { add_points = (20-distance_right); - post_ptr += (n_bytes-1); + if (n_bytes > 0) // move pointer, if non-zero length group was found + post_ptr += (n_bytes-1); } else failed = 1; break; @@ -1886,19 +1880,18 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ case RULE_SKIPCHARS: { // '(Jxy' means 'skip characters until xy' - char *p = post_ptr + letter_xbytes; - char *p2 = p; // pointer to the previous character in the word - int rule_w; // first wide character of skip rule + char *p = post_ptr - 1; // to allow empty jump (without letter between), go one back + char *p2 = p; // pointer to the previous character in the word + int rule_w; // first wide character of skip rule utf8_in(&rule_w, rule); - int g_bytes = 0; // bytes of successfully found character group - while ((letter_w != rule_w) && (letter_w != RULE_SPACE) && (letter_w != 0) && (g_bytes == 0)) { + int g_bytes = -1; // bytes of successfully found character group + while ((letter_w != rule_w) && (letter_w != RULE_SPACE) && (letter_w != 0) && (g_bytes == -1)) { + if (rule_w == RULE_LETTERGP2) + g_bytes = IsLetterGroup(tr, p, LetterGroupNo(rule + 1), 0); p2 = p; p += utf8_in(&letter_w, p); - if (rule_w == RULE_LETTERGP2) - g_bytes = IsLetterGroup(tr, p2, LetterGroupNo(rule + 1), 0); - } - if ((letter_w == rule_w) || (g_bytes > 0)) + if ((letter_w == rule_w) || (g_bytes >= 0)) post_ptr = p2; } break; @@ -1975,9 +1968,10 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ break; case RULE_LETTERGP2: // match against a list of utf-8 strings letter_group = LetterGroupNo(rule++); - if ((n_bytes = IsLetterGroup(tr, pre_ptr, letter_group, 1)) > 0) { + if ((n_bytes = IsLetterGroup(tr, pre_ptr, letter_group, 1)) >= 0) { add_points = (20-distance_right); - pre_ptr -= (n_bytes-1); + if (n_bytes > 0) // move pointer, if non-zero length group was found + pre_ptr -= (n_bytes-1); } else failed = 1; break; @@ -2091,11 +2085,11 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ case RULE_SKIPCHARS: { // 'xyJ)' means 'skip characters backwards until xy' - char *p = pre_ptr; // pointer to current character in word - char *p2 = p; // pointer to previous character in word - int g_bytes = 0; // bytes of successfully found character group + char *p = pre_ptr + 1; // to allow empty jump (without letter between), go one forward + char *p2 = p; // pointer to previous character in word + int g_bytes = -1; // bytes of successfully found character group - while ((*p != *rule) && (*p != RULE_SPACE) && (*p != 0) && (g_bytes == 0)) { + while ((*p != *rule) && (*p != RULE_SPACE) && (*p != 0) && (g_bytes == -1)) { p2 = p; p--; if (*rule == RULE_LETTERGP2) @@ -2106,7 +2100,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ // 'xy' part is checked as usual in following cycles of PRE rule characters if (*p == *rule) pre_ptr = p2; - if (g_bytes > 0) + if (g_bytes >= 0) pre_ptr = p2 + 1; }