From 508be983573bb4eff6a873604cf11859d7aee22a Mon Sep 17 00:00:00 2001 From: Behnam Esfahbod Date: Sun, 19 Apr 2009 20:26:54 +0430 Subject: Add reorder_line() Add Makefile Add .gitignore Move test files to test/ --- .gitignore | 2 + Makefile | 15 ++++++++ fribidi.py | 93 ++++++++++++++++++++++++++++++++++++++++++++ test.py | 117 -------------------------------------------------------- test/.gitignore | 1 + test/fribidi.py | 1 + test/test1.py | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ test/test2.py | 30 +++++++++++++++ 8 files changed, 259 insertions(+), 117 deletions(-) create mode 100644 .gitignore create mode 100644 Makefile delete mode 100755 test.py create mode 100644 test/.gitignore create mode 120000 test/fribidi.py create mode 100755 test/test1.py create mode 100755 test/test2.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b8d9103 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +tags +*.pyc diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..53058e9 --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ + +all: ctags test + +test: + python tests/test1.py + python tests/test2.py + +ctags: + @clear + @echo `pkg-config --libs-only-L fribidi | sed s'/^-L//'` + @ctags -R . `pkg-config --libs-only-L fribidi | sed s'/^-L//'` + +clean: + find *.pyc | xargs rm -f + diff --git a/fribidi.py b/fribidi.py index 28ff07a..efd80e5 100755 --- a/fribidi.py +++ b/fribidi.py @@ -542,6 +542,99 @@ def get_par_embedding_levels(bidi_types_list, text_length=None, return [output_levels_list, pbase_dir_p[0], max_levels] +def reorder_line(bidi_types_list, text_length=None, line_offset=0, + base_direction=None, with_max_levels=False): + + """ + Return visual reordered of a line of logical string + """ + + # TODO + + """ + This function reorders the characters in a line of text from logical to + final visual order. This function implements part 4 of rule L1, and rules + L2 and L3 of the Unicode Bidirectional Algorithm available at + http://www.unicode.org/reports/tr9/#Reordering_Resolved_Levels. + + As a side effect it also sets position maps if not NULL. + + You should provide the resolved paragraph direction and embedding levels as + set by fribidi_get_par_embedding_levels(). Also note that the embedding + levels may change a bit. To be exact, the embedding level of any sequence + of white space at the end of line is reset to the paragraph embedding level + (That is part 4 of rule L1). + + Note that the bidi types and embedding levels are not reordered. You can + reorder these (or any other) arrays using the map later. The user is + responsible to initialize map to something sensible, like an identity + mapping, or pass NULL if no map is needed. + + There is an optional part to this function, which is whether non-spacing + marks for right-to-left parts of the text should be reordered to come after + their base characters in the visual string or not. Most rendering engines + expect this behavior, but console-based systems for example do not like it. + This is controlled by the FRIBIDI_FLAG_REORDER_NSM flag. The flag is on + in FRIBIDI_FLAGS_DEFAULT. + + Returns: Maximum level found in this line plus one, or zero if any error + occured (memory allocation failure most probably). + + """ + + if not text_length: + text_length = len(bidi_types_list) + + if base_direction is None: + base_direction=ParType.LTR + + # Memory allocations + + input_bidi_types_p = _malloc_int32_array_from_list(bidi_types_list, text_length) + pbase_dir_p = ctypes.pointer(ctypes.c_int32(base_direction)) + + emb_p = _malloc_int8_array(text_length) + + # Calling the API + + """ + FRIBIDI_ENTRY FriBidiLevel fribidi_reorder_line ( + FriBidiFlags flags, /* reorder flags */ + const FriBidiCharType *bidi_types, /* input list of bidi types as returned by fribidi_get_bidi_types() */ + const FriBidiStrIndex len, /* input length of the line */ + const FriBidiStrIndex off, /* input offset of the beginning of the line in the paragraph */ + const FriBidiParType base_dir, /* resolved paragraph base direction */ + FriBidiLevel *embedding_levels, /* input list of embedding levels, as returned by fribidi_get_par_embedding_levels */ + FriBidiChar *visual_str, /* visual string to reorder */ + FriBidiStrIndex *map /* a map of string indices which is reordered to reflect where each glyph ends up. */ + ) FRIBIDI_GNUC_WARN_UNUSED; + """ + + success = _libfribidi.fribidi_get_par_embedding_levels( + input_flags, # reorder flags + input_bidi_types_p, # input list of bidi types as returned by get_bidi_types() + text_length, # input string length of the paragraph + line_offset, # input offset of the beginning of the line in the paragraph + pbase_dir_p, # requested and resolved paragraph base direction + emb_p, # output list of embedding levels + embedding_levels_p # input list of embedding levels, as returned by get_par_embedding_levels() + ) + + if not success: + raise Exception('fribidi_get_par_embedding_levels failed') + + # Pythonizing the output + + max_levels = success - 1 + + output_levels_list = [i for i in emb_p] + + if with_max_levels: + return [output_levels_list, max_levels] + else: + return output_levels_list + + # ######################################################################## # FriBidi API, Misc diff --git a/test.py b/test.py deleted file mode 100755 index aa5feef..0000000 --- a/test.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env python -# coding=UTF-8 - - -from fribidi import * - - -def _main(): - - print 'libfribidi version:', libfribidi_version, libfribidi_version_major, libfribidi_version_minor - print - - # Bidi API - - print - print 'TEST get_bidi_types()' - print - - print get_bidi_types(123) - print get_bidi_types(u"سل‌ام") - print get_bidi_types(u"سل‌ام").__class__ - print - - print - print 'TEST get_par_direction()' - print - - print get_par_direction(get_bidi_types(123)) - print get_par_direction(get_bidi_types(u"سل‌ام")) - print get_par_direction(get_bidi_types(u"سل‌ام")).__class__ - print - - print - print 'TEST get_par_embedding_levels()' - print - - print get_par_embedding_levels(get_bidi_types(123)) - print get_par_embedding_levels(get_bidi_types(u"سل‌ام")) - print get_par_embedding_levels(get_bidi_types(u"سل‌ام")).__class__ - print - - print get_par_embedding_levels(get_bidi_types("abc"), None, ParType.LTR) - print get_par_embedding_levels(get_bidi_types(u"aسلام"), None, ParType.LTR) - print get_par_embedding_levels(get_bidi_types(u"aسلام"), None, ParType.RTL) - - ''' - print - print 'TEST remove_bidi_marks()' - print - - print remove_bidi_marks(123) - print remove_bidi_marks(u"سل‌ام") - print remove_bidi_marks(u"سل‌ام").__class__ - print - - print remove_bidi_marks(u"سلامa") - #print remove_bidi_marks(u"سلامa", None, False, True) - #print remove_bidi_marks(u"سلامa", None, False, False, True) - #print remove_bidi_marks(u"سلامa", None, True) - - print remove_bidi_marks(u"سل‌ام") - #print remove_bidi_marks(u"سل‌ام", None, True) - #print remove_bidi_marks(u"سل‌ام", None, False, True) - #print remove_bidi_marks(u"سل‌ام", None, False, False, True) - - print - print 'TEST get_mirror_chars()' - print - - print get_mirror_chars(123) - print get_mirror_chars(u"سل‌ام") - print get_mirror_chars(u"سل‌ام").__class__ - print - - a="()"; print a, get_mirror_chars(a) - a=u"«»"; print a, get_mirror_chars(a) - a=u"﴾﴿"; print a, get_mirror_chars(a) - - print - print 'TEST get_mirror_prop()' - print - - print get_mirror_prop(123) - print get_mirror_prop(u"سل‌ام") - print get_mirror_prop(u"سل‌ام").__class__ - print - - print u"() «» ﴾﴿", get_mirror_prop(u"() «» ﴾﴿") - - print - print 'TEST get_version_info()' - print - - print get_version_info() - - print 'TEST log2vis()' - print - - print log2vis(123) - print log2vis(u"سل‌ام") - print log2vis(u"سل‌ام").__class__ - print - - print log2vis(u"سلام", None, None, True) - print log2vis(u"سلام", None, None, False, True) - print log2vis(u"سلام", None, None, False, False, True) - - print log2vis(u"1سلام", None, ParType.LTR, True, True, True) - print log2vis(u"1سلام", None, ParType.RTL, True, True, True) - - print log2vis(u"aسلام", None, ParType.LTR, True, True, True) - print log2vis(u"aسلام", None, ParType.RTL, True, True, True) - ''' - -if __name__ == '__main__': - _main() - diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/test/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/test/fribidi.py b/test/fribidi.py new file mode 120000 index 0000000..b2f56ab --- /dev/null +++ b/test/fribidi.py @@ -0,0 +1 @@ +../fribidi.py \ No newline at end of file diff --git a/test/test1.py b/test/test1.py new file mode 100755 index 0000000..aa5feef --- /dev/null +++ b/test/test1.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python +# coding=UTF-8 + + +from fribidi import * + + +def _main(): + + print 'libfribidi version:', libfribidi_version, libfribidi_version_major, libfribidi_version_minor + print + + # Bidi API + + print + print 'TEST get_bidi_types()' + print + + print get_bidi_types(123) + print get_bidi_types(u"سل‌ام") + print get_bidi_types(u"سل‌ام").__class__ + print + + print + print 'TEST get_par_direction()' + print + + print get_par_direction(get_bidi_types(123)) + print get_par_direction(get_bidi_types(u"سل‌ام")) + print get_par_direction(get_bidi_types(u"سل‌ام")).__class__ + print + + print + print 'TEST get_par_embedding_levels()' + print + + print get_par_embedding_levels(get_bidi_types(123)) + print get_par_embedding_levels(get_bidi_types(u"سل‌ام")) + print get_par_embedding_levels(get_bidi_types(u"سل‌ام")).__class__ + print + + print get_par_embedding_levels(get_bidi_types("abc"), None, ParType.LTR) + print get_par_embedding_levels(get_bidi_types(u"aسلام"), None, ParType.LTR) + print get_par_embedding_levels(get_bidi_types(u"aسلام"), None, ParType.RTL) + + ''' + print + print 'TEST remove_bidi_marks()' + print + + print remove_bidi_marks(123) + print remove_bidi_marks(u"سل‌ام") + print remove_bidi_marks(u"سل‌ام").__class__ + print + + print remove_bidi_marks(u"سلامa") + #print remove_bidi_marks(u"سلامa", None, False, True) + #print remove_bidi_marks(u"سلامa", None, False, False, True) + #print remove_bidi_marks(u"سلامa", None, True) + + print remove_bidi_marks(u"سل‌ام") + #print remove_bidi_marks(u"سل‌ام", None, True) + #print remove_bidi_marks(u"سل‌ام", None, False, True) + #print remove_bidi_marks(u"سل‌ام", None, False, False, True) + + print + print 'TEST get_mirror_chars()' + print + + print get_mirror_chars(123) + print get_mirror_chars(u"سل‌ام") + print get_mirror_chars(u"سل‌ام").__class__ + print + + a="()"; print a, get_mirror_chars(a) + a=u"«»"; print a, get_mirror_chars(a) + a=u"﴾﴿"; print a, get_mirror_chars(a) + + print + print 'TEST get_mirror_prop()' + print + + print get_mirror_prop(123) + print get_mirror_prop(u"سل‌ام") + print get_mirror_prop(u"سل‌ام").__class__ + print + + print u"() «» ﴾﴿", get_mirror_prop(u"() «» ﴾﴿") + + print + print 'TEST get_version_info()' + print + + print get_version_info() + + print 'TEST log2vis()' + print + + print log2vis(123) + print log2vis(u"سل‌ام") + print log2vis(u"سل‌ام").__class__ + print + + print log2vis(u"سلام", None, None, True) + print log2vis(u"سلام", None, None, False, True) + print log2vis(u"سلام", None, None, False, False, True) + + print log2vis(u"1سلام", None, ParType.LTR, True, True, True) + print log2vis(u"1سلام", None, ParType.RTL, True, True, True) + + print log2vis(u"aسلام", None, ParType.LTR, True, True, True) + print log2vis(u"aسلام", None, ParType.RTL, True, True, True) + ''' + +if __name__ == '__main__': + _main() + diff --git a/test/test2.py b/test/test2.py new file mode 100755 index 0000000..a6bb6e1 --- /dev/null +++ b/test/test2.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# coding=UTF-8 + + +from fribidi import * + +s = u'سلام ABC' + +print 'ORIG\t%s' % s +print 'LTR\t%s' % log2vis(s, None, ParType.LTR) +print 'RTL\t%s' % log2vis(s, None, ParType.RTL) + +s = u'46/12/2008' + +print 'ORIG\t%s' % s +print 'LTR\t%s' % log2vis(s, None, ParType.LTR) +print 'RTL\t%s' % log2vis(s, None, ParType.RTL) + +s = u'٤٦/١٢/٢٠٠٨' + +print 'ORIG\t%s' % s +print 'LTR\t%s' % log2vis(s, None, ParType.LTR) +print 'RTL\t%s' % log2vis(s, None, ParType.RTL) + +s = u'۴۶/۱۲/۲۰۰۸' + +print 'ORIG\t%s' % s +print 'LTR\t%s' % log2vis(s, None, ParType.LTR) +print 'RTL\t%s' % log2vis(s, None, ParType.RTL) + -- cgit v1.2.3