📄 spellchk.c
字号:
} if (result) gtk_text_iter_forward_char(&end); /* Move backwards to the beginning of the word. */ spellchk_backward_word_start(&start); spell->word = gtk_text_iter_get_text(&start, &end); /* Hack because otherwise typing things like U.S. gets difficult * if you have 'u' -> 'you' set as a correction... * * Part 2 of 2: This chops periods off the end of the word so * the right substitution entry is found. */ tmp = g_strdup(spell->word); if (tmp != NULL && *tmp != '\0') { gchar *c; for (c = tmp + strlen(tmp) - 1 ; c != tmp ; c--) { if (*c == '.') { *c = '\0'; period_count++; } else break; } } if ((word = substitute_word(tmp))) { GtkTextMark *mark; GtkTextIter pos; gchar *tmp2; int i; for (i = 1 ; i <= period_count ; i++) { tmp2 = g_strconcat(word, ".", NULL); g_free(word); word = tmp2; } gtk_text_buffer_delete(buffer, &start, &end); gtk_text_buffer_insert(buffer, &start, word, -1); mark = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &pos, mark); spell->pos = gtk_text_iter_get_offset(&pos); g_free(word); g_free(tmp); return TRUE; } g_free(tmp); spell->word = NULL; return replaced;}/* insertion works like this: * - before the text is inserted, we mark the position in the buffer. * - after the text is inserted, we see where our mark is and use that and * the current position to check the entire range of inserted text. * * this may be overkill for the common case (inserting one character). */static voidinsert_text_before(GtkTextBuffer *buffer, GtkTextIter *iter, gchar *text, gint len, spellchk *spell){ if (spell->inserting == TRUE) return; spell->inserting = TRUE; spell->word = NULL; gtk_text_buffer_move_mark(buffer, spell->mark_insert_start, iter);}static voidinsert_text_after(GtkTextBuffer *buffer, GtkTextIter *iter, gchar *text, gint len, spellchk *spell){ GtkTextIter start, end; GtkTextMark *mark; spell->ignore_correction_on_send = FALSE; if (spell->ignore_correction) { spell->ignore_correction = FALSE; return; } /* we need to check a range of text. */ gtk_text_buffer_get_iter_at_mark(buffer, &start, spell->mark_insert_start); if (len == 1) check_range(spell, buffer, start, *iter, FALSE); /* if check_range modified the buffer, iter has been invalidated */ mark = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &end, mark); gtk_text_buffer_move_mark(buffer, spell->mark_insert_end, &end); spell->inserting = FALSE;}static voiddelete_range_after(GtkTextBuffer *buffer, GtkTextIter *start, GtkTextIter *end, spellchk *spell){ GtkTextIter start2, end2; GtkTextMark *mark; GtkTextIter pos; gint place; spell->ignore_correction_on_send = FALSE; if (!spell->word) return; if (spell->inserting == TRUE) return; spell->inserting = TRUE; mark = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &pos, mark); place = gtk_text_iter_get_offset(&pos); if ((place + 1) != spell->pos) { spell->word = NULL; return; } gtk_text_buffer_get_iter_at_mark(buffer, &start2, spell->mark_insert_start); gtk_text_buffer_get_iter_at_mark(buffer, &end2, spell->mark_insert_end); gtk_text_buffer_delete(buffer, &start2, &end2); gtk_text_buffer_insert(buffer, &start2, spell->word, -1); spell->ignore_correction = TRUE; spell->ignore_correction_on_send = TRUE; spell->inserting = FALSE; spell->word = NULL;}static voidmessage_send_cb(GtkWidget *widget, spellchk *spell){ GtkTextBuffer *buffer; GtkTextIter start, end; GtkTextMark *mark; gboolean replaced; if (spell->ignore_correction_on_send) { spell->ignore_correction_on_send = FALSE; return; }#if 0 if (!purple_prefs_get_bool("/plugins/gtk/spellchk/last_word_replace")) return;#endif buffer = gtk_text_view_get_buffer(spell->view); gtk_text_buffer_get_end_iter(buffer, &start); gtk_text_buffer_get_end_iter(buffer, &end); spell->inserting = TRUE; replaced = check_range(spell, buffer, start, end, TRUE); spell->inserting = FALSE; /* if check_range modified the buffer, iter has been invalidated */ mark = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &end, mark); gtk_text_buffer_move_mark(buffer, spell->mark_insert_end, &end); if (replaced) { g_signal_stop_emission_by_name(widget, "message_send"); spell->ignore_correction_on_send = TRUE; }}static voidspellchk_new_attach(PurpleConversation *conv){ spellchk *spell; GtkTextBuffer *buffer; GtkTextIter start, end; PidginConversation *gtkconv; GtkTextView *view; gtkconv = PIDGIN_CONVERSATION(conv); view = GTK_TEXT_VIEW(gtkconv->entry); spell = g_object_get_data(G_OBJECT(view), SPELLCHK_OBJECT_KEY); if (spell != NULL) return; /* attach to the widget */ spell = g_new0(spellchk, 1); spell->view = view; g_object_set_data_full(G_OBJECT(view), SPELLCHK_OBJECT_KEY, spell, (GDestroyNotify)spellchk_free); buffer = gtk_text_view_get_buffer(view); /* we create the mark here, but we don't use it until text is * inserted, so we don't really care where iter points. */ gtk_text_buffer_get_bounds(buffer, &start, &end); spell->mark_insert_start = gtk_text_buffer_create_mark(buffer, "spellchk-insert-start", &start, TRUE); spell->mark_insert_end = gtk_text_buffer_create_mark(buffer, "spellchk-insert-end", &start, TRUE); g_signal_connect_after(G_OBJECT(buffer), "delete-range", G_CALLBACK(delete_range_after), spell); g_signal_connect(G_OBJECT(buffer), "insert-text", G_CALLBACK(insert_text_before), spell); g_signal_connect_after(G_OBJECT(buffer), "insert-text", G_CALLBACK(insert_text_after), spell); g_signal_connect(G_OBJECT(gtkconv->entry), "message_send", G_CALLBACK(message_send_cb), spell); return;}static int buf_get_line(char *ibuf, char **buf, int *position, int len){ int pos = *position; int spos = pos; if (pos == len) return 0; while (!(ibuf[pos] == '\n' || (ibuf[pos] == '\r' && ibuf[pos + 1] != '\n'))) { pos++; if (pos == len) return 0; } if (pos != 0 && ibuf[pos] == '\n' && ibuf[pos - 1] == '\r') ibuf[pos - 1] = '\0'; ibuf[pos] = '\0'; *buf = &ibuf[spos]; pos++; *position = pos; return 1;}static void load_conf(){ /* Corrections to change "...", "(c)", "(r)", and "(tm)" to their * Unicode character equivalents were not added here even though * they existed in the source list(s). I think these corrections * would be more trouble than they're worth. */ const char * const defaultconf = "BAD abbout\nGOOD about\n" "BAD abotu\nGOOD about\n" "BAD abouta\nGOOD about a\n" "BAD aboutit\nGOOD about it\n" "BAD aboutthe\nGOOD about the\n" "BAD abscence\nGOOD absence\n" "BAD accesories\nGOOD accessories\n" "BAD accidant\nGOOD accident\n" "BAD accomodate\nGOOD accommodate\n" "BAD accordingto\nGOOD according to\n" "BAD accross\nGOOD across\n" "BAD acheive\nGOOD achieve\n" "BAD acheived\nGOOD achieved\n" "BAD acheiving\nGOOD achieving\n" "BAD acn\nGOOD can\n" "BAD acommodate\nGOOD accommodate\n" "BAD acomodate\nGOOD accommodate\n" "BAD actualyl\nGOOD actually\n" "BAD additinal\nGOOD additional\n" "BAD addtional\nGOOD additional\n" "BAD adequit\nGOOD adequate\n" "BAD adequite\nGOOD adequate\n" "BAD adn\nGOOD and\n" "BAD advanage\nGOOD advantage\n" "BAD affraid\nGOOD afraid\n" "BAD afterthe\nGOOD after the\n" "COMPLETE 0\nBAD againstt he \nGOOD against the \n" "BAD aganist\nGOOD against\n" "BAD aggresive\nGOOD aggressive\n" "BAD agian\nGOOD again\n" "BAD agreemeent\nGOOD agreement\n" "BAD agreemeents\nGOOD agreements\n" "BAD agreemnet\nGOOD agreement\n" "BAD agreemnets\nGOOD agreements\n" "BAD agressive\nGOOD aggressive\n" "BAD agressiveness\nGOOD aggressiveness\n" "BAD ahd\nGOOD had\n" "BAD ahold\nGOOD a hold\n" "BAD ahppen\nGOOD happen\n" "BAD ahve\nGOOD have\n" "BAD allready\nGOOD already\n" "BAD allwasy\nGOOD always\n" "BAD allwyas\nGOOD always\n" "BAD almots\nGOOD almost\n" "BAD almsot\nGOOD almost\n" "BAD alomst\nGOOD almost\n" "BAD alot\nGOOD a lot\n" "BAD alraedy\nGOOD already\n" "BAD alreayd\nGOOD already\n" "BAD alreday\nGOOD already\n" "BAD alwasy\nGOOD always\n" "BAD alwats\nGOOD always\n" "BAD alway\nGOOD always\n" "BAD alwyas\nGOOD always\n" "BAD amde\nGOOD made\n" "BAD Ameria\nGOOD America\n" "BAD amke\nGOOD make\n" "BAD amkes\nGOOD makes\n" "BAD anbd\nGOOD and\n" "BAD andone\nGOOD and one\n" "BAD andteh\nGOOD and the\n" "BAD andthe\nGOOD and the\n" "COMPLETE 0\nBAD andt he \nGOOD and the \n" "BAD anothe\nGOOD another\n" "BAD anual\nGOOD annual\n" "BAD any1\nGOOD anyone\n" "BAD apparant\nGOOD apparent\n" "BAD apparrent\nGOOD apparent\n" "BAD appearence\nGOOD appearance\n" "BAD appeares\nGOOD appears\n" "BAD applicaiton\nGOOD application\n" "BAD applicaitons\nGOOD applications\n" "BAD applyed\nGOOD applied\n" "BAD appointiment\nGOOD appointment\n" "BAD approrpiate\nGOOD appropriate\n" "BAD approrpriate\nGOOD appropriate\n" "BAD aquisition\nGOOD acquisition\n" "BAD aquisitions\nGOOD acquisitions\n" "BAD arent\nGOOD aren't\n" "COMPLETE 0\nBAD aren;t \nGOOD aren't \n" "BAD arguement\nGOOD argument\n" "BAD arguements\nGOOD arguments\n" "COMPLETE 0\nBAD arn't \nGOOD aren't \n" "BAD arond\nGOOD around\n" "BAD artical\nGOOD article\n" "BAD articel\nGOOD article\n" "BAD asdvertising\nGOOD advertising\n" "COMPLETE 0\nBAD askt he \nGOOD ask the \n" "BAD assistent\nGOOD assistant\n" "BAD asthe\nGOOD as the\n" "BAD atention\nGOOD attention\n" "BAD atmospher\nGOOD atmosphere\n" "BAD attentioin\nGOOD attention\n" "BAD atthe\nGOOD at the\n" "BAD audeince\nGOOD audience\n" "BAD audiance\nGOOD audience\n" "BAD authentification\nGOOD authentication\n" "BAD availalbe\nGOOD available\n" "BAD awya\nGOOD away\n" "BAD aywa\nGOOD away\n" "BAD b4\nGOOD before\n" "BAD bakc\nGOOD back\n" "BAD balence\nGOOD balance\n" "BAD ballance\nGOOD balance\n" "BAD baout\nGOOD about\n" "BAD bcak\nGOOD back\n" "BAD bcuz\nGOOD because\n" "BAD beacuse\nGOOD because\n" "BAD becasue\nGOOD because\n" "BAD becaus\nGOOD because\n" "BAD becausea\nGOOD because a\n" "BAD becauseof\nGOOD because of\n" "BAD becausethe\nGOOD because the\n" "BAD becauseyou\nGOOD because you\n" "COMPLETE 0\nBAD beckon call\nGOOD beck and call\n" "BAD becomeing\nGOOD becoming\n" "BAD becomming\nGOOD becoming\n" "BAD becuase\nGOOD because\n" "BAD becuse\nGOOD because\n" "BAD befoer\nGOOD before\n" "BAD beggining\nGOOD beginning\n" "BAD begining\nGOOD beginning\n" "BAD beginining\nGOOD beginning\n" "BAD beleiev\nGOOD believe\n" "BAD beleieve\nGOOD believe\n" "BAD beleif\nGOOD belief\n" "BAD beleive\nGOOD believe\n" "BAD beleived\nGOOD believed\n" "BAD beleives\nGOOD believes\n" "BAD belive\nGOOD believe\n" "BAD belived\nGOOD believed\n" "BAD belives\nGOOD believes\n" "BAD benifit\nGOOD benefit\n" "BAD benifits\nGOOD benefits\n" "BAD betwen\nGOOD between\n" "BAD beutiful\nGOOD beautiful\n" "BAD blase\nGOOD blas\303\251\n" "BAD boxs\nGOOD boxes\n" "BAD brodcast\nGOOD broadcast\n" "BAD butthe\nGOOD but the\n" "BAD bve\nGOOD be\n" "COMPLETE 0\nBAD byt he \nGOOD by the \n" "BAD cafe\nGOOD caf\303\251\n" "BAD caharcter\nGOOD character\n" "BAD calcullated\nGOOD calculated\n" "BAD calulated\nGOOD calculated\n" "BAD candidtae\nGOOD candidate\n" "BAD candidtaes\nGOOD candidates\n" "COMPLETE 0\nBAD case and point\nGOOD case in point\n" "BAD cant\nGOOD can't\n" "COMPLETE 0\nBAD can;t \nGOOD can't \n" "COMPLETE 0\nBAD can't of been\nGOOD can't have been\n" "BAD catagory\nGOOD category\n" "BAD categiory\nGOOD category\n" "BAD certian\nGOOD certain\n" "BAD challange\nGOOD challenge\n" "BAD challanges\nGOOD challenges\n" "BAD chaneg\nGOOD change\n" "BAD chanegs\nGOOD changes\n" "BAD changable\nGOOD changeable\n" "BAD changeing\nGOOD changing\n" "BAD changng\nGOOD changing\n" "BAD charachter\nGOOD character\n" "BAD charachters\nGOOD characters\n" "BAD charactor\nGOOD character\n" "BAD charecter\nGOOD character\n"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -