From 7f1ae2497b01dfc026564420605b492944d685a6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 19 Feb 2013 16:13:41 +0000 Subject: fix [#34275] Text autocomplete cuts words with accents or special characters autocomplete is now unicode aware, using python api's checks for now. eventually we should have our own. --- source/blender/blenkernel/BKE_text.h | 4 ++++ source/blender/blenkernel/intern/text.c | 12 ++++++++++++ source/blender/editors/space_text/text_autocomplete.c | 6 +++--- source/blender/python/intern/bpy_interface.c | 17 +++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_text.h b/source/blender/blenkernel/BKE_text.h index 3e882a048eb..3d7b5d1c8e4 100644 --- a/source/blender/blenkernel/BKE_text.h +++ b/source/blender/blenkernel/BKE_text.h @@ -109,6 +109,10 @@ int text_check_identifier_nodigit(const char ch); int text_check_whitespace(const char ch); int text_find_identifier_start(const char *str, int i); +/* defined in bpy_interface.c */ +extern int text_check_identifier_unicode(const unsigned int ch); +extern int text_check_identifier_nodigit_unicode(const unsigned int ch); + enum { TXT_MOVE_LINE_UP = -1, TXT_MOVE_LINE_DOWN = 1 diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 86e7a152a4a..74c0a76f82d 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -2938,6 +2938,18 @@ int text_check_identifier_nodigit(const char ch) return 0; } +#ifndef WITH_PYTHON +int text_check_identifier_unicode(const unsigned int ch) +{ + return (ch < 255 && text_check_identifier((char)ch)); +} + +int text_check_identifier_nodigit_unicode(const unsigned int ch) +{ + return (ch < 255 && text_check_identifier_nodigit((char)ch)); +} +#endif /* WITH_PYTHON */ + int text_check_whitespace(const char ch) { if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n') diff --git a/source/blender/editors/space_text/text_autocomplete.c b/source/blender/editors/space_text/text_autocomplete.c index 0c16208c2a7..7c18b5c283a 100644 --- a/source/blender/editors/space_text/text_autocomplete.c +++ b/source/blender/editors/space_text/text_autocomplete.c @@ -170,13 +170,13 @@ static GHash *text_autocomplete_build(Text *text) /* seek identifier beginning */ i_pos = i_start; while ((i_start < linep->len) && - (!text_check_identifier_nodigit(BLI_str_utf8_as_unicode_and_size_safe(&linep->line[i_start], &i_pos)))) + (!text_check_identifier_nodigit_unicode(BLI_str_utf8_as_unicode_and_size_safe(&linep->line[i_start], &i_pos)))) { i_start = i_pos; } i_pos = i_end = i_start; while ((i_end < linep->len) && - (text_check_identifier(BLI_str_utf8_as_unicode_and_size_safe(&linep->line[i_end], &i_pos)))) + (text_check_identifier_unicode(BLI_str_utf8_as_unicode_and_size_safe(&linep->line[i_end], &i_pos)))) { i_end = i_pos; } @@ -184,7 +184,7 @@ static GHash *text_autocomplete_build(Text *text) if ((i_start != i_end) && /* check we're at the beginning of a line or that the previous char is not an identifier * this prevents digits from being added */ - ((i_start < 1) || !text_check_identifier(BLI_str_utf8_as_unicode(&linep->line[i_start - 1])))) + ((i_start < 1) || !text_check_identifier_unicode(BLI_str_utf8_as_unicode(&linep->line[i_start - 1])))) { char *str_sub = &linep->line[i_start]; const int choice_len = i_end - i_start; diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 632018f2bf0..90199a403dc 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -928,3 +928,20 @@ static void bpy_module_free(void *UNUSED(mod)) } #endif + + +/* EVIL, define text.c functions here... */ +extern int text_check_identifier_unicode(const unsigned int ch); +extern int text_check_identifier_nodigit_unicode(const unsigned int ch); +extern int text_check_identifier(const char ch); +extern int text_check_identifier_nodigit(const char ch); + +int text_check_identifier_unicode(const unsigned int ch) +{ + return (ch < 255 && text_check_identifier((char)ch)) || Py_UNICODE_ISALNUM(ch); +} + +int text_check_identifier_nodigit_unicode(const unsigned int ch) +{ + return (ch < 255 && text_check_identifier_nodigit((char)ch)) || Py_UNICODE_ISALPHA(ch); +} -- cgit v1.2.3