Re: Alignment of paragraphs with unicode-bidi: plaintext [css3-text] [css3-writing-modes]

On 02/20/2012 04:58 AM, Aharon (Vladimir) Lanin wrote:
<http://lists.w3.org/Archives/Public/public-i18n-bidi/2012JanMar/0040.html>
> The following is too long, but please do read. [...]

Thank you for your lengthy and insightful comments! I may be slow in
responding, but I greatly appreciate your clear thinking and clear
explanations.

> In a nutshell, the current definition of unicode-bidi:plaintext in
>   http://dev.w3.org/csswg/css3-writing-modes/#unicode-bidi
> is unclear about how unicode-bidi:plaintext is supposed to behave
> when it is in effect on an inline element. Please note that originally,
> e.g. in
>   http://www.w3.org/TR/2011/WD-css3-writing-modes-20110428/,
> the definition said that "this value has no effect on inline elements".
> And later, in
>   http://www.w3.org/TR/2011/WD-css3-writing-modes-20110531/,
> it said that "for inline elements, this value is equivalent to ‘isolate’".
> This put them in a separate bidi paragraph, but did *not* determine
> this paragraph's base directionality. The current definition, however,
> says the following:
>
>  # For the purposes of the Unicode bidirectional algorithm, the base
>  # directionality of each bidi paragraph for which the element forms
>  # the containing block is determined not by the element's computed
>  # ‘direction’ as usual, but by following the heuristic in rules P2
>  # and P3 of the Unicode bidirectional algorithm. For inline elements,
>  # this value behaves as for ‘isolate’, except, as with block containers,
>  # **the base directionality is determined by following the Unicode
>  # heuristic instead of by using the ‘direction’ value.
>
> This gives no clue to the following question: for which paragraphs,
> exactly, does a unicode-bidi:plaintext element that is not a containing
> block for anything determine the base directionality?
>
> Given that the definition says that such elements are to behave as for
> unicode-bidi:isolate, we do at least know that paragraphs never straddle
> the boundary of a unicode-bidi:plaintext element. So, should the unicode
>-bidi:plaintext on an element set the base directionality of *all*
> paragraphs contained by the element? Should it apply to:
>
> - Both paragraphs in
>     <span "style=unicode-bidi:plaintext">Line 1.<br/>שורה 2.</span>?
> - All three paragraphs in
>     <span "style=unicode-bidi: plaintext">Line 1.
>       <span style="display:block">שורה 2.</span>שורה 3.</span>?
> - Both paragraphs in
>     <span "style=unicode-bidi: plaintext">He said
>       '<span style="unicode-bidi:isolate">שלום!</span>'.</span>?

My answers would be,
   - yes
   - for lines 1 and 3 only
   - for the outer paragraph only

> [...]
>
> If so, however, the unicode-bidi:plaintext heuristic also should not apply
> to the paragraph in the inside span in [the second example].
>
> That is, "שורה 2!" should be displayed LTR by inheritance from the div,
> not RTL by the unicode-bidi:plaintext on the outside span, even though
> the outside span contains it.
>
> To reflect this, I propose that the definition of unicode-bidi:plaintext
> be modified as follows:
>
>  | plaintext
>  |   This value behaves as for ‘isolate’, except that for the purposes of
>  |   the Unicode bidirectional algorithm, the base directionality of each
>  |   bidi paragraph /immediately contained/ by the element is determined
>  |   not by the element's computed ‘direction’ as usual, but by following
>  |   the heuristic in rules P2 and P3 of the Unicode bidirectional algorithm.
>  |   /A paragraph is immediately contained by an element if it is contained
>  |   by it, but is not contained by a descendant element that puts its
>  |   content into a separate bidi paragraph (or paragraphs)/, e.g. an element
>  |   with display:block, position:absolute, unicode-bidi:isolate,
>  |   unicode-bidi:plaintext, and so on.
>
> Please note that this gets rid of the reliance on containing blocks,
> replacing it instead with the notion of the "immediately containing"
> element for a given bidi paragraph. It then makes no difference whether
> the element is inline or a block. [Note about this better matching
> Firefox and Webkits behavior wrt embedded blocks.]

I've tweaked the definition of "immediately contained" a bit to try to
make it clearer, but otherwise accepted your edits:

   # This value behaves as ''isolate'' except that for the purposes of
   # the Unicode bidirectional algorithm, the base directionality of each
   # bidi paragraph immediately contained by the element is determined not
   # by the element's computed 'direction' as usual, but by following the
   # heuristic in rules P2 and P3 of the Unicode bidirectional algorithm.
   # An element immediately contains a bidi paragraph if it is a block
   # container or bidi-isolating inline and no other such elements intervene
   # between it and the bidi paragraph.

Alternatively, the last three lines could be
   # A bidi paragraph is immediately contained by an element if the element
   # is a block container or bidi-isolating inline and no other such elements
   # intervene between it and the bidi paragraph.

> Now, let's go on to alignment. [...] There are a couple of issues here.
>
> - What exactly does "In the case of ‘unicode-bidi: plaintext’" mean? I
> think it means the case where the element whose text-align (or text-align-last)
> we are trying to apply also has unicode-bidi:plaintext.

Yes, that is indeed what's meant.

> - The definition assumes that a "paragraph" can contain several line boxes,
> but not the other way around. This is not true. Take, for example, [...]
>
> I propose that just as an element's unicode-bidi:plaintext only affects the
> directionality of paragraphs that the element immediately contains, so too
> it is *only these* paragraphs' directionality that should affect the alignment
> of the line boxes in the element when the element is a containing block.

Agreed.

> That is, let's note that if two distinct paragraphs are immediately contained
> by the same element, they can not share a line box. (If they did, they would
> have to be a single paragraph.) Thus, each line box in a containing block
> belongs to exactly one of the block's immediately contained paragraphs.
>
> Now, the amended definition for alignment:
>
>  | The start and end edges of a line box are relative to a direction
>  | determined as follows. If a line box's containing block has
>  | unicode-bidi:plaintext, use the base directionality of the containing
>  | block's immediately contained paragraph to which the line box belongs.
>  | Otherwise, use the containing block's computed direction.

So, how about this:

   | The start and end edges of a line box are determined by the inline base
   | direction of the "bidi paragraph" to which it belongs. In most cases,
   | this means using the containing block's computed 'direction'. However if
   | containing block has ''unicode-bidi: plaintext'' [[!CSS3-WRITING-MODES]],
   | the inline base direction of its line boxes will be determined by the bidi
   | paragraphs it contains.

(I want to put the most common case up first, which I think helps make the
paragraph understandable.)

> Please note that this means that unicode-bidi:plaintext does not affect
> alignment except when applied to an element that is a containing block.

Good, I think this should be the intent. :)

> [lots of examples]
> And finally, let's take an example like the one in the current spec.
> As you will see, my expectations differ from those currently stated
> in the spec:

Fixed the incorrect example. I should probably add some more of yours, too. :)

~fantasai

Received on Tuesday, 27 March 2012 01:28:52 UTC