Re: API for bidi reordering a string

"Martin J. Dürst" <[email protected]> Wed, 01 Sep 2010 18:06:14 +0900
Newsgroups gmane.emacs.bidi,gmane.emacs.devel
Organization Aoyama Gakuin University
Message-ID <[email protected]>
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
> 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
> different from the input arg EMBEDDING only if the latter is nil.
>
> LOG-TO-VIS is a vector of character indices mapping the original
> logical-order STRING to the reordered visual-order string.  The zeroth
> element of LOG-TO-VIS gives the index of the first character of STRING
> in the reordered string output by the function, the next element gives
> the index of the second character, etc.  For example, if the
> logical-order string ABCDE is reordered into EDCBA, then the zeroth
> element of LOG-TO-VIS will be 4, the 1st element will be 3, etc.
>
> VIS-TO-LOG is a vector of character indices for the reverse mapping of
> the characters in the visual-order string back to its logical-order
> original.
>
> LEVELS is a vector of resolved levels, one each for every character in
> the reordered string.  Resolved levels are numbers between zero and
> 63, with even levels indicating the left-to-right directionality and
> odd levels indicating the right-to-left directionality.  Note that the
> levels are specified in the visual order, i.e. they correspond to
> characters in the reordered string returned by the function."
>
> _______________________________________________
> emacs-bidi mailing list
> [email protected]
> http://lists.gnu.org/mailman/listinfo/emacs-bidi
>
>

-- 
#-# Martin J. Dürst, Professor, Aoyama Gakuin University
#-# http://www.sw.it.aoyama.ac.jp   mailto:[email protected]