Discussion follows below.

> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]On Behalf Of
> Karen Lease
> Sent: April 29, 2002 5:39 PM
> To: [EMAIL PROTECTED]
> Subject: [REDESIGN] Line layout manager discussion
>
> Keiron Liddle wrote:
> > So why flatten the inline layout managers?
> > If we have an example like this:
> >
> > <block>Some text <basic-link>a paragraph of text<block>with a
> > block</block>and more text</basic-link> and <inline
> background="blue">blue
> > background<inline color="green"> green text <block>a block</block> more
> > green</inline></inline></block>
> >
> > The basic link produces/returns both inline areas and a block
> area, so it
> > is not possible to say that the basic-link element or its layout manager
> > would produce inline areas. So how should this be handled. If it is
> > flattened things are easier. The layout manager can then keep range
> > information like: starts link, ends link.

I think this FO snippet is sufficiently complex as to be a good
Gedankenexperiment. I prepared a PNG which illustrates the area tree as _I_
interpret the spec applying to this FO.

You'll have to view the image in colour. I have taken liberties with WS,
border colours, spaces, padding etc etc. I threw in one page break to make
things interesting. Also, I have shown runs of texts as combined inlines,
where we know in fact that they are really containers for a bunch of glyph
areas.

Here's some of the main principles I am keeping in mind:

1. An area must have its child areas all of the same type (inline or block);
2. No area may have more than one normal block area returned by the same
fo:block;
3. No area may have more than one normal inline area returned by the same
inline (fo:inline, fo:basic-link);
4. A block generates normal block areas. If a child FO returns a block area
this becomes a direct child of one of those block areas. If a child returns
a sequence of inline areas, these become children of line areas which are in
turn children of a normal block area;
5. An inline generates normal inline areas. Each such may contain a sequence
of inline areas or a single block area.

Absolutely nobody else is going to agree 100% with my interpretation, but I
think if we can hash this out it will allow us to really move forward with
confidence.

a) There are no block-level children of the top block, only inlines, so we
know that the one or more block areas generated by the top-level block are
going to contain line areas. Because of the page break there are 2 normal
block areas generated by the top-level block;

b) "some text" is simple - the inline goes neatly into the first line area
as its first child;

c) Now we hit the basic link. This generates one or more normal inlines,
which are outlined in orange. The "a paragraph of text" is the first inline
child of the first normal inline area generated by the basic-link;

d) we hit the nested block. OK, this is where the anguish starts. :-) It
produces at least one normal block area, by definition. I have given this a
pale green background. This _cannot_ occupy the first normal inline area
generated by the basic-link, because that already contains an inline area
(rule 1). So it must be in a second normal inline area generated by the
basic-link. By rule 3, the first line area may not contain 2 areas generated
by the same inline, so that's why we terminate line aea 1 and start another;

e) In the second line area (outlined in dark blue), we have the second
normal inline area generated by the basic-link, outlined in orange. This
contains a single block area generated by the nested block (rule 5). In
order for the block area to handle the contained text ("with a block") it
must itself have a line area with inline children (one or more - I've shown
one);

f) we encounter "and more text". The same argument applies as in 'd' - the
second inline area generated by the basic link cannot accept the inline area
this text results in because it already contains a block area. So, a third
inline area gets generated by the basic link, and by rule 3, this results
yet again in another line area;

g) the third line area, now graced by the presence of the last normal inline
generated by the basic-link (and its children), is able to handle more line
areas, and so "and" and ""blue background" and "green text" certainly are
allowed. I chose to insert a line break after the "green". I hope the
colours help distinguish what is what - the inline child of the top-level
block ends up creating 4 normal inline area which have blue backgrounds;

h) the doubly-nested inline produces inline areas that in fact have a
transparent background and so everything should be blue, but I thought this
would lack clarity. The normal inline areas produced by the doubly-nested
inline have a thicker brown border. The same argument applies to the block
which is nested in _this_ inline; the combination of rules 1 and 3 require
different line areas. Again, the normal block area generated by the
doubly-nested block has a pale green background;

_If_ there were blocks nested inside the top-level block these would produce
normal block areas that are single children of normal block areas produced
by the top-level block. My reading of Line-Building is that normal block
areas generated by a fo:block have either _single_ block areas _or_ one or
more line areas as children, not a mixture.

Final comment: it is the close intermingling of inlines and blocks in this
example that causes so much line breaking. Clearly each of the 2 nested
blocks could be wrapped in inlines (fo:inline or whatever), and as a result
everything in the example, in theory, could be in _one_ line area.

Anyhow, please critique away. :-)

Regards,
Arved

Attachment: complex_block.png
Description: PNG image

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to