Re: [emacs-bidi] Re: improving bidi documents display

"Martin J. Dürst" <[email protected]> Wed, 02 Mar 2011 11:09:42 +0900
Newsgroups gmane.emacs.devel,gmane.emacs.bidi
Organization Aoyama Gakuin University
Message-ID <[email protected]>
Hello Eli,

On 2011/02/28 6:15, Eli Zaretskii wrote:
>> From: Michael Welsh Duggan<[email protected]>
>> Cc: Eli Osherovich<[email protected]>,  [email protected], em=
[email protected]
>> Date: Sun, 27 Feb 2011 05:01:25 -0500
>>
>> Memory:  HEBREW \foo{english}
>> Levels:  11111111222222222221
>> Display: {foo{english\ WERBEH
>
> The key to a useful discussion of these matters is to decide up front
> what do we want to support and what do we want the text to look like.
>
> In this case, someone who knows about (La)TeX much more than I do
> should first describe what TeX features would be useful when
> typesetting bidirectional text.
>
> With that knowledge in hand, we could then think whether the example
> above is at all practical.  For example, most of the problems go away
> if paragraphs have left-to-right direction; in that case the display
> will be
>
>     WERBEH \foo{english}
>
> Maybe this is already good enough.

In some cases, it will be good enough. But if this is a word or two in a=20
Hebrew paragraph, it will probably be awkward to read.

>> One simple, naive way of handling this for the various TeXs is to
>> consider all backslashes and brace characters as R characters.  This c=
an
>> be simulated by surrounding each run of these characters by LRE PDF
>> pairs.  However, unless TeX ignores these characters completely, these
>> formatting characters would have to be removed before being processed =
by
>> TeX.
>
> Again, someone who knows should tell if the bidi formatting codes need
> to be removed before TeX'ing the file.
>
>> Another way of handling this would be to redefine the backslash and
>> brace characters as R characters, for purposes of the display engine.
>> Currently, I don't know if there is a way to do this in elisp.  bidi.c
>> seems to use a character table named bidi_type_table to hold this
>> information.  Currently this table is not exposed at the elisp layer, =
to
>> the best of my knowledge.  Maybe it would be possible to modify this
>> table in elisp, and possibly make it buffer local?
>
> I didn't expose the table to Lisp on purpose: messing with
> bidirectional properties of characters is asking for trouble.  At
> best, you will get text that will look different in any other editor;
> at worst, you could easily crash Emacs.

Getting text to look better than in another editor would be a good idea.=20
Crashing Emacs would be bad, but that would reveal a bug, or not?=20
Anyway, if at all, setting bidi properties of characters would have to=20
be done on a buffer-by-buffer (or mode-by-mode) level, not once and for=20
all for a running instance. Even then, it will only allow to take care=20
of very local phenomena (which may not work for multiple-level=20
embeddings), and it will only work one way for the whole buffer (which=20
may not work if there are paragraphs of varying directionality).

>> Another idea would be to allow a text property to override the charact=
er
>> type.
>
> Overlay, not text property.  The latter modifies the buffer, which is
> not what you want in this case.

Just a factual question: What does it mean when you say that properties=20
modify the buffer? For example, I'd expect that "modifies the buffer"=20
means that these modifications get saved when the buffer gets saved, but=20
there are lots of properties that I would have no idea of how they get=20
saved when the text is saved as plain text (as is usual for Emacs).


>> This feels like a very elegant, emacs-ish way to do things, but
>> an uneducated glance at the bidi code makes me feel like it would be
>> difficult to get information about text properties into this layer.
>
> You are looking at this from a wrong perspective.  The bidi reordering
> engine doesn't need to access text properties or overlays; rather, the
> display code should tell the reordering engine what to reorder.  The
> reordering code already honors point-min and point-max, so all it
> takes to do what you want is narrow the buffer to the portion of text
> we want to reorder.  These portions could be marked by an overlay; the
> display code already examines overlays as it goes about its job.

I think this would work for simple cases, but for more complex cases=20
(e.g., several hierarchical levels of embeddings), it's impossible to=20
set three different levels of point-min and point-max.


>> Another idea would be to use display strings including the LRE and PDF
>> characters to replace existing backslashes and braces.

This is similar to what we are doing, although we leave the syntactic=20
characters (backslashes and braces for LaTeX) displayed as is, and=20
insert display strings with Bidi control characters before and after.

>> However, display
>> strings do not affect the bidi algorithm at this point.
>
> I need a few rainy days to implement support for display strings.

Let's hope for some rain in your area :-).

> However, it would be a mistake to base large portions of buffer
> display on display strings, because they make redisplay too expensive.

What are 'large portions of buffer'? Our current implementation=20
restricts its work to the portion of the buffer that is currently=20
actually displayed. This means that if you have a 1MB file and a 100x100=20
character display, only 1% of the buffer actually has overlays (but it=20
may have quite a few).

Regards,    Martin.


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