private bool Append(BookTokenIterator bookTokens, string lastText, int stopTokenID, string stopText, ref bool firstText)
        {
            TokenBase token = bookTokens.Current;

            var pageBreakToken = token as NewPageToken;

            if (pageBreakToken != null)
            {
                AppendToLine(pageBreakToken);
            }

            var imageToken = token as PictureToken;

            if (imageToken != null)
            {
                AppendToLine(imageToken);
            }

            var openTagToken = token as TagOpenToken;

            if (openTagToken != null)
            {
                AppendToLine(openTagToken);
            }

            var closeTagToken = token as TagCloseToken;

            if (closeTagToken != null)
            {
                AppendToLine(closeTagToken);
            }

            var textSeparatorToken = token as WhitespaceToken;

            if (textSeparatorToken != null)
            {
                AppendSeparator();
            }

            var textToken = token as TextToken;

            if (textToken != null && AppendTextToken(textToken, lastText, stopTokenID, stopText, ref firstText) ||
                stopTokenID >= 0 && token.ID >= stopTokenID)
            {
                return(false);
            }

            return(true);
        }
 public BookBuilder(
     BookTokenIterator bookTokens,
     IEnumerable <BookImage> images,
     IList <double> headerSizes,
     IFontHelper helper,
     Size pageSize,
     double textSize,
     bool hyphenation,
     bool useCssFontSize)
 {
     _bookTokens     = bookTokens;
     _images         = images;
     _headerSizes    = headerSizes;
     _helper         = helper;
     _pageSize       = pageSize;
     _textSize       = textSize;
     _hyphenation    = hyphenation;
     _useCssFontSize = useCssFontSize;
 }
        public IEnumerable <TokenBlockBase> GetLines(BookTokenIterator bookTokens, string lastText, int firstTokenID,
                                                     int stopTokenID = -1, string stopText = null)
        {
            _firstTokenID = firstTokenID;

            _tree        = bookTokens.BuildTree(_firstTokenID);
            _lastOpenTag = _tree.Peek();
            _fontSize    = GetCurrentFontSize();
            _separator   = false;
            bool firstText = true;

            _marginLeft = _marginRight = 0.0;

            foreach (TagOpenToken openTagToken in _tree.Reverse())
            {
                EnterMargin(openTagToken.TextProperties);
            }

            if (string.IsNullOrEmpty(stopText) && stopTokenID > 0)
            {
                --stopTokenID;
            }

            while (bookTokens.MoveNext())
            {
                foreach (TokenBlockBase baseTokenLine in OutputLines(false))
                {
                    yield return(baseTokenLine);
                }

                if (!Append(bookTokens, lastText, stopTokenID, stopText, ref firstText))
                {
                    break;
                }
            }
            foreach (TokenBlockBase baseTokenLine in OutputLines(true))
            {
                yield return(baseTokenLine);
            }
        }