Eli Zaretskii | 1 Sep 10:26
Picon

API for bidi reordering a string

I'm planning on implementing the following API for reordering a
logical-order string into visual order.  Comments are welcome,
especially regarding the way the extra information is returned.

(defun bidi-reorder-string string embedding &optional extra)
  "Reorder the input STRING from logical to visual order.

This function reorders STRING according to the Unicode Bidirectional
Algorithm described in the Unicode Standard Annex #9 (UAX#9), see
http://unicode.org/reports/tr9/.

Second argument EMBEDDING provides the base paragraph embedding level
for the reordering.  It is `left-to-right' for left-to-right
paragraphs, `right-to-left' for right-to-left paragraphs, or nil for
neutral paragraphs.  In the latter case, the actual base paragraph
level is determined from the string itself, using the UAX#9 rules.

Value is the reordered string.  For STRING without any characters
from right-to-left scripts, such as Arabic or Hebrew, this function
returns a copy of the original STRING, possibly with a text property
\(see below).

Optional argument EXTRA non-nil means return additional information
about the results of reordering.  This information is recorded in the
value of the `bidi-info' text property of the returned string.  The
value is a vector of the form:

  [EMBEDDING LOG-TO-VIS VIS-TO-LOG LEVELS]

EMBEDDING is the actual base paragraph embedding level.  It is
(Continue reading)

Martin J. Dürst | 1 Sep 11:06
Picon
Gravatar

Re: API for bidi reordering a string

Hello Eli,

Overall, the API makes sense. I'd personally put the levels (when extra 
is non-nil) in logical order, but that's a detail.

This function could be very useful for testing (assuming it uses the 
same logic as the built-in display reordering). On the other hand, I'm 
not sure what other uses you have in mind. I'm quite afraid that some 
people may take the existence of such a function as a license to convert 
a lot of text from logical to visual encoding. As I hope we all agree, 
that would be a bad idea, because it's a one-way street, and visual is 
much less flexible (e.g. reflowing lines,...).

Regards,    Martin.

On 2010/09/01 17:26, Eli Zaretskii wrote:
> I'm planning on implementing the following API for reordering a
> logical-order string into visual order.  Comments are welcome,
> especially regarding the way the extra information is returned.
>
> (defun bidi-reorder-string string embedding&optional extra)
>    "Reorder the input STRING from logical to visual order.
>
> This function reorders STRING according to the Unicode Bidirectional
> Algorithm described in the Unicode Standard Annex #9 (UAX#9), see
> http://unicode.org/reports/tr9/.
>
> Second argument EMBEDDING provides the base paragraph embedding level
> for the reordering.  It is `left-to-right' for left-to-right
> paragraphs, `right-to-left' for right-to-left paragraphs, or nil for
(Continue reading)

Eli Zaretskii | 1 Sep 11:24
Picon

Re: API for bidi reordering a string

> Date: Wed, 01 Sep 2010 18:06:14 +0900
> From: "Martin J. Dürst" <duerst <at> it.aoyama.ac.jp>
> CC: emacs-bidi <at> gnu.org, emacs-devel <at> gnu.org
> 
> Overall, the API makes sense. I'd personally put the levels (when extra 
> is non-nil) in logical order, but that's a detail.

I don't mind to produce it in logical order, but is there a reason to
do so?

> This function could be very useful for testing (assuming it uses the 
> same logic as the built-in display reordering). On the other hand, I'm 
> not sure what other uses you have in mind.

As a matter of fact, I don't see too much uses for it, except for
testing and "educational" purposes.  The only other use-case I can
think of is encoding text into a visual-order encoding.  But I need to
implement reordering of display strings, so I thought it would be nice
to have a Lisp binding for that.

Thanks for the comments.

Gmane