comparison plugins/spellchk.c @ 11317:cdd9d1011d97

[gaim-migrate @ 13519] Reapplying the previous changes, plus Levi's changes to fix the crashing, plus a couple more cosmetic fixes by me. committer: Tailor Script <tailor@pidgin.im>
author Richard Laager <rlaager@wiktel.com>
date Fri, 19 Aug 2005 20:06:37 +0000
parents bcc7f30c91bd
children 519dc2186438
comparison
equal deleted inserted replaced
11316:12f6164ee2c6 11317:cdd9d1011d97
54 #define SPELLCHK_OBJECT_KEY "spellchk" 54 #define SPELLCHK_OBJECT_KEY "spellchk"
55 55
56 enum { 56 enum {
57 BAD_COLUMN, 57 BAD_COLUMN,
58 GOOD_COLUMN, 58 GOOD_COLUMN,
59 WORD_ONLY_COLUMN,
59 N_COLUMNS 60 N_COLUMNS
60 }; 61 };
61 62
62 struct _spellchk { 63 struct _spellchk {
63 GtkTextView *view; 64 GtkTextView *view;
64 GtkTextMark *mark_insert_start; 65 GtkTextMark *mark_insert_start;
65 GtkTextMark *mark_insert_end; 66 GtkTextMark *mark_insert_end;
66 67
67 gchar *word; 68 const gchar *word;
68 gboolean inserting; 69 gboolean inserting;
69 gboolean ignore_correction; 70 gboolean ignore_correction;
70 gint pos; 71 gint pos;
71 }; 72 };
72 73
73 typedef struct _spellchk spellchk; 74 typedef struct _spellchk spellchk;
74 75
75 static GtkListStore *model; 76 static GtkListStore *model;
76 77
77 static gboolean 78 static gboolean
78 is_word_uppercase(gchar *word) 79 is_word_uppercase(const gchar *word)
79 { 80 {
80 for (; word[0] != '\0'; word = g_utf8_find_next_char (word, NULL)) { 81 for (; word[0] != '\0'; word = g_utf8_find_next_char (word, NULL)) {
81 if (!g_unichar_isupper(g_utf8_get_char(word)) && 82 if (!g_unichar_isupper(g_utf8_get_char(word)) &&
82 !g_unichar_ispunct(g_utf8_get_char(word))) 83 !g_unichar_ispunct(g_utf8_get_char(word)))
83 return FALSE; 84 return FALSE;
85 86
86 return TRUE; 87 return TRUE;
87 } 88 }
88 89
89 static gboolean 90 static gboolean
90 is_word_lowercase(gchar *word) 91 is_word_lowercase(const gchar *word)
91 { 92 {
92 for (; word[0] != '\0'; word = g_utf8_find_next_char(word, NULL)) { 93 for (; word[0] != '\0'; word = g_utf8_find_next_char(word, NULL)) {
93 if (!g_unichar_islower(g_utf8_get_char(word)) && 94 if (!g_unichar_islower(g_utf8_get_char(word)) &&
94 !g_unichar_ispunct(g_utf8_get_char(word))) 95 !g_unichar_ispunct(g_utf8_get_char(word)))
95 return FALSE; 96 return FALSE;
97 98
98 return TRUE; 99 return TRUE;
99 } 100 }
100 101
101 static gboolean 102 static gboolean
102 is_word_proper(gchar *word) 103 is_word_proper(const gchar *word)
103 { 104 {
104 if (word[0] == '\0') 105 if (word[0] == '\0')
105 return FALSE; 106 return FALSE;
106 107
107 if (!g_unichar_isupper(g_utf8_get_char_validated(word, -1))) 108 if (!g_unichar_isupper(g_utf8_get_char_validated(word, -1)))
109 110
110 return is_word_lowercase(g_utf8_offset_to_pointer(word, 1)); 111 return is_word_lowercase(g_utf8_offset_to_pointer(word, 1));
111 } 112 }
112 113
113 static gchar * 114 static gchar *
114 make_word_proper(gchar *word) 115 make_word_proper(const gchar *word)
115 { 116 {
116 gchar *state = g_utf8_strdown(word, -1); 117 gchar *state = g_utf8_strdown(word, -1);
117 118
118 state[0] = g_unichar_toupper(g_utf8_get_char(word)); 119 state[0] = g_unichar_toupper(g_utf8_get_char(word));
119 120
120 return state; 121 return state;
122 }
123
124 static gboolean
125 substitute_simple_buffer(GtkTextBuffer *buffer)
126 {
127 GtkTextIter start;
128 GtkTextIter end;
129 GtkTreeIter treeiter;
130 gchar *text = NULL;
131
132 gtk_text_buffer_get_iter_at_offset(buffer, &start, 0);
133 gtk_text_buffer_get_iter_at_offset(buffer, &end, 0);
134 gtk_text_iter_forward_to_end(&end);
135
136 text = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
137
138 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &treeiter) && text) {
139 do{
140 GValue val0 = {0, };
141 GValue val1 = {0, };
142 GValue val2 = {0, };
143 const gchar *bad;
144 const gchar *good;
145 gchar *cursor;
146 gboolean word_only;
147 glong char_pos;
148
149 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &treeiter, BAD_COLUMN, &val0);
150 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &treeiter, GOOD_COLUMN, &val1);
151 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &treeiter, WORD_ONLY_COLUMN, &val2);
152
153 bad = g_value_get_string(&val0);
154 good = g_value_get_string(&val1);
155 word_only = g_value_get_boolean(&val2);
156
157 /* using g_utf8_* to get /character/ offsets instead of byte offsets for buffer */
158 if (!word_only && (cursor = g_strrstr(text, bad)))
159 {
160 char_pos = g_utf8_pointer_to_offset(text, cursor);
161 gtk_text_buffer_get_iter_at_offset(buffer, &start, char_pos);
162 gtk_text_buffer_get_iter_at_offset(buffer, &end, char_pos + g_utf8_strlen(bad, -1));
163 gtk_text_buffer_delete(buffer, &start, &end);
164
165 gtk_text_buffer_get_iter_at_offset(buffer, &start, char_pos);
166 gtk_text_buffer_insert(buffer, &start, good, -1);
167
168 g_value_unset(&val0);
169 g_value_unset(&val1);
170 g_value_unset(&val2);
171
172 return TRUE;
173 }
174
175 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &treeiter));
176 }
177
178 return FALSE;
121 } 179 }
122 180
123 static gchar * 181 static gchar *
124 substitute_word(gchar *word) 182 substitute_word(gchar *word)
125 { 183 {
134 192
135 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) { 193 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) {
136 do { 194 do {
137 GValue val0 = {0, }; 195 GValue val0 = {0, };
138 GValue val1 = {0, }; 196 GValue val1 = {0, };
139 char *bad; 197 GValue val2 = {0, };
140 char *good; 198 const char *bad;
199 const char *good;
141 gchar *tmpbad; 200 gchar *tmpbad;
142 gchar *tmpword; 201 gchar *tmpword;
143 202 gboolean word_only;
144 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, 0, &val0); 203
145 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, 1, &val1); 204 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, BAD_COLUMN, &val0);
146 205 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, GOOD_COLUMN, &val1);
147 bad = (char *) g_value_get_string(&val0); 206 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, WORD_ONLY_COLUMN, &val2);
148 good = (char *) g_value_get_string(&val1); 207
208 bad = g_value_get_string(&val0);
209 good = g_value_get_string(&val1);
210 word_only = g_value_get_boolean(&val2);
149 211
150 tmpbad = g_utf8_casefold(bad, -1); 212 tmpbad = g_utf8_casefold(bad, -1);
151 tmpword = g_utf8_casefold(word, -1); 213 tmpword = g_utf8_casefold(word, -1);
152 214
153 if (!strcmp(bad, lowerword) || (!is_word_lowercase(bad) && !strcmp(tmpbad, tmpword))) { 215 if (word_only && (!strcmp(bad, lowerword) || (!is_word_lowercase(bad) && !strcmp(tmpbad, tmpword)))) {
216 g_free(tmpbad);
217 g_free(tmpword);
218
154 outword = g_strdup(good); 219 outword = g_strdup(good);
155 220
156 if (is_word_lowercase(bad) && is_word_lowercase(good)) { 221 if (is_word_lowercase(bad) && is_word_lowercase(good)) {
157 222
158 if (is_word_uppercase (word)) { 223 if (is_word_uppercase (word)) {
170 } 235 }
171 } 236 }
172 237
173 g_value_unset(&val0); 238 g_value_unset(&val0);
174 g_value_unset(&val1); 239 g_value_unset(&val1);
175 240 g_value_unset(&val2);
176 g_free(tmpbad);
177 g_free(tmpword);
178 241
179 return outword; 242 return outword;
180 } 243 }
244
181 g_value_unset(&val0); 245 g_value_unset(&val0);
182 g_value_unset(&val1); 246 g_value_unset(&val1);
183 247 g_value_unset(&val2);
184 g_free(tmpbad); 248 g_free(tmpbad);
185 g_free(tmpword); 249 g_free(tmpword);
186 250
187 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter)); 251 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter));
188 } 252 }
287 351
288 gboolean result; 352 gboolean result;
289 gchar *tmp; 353 gchar *tmp;
290 int period_count = 0; 354 int period_count = 0;
291 gchar *word; 355 gchar *word;
356 GtkTextMark *mark;
357 GtkTextIter pos;
358
359 if (substitute_simple_buffer(buffer))
360 {
361 mark = gtk_text_buffer_get_insert(buffer);
362 gtk_text_buffer_get_iter_at_mark(buffer, &pos, mark);
363 spell->pos = gtk_text_iter_get_offset(&pos);
364
365 gtk_text_buffer_get_iter_at_mark(buffer, &start, mark);
366 gtk_text_buffer_get_iter_at_mark(buffer, &end, mark);
367 }
292 368
293 /* We need to go backwords to find out if we are inside a word or not. */ 369 /* We need to go backwords to find out if we are inside a word or not. */
294 gtk_text_iter_backward_char(&end); 370 gtk_text_iter_backward_char(&end);
295 371
296 if (spellchk_inside_word(&end)) { 372 if (spellchk_inside_word(&end)) {
355 g_free(tmp); 431 g_free(tmp);
356 return; 432 return;
357 } 433 }
358 g_free(tmp); 434 g_free(tmp);
359 435
360 /* g_free(spell->word); */
361 spell->word = NULL; 436 spell->word = NULL;
362 437
363 } 438 }
364 439
365 /* insertion works like this: 440 /* insertion works like this:
375 if (spell->inserting == TRUE) 450 if (spell->inserting == TRUE)
376 return; 451 return;
377 452
378 spell->inserting = TRUE; 453 spell->inserting = TRUE;
379 454
380 if (spell->word) { 455 spell->word = NULL;
381 /* g_free(spell->word); */
382 spell->word = NULL;
383 }
384 456
385 gtk_text_buffer_move_mark(buffer, spell->mark_insert_start, iter); 457 gtk_text_buffer_move_mark(buffer, spell->mark_insert_start, iter);
386 } 458 }
387 459
388 static void 460 static void
429 mark = gtk_text_buffer_get_insert(buffer); 501 mark = gtk_text_buffer_get_insert(buffer);
430 gtk_text_buffer_get_iter_at_mark(buffer, &pos, mark); 502 gtk_text_buffer_get_iter_at_mark(buffer, &pos, mark);
431 place = gtk_text_iter_get_offset(&pos); 503 place = gtk_text_iter_get_offset(&pos);
432 504
433 if ((place + 1) != spell->pos) { 505 if ((place + 1) != spell->pos) {
434 /* g_free(spell->word); */
435 spell->word = NULL; 506 spell->word = NULL;
436 return; 507 return;
437 } 508 }
438 509
439 gtk_text_buffer_get_iter_at_mark(buffer, &start2, spell->mark_insert_start); 510 gtk_text_buffer_get_iter_at_mark(buffer, &start2, spell->mark_insert_start);
441 512
442 gtk_text_buffer_delete(buffer, &start2, &end2); 513 gtk_text_buffer_delete(buffer, &start2, &end2);
443 gtk_text_buffer_insert(buffer, &start2, spell->word, -1); 514 gtk_text_buffer_insert(buffer, &start2, spell->word, -1);
444 spell->ignore_correction = TRUE; 515 spell->ignore_correction = TRUE;
445 516
446 /* g_free(spell->word); */
447 spell->inserting = FALSE; 517 spell->inserting = FALSE;
448 spell->word = NULL; 518 spell->word = NULL;
449 } 519 }
450 520
451 spellchk* 521 static void
452 spellchk_new_attach(GaimConversation *c) { 522 spellchk_new_attach(GaimConversation *c) {
453 spellchk *spell; 523 spellchk *spell;
454 GtkTextBuffer *buffer; 524 GtkTextBuffer *buffer;
455 GtkTextIter start, end; 525 GtkTextIter start, end;
456 GaimGtkConversation *gtkconv; 526 GaimGtkConversation *gtkconv;
459 gtkconv = GAIM_GTK_CONVERSATION(c); 529 gtkconv = GAIM_GTK_CONVERSATION(c);
460 530
461 view = GTK_TEXT_VIEW(gtkconv->entry); 531 view = GTK_TEXT_VIEW(gtkconv->entry);
462 532
463 spell = g_object_get_data(G_OBJECT(view), SPELLCHK_OBJECT_KEY); 533 spell = g_object_get_data(G_OBJECT(view), SPELLCHK_OBJECT_KEY);
464 if(spell){ 534 if (spell != NULL)
465 return spell; 535 return;
466 }
467 536
468 /* attach to the widget */ 537 /* attach to the widget */
469 spell = g_new0(spellchk, 1); 538 spell = g_new0(spellchk, 1);
470 spell->view = view; 539 spell->view = view;
471 540
494 G_CALLBACK(insert_text_before), spell); 563 G_CALLBACK(insert_text_before), spell);
495 g_signal_connect_after(G_OBJECT(buffer), 564 g_signal_connect_after(G_OBJECT(buffer),
496 "insert-text", 565 "insert-text",
497 G_CALLBACK(insert_text_after), spell); 566 G_CALLBACK(insert_text_after), spell);
498 567
499 return spell; 568 return;
500 } 569 }
501 570
502 static int buf_get_line(char *ibuf, char **buf, int *position, int len) 571 static int buf_get_line(char *ibuf, char **buf, int *position, int len)
503 { 572 {
504 int pos = *position; 573 int pos = *position;
527 return 1; 596 return 1;
528 } 597 }
529 598
530 static void load_conf() 599 static void load_conf()
531 { 600 {
532 /* There are things in this word list that the plugin can't yet correct. 601 /* Corrections to change "...", "(c)", "(r)", and "(tm)" to their
533 * For example, BAD "words" with spaces in them. I've left them in the
534 * list because if the plugin is enhanced in the future, they'll be
535 * useful corrections.
536 *
537 * Corrections to change "...", "(c)", "(r)", and "(tm)" to their
538 * Unicode character equivalents were not added here even though 602 * Unicode character equivalents were not added here even though
539 * they existed in the source list(s). This plugin doesn't yet 603 * they existed in the source list(s). I think these corrections
540 * handle them and it seems that even if it did, those corrections
541 * would be more trouble than they're worth. 604 * would be more trouble than they're worth.
542 *
543 * - Richard Laager (rlaager)
544 */ 605 */
545 const char * const defaultconf = 606 const char * const defaultconf =
546 "BAD abbout\nGOOD about\n" 607 "BAD abbout\nGOOD about\n"
547 "BAD abotu\nGOOD about\n" 608 "BAD abotu\nGOOD about\n"
548 "BAD abouta\nGOOD about a\n" 609 "BAD abouta\nGOOD about a\n"
567 "BAD adequite\nGOOD adequate\n" 628 "BAD adequite\nGOOD adequate\n"
568 "BAD adn\nGOOD and\n" 629 "BAD adn\nGOOD and\n"
569 "BAD advanage\nGOOD advantage\n" 630 "BAD advanage\nGOOD advantage\n"
570 "BAD affraid\nGOOD afraid\n" 631 "BAD affraid\nGOOD afraid\n"
571 "BAD afterthe\nGOOD after the\n" 632 "BAD afterthe\nGOOD after the\n"
572 "BAD againstt he\nGOOD against the\n" 633 "COMPLETE 0\nBAD againstt he\nGOOD against the\n"
573 "BAD aganist\nGOOD against\n" 634 "BAD aganist\nGOOD against\n"
574 "BAD aggresive\nGOOD aggressive\n" 635 "BAD aggresive\nGOOD aggressive\n"
575 "BAD agian\nGOOD again\n" 636 "BAD agian\nGOOD again\n"
576 "BAD agreemeent\nGOOD agreement\n" 637 "BAD agreemeent\nGOOD agreement\n"
577 "BAD agreemeents\nGOOD agreements\n" 638 "BAD agreemeents\nGOOD agreements\n"
603 "BAD amkes\nGOOD makes\n" 664 "BAD amkes\nGOOD makes\n"
604 "BAD anbd\nGOOD and\n" 665 "BAD anbd\nGOOD and\n"
605 "BAD andone\nGOOD and one\n" 666 "BAD andone\nGOOD and one\n"
606 "BAD andteh\nGOOD and the\n" 667 "BAD andteh\nGOOD and the\n"
607 "BAD andthe\nGOOD and the\n" 668 "BAD andthe\nGOOD and the\n"
608 "BAD andt he\nGOOD and the\n" 669 "COMPLETE 0\nBAD andt he\nGOOD and the\n"
609 "BAD anothe\nGOOD another\n" 670 "BAD anothe\nGOOD another\n"
610 "BAD anual\nGOOD annual\n" 671 "BAD anual\nGOOD annual\n"
611 "BAD any1\nGOOD anyone\n" 672 "BAD any1\nGOOD anyone\n"
612 "BAD apparant\nGOOD apparent\n" 673 "BAD apparant\nGOOD apparent\n"
613 "BAD apparrent\nGOOD apparent\n" 674 "BAD apparrent\nGOOD apparent\n"
620 "BAD approrpiate\nGOOD appropriate\n" 681 "BAD approrpiate\nGOOD appropriate\n"
621 "BAD approrpriate\nGOOD appropriate\n" 682 "BAD approrpriate\nGOOD appropriate\n"
622 "BAD aquisition\nGOOD acquisition\n" 683 "BAD aquisition\nGOOD acquisition\n"
623 "BAD aquisitions\nGOOD acquisitions\n" 684 "BAD aquisitions\nGOOD acquisitions\n"
624 "BAD arent\nGOOD aren't\n" 685 "BAD arent\nGOOD aren't\n"
625 "BAD aren;t\nGOOD aren't\n" 686 "COMPLETE 0\nBAD aren;t\nGOOD aren't\n"
626 "BAD arguement\nGOOD argument\n" 687 "BAD arguement\nGOOD argument\n"
627 "BAD arguements\nGOOD arguments\n" 688 "BAD arguements\nGOOD arguments\n"
628 "BAD arn't\nGOOD aren't\n" 689 "COMPLETE 0\nBAD arn't\nGOOD aren't\n"
629 "BAD arond\nGOOD around\n" 690 "BAD arond\nGOOD around\n"
630 "BAD artical\nGOOD article\n" 691 "BAD artical\nGOOD article\n"
631 "BAD articel\nGOOD article\n" 692 "BAD articel\nGOOD article\n"
632 "BAD asdvertising\nGOOD advertising\n" 693 "BAD asdvertising\nGOOD advertising\n"
633 "BAD askt he\nGOOD ask the\n" 694 "COMPLETE 0\nBAD askt he\nGOOD ask the\n"
634 "BAD assistent\nGOOD assistant\n" 695 "BAD assistent\nGOOD assistant\n"
635 "BAD asthe\nGOOD as the\n" 696 "BAD asthe\nGOOD as the\n"
636 "BAD atention\nGOOD attention\n" 697 "BAD atention\nGOOD attention\n"
637 "BAD atmospher\nGOOD atmosphere\n" 698 "BAD atmospher\nGOOD atmosphere\n"
638 "BAD attentioin\nGOOD attention\n" 699 "BAD attentioin\nGOOD attention\n"
680 "BAD blase\nGOOD blasé\n" 741 "BAD blase\nGOOD blasé\n"
681 "BAD boxs\nGOOD boxes\n" 742 "BAD boxs\nGOOD boxes\n"
682 "BAD brodcast\nGOOD broadcast\n" 743 "BAD brodcast\nGOOD broadcast\n"
683 "BAD butthe\nGOOD but the\n" 744 "BAD butthe\nGOOD but the\n"
684 "BAD bve\nGOOD be\n" 745 "BAD bve\nGOOD be\n"
685 "BAD byt he\nGOOD by the\n" 746 "COMPLETE 0\nBAD byt he\nGOOD by the\n"
686 "BAD cafe\nGOOD café\n" 747 "BAD cafe\nGOOD café\n"
687 "BAD caharcter\nGOOD character\n" 748 "BAD caharcter\nGOOD character\n"
688 "BAD calcullated\nGOOD calculated\n" 749 "BAD calcullated\nGOOD calculated\n"
689 "BAD calulated\nGOOD calculated\n" 750 "BAD calulated\nGOOD calculated\n"
690 "BAD candidtae\nGOOD candidate\n" 751 "BAD candidtae\nGOOD candidate\n"
691 "BAD candidtaes\nGOOD candidates\n" 752 "BAD candidtaes\nGOOD candidates\n"
692 "BAD cant\nGOOD can't\n" 753 "BAD cant\nGOOD can't\n"
693 "BAD can;t\nGOOD can't\n" 754 "COMPLETE 0\nBAD can;t\nGOOD can't\n"
694 "BAD can't of been\nGOOD can't have been\n" 755 "COMPLETE 0\nBAD can't of been\nGOOD can't have been\n"
695 "BAD catagory\nGOOD category\n" 756 "BAD catagory\nGOOD category\n"
696 "BAD categiory\nGOOD category\n" 757 "BAD categiory\nGOOD category\n"
697 "BAD certian\nGOOD certain\n" 758 "BAD certian\nGOOD certain\n"
698 "BAD challange\nGOOD challenge\n" 759 "BAD challange\nGOOD challenge\n"
699 "BAD challanges\nGOOD challenges\n" 760 "BAD challanges\nGOOD challenges\n"
734 "BAD committments\nGOOD commitments\n" 795 "BAD committments\nGOOD commitments\n"
735 "BAD committy\nGOOD committee\n" 796 "BAD committy\nGOOD committee\n"
736 "BAD comntain\nGOOD contain\n" 797 "BAD comntain\nGOOD contain\n"
737 "BAD comntains\nGOOD contains\n" 798 "BAD comntains\nGOOD contains\n"
738 "BAD compair\nGOOD compare\n" 799 "BAD compair\nGOOD compare\n"
739 "BAD company;s\nGOOD company's\n" 800 "COMPLETE 0\nBAD company;s\nGOOD company's\n"
740 "BAD competetive\nGOOD competitive\n" 801 "BAD competetive\nGOOD competitive\n"
741 "BAD compleated\nGOOD completed\n" 802 "BAD compleated\nGOOD completed\n"
742 "BAD compleatly\nGOOD completely\n" 803 "BAD compleatly\nGOOD completely\n"
743 "BAD compleatness\nGOOD completeness\n" 804 "BAD compleatness\nGOOD completeness\n"
744 "BAD completly\nGOOD completely\n" 805 "BAD completly\nGOOD completely\n"
764 "BAD corproation\nGOOD corporation\n" 825 "BAD corproation\nGOOD corporation\n"
765 "BAD corproations\nGOOD corporations\n" 826 "BAD corproations\nGOOD corporations\n"
766 "BAD corruptable\nGOOD corruptible\n" 827 "BAD corruptable\nGOOD corruptible\n"
767 "BAD cotten\nGOOD cotton\n" 828 "BAD cotten\nGOOD cotton\n"
768 "BAD coudl\nGOOD could\n" 829 "BAD coudl\nGOOD could\n"
769 "BAD coudln't\nGOOD couldn't\n" 830 "COMPLETE 0\nBAD coudln't\nGOOD couldn't\n"
770 "BAD coudn't\nGOOD couldn't\n" 831 "COMPLETE 0\nBAD coudn't\nGOOD couldn't\n"
771 "BAD couldnt\nGOOD couldn't\n" 832 "BAD couldnt\nGOOD couldn't\n"
772 "BAD couldn;t\nGOOD couldn't\n" 833 "COMPLETE 0\nBAD couldn;t\nGOOD couldn't\n"
773 "BAD could of been\nGOOD could have been\n" 834 "COMPLETE 0\nBAD could of been\nGOOD could have been\n"
774 "BAD could of had\nGOOD could have had\n" 835 "COMPLETE 0\nBAD could of had\nGOOD could have had\n"
775 "BAD couldthe\nGOOD could the\n" 836 "BAD couldthe\nGOOD could the\n"
776 "BAD couldve\nGOOD could've\n" 837 "BAD couldve\nGOOD could've\n"
777 "BAD cpoy\nGOOD copy\n" 838 "BAD cpoy\nGOOD copy\n"
778 "BAD creme\nGOOD crème\n" 839 "BAD creme\nGOOD crème\n"
779 "BAD ctaegory\nGOOD category\n" 840 "BAD ctaegory\nGOOD category\n"
790 "BAD decison\nGOOD decision\n" 851 "BAD decison\nGOOD decision\n"
791 "BAD decisons\nGOOD decisions\n" 852 "BAD decisons\nGOOD decisions\n"
792 "BAD decor\nGOOD décor\n" 853 "BAD decor\nGOOD décor\n"
793 "BAD defendent\nGOOD defendant\n" 854 "BAD defendent\nGOOD defendant\n"
794 "BAD definately\nGOOD definitely\n" 855 "BAD definately\nGOOD definitely\n"
795 "BAD deja vu\nGOOD déjà vu\n" 856 "COMPLETE 0\nBAD deja vu\nGOOD déjà vu\n"
796 "BAD deptartment\nGOOD department\n" 857 "BAD deptartment\nGOOD department\n"
797 "BAD desicion\nGOOD decision\n" 858 "BAD desicion\nGOOD decision\n"
798 "BAD desicions\nGOOD decisions\n" 859 "BAD desicions\nGOOD decisions\n"
799 "BAD desision\nGOOD decision\n" 860 "BAD desision\nGOOD decision\n"
800 "BAD desisions\nGOOD decisions\n" 861 "BAD desisions\nGOOD decisions\n"
816 "BAD develpment\nGOOD development\n" 877 "BAD develpment\nGOOD development\n"
817 "BAD diaplay\nGOOD display\n" 878 "BAD diaplay\nGOOD display\n"
818 "BAD didint\nGOOD didn't\n" 879 "BAD didint\nGOOD didn't\n"
819 "BAD didnot\nGOOD did not\n" 880 "BAD didnot\nGOOD did not\n"
820 "BAD didnt\nGOOD didn't\n" 881 "BAD didnt\nGOOD didn't\n"
821 "BAD didn;t\nGOOD didn't\n" 882 "COMPLETE 0\nBAD didn;t\nGOOD didn't\n"
822 "BAD difefrent\nGOOD different\n" 883 "BAD difefrent\nGOOD different\n"
823 "BAD diferences\nGOOD differences\n" 884 "BAD diferences\nGOOD differences\n"
824 "BAD differance\nGOOD difference\n" 885 "BAD differance\nGOOD difference\n"
825 "BAD differances\nGOOD differences\n" 886 "BAD differances\nGOOD differences\n"
826 "BAD differant\nGOOD different\n" 887 "BAD differant\nGOOD different\n"
840 "BAD docuement\nGOOD documents\n" 901 "BAD docuement\nGOOD documents\n"
841 "BAD docuemnt\nGOOD document\n" 902 "BAD docuemnt\nGOOD document\n"
842 "BAD documetn\nGOOD document\n" 903 "BAD documetn\nGOOD document\n"
843 "BAD documnet\nGOOD document\n" 904 "BAD documnet\nGOOD document\n"
844 "BAD documnets\nGOOD documents\n" 905 "BAD documnets\nGOOD documents\n"
845 "BAD doens't\nGOOD doesn't\n" 906 "COMPLETE 0\nBAD doens't\nGOOD doesn't\n"
846 "BAD doese\nGOOD does\n" 907 "BAD doese\nGOOD does\n"
847 "BAD doe snot\nGOOD does not\n" 908 "COMPLETE 0\nBAD doe snot\nGOOD does not\n"
848 "BAD doesnt\nGOOD doesn't\n" 909 "BAD doesnt\nGOOD doesn't\n"
849 "BAD doesn;t\nGOOD doesn't\n" 910 "COMPLETE 0\nBAD doesn;t\nGOOD doesn't\n"
850 "BAD doign\nGOOD doing\n" 911 "BAD doign\nGOOD doing\n"
851 "BAD doimg\nGOOD doing\n" 912 "BAD doimg\nGOOD doing\n"
852 "BAD doind\nGOOD doing\n" 913 "BAD doind\nGOOD doing\n"
853 "BAD dollers\nGOOD dollars\n" 914 "BAD dollers\nGOOD dollars\n"
854 "BAD donig\nGOOD doing\n" 915 "BAD donig\nGOOD doing\n"
855 "BAD donno\nGOOD don't know\n" 916 "BAD donno\nGOOD don't know\n"
856 "BAD dont\nGOOD don't\n" 917 "BAD dont\nGOOD don't\n"
857 "BAD do'nt\nGOOD don't\n" 918 "COMPLETE 0\nBAD do'nt\nGOOD don't\n"
858 "BAD don;t\nGOOD don't\n" 919 "COMPLETE 0\nBAD don;t\nGOOD don't\n"
859 "BAD don't no\nGOOD don't know\n" 920 "COMPLETE 0\nBAD don't no\nGOOD don't know\n"
860 "BAD dosn't\nGOOD doesn't\n" 921 "COMPLETE 0\nBAD dosn't\nGOOD doesn't\n"
861 "BAD driveing\nGOOD driving\n" 922 "BAD driveing\nGOOD driving\n"
862 "BAD drnik\nGOOD drink\n" 923 "BAD drnik\nGOOD drink\n"
863 "BAD dunno\nGOOD don't know\n" 924 "BAD dunno\nGOOD don't know\n"
864 "BAD eclair\nGOOD éclair\n" 925 "BAD eclair\nGOOD éclair\n"
865 "BAD efel\nGOOD feel\n" 926 "BAD efel\nGOOD feel\n"
921 "BAD freindly\nGOOD friendly\n" 982 "BAD freindly\nGOOD friendly\n"
922 "BAD freinds\nGOOD friends\n" 983 "BAD freinds\nGOOD friends\n"
923 "BAD friday\nGOOD Friday\n" 984 "BAD friday\nGOOD Friday\n"
924 "BAD frmo\nGOOD from\n" 985 "BAD frmo\nGOOD from\n"
925 "BAD fromthe\nGOOD from the\n" 986 "BAD fromthe\nGOOD from the\n"
926 "BAD fromt he\nGOOD from the\n" 987 "COMPLETE 0\nBAD fromt he\nGOOD from the\n"
927 "BAD furneral\nGOOD funeral\n" 988 "BAD furneral\nGOOD funeral\n"
928 "BAD fwe\nGOOD few\n" 989 "BAD fwe\nGOOD few\n"
929 "BAD garantee\nGOOD guarantee\n" 990 "BAD garantee\nGOOD guarantee\n"
930 "BAD gaurd\nGOOD guard\n" 991 "BAD gaurd\nGOOD guard\n"
931 "BAD gemeral\nGOOD general\n" 992 "BAD gemeral\nGOOD general\n"
943 "BAD gruops\nGOOD groups\n" 1004 "BAD gruops\nGOOD groups\n"
944 "BAD grwo\nGOOD grow\n" 1005 "BAD grwo\nGOOD grow\n"
945 "BAD guidlines\nGOOD guidelines\n" 1006 "BAD guidlines\nGOOD guidelines\n"
946 "BAD hadbeen\nGOOD had been\n" 1007 "BAD hadbeen\nGOOD had been\n"
947 "BAD hadnt\nGOOD hadn't\n" 1008 "BAD hadnt\nGOOD hadn't\n"
948 "BAD hadn;t\nGOOD hadn't\n" 1009 "COMPLETE 0\nBAD hadn;t\nGOOD hadn't\n"
949 "BAD haev\nGOOD have\n" 1010 "BAD haev\nGOOD have\n"
950 "BAD hapen\nGOOD happen\n" 1011 "BAD hapen\nGOOD happen\n"
951 "BAD hapened\nGOOD happened\n" 1012 "BAD hapened\nGOOD happened\n"
952 "BAD hapening\nGOOD happening\n" 1013 "BAD hapening\nGOOD happening\n"
953 "BAD hapens\nGOOD happens\n" 1014 "BAD hapens\nGOOD happens\n"
954 "BAD happend\nGOOD happened\n" 1015 "BAD happend\nGOOD happened\n"
955 "BAD hasbeen\nGOOD has been\n" 1016 "BAD hasbeen\nGOOD has been\n"
956 "BAD hasnt\nGOOD hasn't\n" 1017 "BAD hasnt\nGOOD hasn't\n"
957 "BAD hasn;t\nGOOD hasn't\n" 1018 "COMPLETE 0\nBAD hasn;t\nGOOD hasn't\n"
958 "BAD havebeen\nGOOD have been\n" 1019 "BAD havebeen\nGOOD have been\n"
959 "BAD haveing\nGOOD having\n" 1020 "BAD haveing\nGOOD having\n"
960 "BAD havent\nGOOD haven't\n" 1021 "BAD havent\nGOOD haven't\n"
961 "BAD haven;t\nGOOD haven't\n" 1022 "COMPLETE 0\nBAD haven;t\nGOOD haven't\n"
962 "BAD hda\nGOOD had\n" 1023 "BAD hda\nGOOD had\n"
963 "BAD hearign\nGOOD hearing\n" 1024 "BAD hearign\nGOOD hearing\n"
964 "BAD he;d\nGOOD he'd\n" 1025 "COMPLETE 0\nBAD he;d\nGOOD he'd\n"
965 "BAD hel\nGOOD he'll\n" 1026 "BAD hel\nGOOD he'll\n"
966 "BAD he;ll\nGOOD he'll\n" 1027 "COMPLETE 0\nBAD he;ll\nGOOD he'll\n"
967 "BAD helpfull\nGOOD helpful\n" 1028 "BAD helpfull\nGOOD helpful\n"
968 "BAD herat\nGOOD heart\n" 1029 "BAD herat\nGOOD heart\n"
969 "BAD heres\nGOOD here's\n" 1030 "BAD heres\nGOOD here's\n"
970 "BAD here;s\nGOOD here's\n" 1031 "COMPLETE 0\nBAD here;s\nGOOD here's\n"
971 "BAD hes\nGOOD he's\n" 1032 "BAD hes\nGOOD he's\n"
972 "BAD he;s\nGOOD he's\n" 1033 "COMPLETE 0\nBAD he;s\nGOOD he's\n"
973 "BAD hesaid\nGOOD he said\n" 1034 "BAD hesaid\nGOOD he said\n"
974 "BAD hewas\nGOOD he was\n" 1035 "BAD hewas\nGOOD he was\n"
975 "BAD hge\nGOOD he\n" 1036 "BAD hge\nGOOD he\n"
976 "BAD hismelf\nGOOD himself\n" 1037 "BAD hismelf\nGOOD himself\n"
977 "BAD hlep\nGOOD help\n" 1038 "BAD hlep\nGOOD help\n"
985 "BAD htese\nGOOD these\n" 1046 "BAD htese\nGOOD these\n"
986 "BAD htey\nGOOD they\n" 1047 "BAD htey\nGOOD they\n"
987 "BAD hting\nGOOD thing\n" 1048 "BAD hting\nGOOD thing\n"
988 "BAD htink\nGOOD think\n" 1049 "BAD htink\nGOOD think\n"
989 "BAD htis\nGOOD this\n" 1050 "BAD htis\nGOOD this\n"
990 "BAD htp:\nGOOD http:\n" 1051 "COMPLETE 0\nBAD htp:\nGOOD http:\n"
991 "BAD http:\\\\nGOOD http://\n" 1052 "COMPLETE 0\nBAD http:\\\\nGOOD http://\n"
992 "BAD httpL\nGOOD http:\n" 1053 "BAD httpL\nGOOD http:\n"
993 "BAD hvae\nGOOD have\n" 1054 "BAD hvae\nGOOD have\n"
994 "BAD hvaing\nGOOD having\n" 1055 "BAD hvaing\nGOOD having\n"
995 "BAD hwich\nGOOD which\n" 1056 "BAD hwich\nGOOD which\n"
996 "BAD i\nGOOD I\n" 1057 "BAD i\nGOOD I\n"
997 "BAD i c\nGOOD I see\n" 1058 "COMPLETE 0\nBAD i c\nGOOD I see\n"
998 "BAD i;d\nGOOD I'd\n" 1059 "COMPLETE 0\nBAD i;d\nGOOD I'd\n"
999 "BAD i'd\nGOOD I'd\n" 1060 "COMPLETE 0\nBAD i'd\nGOOD I'd\n"
1000 "BAD I;d\nGOOD I'd\n" 1061 "COMPLETE 0\nBAD I;d\nGOOD I'd\n"
1001 "BAD idae\nGOOD idea\n" 1062 "BAD idae\nGOOD idea\n"
1002 "BAD idaes\nGOOD ideas\n" 1063 "BAD idaes\nGOOD ideas\n"
1003 "BAD identofy\nGOOD identify\n" 1064 "BAD identofy\nGOOD identify\n"
1004 "BAD ihs\nGOOD his\n" 1065 "BAD ihs\nGOOD his\n"
1005 "BAD iits the\nGOOD it's the\n" 1066 "BAD iits the\nGOOD it's the\n"
1006 "BAD i'll\nGOOD I'll\n" 1067 "COMPLETE 0\nBAD i'll\nGOOD I'll\n"
1007 "BAD I;ll\nGOOD I'll\n" 1068 "COMPLETE 0\nBAD I;ll\nGOOD I'll\n"
1008 "BAD i;m\nGOOD I'm\n" 1069 "COMPLETE 0\nBAD i;m\nGOOD I'm\n"
1009 "BAD i'm\nGOOD I'm\n" 1070 "COMPLETE 0\nBAD i'm\nGOOD I'm\n"
1010 "BAD I\"m\nGOOD I'm\n" 1071 "COMPLETE 0\nBAD I\"m\nGOOD I'm\n"
1011 "BAD imediate\nGOOD immediate\n" 1072 "BAD imediate\nGOOD immediate\n"
1012 "BAD imediatly\nGOOD immediately\n" 1073 "BAD imediatly\nGOOD immediately\n"
1013 "BAD immediatly\nGOOD immediately\n" 1074 "BAD immediatly\nGOOD immediately\n"
1014 "BAD importent\nGOOD important\n" 1075 "BAD importent\nGOOD important\n"
1015 "BAD importnat\nGOOD important\n" 1076 "BAD importnat\nGOOD important\n"
1031 "BAD insted\nGOOD instead\n" 1092 "BAD insted\nGOOD instead\n"
1032 "BAD insurence\nGOOD insurance\n" 1093 "BAD insurence\nGOOD insurance\n"
1033 "BAD inteh\nGOOD in the\n" 1094 "BAD inteh\nGOOD in the\n"
1034 "BAD interum\nGOOD interim\n" 1095 "BAD interum\nGOOD interim\n"
1035 "BAD inthe\nGOOD in the\n" 1096 "BAD inthe\nGOOD in the\n"
1036 "BAD int he\nGOOD in the\n" 1097 "COMPLETE 0\nBAD int he\nGOOD in the\n"
1037 "BAD inturn\nGOOD intern\n" 1098 "BAD inturn\nGOOD intern\n"
1038 "BAD inwhich\nGOOD in which\n" 1099 "BAD inwhich\nGOOD in which\n"
1039 "BAD i snot\nGOOD is not\n" 1100 "COMPLETE 0\nBAD i snot\nGOOD is not\n"
1040 "BAD isnt\nGOOD isn't\n" 1101 "BAD isnt\nGOOD isn't\n"
1041 "BAD isn;t\nGOOD isn't\n" 1102 "COMPLETE 0\nBAD isn;t\nGOOD isn't\n"
1042 "BAD isthe\nGOOD is the\n" 1103 "BAD isthe\nGOOD is the\n"
1043 "BAD itd\nGOOD it'd\n" 1104 "BAD itd\nGOOD it'd\n"
1044 "BAD it;d\nGOOD it'd\n" 1105 "COMPLETE 0\nBAD it;d\nGOOD it'd\n"
1045 "BAD itis\nGOOD it is\n" 1106 "BAD itis\nGOOD it is\n"
1046 "BAD ititial\nGOOD initial\n" 1107 "BAD ititial\nGOOD initial\n"
1047 "BAD itll\nGOOD it'll\n" 1108 "BAD itll\nGOOD it'll\n"
1048 "BAD it;ll\nGOOD it'll\n" 1109 "COMPLETE 0\nBAD it;ll\nGOOD it'll\n"
1049 "BAD itnerest\nGOOD interest\n" 1110 "BAD itnerest\nGOOD interest\n"
1050 "BAD itnerested\nGOOD interested\n" 1111 "BAD itnerested\nGOOD interested\n"
1051 "BAD itneresting\nGOOD interesting\n" 1112 "BAD itneresting\nGOOD interesting\n"
1052 "BAD itnerests\nGOOD interests\n" 1113 "BAD itnerests\nGOOD interests\n"
1053 "BAD it;s\nGOOD it's\n" 1114 "COMPLETE 0\nBAD it;s\nGOOD it's\n"
1054 "BAD itsa\nGOOD it's a\n" 1115 "BAD itsa\nGOOD it's a\n"
1055 "BAD its a\nGOOD it's a\n" 1116 "COMPLETE 0\nBAD its a\nGOOD it's a\n"
1056 "BAD it snot\nGOOD it's not\n" 1117 "COMPLETE 0\nBAD it snot\nGOOD it's not\n"
1057 "BAD it' snot\nGOOD it's not\n" 1118 "COMPLETE 0\nBAD it' snot\nGOOD it's not\n"
1058 "BAD its the\nGOOD it's the\n" 1119 "COMPLETE 0\nBAD its the\nGOOD it's the\n"
1059 "BAD itwas\nGOOD it was\n" 1120 "BAD itwas\nGOOD it was\n"
1060 "BAD ive\nGOOD I've\n" 1121 "BAD ive\nGOOD I've\n"
1061 "BAD i;ve\nGOOD I've\n" 1122 "COMPLETE 0\nBAD i;ve\nGOOD I've\n"
1062 "BAD i've\nGOOD I've\n" 1123 "COMPLETE 0\nBAD i've\nGOOD I've\n"
1063 "BAD iwll\nGOOD will\n" 1124 "BAD iwll\nGOOD will\n"
1064 "BAD iwth\nGOOD with\n" 1125 "BAD iwth\nGOOD with\n"
1065 "BAD jsut\nGOOD just\n" 1126 "BAD jsut\nGOOD just\n"
1066 "BAD jugment\nGOOD judgment\n" 1127 "BAD jugment\nGOOD judgment\n"
1067 "BAD k\nGOOD okay\n" 1128 "BAD k\nGOOD okay\n"
1077 "BAD labratory\nGOOD laboratory\n" 1138 "BAD labratory\nGOOD laboratory\n"
1078 "BAD lastyear\nGOOD last year\n" 1139 "BAD lastyear\nGOOD last year\n"
1079 "BAD laterz\nGOOD later\n" 1140 "BAD laterz\nGOOD later\n"
1080 "BAD learnign\nGOOD learning\n" 1141 "BAD learnign\nGOOD learning\n"
1081 "BAD lenght\nGOOD length\n" 1142 "BAD lenght\nGOOD length\n"
1082 "BAD let;s\nGOOD let's\n" 1143 "COMPLETE 0\nBAD let;s\nGOOD let's\n"
1083 "BAD let's him\nGOOD lets him\n" 1144 "COMPLETE 0\nBAD let's him\nGOOD lets him\n"
1084 "BAD let's it\nGOOD lets it\n" 1145 "COMPLETE 0\nBAD let's it\nGOOD lets it\n"
1085 "BAD levle\nGOOD level\n" 1146 "BAD levle\nGOOD level\n"
1086 "BAD libary\nGOOD library\n" 1147 "BAD libary\nGOOD library\n"
1087 "BAD librarry\nGOOD library\n" 1148 "BAD librarry\nGOOD library\n"
1088 "BAD librery\nGOOD library\n" 1149 "BAD librery\nGOOD library\n"
1089 "BAD liek\nGOOD like\n" 1150 "BAD liek\nGOOD like\n"
1104 "BAD maintenence\nGOOD maintenance\n" 1165 "BAD maintenence\nGOOD maintenance\n"
1105 "BAD makeing\nGOOD making\n" 1166 "BAD makeing\nGOOD making\n"
1106 "BAD managment\nGOOD management\n" 1167 "BAD managment\nGOOD management\n"
1107 "BAD mantain\nGOOD maintain\n" 1168 "BAD mantain\nGOOD maintain\n"
1108 "BAD marraige\nGOOD marriage\n" 1169 "BAD marraige\nGOOD marriage\n"
1109 "BAD may of been\nGOOD may have been\n" 1170 "COMPLETE 0\nBAD may of been\nGOOD may have been\n"
1110 "BAD may of had\nGOOD may have had\n" 1171 "COMPLETE 0\nBAD may of had\nGOOD may have had\n"
1111 "BAD memeber\nGOOD member\n" 1172 "BAD memeber\nGOOD member\n"
1112 "BAD merchent\nGOOD merchant\n" 1173 "BAD merchent\nGOOD merchant\n"
1113 "BAD mesage\nGOOD message\n" 1174 "BAD mesage\nGOOD message\n"
1114 "BAD mesages\nGOOD messages\n" 1175 "BAD mesages\nGOOD messages\n"
1115 "BAD might of been\nGOOD might have been\n" 1176 "COMPLETE 0\nBAD might of been\nGOOD might have been\n"
1116 "BAD might of had\nGOOD might have had\n" 1177 "COMPLETE 0\nBAD might of had\nGOOD might have had\n"
1117 "BAD mispell\nGOOD misspell\n" 1178 "BAD mispell\nGOOD misspell\n"
1118 "BAD mispelling\nGOOD misspelling\n" 1179 "BAD mispelling\nGOOD misspelling\n"
1119 "BAD mispellings\nGOOD misspellings\n" 1180 "BAD mispellings\nGOOD misspellings\n"
1120 "BAD mkae\nGOOD make\n" 1181 "BAD mkae\nGOOD make\n"
1121 "BAD mkaes\nGOOD makes\n" 1182 "BAD mkaes\nGOOD makes\n"
1122 "BAD mkaing\nGOOD making\n" 1183 "BAD mkaing\nGOOD making\n"
1123 "BAD moeny\nGOOD money\n" 1184 "BAD moeny\nGOOD money\n"
1124 "BAD monday\nGOOD Monday\n" 1185 "BAD monday\nGOOD Monday\n"
1125 "BAD morgage\nGOOD mortgage\n" 1186 "BAD morgage\nGOOD mortgage\n"
1126 "BAD mroe\nGOOD more\n" 1187 "BAD mroe\nGOOD more\n"
1127 "BAD must of been\nGOOD must have been\n" 1188 "COMPLETE 0\nBAD must of been\nGOOD must have been\n"
1128 "BAD must of had\nGOOD must have had\n" 1189 "COMPLETE 0\nBAD must of had\nGOOD must have had\n"
1129 "BAD mysefl\nGOOD myself\n" 1190 "BAD mysefl\nGOOD myself\n"
1130 "BAD myu\nGOOD my\n" 1191 "BAD myu\nGOOD my\n"
1131 "BAD naive\nGOOD naïve\n" 1192 "BAD naive\nGOOD naïve\n"
1132 "BAD ne way\nGOOD anyway\n" 1193 "COMPLETE 0\nBAD ne way\nGOOD anyway\n"
1133 "BAD ne ways\nGOOD anyways\n" 1194 "COMPLETE 0\nBAD ne ways\nGOOD anyways\n"
1134 "BAD ne1\nGOOD anyone\n" 1195 "BAD ne1\nGOOD anyone\n"
1135 "BAD neway\nGOOD anyway\n" 1196 "BAD neway\nGOOD anyway\n"
1136 "BAD neways\nGOOD anyways\n" 1197 "BAD neways\nGOOD anyways\n"
1137 "BAD necassarily\nGOOD necessarily\n" 1198 "BAD necassarily\nGOOD necessarily\n"
1138 "BAD necassary\nGOOD necessary\n" 1199 "BAD necassary\nGOOD necessary\n"
1165 "BAD ohter\nGOOD other\n" 1226 "BAD ohter\nGOOD other\n"
1166 "BAD omre\nGOOD more\n" 1227 "BAD omre\nGOOD more\n"
1167 "BAD oneof\nGOOD one of\n" 1228 "BAD oneof\nGOOD one of\n"
1168 "BAD onepoint\nGOOD one point\n" 1229 "BAD onepoint\nGOOD one point\n"
1169 "BAD onthe\nGOOD on the\n" 1230 "BAD onthe\nGOOD on the\n"
1170 "BAD ont he\nGOOD on the\n" 1231 "COMPLETE 0\nBAD ont he\nGOOD on the\n"
1171 "BAD onyl\nGOOD only\n" 1232 "BAD onyl\nGOOD only\n"
1172 "BAD oppasite\nGOOD opposite\n" 1233 "BAD oppasite\nGOOD opposite\n"
1173 "BAD opperation\nGOOD operation\n" 1234 "BAD opperation\nGOOD operation\n"
1174 "BAD oppertunity\nGOOD opportunity\n" 1235 "BAD oppertunity\nGOOD opportunity\n"
1175 "BAD opposate\nGOOD opposite\n" 1236 "BAD opposate\nGOOD opposite\n"
1285 "BAD rythm\nGOOD rhythm\n" 1346 "BAD rythm\nGOOD rhythm\n"
1286 "BAD saidhe\nGOOD said he\n" 1347 "BAD saidhe\nGOOD said he\n"
1287 "BAD saidit\nGOOD said it\n" 1348 "BAD saidit\nGOOD said it\n"
1288 "BAD saidthat\nGOOD said that\n" 1349 "BAD saidthat\nGOOD said that\n"
1289 "BAD saidthe\nGOOD said the\n" 1350 "BAD saidthe\nGOOD said the\n"
1290 "BAD saidt he\nGOOD said the\n" 1351 "COMPLETE 0\nBAD saidt he\nGOOD said the\n"
1291 "BAD sandwhich\nGOOD sandwich\n" 1352 "BAD sandwhich\nGOOD sandwich\n"
1292 "BAD sandwitch\nGOOD sandwich\n" 1353 "BAD sandwitch\nGOOD sandwich\n"
1293 "BAD saturday\nGOOD Saturday\n" 1354 "BAD saturday\nGOOD Saturday\n"
1294 "BAD scedule\nGOOD schedule\n" 1355 "BAD scedule\nGOOD schedule\n"
1295 "BAD sceduled\nGOOD scheduled\n" 1356 "BAD sceduled\nGOOD scheduled\n"
1302 "BAD sentance\nGOOD sentence\n" 1363 "BAD sentance\nGOOD sentence\n"
1303 "BAD separeate\nGOOD separate\n" 1364 "BAD separeate\nGOOD separate\n"
1304 "BAD seperate\nGOOD separate\n" 1365 "BAD seperate\nGOOD separate\n"
1305 "BAD sercumstances\nGOOD circumstances\n" 1366 "BAD sercumstances\nGOOD circumstances\n"
1306 "BAD shcool\nGOOD school\n" 1367 "BAD shcool\nGOOD school\n"
1307 "BAD she'\nGOOD she'll\n" 1368 "COMPLETE 0\nBAD she;d\nGOOD she'd\n"
1308 "BAD she;d\nGOOD she'd\n" 1369 "COMPLETE 0\nBAD she;ll\nGOOD she'll\n"
1309 "BAD she;ll\nGOOD she'll\n"
1310 "BAD shes\nGOOD she's\n" 1370 "BAD shes\nGOOD she's\n"
1311 "BAD she;s\nGOOD she's\n" 1371 "COMPLETE 0\nBAD she;s\nGOOD she's\n"
1312 "BAD shesaid\nGOOD she said\n" 1372 "BAD shesaid\nGOOD she said\n"
1313 "BAD shineing\nGOOD shining\n" 1373 "BAD shineing\nGOOD shining\n"
1314 "BAD shiped\nGOOD shipped\n" 1374 "BAD shiped\nGOOD shipped\n"
1315 "BAD shoudl\nGOOD should\n" 1375 "BAD shoudl\nGOOD should\n"
1316 "BAD shoudln't\nGOOD shouldn't\n" 1376 "COMPLETE 0\nBAD shoudln't\nGOOD shouldn't\n"
1317 "BAD shouldent\nGOOD shouldn't\n" 1377 "BAD shouldent\nGOOD shouldn't\n"
1318 "BAD shouldnt\nGOOD shouldn't\n" 1378 "BAD shouldnt\nGOOD shouldn't\n"
1319 "BAD shouldn;t\nGOOD shouldn't\n" 1379 "COMPLETE 0\nBAD shouldn;t\nGOOD shouldn't\n"
1320 "BAD should of been\nGOOD should have been\n" 1380 "COMPLETE 0\nBAD should of been\nGOOD should have been\n"
1321 "BAD should of had\nGOOD should have had\n" 1381 "COMPLETE 0\nBAD should of had\nGOOD should have had\n"
1322 "BAD shouldve\nGOOD should've\n" 1382 "BAD shouldve\nGOOD should've\n"
1323 "BAD showinf\nGOOD showing\n" 1383 "BAD showinf\nGOOD showing\n"
1324 "BAD signifacnt\nGOOD significant\n" 1384 "BAD signifacnt\nGOOD significant\n"
1325 "BAD simalar\nGOOD similar\n" 1385 "BAD simalar\nGOOD similar\n"
1326 "BAD similiar\nGOOD similar\n" 1386 "BAD similiar\nGOOD similar\n"
1336 "BAD somethign\nGOOD something\n" 1396 "BAD somethign\nGOOD something\n"
1337 "BAD someting\nGOOD something\n" 1397 "BAD someting\nGOOD something\n"
1338 "BAD somewaht\nGOOD somewhat\n" 1398 "BAD somewaht\nGOOD somewhat\n"
1339 "BAD somthing\nGOOD something\n" 1399 "BAD somthing\nGOOD something\n"
1340 "BAD somtimes\nGOOD sometimes\n" 1400 "BAD somtimes\nGOOD sometimes\n"
1341 "BAD sot hat\nGOOD so that\n" 1401 "COMPLETE 0\nBAD sot hat\nGOOD so that\n"
1342 "BAD soudn\nGOOD sound\n" 1402 "BAD soudn\nGOOD sound\n"
1343 "BAD soudns\nGOOD sounds\n" 1403 "BAD soudns\nGOOD sounds\n"
1344 "BAD speach\nGOOD speech\n" 1404 "BAD speach\nGOOD speech\n"
1345 "BAD specificaly\nGOOD specifically\n" 1405 "BAD specificaly\nGOOD specifically\n"
1346 "BAD specificalyl\nGOOD specifically\n" 1406 "BAD specificalyl\nGOOD specifically\n"
1377 "BAD talkign\nGOOD talking\n" 1437 "BAD talkign\nGOOD talking\n"
1378 "BAD tath\nGOOD that\n" 1438 "BAD tath\nGOOD that\n"
1379 "BAD tecnical\nGOOD technical\n" 1439 "BAD tecnical\nGOOD technical\n"
1380 "BAD teh\nGOOD the\n" 1440 "BAD teh\nGOOD the\n"
1381 "BAD tehy\nGOOD they\n" 1441 "BAD tehy\nGOOD they\n"
1382 "BAD tellt he\nGOOD tell the\n" 1442 "COMPLETE 0\nBAD tellt he\nGOOD tell the\n"
1383 "BAD termoil\nGOOD turmoil\n" 1443 "BAD termoil\nGOOD turmoil\n"
1384 "BAD tets\nGOOD test\n" 1444 "BAD tets\nGOOD test\n"
1385 "BAD tghe\nGOOD the\n" 1445 "BAD tghe\nGOOD the\n"
1386 "BAD tghis\nGOOD this\n" 1446 "BAD tghis\nGOOD this\n"
1387 "BAD thansk\nGOOD thanks\n" 1447 "BAD thansk\nGOOD thanks\n"
1388 "BAD thanx\nGOOD thanks\n" 1448 "BAD thanx\nGOOD thanks\n"
1389 "BAD thats\nGOOD that's\n" 1449 "BAD thats\nGOOD that's\n"
1390 "BAD thatthe\nGOOD that the\n" 1450 "BAD thatthe\nGOOD that the\n"
1391 "BAD thatt he\nGOOD that the\n" 1451 "COMPLETE 0\nBAD thatt he\nGOOD that the\n"
1392 "BAD thecompany\nGOOD the company\n" 1452 "BAD thecompany\nGOOD the company\n"
1393 "BAD thefirst\nGOOD the first\n" 1453 "BAD thefirst\nGOOD the first\n"
1394 "BAD thegovernment\nGOOD the government\n" 1454 "BAD thegovernment\nGOOD the government\n"
1395 "BAD their are\nGOOD there are\n" 1455 "COMPLETE 0\nBAD their are\nGOOD there are\n"
1396 "BAD their is\nGOOD there is\n" 1456 "COMPLETE 0\nBAD their is\nGOOD there is\n"
1397 "BAD themself\nGOOD themselves\n" 1457 "BAD themself\nGOOD themselves\n"
1398 "BAD themselfs\nGOOD themselves\n" 1458 "BAD themselfs\nGOOD themselves\n"
1399 "BAD thenew\nGOOD the new\n" 1459 "BAD thenew\nGOOD the new\n"
1400 "BAD theres\nGOOD there's\n" 1460 "BAD theres\nGOOD there's\n"
1401 "BAD there's is\nGOOD theirs is\n" 1461 "COMPLETE 0\nBAD there's is\nGOOD theirs is\n"
1402 "BAD theri\nGOOD their\n" 1462 "BAD theri\nGOOD their\n"
1403 "BAD thesame\nGOOD the same\n" 1463 "BAD thesame\nGOOD the same\n"
1404 "BAD thetwo\nGOOD the two\n" 1464 "BAD thetwo\nGOOD the two\n"
1405 "BAD theyd\nGOOD they'd\n" 1465 "BAD theyd\nGOOD they'd\n"
1406 "BAD they;d\nGOOD they'd\n" 1466 "COMPLETE 0\nBAD they;d\nGOOD they'd\n"
1407 "BAD they;l\nGOOD they'll\n" 1467 "COMPLETE 0\nBAD they;l\nGOOD they'll\n"
1408 "BAD theyll\nGOOD they'll\n" 1468 "BAD theyll\nGOOD they'll\n"
1409 "BAD they;ll\nGOOD they'll\n" 1469 "COMPLETE 0\nBAD they;ll\nGOOD they'll\n"
1410 "BAD they;r\nGOOD they're\n" 1470 "COMPLETE 0\nBAD they;r\nGOOD they're\n"
1411 "BAD theyre\nGOOD they're\n" 1471 "COMPLETE 0\nBAD theyre\nGOOD they're\n"
1412 "BAD they;re\nGOOD they're\n" 1472 "COMPLETE 0\nBAD they;re\nGOOD they're\n"
1413 "BAD they're are\nGOOD there are\n" 1473 "COMPLETE 0\nBAD they're are\nGOOD there are\n"
1414 "BAD they're is\nGOOD there is\n" 1474 "COMPLETE 0\nBAD they're is\nGOOD there is\n"
1415 "BAD they;v\nGOOD they've\n" 1475 "COMPLETE 0\nBAD they;v\nGOOD they've\n"
1416 "BAD theyve\nGOOD they've\n" 1476 "BAD theyve\nGOOD they've\n"
1417 "BAD they;ve\nGOOD they've\n" 1477 "COMPLETE 0\nBAD they;ve\nGOOD they've\n"
1418 "BAD thgat\nGOOD that\n" 1478 "BAD thgat\nGOOD that\n"
1419 "BAD thge\nGOOD the\n" 1479 "BAD thge\nGOOD the\n"
1420 "BAD thier\nGOOD their \n" 1480 "BAD thier\nGOOD their \n"
1421 "BAD thigsn\nGOOD things\n" 1481 "BAD thigsn\nGOOD things\n"
1422 "BAD thisyear\nGOOD this year\n" 1482 "BAD thisyear\nGOOD this year\n"
1442 "BAD tkaing\nGOOD taking\n" 1502 "BAD tkaing\nGOOD taking\n"
1443 "BAD tlaking\nGOOD talking\n" 1503 "BAD tlaking\nGOOD talking\n"
1444 "BAD tnx\nGOOD thanks\n" 1504 "BAD tnx\nGOOD thanks\n"
1445 "BAD todya\nGOOD today\n" 1505 "BAD todya\nGOOD today\n"
1446 "BAD togehter\nGOOD together\n" 1506 "BAD togehter\nGOOD together\n"
1447 "BAD toldt he\nGOOD told the\n" 1507 "COMPLETE 0\nBAD toldt he\nGOOD told the\n"
1448 "BAD tomorow\nGOOD tomorrow\n" 1508 "BAD tomorow\nGOOD tomorrow\n"
1449 "BAD tongiht\nGOOD tonight\n" 1509 "BAD tongiht\nGOOD tonight\n"
1450 "BAD tonihgt\nGOOD tonight\n" 1510 "BAD tonihgt\nGOOD tonight\n"
1451 "BAD tonite\nGOOD tonight\n" 1511 "BAD tonite\nGOOD tonight\n"
1452 "BAD totaly\nGOOD totally\n" 1512 "BAD totaly\nGOOD totally\n"
1453 "BAD totalyl\nGOOD totally\n" 1513 "BAD totalyl\nGOOD totally\n"
1454 "BAD tothe\nGOOD to the\n" 1514 "BAD tothe\nGOOD to the\n"
1455 "BAD tot he\nGOOD to the\n" 1515 "COMPLETE 0\nBAD tot he\nGOOD to the\n"
1456 "BAD towrad\nGOOD toward\n" 1516 "BAD towrad\nGOOD toward\n"
1457 "BAD traditionalyl\nGOOD traditionally\n" 1517 "BAD traditionalyl\nGOOD traditionally\n"
1458 "BAD transfered\nGOOD transferred\n" 1518 "BAD transfered\nGOOD transferred\n"
1459 "BAD truely\nGOOD truly\n" 1519 "BAD truely\nGOOD truly\n"
1460 "BAD truley\nGOOD truly\n" 1520 "BAD truley\nGOOD truly\n"
1464 "BAD tyhat\nGOOD that\n" 1524 "BAD tyhat\nGOOD that\n"
1465 "BAD tyhe\nGOOD the\n" 1525 "BAD tyhe\nGOOD the\n"
1466 "BAD u\nGOOD you\n" 1526 "BAD u\nGOOD you\n"
1467 "BAD udnerstand\nGOOD understand\n" 1527 "BAD udnerstand\nGOOD understand\n"
1468 "BAD understnad\nGOOD understand\n" 1528 "BAD understnad\nGOOD understand\n"
1469 "BAD undert he\nGOOD under the\n" 1529 "COMPLETE 0\nBAD undert he\nGOOD under the\n"
1470 "BAD unforseen\nGOOD unforeseen\n" 1530 "BAD unforseen\nGOOD unforeseen\n"
1471 "BAD UnitedStates\nGOOD United States\n" 1531 "BAD UnitedStates\nGOOD United States\n"
1472 "BAD unliek\nGOOD unlike\n" 1532 "BAD unliek\nGOOD unlike\n"
1473 "BAD unpleasently\nGOOD unpleasantly\n" 1533 "BAD unpleasently\nGOOD unpleasantly\n"
1474 "BAD untill\nGOOD until\n" 1534 "BAD untill\nGOOD until\n"
1477 "BAD useing\nGOOD using\n" 1537 "BAD useing\nGOOD using\n"
1478 "BAD usualyl\nGOOD usually\n" 1538 "BAD usualyl\nGOOD usually\n"
1479 "BAD veyr\nGOOD very\n" 1539 "BAD veyr\nGOOD very\n"
1480 "BAD virtualyl\nGOOD virtually\n" 1540 "BAD virtualyl\nGOOD virtually\n"
1481 "BAD visavis\nGOOD vis-a-vis\n" 1541 "BAD visavis\nGOOD vis-a-vis\n"
1482 "BAD vis-a-vis\nGOOD vis-à-vis\n" 1542 "COMPLETE 0\nBAD vis-a-vis\nGOOD vis-à-vis\n"
1483 "BAD vrey\nGOOD very\n" 1543 "BAD vrey\nGOOD very\n"
1484 "BAD vulnerible\nGOOD vulnerable\n" 1544 "BAD vulnerible\nGOOD vulnerable\n"
1485 "BAD waht\nGOOD what\n" 1545 "BAD waht\nGOOD what\n"
1486 "BAD warrent\nGOOD warrant\n" 1546 "BAD warrent\nGOOD warrant\n"
1487 "BAD wa snot\nGOOD was not\n" 1547 "COMPLETE 0\nBAD wa snot\nGOOD was not\n"
1488 "BAD wasnt\nGOOD wasn't\n" 1548 "COMPLETE 0\nBAD wasnt\nGOOD wasn't\n"
1489 "BAD wasn;t\nGOOD wasn't\n" 1549 "COMPLETE 0\nBAD wasn;t\nGOOD wasn't\n"
1490 "BAD wat\nGOOD what\n" 1550 "BAD wat\nGOOD what\n"
1491 "BAD watn\nGOOD want\n" 1551 "BAD watn\nGOOD want\n"
1492 "BAD we;d\nGOOD we'd\n" 1552 "COMPLETE 0\nBAD we;d\nGOOD we'd\n"
1493 "BAD wednesday\nGOOD Wednesday\n" 1553 "BAD wednesday\nGOOD Wednesday\n"
1494 "BAD wel\nGOOD we'll\n" 1554 "BAD wel\nGOOD we'll\n"
1495 "BAD wehn\nGOOD when\n" 1555 "BAD wehn\nGOOD when\n"
1496 "BAD we'l\nGOOD we'll\n" 1556 "COMPLETE 0\nBAD we'l\nGOOD we'll\n"
1497 "BAD we;ll\nGOOD we'll\n" 1557 "COMPLETE 0\nBAD we;ll\nGOOD we'll\n"
1498 "BAD we;re\nGOOD we're\n" 1558 "COMPLETE 0\nBAD we;re\nGOOD we're\n"
1499 "BAD werent\nGOOD weren't\n" 1559 "BAD werent\nGOOD weren't\n"
1500 "BAD weren;t\nGOOD weren't\n" 1560 "COMPLETE 0\nBAD weren;t\nGOOD weren't\n"
1501 "BAD wern't\nGOOD weren't\n" 1561 "COMPLETE 0\nBAD wern't\nGOOD weren't\n"
1502 "BAD werre\nGOOD were\n" 1562 "BAD werre\nGOOD were\n"
1503 "BAD weve\nGOOD we've\n" 1563 "BAD weve\nGOOD we've\n"
1504 "BAD we;ve\nGOOD we've\n" 1564 "COMPLETE 0\nBAD we;ve\nGOOD we've\n"
1505 "BAD whats\nGOOD what's\n" 1565 "BAD whats\nGOOD what's\n"
1506 "BAD what;s\nGOOD what's\n" 1566 "COMPLETE 0\nBAD what;s\nGOOD what's\n"
1507 "BAD whcih\nGOOD which\n" 1567 "BAD whcih\nGOOD which\n"
1508 "BAD whent he\nGOOD when the\n" 1568 "COMPLETE 0\nBAD whent he\nGOOD when the\n"
1509 "BAD wheres\nGOOD where's\n" 1569 "BAD wheres\nGOOD where's\n"
1510 "BAD where;s\nGOOD where's\n" 1570 "COMPLETE 0\nBAD where;s\nGOOD where's\n"
1511 "BAD wherre\nGOOD where\n" 1571 "BAD wherre\nGOOD where\n"
1512 "BAD whic\nGOOD which\n" 1572 "BAD whic\nGOOD which\n"
1513 "BAD whicht he\nGOOD which the\n" 1573 "COMPLETE 0\nBAD whicht he\nGOOD which the\n"
1514 "BAD whihc\nGOOD which\n" 1574 "BAD whihc\nGOOD which\n"
1515 "BAD wholl\nGOOD who'll\n" 1575 "BAD wholl\nGOOD who'll\n"
1516 "BAD whos\nGOOD who's\n" 1576 "BAD whos\nGOOD who's\n"
1517 "BAD who;s\nGOOD who's\n" 1577 "COMPLETE 0\nBAD who;s\nGOOD who's\n"
1518 "BAD whove\nGOOD who've\n" 1578 "BAD whove\nGOOD who've\n"
1519 "BAD who;ve\nGOOD who've\n" 1579 "COMPLETE 0\nBAD who;ve\nGOOD who've\n"
1520 "BAD whta\nGOOD what\n" 1580 "BAD whta\nGOOD what\n"
1521 "BAD whys\nGOOD why's\n" 1581 "BAD whys\nGOOD why's\n"
1522 "BAD wief\nGOOD wife\n" 1582 "BAD wief\nGOOD wife\n"
1523 "BAD wierd\nGOOD weird\n" 1583 "BAD wierd\nGOOD weird\n"
1524 "BAD wihch\nGOOD which\n" 1584 "BAD wihch\nGOOD which\n"
1525 "BAD wiht\nGOOD with\n" 1585 "BAD wiht\nGOOD with\n"
1526 "BAD willbe\nGOOD will be\n" 1586 "BAD willbe\nGOOD will be\n"
1527 "BAD will of been\nGOOD will have been\n" 1587 "COMPLETE 0\nBAD will of been\nGOOD will have been\n"
1528 "BAD will of had\nGOOD will have had\n" 1588 "COMPLETE 0\nBAD will of had\nGOOD will have had\n"
1529 "BAD windoes\nGOOD windows\n" 1589 "BAD windoes\nGOOD windows\n"
1530 "BAD witha\nGOOD with a\n" 1590 "BAD witha\nGOOD with a\n"
1531 "BAD withe\nGOOD with\n" 1591 "BAD withe\nGOOD with\n"
1532 "BAD withthe\nGOOD with the\n" 1592 "COMPLETE 0\nBAD withthe\nGOOD with the\n"
1533 "BAD witht he\nGOOD with the\n" 1593 "BAD witht he\nGOOD with the\n"
1534 "BAD wiull\nGOOD will\n" 1594 "BAD wiull\nGOOD will\n"
1535 "BAD wnat\nGOOD want\n" 1595 "BAD wnat\nGOOD want\n"
1536 "BAD wnated\nGOOD wanted\n" 1596 "BAD wnated\nGOOD wanted\n"
1537 "BAD wnats\nGOOD wants\n" 1597 "BAD wnats\nGOOD wants\n"
1538 "BAD woh\nGOOD who\n" 1598 "BAD woh\nGOOD who\n"
1539 "BAD wohle\nGOOD whole\n" 1599 "BAD wohle\nGOOD whole\n"
1540 "BAD wokr\nGOOD work\n" 1600 "BAD wokr\nGOOD work\n"
1541 "BAD wont\nGOOD won't\n" 1601 "BAD wont\nGOOD won't\n"
1542 "BAD wo'nt\nGOOD won't\n" 1602 "COMPLETE 0\nBAD wo'nt\nGOOD won't\n"
1543 "BAD won;t\nGOOD won't\n" 1603 "COMPLETE 0\nBAD won;t\nGOOD won't\n"
1544 "BAD woudl\nGOOD would\n" 1604 "BAD woudl\nGOOD would\n"
1545 "BAD woudln't\nGOOD wouldn't\n" 1605 "COMPLETE 0\nBAD woudln't\nGOOD wouldn't\n"
1546 "BAD wouldbe\nGOOD would be\n" 1606 "BAD wouldbe\nGOOD would be\n"
1547 "BAD wouldnt\nGOOD wouldn't\n" 1607 "BAD wouldnt\nGOOD wouldn't\n"
1548 "BAD wouldn;t\nGOOD wouldn't\n" 1608 "COMPLETE 0\nBAD wouldn;t\nGOOD wouldn't\n"
1549 "BAD would of been\nGOOD would have been\n" 1609 "COMPLETE 0\nBAD would of been\nGOOD would have been\n"
1550 "BAD would of had\nGOOD would have had\n" 1610 "COMPLETE 0\nBAD would of had\nGOOD would have had\n"
1551 "BAD wouldve\nGOOD would've\n" 1611 "BAD wouldve\nGOOD would've\n"
1552 "BAD wriet\nGOOD write\n" 1612 "BAD wriet\nGOOD write\n"
1553 "BAD writting\nGOOD writing\n" 1613 "BAD writting\nGOOD writing\n"
1554 "BAD wrod\nGOOD word\n" 1614 "BAD wrod\nGOOD word\n"
1555 "BAD wroet\nGOOD wrote\n" 1615 "BAD wroet\nGOOD wrote\n"
1564 "BAD yeras\nGOOD years\n" 1624 "BAD yeras\nGOOD years\n"
1565 "BAD yersa\nGOOD years\n" 1625 "BAD yersa\nGOOD years\n"
1566 "BAD yoiu\nGOOD you\n" 1626 "BAD yoiu\nGOOD you\n"
1567 "BAD youare\nGOOD you are\n" 1627 "BAD youare\nGOOD you are\n"
1568 "BAD youd\nGOOD you'd\n" 1628 "BAD youd\nGOOD you'd\n"
1569 "BAD you;d\nGOOD you'd\n" 1629 "COMPLETE 0\nBAD you;d\nGOOD you'd\n"
1570 "BAD youll\nGOOD you'll\n" 1630 "BAD youll\nGOOD you'll\n"
1571 "BAD your a\nGOOD you're a\n" 1631 "COMPLETE 0\nBAD your a\nGOOD you're a\n"
1572 "BAD your an\nGOOD you're an\n" 1632 "COMPLETE 0\nBAD your an\nGOOD you're an\n"
1573 "BAD youre\nGOOD you're\n" 1633 "BAD youre\nGOOD you're\n"
1574 "BAD you;re\nGOOD you're\n" 1634 "COMPLETE 0\nBAD you;re\nGOOD you're\n"
1575 "BAD you're own\nGOOD your own\n" 1635 "COMPLETE 0\nBAD you're own\nGOOD your own\n"
1576 "BAD your her\nGOOD you're her\n" 1636 "COMPLETE 0\nBAD your her\nGOOD you're her\n"
1577 "BAD your here\nGOOD you're here\n" 1637 "COMPLETE 0\nBAD your here\nGOOD you're here\n"
1578 "BAD your his\nGOOD you're his\n" 1638 "COMPLETE 0\nBAD your his\nGOOD you're his\n"
1579 "BAD your my\nGOOD you're my\n" 1639 "COMPLETE 0\nBAD your my\nGOOD you're my\n"
1580 "BAD your the\nGOOD you're the\n" 1640 "COMPLETE 0\nBAD your the\nGOOD you're the\n"
1581 "BAD your their\nGOOD you're their\n" 1641 "COMPLETE 0\nBAD your their\nGOOD you're their\n"
1582 "BAD your your\nGOOD you're your\n" 1642 "COMPLETE 0\nBAD your your\nGOOD you're your\n"
1583 "BAD youve\nGOOD you've\n" 1643 "BAD youve\nGOOD you've\n"
1584 "BAD you;ve\nGOOD you've\n" 1644 "COMPLETE 0\nBAD you;ve\nGOOD you've\n"
1585 "BAD ytou\nGOOD you\n" 1645 "BAD ytou\nGOOD you\n"
1586 "BAD yuo\nGOOD you\n" 1646 "BAD yuo\nGOOD you\n"
1587 "BAD yuor\nGOOD your\n"; 1647 "BAD yuor\nGOOD your\n";
1588 gchar *buf; 1648 gchar *buf;
1589 gchar *ibuf; 1649 gchar *ibuf;
1590 GHashTable *hashes; 1650 GHashTable *hashes;
1591 char bad[82] = ""; 1651 char bad[82] = "";
1592 char good[256] = ""; 1652 char good[256] = "";
1653 char completestr[BUFSIZ] = "";
1593 int pnt = 0; 1654 int pnt = 0;
1594 gsize size; 1655 gsize size;
1656 gboolean complete = TRUE;
1595 1657
1596 buf = g_build_filename(gaim_user_dir(), "dict", NULL); 1658 buf = g_build_filename(gaim_user_dir(), "dict", NULL);
1597 g_file_get_contents(buf, &ibuf, &size, NULL); 1659 g_file_get_contents(buf, &ibuf, &size, NULL);
1598 g_free(buf); 1660 g_free(buf);
1599 if (!ibuf) { 1661 if (!ibuf) {
1600 ibuf = g_strdup(defaultconf); 1662 ibuf = g_strdup(defaultconf);
1601 size = strlen(defaultconf); 1663 size = strlen(defaultconf);
1602 } 1664 }
1603 1665
1604 model = gtk_list_store_new((gint)N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING); 1666 model = gtk_list_store_new((gint)N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
1605 hashes = g_hash_table_new(g_str_hash, g_str_equal); 1667 hashes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
1606 1668
1607 while (buf_get_line(ibuf, &buf, &pnt, size)) { 1669 while (buf_get_line(ibuf, &buf, &pnt, size)) {
1608 if (*buf != '#') { 1670 if (*buf != '#') {
1609 if (!strncasecmp(buf, "BAD ", 4)) 1671 if (!strncasecmp(buf, "BAD ", 4))
1672 {
1610 strncpy(bad, buf + 4, 81); 1673 strncpy(bad, buf + 4, 81);
1611 else if (!strncasecmp(buf, "GOOD ", 5)) { 1674 }
1675 else if(!strncasecmp(buf, "COMPLETE ", 9))
1676 {
1677 strncpy(completestr, buf + 9, BUFSIZ - 1);
1678 complete = (gboolean)strtol(completestr, NULL, 10);
1679 }
1680 else if (!strncasecmp(buf, "GOOD ", 5))
1681 {
1612 strncpy(good, buf + 5, 255); 1682 strncpy(good, buf + 5, 255);
1613 1683
1614 if (*bad && *good && g_hash_table_lookup(hashes, bad) == NULL) { 1684 if (*bad && *good && g_hash_table_lookup(hashes, bad) == NULL) {
1615 GtkTreeIter iter; 1685 GtkTreeIter iter;
1616 1686
1617 /* We don't actually need to store the good string, since this 1687 /* We don't actually need to store the good string, since this
1618 * hash is just being used to eliminate duplicate bad strings. 1688 * hash is just being used to eliminate duplicate bad strings.
1689 * The value has to be non-NULL so the lookup above will work.
1619 */ 1690 */
1620 g_hash_table_insert(hashes, g_strdup(bad), GINT_TO_POINTER(1)); 1691 g_hash_table_insert(hashes, g_strdup(bad), GINT_TO_POINTER(1));
1621 1692
1622 gtk_list_store_append(model, &iter); 1693 gtk_list_store_append(model, &iter);
1623 gtk_list_store_set(model, &iter, 1694 gtk_list_store_set(model, &iter,
1624 0, bad, 1695 0, bad,
1625 1, good, 1696 1, good,
1697 2, complete,
1626 -1); 1698 -1);
1627 } 1699 }
1628 bad[0] = '\0'; 1700 bad[0] = '\0';
1701 complete = TRUE;
1629 } 1702 }
1630 } 1703 }
1631 } 1704 }
1632 g_free(ibuf); 1705 g_free(ibuf);
1633 g_hash_table_foreach(hashes, (GHFunc)g_free, NULL);
1634 g_hash_table_destroy(hashes); 1706 g_hash_table_destroy(hashes);
1635 1707
1636 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), 1708 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model),
1637 0, GTK_SORT_ASCENDING); 1709 0, GTK_SORT_ASCENDING);
1638 } 1710 }
1639 1711
1640 static GtkWidget *tree; 1712 static GtkWidget *tree;
1641 static GtkWidget *bad_entry; 1713 static GtkWidget *bad_entry;
1642 static GtkWidget *good_entry; 1714 static GtkWidget *good_entry;
1715 static GtkWidget *complete_toggle;
1643 1716
1644 static void save_list(); 1717 static void save_list();
1645 1718
1646 static void on_edited(GtkCellRendererText *cellrenderertext, 1719 static void on_edited(GtkCellRendererText *cellrenderertext,
1647 gchar *path, gchar *arg2, gpointer data) 1720 gchar *path, gchar *arg2, gpointer data)
1662 save_list(); 1735 save_list();
1663 } 1736 }
1664 g_value_unset(&val); 1737 g_value_unset(&val);
1665 } 1738 }
1666 1739
1740
1741 static void on_toggled(GtkCellRendererToggle *cellrenderertoggle,
1742 gchar *path, gpointer data){
1743 GtkTreeIter iter;
1744 gboolean enabled;
1745
1746 g_return_if_fail(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model), &iter, path));
1747 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
1748 WORD_ONLY_COLUMN, &enabled,
1749 -1);
1750
1751 gtk_list_store_set(GTK_LIST_STORE(model), &iter,
1752 WORD_ONLY_COLUMN, !enabled,
1753 -1);
1754
1755 save_list();
1756 }
1757
1667 static void list_add_new() 1758 static void list_add_new()
1668 { 1759 {
1669 GtkTreeIter iter; 1760 GtkTreeIter iter;
1670 1761
1671 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) { 1762 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) {
1673 1764
1674 do { 1765 do {
1675 GValue val0 = {0, }; 1766 GValue val0 = {0, };
1676 char *bad; 1767 char *bad;
1677 1768
1678 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, 0, &val0); 1769 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, BAD_COLUMN, &val0);
1679 bad = g_utf8_casefold(g_value_get_string(&val0), -1); 1770 bad = g_utf8_casefold(g_value_get_string(&val0), -1);
1680 1771
1681 if (!strcmp(bad, tmpword)) { 1772 if (!strcmp(bad, tmpword)) {
1682 g_value_unset(&val0); 1773 g_value_unset(&val0);
1683 g_free(bad); 1774 g_free(bad);
1698 } 1789 }
1699 1790
1700 1791
1701 gtk_list_store_append(model, &iter); 1792 gtk_list_store_append(model, &iter);
1702 gtk_list_store_set(model, &iter, 1793 gtk_list_store_set(model, &iter,
1703 0, gtk_entry_get_text(GTK_ENTRY(bad_entry)), 1794 BAD_COLUMN, gtk_entry_get_text(GTK_ENTRY(bad_entry)),
1704 1, gtk_entry_get_text(GTK_ENTRY(good_entry)), 1795 GOOD_COLUMN, gtk_entry_get_text(GTK_ENTRY(good_entry)),
1796 WORD_ONLY_COLUMN, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(complete_toggle)),
1705 -1); 1797 -1);
1798
1706 gtk_editable_delete_text(GTK_EDITABLE(bad_entry), 0, -1); 1799 gtk_editable_delete_text(GTK_EDITABLE(bad_entry), 0, -1);
1707 gtk_editable_delete_text(GTK_EDITABLE(good_entry), 0, -1); 1800 gtk_editable_delete_text(GTK_EDITABLE(good_entry), 0, -1);
1801 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(complete_toggle), TRUE);
1708 gtk_widget_grab_focus(bad_entry); 1802 gtk_widget_grab_focus(bad_entry);
1709 1803
1710 save_list(); 1804 save_list();
1711 } 1805 }
1712 1806
1749 1843
1750 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) { 1844 if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter)) {
1751 do { 1845 do {
1752 GValue val0 = {0, }; 1846 GValue val0 = {0, };
1753 GValue val1 = {0, }; 1847 GValue val1 = {0, };
1754 1848 GValue val2 = {0, };
1755 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, 0, &val0); 1849
1756 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, 1, &val1); 1850 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, BAD_COLUMN, &val0);
1757 1851 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, GOOD_COLUMN, &val1);
1758 g_string_append_printf(data, "BAD %s\nGOOD %s\n\n", g_value_get_string(&val0), g_value_get_string(&val1)); 1852 gtk_tree_model_get_value(GTK_TREE_MODEL(model), &iter, WORD_ONLY_COLUMN, &val2);
1853
1854 g_string_append_printf(data, "COMPLETE %d\nBAD %s\nGOOD %s\n\n", g_value_get_boolean(&val2), g_value_get_string(&val0), g_value_get_string(&val1));
1759 1855
1760 g_value_unset(&val0); 1856 g_value_unset(&val0);
1761 g_value_unset(&val1); 1857 g_value_unset(&val1);
1858 g_value_unset(&val2);
1762 1859
1763 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter)); 1860 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter));
1764 } 1861 }
1765 1862
1766 gaim_util_write_data_to_file("dict", data->str, -1); 1863 gaim_util_write_data_to_file("dict", data->str, -1);
1819 { 1916 {
1820 GtkWidget *ret, *vbox, *win; 1917 GtkWidget *ret, *vbox, *win;
1821 GtkWidget *hbox, *label; 1918 GtkWidget *hbox, *label;
1822 GtkWidget *button; 1919 GtkWidget *button;
1823 GtkSizeGroup *sg; 1920 GtkSizeGroup *sg;
1921 GtkSizeGroup *sg2;
1824 GtkCellRenderer *renderer; 1922 GtkCellRenderer *renderer;
1825 GtkTreeViewColumn *column; 1923 GtkTreeViewColumn *column;
1826 1924
1827 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
1828
1829 ret = gtk_vbox_new(FALSE, 18); 1925 ret = gtk_vbox_new(FALSE, 18);
1830 gtk_container_set_border_width (GTK_CONTAINER(ret), 12); 1926 gtk_container_set_border_width (GTK_CONTAINER(ret), 12);
1831 1927
1832 vbox = gaim_gtk_make_frame(ret, _("Text Replacements")); 1928 vbox = gaim_gtk_make_frame(ret, _("Text Replacements"));
1833 gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); 1929 gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
1834 gtk_widget_set_size_request(vbox, 300, -1); 1930 gtk_widget_set_size_request(vbox, 445, -1);
1835 gtk_widget_show(vbox); 1931 gtk_widget_show(vbox);
1836 1932
1837 win = gtk_scrolled_window_new(0, 0); 1933 win = gtk_scrolled_window_new(0, 0);
1838 gtk_container_add(GTK_CONTAINER(vbox), win); 1934 gtk_container_add(GTK_CONTAINER(vbox), win);
1839 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(win), 1935 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(win),
1843 GTK_POLICY_AUTOMATIC); 1939 GTK_POLICY_AUTOMATIC);
1844 gtk_widget_show(win); 1940 gtk_widget_show(win);
1845 1941
1846 tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); 1942 tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
1847 /* gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree), TRUE); */ 1943 /* gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree), TRUE); */
1848 gtk_widget_set_size_request(tree, 260,200); 1944 gtk_widget_set_size_request(tree, 445, 200);
1849 1945
1850 renderer = gtk_cell_renderer_text_new(); 1946 renderer = gtk_cell_renderer_text_new();
1851 g_object_set(G_OBJECT(renderer), 1947 g_object_set(G_OBJECT(renderer),
1852 "editable", TRUE, 1948 "editable", TRUE,
1853 NULL); 1949 NULL);
1866 g_signal_connect(G_OBJECT(renderer), "edited", 1962 g_signal_connect(G_OBJECT(renderer), "edited",
1867 G_CALLBACK(on_edited), GINT_TO_POINTER(1)); 1963 G_CALLBACK(on_edited), GINT_TO_POINTER(1));
1868 column = gtk_tree_view_column_new_with_attributes(_("You send"), 1964 column = gtk_tree_view_column_new_with_attributes(_("You send"),
1869 renderer, "text", GOOD_COLUMN, NULL); 1965 renderer, "text", GOOD_COLUMN, NULL);
1870 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); 1966 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
1967 gtk_tree_view_column_set_fixed_width(column, 150);
1968 /* gtk_tree_view_column_set_resizable(column, TRUE); */
1969 gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
1970 renderer = gtk_cell_renderer_toggle_new();
1971 g_object_set(G_OBJECT(renderer),
1972 "activatable", TRUE,
1973 NULL);
1974 g_signal_connect(G_OBJECT(renderer), "toggled",
1975 G_CALLBACK(on_toggled), GINT_TO_POINTER(2));
1976 column = gtk_tree_view_column_new_with_attributes(_("Complete words"),
1977 renderer, "active", WORD_ONLY_COLUMN, NULL);
1978 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
1871 gtk_tree_view_column_set_fixed_width(column, 130); 1979 gtk_tree_view_column_set_fixed_width(column, 130);
1872 /* gtk_tree_view_column_set_resizable(column, TRUE); */ 1980 /* gtk_tree_view_column_set_resizable(column, TRUE); */
1873 gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); 1981 gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
1874 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)), 1982 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)),
1875 GTK_SELECTION_MULTIPLE); 1983 GTK_SELECTION_MULTIPLE);
1892 gtk_widget_show(button); 2000 gtk_widget_show(button);
1893 2001
1894 vbox = gaim_gtk_make_frame(ret, _("Add a new text replacement")); 2002 vbox = gaim_gtk_make_frame(ret, _("Add a new text replacement"));
1895 gtk_widget_set_size_request(vbox, 300, -1); 2003 gtk_widget_set_size_request(vbox, 300, -1);
1896 2004
2005 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
2006 sg2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
2007
1897 hbox = gtk_hbox_new(FALSE, 2); 2008 hbox = gtk_hbox_new(FALSE, 2);
1898 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); 2009 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1899 gtk_widget_show(hbox); 2010 gtk_widget_show(hbox);
1900 2011
1901 label = gtk_label_new_with_mnemonic(_("You _type:")); 2012 label = gtk_label_new_with_mnemonic(_("You _type:"));
1902 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); 2013 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
2014 gtk_size_group_add_widget(sg, label);
2015 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
1903 2016
1904 bad_entry = gtk_entry_new(); 2017 bad_entry = gtk_entry_new();
1905 gtk_entry_set_max_length(GTK_ENTRY(bad_entry), 40); 2018 gtk_entry_set_max_length(GTK_ENTRY(bad_entry), 40);
1906 gtk_box_pack_start(GTK_BOX(hbox), bad_entry, TRUE, TRUE, 0); 2019 gtk_box_pack_start(GTK_BOX(hbox), bad_entry, TRUE, TRUE, 0);
1907 gtk_size_group_add_widget(sg, bad_entry); 2020 gtk_size_group_add_widget(sg2, bad_entry);
1908 gtk_label_set_mnemonic_widget(GTK_LABEL(label), bad_entry); 2021 gtk_label_set_mnemonic_widget(GTK_LABEL(label), bad_entry);
1909 gtk_widget_show(bad_entry); 2022 gtk_widget_show(bad_entry);
1910 2023
1911 hbox = gtk_hbox_new(FALSE, 2); 2024 hbox = gtk_hbox_new(FALSE, 2);
1912 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); 2025 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1913 gtk_widget_show(hbox); 2026 gtk_widget_show(hbox);
1914 2027
1915 label = gtk_label_new_with_mnemonic(_("You _send:")); 2028 label = gtk_label_new_with_mnemonic(_("You _send:"));
1916 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); 2029 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
2030 gtk_size_group_add_widget(sg, label);
2031 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
1917 2032
1918 good_entry = gtk_entry_new(); 2033 good_entry = gtk_entry_new();
1919 gtk_entry_set_max_length(GTK_ENTRY(good_entry), 255); 2034 gtk_entry_set_max_length(GTK_ENTRY(good_entry), 255);
1920 gtk_box_pack_start(GTK_BOX(hbox), good_entry, TRUE, TRUE, 0); 2035 gtk_box_pack_start(GTK_BOX(hbox), good_entry, TRUE, TRUE, 0);
1921 gtk_size_group_add_widget(sg, good_entry); 2036 gtk_size_group_add_widget(sg2, good_entry);
1922 gtk_label_set_mnemonic_widget(GTK_LABEL(label), good_entry); 2037 gtk_label_set_mnemonic_widget(GTK_LABEL(label), good_entry);
1923 gtk_widget_show(good_entry); 2038 gtk_widget_show(good_entry);
2039
2040 complete_toggle = gtk_check_button_new_with_mnemonic(_("Only replace _complete words"));
2041 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(complete_toggle), TRUE);
2042 gtk_widget_show(complete_toggle);
2043 gtk_box_pack_start(GTK_BOX(vbox), complete_toggle, FALSE, FALSE, 0);
1924 2044
1925 hbox = gtk_hbutton_box_new(); 2045 hbox = gtk_hbutton_box_new();
1926 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); 2046 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1927 button = gtk_button_new_from_stock(GTK_STOCK_ADD); 2047 button = gtk_button_new_from_stock(GTK_STOCK_ADD);
1928 g_signal_connect(G_OBJECT(button), "clicked", 2048 g_signal_connect(G_OBJECT(button), "clicked",