Date: prev next · Thread: first prev next last
2011 Archives by date, by thread · List index


Hi,

I have attached two patches for the Hyphen library and the English
hyphenation patterns, also a test document.
(The first test is not yet resolved, see my next letter.)

The Hyphen patch fixes the bad hyphenation of words with hyphens (a
new bug of OpenOffice.org) and apostrophes for all languages. Old
partial (string replacement at hyphenation) of LibreOffice's English
hyphenation patterns or full solutions (explicite NOHYPHEN attribute)
are unnecessary, removed by the another patch.

Best regards,
Laci
From 722c5dc25ad32a7878f7b1d00f2864789c4081d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?L=C3=A1szl=C3=B3=20N=C3=A9meth?= <nemeth@numbertext.org>
Date: Fri, 7 Oct 2011 16:03:06 +0200
Subject: [PATCH] Fixes of Hyphen 2.8.2 (words with hyphens, numbers and use min. def. hyphenmin)

---
 hyphen/hyphen-2.7.1-2.8.2.patch |  325 +++++++++++++++++++++++++++++++++++++++
 hyphen/makefile.mk              |    3 +-
 2 files changed, 327 insertions(+), 1 deletions(-)
 create mode 100644 hyphen/hyphen-2.7.1-2.8.2.patch

diff --git a/hyphen/hyphen-2.7.1-2.8.2.patch b/hyphen/hyphen-2.7.1-2.8.2.patch
new file mode 100644
index 0000000..912fba7
--- /dev/null
+++ b/hyphen/hyphen-2.7.1-2.8.2.patch
@@ -0,0 +1,325 @@
+--- misc/build/hyphen-2.7.1/hyphen.c.old       2011-10-07 15:51:25.883686906 +0200
++++ misc/build/hyphen-2.7.1/hyphen.c   2011-10-07 15:51:59.363686900 +0200
+@@ -242,99 +242,45 @@
+ }
+ #endif
+ 
+-HyphenDict *
+-hnj_hyphen_load (const char *fn)
+-{
+-  HyphenDict *dict[2];
+-  HashTab *hashtab;
+-  FILE *f;
+-  char buf[MAX_CHARS];
++void hnj_hyphen_load_line(char * buf, HyphenDict * dict, HashTab * hashtab) {
++  int i, j;
+   char word[MAX_CHARS];
+   char pattern[MAX_CHARS];
+   char * repl;
+   signed char replindex;
+   signed char replcut;
+-  int state_num = 0, last_state;
+-  int i, j, k;
++  int state_num = 0;
++  int last_state;
+   char ch;
+   int found;
+-  HashEntry *e;
+-  int nextlevel = 0;
+-
+-  f = fopen (fn, "r");
+-  if (f == NULL)
+-    return NULL;
+ 
+-// loading one or two dictionaries (separated by NEXTLEVEL keyword)
+-for (k = 0; k == 0 || (k == 1 && nextlevel); k++) { 
+-  hashtab = hnj_hash_new ();
+-#ifdef VERBOSE
+-  global = hashtab;
+-#endif
+-  hnj_hash_insert (hashtab, "", 0);
+-  dict[k] = hnj_malloc (sizeof(HyphenDict));
+-  dict[k]->num_states = 1;
+-  dict[k]->states = hnj_malloc (sizeof(HyphenState));
+-  dict[k]->states[0].match = NULL;
+-  dict[k]->states[0].repl = NULL;
+-  dict[k]->states[0].fallback_state = -1;
+-  dict[k]->states[0].num_trans = 0;
+-  dict[k]->states[0].trans = NULL;
+-  dict[k]->nextlevel = NULL;
+-  dict[k]->lhmin = 0;
+-  dict[k]->rhmin = 0;
+-  dict[k]->clhmin = 0;
+-  dict[k]->crhmin = 0;
+-  dict[k]->nohyphen = NULL;
+-  dict[k]->nohyphenl = 0;
+-
+-  /* read in character set info */
+-  if (k == 0) {
+-    for (i=0;i<MAX_NAME;i++) dict[k]->cset[i]= 0;
+-    fgets(dict[k]->cset,  sizeof(dict[k]->cset),f);
+-    for (i=0;i<MAX_NAME;i++)
+-      if ((dict[k]->cset[i] == '\r') || (dict[k]->cset[i] == '\n'))
+-        dict[k]->cset[i] = 0;
+-    dict[k]->utf8 = (strcmp(dict[k]->cset, "UTF-8") == 0);
+-  } else {
+-    strcpy(dict[k]->cset, dict[0]->cset);
+-    dict[k]->utf8 = dict[0]->utf8;
+-  }
+-
+-  while (fgets (buf, sizeof(buf), f) != NULL)
+-    {
+-      if (buf[0] != '%')
+-      {
+-        if (strncmp(buf, "NEXTLEVEL", 9) == 0) {
+-          nextlevel = 1;
+-          break;
+-        } else if (strncmp(buf, "LEFTHYPHENMIN", 13) == 0) {
+-          dict[k]->lhmin = atoi(buf + 13);
+-          continue;
++        if (strncmp(buf, "LEFTHYPHENMIN", 13) == 0) {
++          dict->lhmin = atoi(buf + 13);
++          return;
+         } else if (strncmp(buf, "RIGHTHYPHENMIN", 14) == 0) {
+-          dict[k]->rhmin = atoi(buf + 14);
+-          continue;
++          dict->rhmin = atoi(buf + 14);
++          return;
+         } else if (strncmp(buf, "COMPOUNDLEFTHYPHENMIN", 21) == 0) {
+-          dict[k]->clhmin = atoi(buf + 21);
+-          continue;
++          dict->clhmin = atoi(buf + 21);
++          return;
+         } else if (strncmp(buf, "COMPOUNDRIGHTHYPHENMIN", 22) == 0) {
+-          dict[k]->crhmin = atoi(buf + 22);
+-          continue;
++          dict->crhmin = atoi(buf + 22);
++          return;
+         } else if (strncmp(buf, "NOHYPHEN", 8) == 0) {
+           char * space = buf + 8;
+           while (*space != '\0' && (*space == ' ' || *space == '\t')) space++;
+-          if (*buf != '\0') dict[k]->nohyphen = hnj_strdup(space);
+-          if (dict[k]->nohyphen) {
+-              char * nhe = dict[k]->nohyphen + strlen(dict[k]->nohyphen) - 1;
++          if (*buf != '\0') dict->nohyphen = hnj_strdup(space);
++          if (dict->nohyphen) {
++              char * nhe = dict->nohyphen + strlen(dict->nohyphen) - 1;
+               *nhe = 0;
+-              for (nhe = nhe - 1; nhe > dict[k]->nohyphen; nhe--) {
++              for (nhe = nhe - 1; nhe > dict->nohyphen; nhe--) {
+                       if (*nhe == ',') {
+-                          dict[k]->nohyphenl++;
++                          dict->nohyphenl++;
+                           *nhe = 0;
+                       }
+               }
+           }
+-          continue;
++          return;
+         } 
+         j = 0;
+         pattern[j] = '0';
+@@ -379,7 +325,7 @@
+           } else {
+             if (*word == '.') i++;
+             /* convert UTF-8 char. positions of discretionary hyph. replacements to 8-bit */
+-            if (dict[k]->utf8) {
++            if (dict->utf8) {
+                 int pu = -1;        /* unicode character position */
+                 int ps = -1;        /* unicode start position (original replindex) */
+                 int pc = (*word == '.') ? 1: 0; /* 8-bit character position */
+@@ -403,14 +349,14 @@
+         printf ("word %s pattern %s, j = %d  repl: %s\n", word, pattern + i, j, repl);
+ #endif
+         found = hnj_hash_lookup (hashtab, word);
+-        state_num = hnj_get_state (dict[k], hashtab, word);
+-        dict[k]->states[state_num].match = hnj_strdup (pattern + i);
+-        dict[k]->states[state_num].repl = repl;
+-        dict[k]->states[state_num].replindex = replindex;
++        state_num = hnj_get_state (dict, hashtab, word);
++        dict->states[state_num].match = hnj_strdup (pattern + i);
++        dict->states[state_num].repl = repl;
++        dict->states[state_num].replindex = replindex;
+           if (!replcut) {
+-            dict[k]->states[state_num].replcut = (signed char) strlen(word);
++            dict->states[state_num].replcut = (signed char) strlen(word);
+           } else {
+-            dict[k]->states[state_num].replcut = replcut;
++            dict->states[state_num].replcut = replcut;
+           }
+ 
+         /* now, put in the prefix transitions */
+@@ -420,11 +366,81 @@
+             ch = word[j - 1];
+             word[j - 1] = '\0';
+             found = hnj_hash_lookup (hashtab, word);
+-            state_num = hnj_get_state (dict[k], hashtab, word);
+-            hnj_add_trans (dict[k], state_num, last_state, ch);
++            state_num = hnj_get_state (dict, hashtab, word);
++            hnj_add_trans (dict, state_num, last_state, ch);
+           }
+-      }
++}
++
++HyphenDict *
++hnj_hyphen_load (const char *fn)
++{
++  HyphenDict *dict[2];
++  HashTab *hashtab;
++  FILE *f;
++  char buf[MAX_CHARS];
++  int nextlevel = 0;
++  int i, j, k;
++  HashEntry *e;
++  int state_num = 0;
++
++  f = fopen (fn, "r");
++  if (f == NULL)
++    return NULL;
++
++// loading one or two dictionaries (separated by NEXTLEVEL keyword)
++for (k = 0; k < 2; k++) { 
++  hashtab = hnj_hash_new ();
++#ifdef VERBOSE
++  global = hashtab;
++#endif
++  hnj_hash_insert (hashtab, "", 0);
++  dict[k] = hnj_malloc (sizeof(HyphenDict));
++  dict[k]->num_states = 1;
++  dict[k]->states = hnj_malloc (sizeof(HyphenState));
++  dict[k]->states[0].match = NULL;
++  dict[k]->states[0].repl = NULL;
++  dict[k]->states[0].fallback_state = -1;
++  dict[k]->states[0].num_trans = 0;
++  dict[k]->states[0].trans = NULL;
++  dict[k]->nextlevel = NULL;
++  dict[k]->lhmin = 0;
++  dict[k]->rhmin = 0;
++  dict[k]->clhmin = 0;
++  dict[k]->crhmin = 0;
++  dict[k]->nohyphen = NULL;
++  dict[k]->nohyphenl = 0;
++
++  /* read in character set info */
++  if (k == 0) {
++    for (i=0;i<MAX_NAME;i++) dict[k]->cset[i]= 0;
++    fgets(dict[k]->cset,  sizeof(dict[k]->cset),f);
++    for (i=0;i<MAX_NAME;i++)
++      if ((dict[k]->cset[i] == '\r') || (dict[k]->cset[i] == '\n'))
++        dict[k]->cset[i] = 0;
++    dict[k]->utf8 = (strcmp(dict[k]->cset, "UTF-8") == 0);
++  } else {
++    strcpy(dict[k]->cset, dict[0]->cset);
++    dict[k]->utf8 = dict[0]->utf8;
++  }
++
++  if (k == 0 || nextlevel) {
++    while (fgets (buf, sizeof(buf), f) != NULL) {
++      if (strncmp(buf, "NEXTLEVEL", 9) == 0) {
++      nextlevel = 1;
++      break;
++      } else if (buf[0] != '%') hnj_hyphen_load_line(buf, dict[k], hashtab);
+     }
++  } else if (k == 1) {
++    /* default first level: hyphen and ASCII apostrophe */
++    if (!dict[0]->utf8) hnj_hyphen_load_line("NOHYPHEN -,'\n", dict[k], hashtab);
++    else hnj_hyphen_load_line("NOHYPHEN -,',\xe2\x80\x93,\xe2\x80\x99\n", dict[k], hashtab);
++    hnj_hyphen_load_line("1-1\n", dict[k], hashtab); /* hyphen */
++    hnj_hyphen_load_line("1'1\n", dict[k], hashtab); /* ASCII apostrophe */
++    if (dict[0]->utf8) {
++      hnj_hyphen_load_line("1\xe2\x80\x93" "1\n", dict[k], hashtab); /* endash */
++      hnj_hyphen_load_line("1\xe2\x80\x99" "1\n", dict[k], hashtab); /* apostrophe */
++    }
++  }
+ 
+   /* Could do unioning of matches here (instead of the preprocessor script).
+      If we did, the pseudocode would look something like this:
+@@ -476,7 +492,15 @@
+   state_num = 0;
+ }
+   fclose(f);
+-  if (k == 2) dict[0]->nextlevel = dict[1];
++  if (nextlevel) dict[0]->nextlevel = dict[1];
++  else {
++    dict[1] -> nextlevel = dict[0];
++    dict[1]->lhmin = dict[0]->lhmin;
++    dict[1]->rhmin = dict[0]->rhmin;
++    dict[1]->clhmin = (dict[0]->clhmin) ? dict[0]->clhmin : ((dict[0]->lhmin) ? dict[0]->lhmin : 
2);
++    dict[1]->crhmin = (dict[0]->crhmin) ? dict[0]->crhmin : ((dict[0]->rhmin) ? dict[0]->rhmin : 
2);
++    return dict[1];
++  }
+   return dict[0];
+ }
+ 
+@@ -527,8 +551,13 @@
+   j = 0;
+   prep_word[j++] = '.';
+ 
+-  for (i = 0; i < word_size; i++)
++  for (i = 0; i < word_size; i++) {
++    if (word[i] <= '9' && word[i] >= '0') {
++      prep_word[j++] = '.';
++    } else {
+       prep_word[j++] = word[i];
++    }
++  }
+ 
+   prep_word[j++] = '.';
+   prep_word[j] = '\0';
+@@ -670,6 +699,9 @@
+       i += hnj_ligature(word[2]);
+     }
+ 
++    // ignore numbers
++    for (j = 0; word[j] <= '9' && word[j] >= '0'; j++) i--;
++
+     for (j = 0; i < lhmin && word[j] != '\0'; i++) do {
+       // check length of the non-standard part
+       if (*rep && *pos && *cut && (*rep)[j]) {
+@@ -696,9 +728,13 @@
+ int hnj_hyphen_rhmin(int utf8, const char *word, int word_size, char * hyphens,
+       char *** rep, int ** pos, int ** cut, int rhmin)
+ {
+-    int i;
+-    int j = word_size - 2;    
+-    for (i = 1; i < rhmin && j > 0; j--) {
++    int i = 1;
++    int j;
++
++    // ignore numbers
++    for (j = word_size - 1; j > 0 && word[j] <= '9' && word[j] >= '0'; j--) i--;
++
++    for (j = word_size - 2; i < rhmin && j > 0; j--) {
+       // check length of the non-standard part
+       if (*rep && *pos && *cut && (*rep)[j]) {
+         char * rh = strchr((*rep)[j], '=');
+@@ -756,8 +792,15 @@
+   j = 0;
+   prep_word[j++] = '.';
+   
+-  for (i = 0; i < word_size; i++)
++  for (i = 0; i < word_size; i++) {
++    if (word[i] <= '9' && word[i] >= '0') {
++      prep_word[j++] = '.';
++    } else {
+       prep_word[j++] = word[i];
++    }
++  }
++
++
+ 
+   prep_word[j++] = '.';
+   prep_word[j] = '\0';
+@@ -1093,8 +1136,10 @@
+       char *hyphword, char *** rep, int ** pos, int ** cut,
+       int lhmin, int rhmin, int clhmin, int crhmin)
+ {
+-  lhmin = (lhmin > 0 ? lhmin : dict->lhmin);
+-  rhmin = (rhmin > 0 ? rhmin : dict->rhmin);
++  lhmin = (lhmin > dict->lhmin) ? lhmin : dict->lhmin;
++  rhmin = (rhmin > dict->rhmin) ? rhmin : dict->rhmin;
++  clhmin = (clhmin > dict->clhmin) ? clhmin : dict->clhmin;
++  crhmin = (crhmin > dict->crhmin) ? crhmin : dict->crhmin;
+   hnj_hyphen_hyph_(dict, word, word_size, hyphens, rep, pos, cut,
+     clhmin, crhmin, 1, 1);
+   hnj_hyphen_lhmin(dict->utf8, word, word_size, hyphens,
diff --git a/hyphen/makefile.mk b/hyphen/makefile.mk
index 80f5bbd..06cfc58 100644
--- a/hyphen/makefile.mk
+++ b/hyphen/makefile.mk
@@ -43,7 +43,8 @@ ADDITIONAL_FILES += makefile.mk
 
 PATCH_FILES= \
     hyphen-2.7.1.patch \
-    hyphen-2.7.1-read-charset.patch
+    hyphen-2.7.1-read-charset.patch \
+    hyphen-2.7.1-2.8.2.patch
 
 .IF "$(GUI)"=="UNX"
 CONFIGURE_DIR=$(BUILD_DIR)
-- 
1.7.4.1

From a44474b261c37b44fe50324cd888ed4d8e99bf26 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?L=C3=A1szl=C3=B3=20N=C3=A9meth?= <nemeth@numbertext.org>
Date: Fri, 7 Oct 2011 16:49:29 +0200
Subject: [PATCH] Fix hyphenation of words with hyphens (handled by Hyphen 2.8.2)

---
 dictionaries/en/README_hyph_en_GB.txt |    4 +
 dictionaries/en/README_hyph_en_US.txt |    4 +
 dictionaries/en/hyph_en_GB.dic        |  272 ---------------------------------
 dictionaries/en/hyph_en_US.dic        |  272 ---------------------------------
 4 files changed, 8 insertions(+), 544 deletions(-)

diff --git a/dictionaries/en/README_hyph_en_GB.txt b/dictionaries/en/README_hyph_en_GB.txt
index b6acd82..4afac7b 100644
--- a/dictionaries/en/README_hyph_en_GB.txt
+++ b/dictionaries/en/README_hyph_en_GB.txt
@@ -1,5 +1,9 @@
 hyph_en_GB.dic - British English hyphenation patterns for OpenOffice.org
 
+version 2011-10-07
+
+- remove unnecessary parts for Hyphen 2.8.2
+
 version 2010-03-16
 
 Changes
diff --git a/dictionaries/en/README_hyph_en_US.txt b/dictionaries/en/README_hyph_en_US.txt
index 649bcfc..8420172 100644
--- a/dictionaries/en/README_hyph_en_US.txt
+++ b/dictionaries/en/README_hyph_en_US.txt
@@ -1,5 +1,9 @@
 hyph_en_US.dic - American English hyphenation patterns for OpenOffice.org
 
+version 2011-10-07
+
+- remove unnecessary parts for the new Hyphen 2.8.2
+
 version 2010-03-16
 
 Changes
diff --git a/dictionaries/en/hyph_en_GB.dic b/dictionaries/en/hyph_en_GB.dic
index a310712..e19d0ea 100644
--- a/dictionaries/en/hyph_en_GB.dic
+++ b/dictionaries/en/hyph_en_GB.dic
@@ -3,13 +3,6 @@ LEFTHYPHENMIN 2
 RIGHTHYPHENMIN 3
 COMPOUNDLEFTHYPHENMIN 2
 COMPOUNDRIGHTHYPHENMIN 3
-1'.
-1's./'=s,1,2
-1't./'=t,1,2
-1’.
-1’s./’=s,1,2
-1’t./’=t,1,2
-NEXTLEVEL
 .1ab
 .ab4i
 .abo2
@@ -13391,271 +13384,6 @@ z5z2ot2
 .someth1in
 .somethi4ng
 .some5thing.
-8'8
-8a8'8
-8b8'8
-8c8'8
-8d8'8
-8e8'8
-8f8'8
-8g8'8
-8h8'8
-8i8'8
-8j8'8
-8k8'8
-8l8'8
-8m8'8
-8n8'8
-8o8'8
-8p8'8
-8q8'8
-8r8'8
-8s8'8
-8t8'8
-8u8'8
-8v8'8
-8w8'8
-8x8'8
-8y8'8
-8z8'8
-'a8
-'b8
-'c8
-'d8
-'e8
-'f8
-'g8
-'h8
-'i8
-'j8
-'k8
-'l8
-'m8
-'n8
-'o8
-'p8
-'q8
-'r8
-'s8
-'t8
-'u8
-'v8
-'w8
-'x8
-'y8
-'z8
-8’8
-8a8’8
-8b8’8
-8c8’8
-8d8’8
-8e8’8
-8f8’8
-8g8’8
-8h8’8
-8i8’8
-8j8’8
-8k8’8
-8l8’8
-8m8’8
-8n8’8
-8o8’8
-8p8’8
-8q8’8
-8r8’8
-8s8’8
-8t8’8
-8u8’8
-8v8’8
-8w8’8
-8x8’8
-8y8’8
-8z8’8
-’a8
-’b8
-’c8
-’d8
-’e8
-’f8
-’g8
-’h8
-’i8
-’j8
-’k8
-’l8
-’m8
-’n8
-’o8
-’p8
-’q8
-’r8
-’s8
-’t8
-’u8
-’v8
-’w8
-’x8
-’y8
-’z8
-8-8
-8a8-8
-8b8-8
-8c8-8
-8d8-8
-8e8-8
-8f8-8
-8g8-8
-8h8-8
-8i8-8
-8j8-8
-8k8-8
-8l8-8
-8m8-8
-8n8-8
-8o8-8
-8p8-8
-8q8-8
-8r8-8
-8s8-8
-8t8-8
-8u8-8
-8v8-8
-8w8-8
-8x8-8
-8y8-8
-8z8-8
--a8
--b8
--c8
--d8
--e8
--f8
--g8
--h8
--i8
--j8
--k8
--l8
--m8
--n8
--o8
--p8
--q8
--r8
--s8
--t8
--u8
--v8
--w8
--x8
--y8
--z8
-8–8
-8a8–8
-8b8–8
-8c8–8
-8d8–8
-8e8–8
-8f8–8
-8g8–8
-8h8–8
-8i8–8
-8j8–8
-8k8–8
-8l8–8
-8m8–8
-8n8–8
-8o8–8
-8p8–8
-8q8–8
-8r8–8
-8s8–8
-8t8–8
-8u8–8
-8v8–8
-8w8–8
-8x8–8
-8y8–8
-8z8–8
-–a8
-–b8
-–c8
-–d8
-–e8
-–f8
-–g8
-–h8
-–i8
-–j8
-–k8
-–l8
-–m8
-–n8
-–o8
-–p8
-–q8
-–r8
-–s8
-–t8
-–u8
-–v8
-–w8
-–x8
-–y8
-–z8
-8—8
-8a8—8
-8b8—8
-8c8—8
-8d8—8
-8e8—8
-8f8—8
-8g8—8
-8h8—8
-8i8—8
-8j8—8
-8k8—8
-8l8—8
-8m8—8
-8n8—8
-8o8—8
-8p8—8
-8q8—8
-8r8—8
-8s8—8
-8t8—8
-8u8—8
-8v8—8
-8w8—8
-8x8—8
-8y8—8
-8z8—8
-—a8
-—b8
-—c8
-—d8
-—e8
-—f8
-—g8
-—h8
-—i8
-—j8
-—k8
-—l8
-—m8
-—n8
-—o8
-—p8
-—q8
-—r8
-—s8
-—t8
-—u8
-—v8
-—w8
-—x8
-—y8
-—z8
 .afflat7u4s4es.
 .affl2
 .affl2a2tu
diff --git a/dictionaries/en/hyph_en_US.dic b/dictionaries/en/hyph_en_US.dic
index a1fd879..d7dd292 100644
--- a/dictionaries/en/hyph_en_US.dic
+++ b/dictionaries/en/hyph_en_US.dic
@@ -3,13 +3,6 @@ LEFTHYPHENMIN 2
 RIGHTHYPHENMIN 3
 COMPOUNDLEFTHYPHENMIN 2
 COMPOUNDRIGHTHYPHENMIN 3
-1'.
-1's./'=s,1,2
-1't./'=t,1,2
-1’.
-1’s./’=s,1,2
-1’t./’=t,1,2
-NEXTLEVEL
 .a2ch4
 .ad4der
 .a2d
@@ -10997,271 +10990,6 @@ z4zy
 .zeits2ch2
 .zeitsc4hr4
 .zeitschr4i2ft
-8'8
-8a8'8
-8b8'8
-8c8'8
-8d8'8
-8e8'8
-8f8'8
-8g8'8
-8h8'8
-8i8'8
-8j8'8
-8k8'8
-8l8'8
-8m8'8
-8n8'8
-8o8'8
-8p8'8
-8q8'8
-8r8'8
-8s8'8
-8t8'8
-8u8'8
-8v8'8
-8w8'8
-8x8'8
-8y8'8
-8z8'8
-'a8
-'b8
-'c8
-'d8
-'e8
-'f8
-'g8
-'h8
-'i8
-'j8
-'k8
-'l8
-'m8
-'n8
-'o8
-'p8
-'q8
-'r8
-'s8
-'t8
-'u8
-'v8
-'w8
-'x8
-'y8
-'z8
-8’8
-8a8’8
-8b8’8
-8c8’8
-8d8’8
-8e8’8
-8f8’8
-8g8’8
-8h8’8
-8i8’8
-8j8’8
-8k8’8
-8l8’8
-8m8’8
-8n8’8
-8o8’8
-8p8’8
-8q8’8
-8r8’8
-8s8’8
-8t8’8
-8u8’8
-8v8’8
-8w8’8
-8x8’8
-8y8’8
-8z8’8
-’a8
-’b8
-’c8
-’d8
-’e8
-’f8
-’g8
-’h8
-’i8
-’j8
-’k8
-’l8
-’m8
-’n8
-’o8
-’p8
-’q8
-’r8
-’s8
-’t8
-’u8
-’v8
-’w8
-’x8
-’y8
-’z8
-8-8
-8a8-8
-8b8-8
-8c8-8
-8d8-8
-8e8-8
-8f8-8
-8g8-8
-8h8-8
-8i8-8
-8j8-8
-8k8-8
-8l8-8
-8m8-8
-8n8-8
-8o8-8
-8p8-8
-8q8-8
-8r8-8
-8s8-8
-8t8-8
-8u8-8
-8v8-8
-8w8-8
-8x8-8
-8y8-8
-8z8-8
--a8
--b8
--c8
--d8
--e8
--f8
--g8
--h8
--i8
--j8
--k8
--l8
--m8
--n8
--o8
--p8
--q8
--r8
--s8
--t8
--u8
--v8
--w8
--x8
--y8
--z8
-8–8
-8a8–8
-8b8–8
-8c8–8
-8d8–8
-8e8–8
-8f8–8
-8g8–8
-8h8–8
-8i8–8
-8j8–8
-8k8–8
-8l8–8
-8m8–8
-8n8–8
-8o8–8
-8p8–8
-8q8–8
-8r8–8
-8s8–8
-8t8–8
-8u8–8
-8v8–8
-8w8–8
-8x8–8
-8y8–8
-8z8–8
-–a8
-–b8
-–c8
-–d8
-–e8
-–f8
-–g8
-–h8
-–i8
-–j8
-–k8
-–l8
-–m8
-–n8
-–o8
-–p8
-–q8
-–r8
-–s8
-–t8
-–u8
-–v8
-–w8
-–x8
-–y8
-–z8
-8—8
-8a8—8
-8b8—8
-8c8—8
-8d8—8
-8e8—8
-8f8—8
-8g8—8
-8h8—8
-8i8—8
-8j8—8
-8k8—8
-8l8—8
-8m8—8
-8n8—8
-8o8—8
-8p8—8
-8q8—8
-8r8—8
-8s8—8
-8t8—8
-8u8—8
-8v8—8
-8w8—8
-8x8—8
-8y8—8
-8z8—8
-—a8
-—b8
-—c8
-—d8
-—e8
-—f8
-—g8
-—h8
-—i8
-—j8
-—k8
-—l8
-—m8
-—n8
-—o8
-—p8
-—q8
-—r8
-—s8
-—t8
-—u8
-—v8
-—w8
-—x8
-—y8
-—z8
 .affin9i1ty
 .affin2it
 .affin9ity's8
-- 
1.7.4.1

Attachment: hyphenation_nohyphen_number_test.odt
Description: application/vnd.oasis.opendocument.text


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.