Simon Pepping wrote:

> Nested inline and other LMs: The output contains errors, see the
> comments in the text. The errors occur when hyphenation is set to
> true.

Fixed: there were errors in the method addALetterSpaceTo of LeafNodeLM and
InlineStackingLM.

I also found a bug in the LeafNodeLM.addAreas method, affecting HEAD too:
the area is added to the area tree (with parentLM.addChild(curArea))
*before* widthAdjustArea is called, so its width is not correctly added to
the inline parent width and the output sometimes shows overlapped text
(when there is another child of inline parent after the leader area).

> Justification: This is a test fo you submitted earlier. According to
> the text in the file the second block should be hyphenated; it is
> not. Should it still be hyphenated, or can this not be enforced with
> the Knuth algorithm and text-align="start"?

I cannot find a hyphenate property in the fo file you attached, so I'm not
sure whether I understand what you mean.
Anyway, hyphenate = "true" means, according to the recommendation (7.9.4),
that "hyphenation may be used in the line-breaking algorithm", not that it
*must* be used.
As hyphenation is time-expansive and bad-looking, I think it should be
used only if necessary.

> No breakpoints: An exception is thrown, at
> LineLayoutManager.getNextBreakPoss(LineLayoutManager.java:495). It
> occurs because breakpoints has size 0; the third call to
> findBreakingPoints also returned 0. This should not be possible; the
> algorithm should always return a breakpoint.

Right, I completely forgot to provide a fallback in case the algorithm
doesn't find a good set of breaking points.
I added a boolean argument called "force" to findBreakingPoints: if it is
true, and after the main loop there are no active nodes, the last
deactivated node is used to create LineBreakPositions.
There will zero or more "good" lines followed by a single line including
all the remaining content (this line will obviously get off the right
margin).

The method findBreakingPoints will be called no more than three times:
I) no hyphenation, adjustment ratios must be <= 1
II) hyphenation (if allowed), or ratios up to 5
III) ratios up to 20, and if necessary force the creation of LineBreakPositions

> A few small remarks:
>
> Can you move the following log messages to trace log level:
> [DEBUG] AbstractLayoutManager - - Word to hyphenate: We

Done

> In TextLM, returning null for a forced LF is not an idea that I like,
> because it overloads the null return value. Cannot you return an
> special Knuth element for LF? Alternatively, you could return null and
> process the paragraph. The second paragraph would then be produced and
> processed later.

A preserved linefeed can be represented by a penalty item whose value is
-infinite: +inf means that there can't be a break here, -inf means that
there must be a break (as there can't be a better breakpoint).

Preserved linefeeds inside inlines are much more problematical than I
first thought, but they should work now: I had to add a List argument to
the applyChanges() and getChangedKnuthElements() methods, to tell an ISLM
which children it has to consider.

> InlineStackingLM.getNextKnuthElements: 'if (lc.startsNewArea())' no
> longer used?

I tried to preserve the existing code as much as possible, so I didn't
touch that if statement.
Maybe I removed some lines in the LineLM so that lc.startsNewArea is never
true?

Regards,
    Luca


Reply via email to