Esempio n. 1
0
 public void AddBreak(FormatContext format, IToken token, int count = 1)
 {
     if (!(token is Tab))
     {
         _writer.WriteRaw("\r\n");
     }
 }
Esempio n. 2
0
        public void AddPicture(FormatContext format, Picture picture)
        {
            _startOfLine = false;
            EnsureParagraph(format);
            var uri = _settings?.ImageUriGetter(picture);

            if (!string.IsNullOrEmpty(uri))
            {
                _writer.WriteStartElement("img");

                if (picture.WidthGoal.HasValue)
                {
                    _writer.WriteAttributeString("width", picture.WidthGoal.ToPx().ToString("0"));
                }
                else if (picture.Width.HasValue)
                {
                    _writer.WriteAttributeString("width", picture.Width.ToPx().ToString("0"));
                }

                if (picture.HeightGoal.HasValue)
                {
                    _writer.WriteAttributeString("height", picture.HeightGoal.ToPx().ToString("0"));
                }
                else if (picture.Height.HasValue)
                {
                    _writer.WriteAttributeString("height", picture.Height.ToPx().ToString("0"));
                }

                _writer.WriteAttributeString("src", uri);
                _writer.WriteEndElement();
                _tags.Peek().ChildCount++;
                _lastTokenType = typeof(Picture);
            }
        }
Esempio n. 3
0
 private static FormatContext FixStyles(Document doc, FormatContext style)
 {
     style.ReplaceToken <ListStyleId>(styleId =>
     {
         var list = new List <IToken>();
         if (doc.ListStyles.TryGetValue(styleId.Value, out var listStyle))
         {
             var levelNum = style.RemoveFirstOfType <ListLevelNumber>() ?? new ListLevelNumber(0);
             var level    = levelNum.Value;
             list.AddRange(listStyle.Style.Levels[level]
                           .Where(t =>
             {
                 // This is a bit of a hack, but not sure how MS Word is interpreting this
                 if (t is FirstLineIndent firstLine)
                 {
                     return(firstLine.Value > new UnitValue(-1, UnitType.Inch));
                 }
                 return(t.Type == TokenType.ParagraphFormat);
             }));
             list.Add(styleId);
             list.Add(levelNum);
         }
         return(list);
     });
     return(style);
 }
Esempio n. 4
0
 public void AddText(FormatContext format, string text)
 {
     if (format.OfType <HtmlTag>().Any())
     {
         _writer.WriteRaw(text);
     }
     else
     {
         _writer.WriteValue(text);
     }
 }
Esempio n. 5
0
        public void AddText(FormatContext format, string text)
        {
            if (format.OfType <HiddenToken>().Any())
            {
                return;
            }
            _startOfLine = false;
            EnsureSpans(format);

            _tags.Peek().ChildCount++;
            _writer.WriteValue(AddNonBreaking(text));
            _lastTokenType = typeof(TextToken);
        }
Esempio n. 6
0
 private void AddBreak(Document doc, IToken token, FormatContext currStyle)
 {
     if (token is PageBreak || token is SectionBreak)
     {
         RenderFootnotes(doc);
     }
     _html.AddBreak(FixStyles(doc, currStyle), token);
     if (token is RowBreak)
     {
         foreach (var style in _inputStyle)
         {
             style.InTable = false;
         }
     }
 }
Esempio n. 7
0
        private void EnsureSection(FormatContext format)
        {
            if (_tags.Any(t => t.Name == "div"))
            {
                return;
            }

            var tag = new TagContext("div", _tags.PeekOrDefault());

            tag.AddRange(format.Where(t => t.Type == TokenType.SectionFormat || t is PageBreak));
            if (DefaultFont != null)
            {
                tag.Add(DefaultFont);
            }
            WriteTag(tag);
        }
Esempio n. 8
0
        private void RenderFootnotes(Document doc)
        {
            if (_footnotes.Count > 0)
            {
                var style = new FormatContext();
                _html.AddBreak(style, new FootnoteBreak());
                var start = _footnoteIdx - _footnotes.Count + 1;
                for (var i = 0; i < _footnotes.Count; i++)
                {
                    if (i > 0)
                    {
                        _html.AddBreak(style, new ParagraphBreak());
                    }
                    var group = new Group();
                    var id    = FootnoteId(start + i);
                    group.Contents.Add(new BookmarkToken()
                    {
                        Id = id, Start = true
                    });
                    group.Contents.Add(new SuperStartToken());
                    group.Contents.Add(new TextToken()
                    {
                        Value = (start + i) + " "
                    });
                    group.Contents.Add(new NoSuperSubToken());
                    group.Contents.Add(new BookmarkToken()
                    {
                        Id = id, Start = false
                    });
                    group.Contents.AddRange(_footnotes[i].Contents.Where(t => !(t is Footnote)));
                    ToHtmlGroup(doc, group, true);
                }

                _footnotes.Clear();
            }
        }
Esempio n. 9
0
 public void AddPicture(FormatContext format, Picture picture)
 {
     throw new NotSupportedException();
 }
Esempio n. 10
0
        private void EnsureParagraph(FormatContext format)
        {
            var firstParaSection = _tags
                                   .SkipWhile(t => t.Type == TagType.Span)
                                   .FirstOrDefault();

            var currLevel = _tags.Count(t => t.Name == "td");
            var reqLevel  = format.OfType <NestingLevel>().FirstOrDefault()?.Value ?? (format.InTable ? 1 : 0);

            if (firstParaSection?.Type == TagType.Paragraph && _state == WriteState.Other && currLevel == reqLevel)
            {
                return;
            }

            EnsureSection(format);

            if (format.InTable)
            {
                var tableLevel = _tags.Count(t => t.Name == "table");
                while (currLevel < reqLevel)
                {
                    while (!(_tags.Peek().Name == "div" || _tags.Peek().Name == "table" || _tags.Peek().Name == "tr" ||
                             _tags.Peek().Name == "tbody" || _tags.Peek().Name == "thead" || _tags.Peek().Name == "td"))
                    {
                        EndTag();
                    }

                    var tag = default(TagContext);
                    if (tableLevel < reqLevel)
                    {
                        if (_tags.Peek().Name == "table" || _tags.Peek().Name == "tbody" || _tags.Peek().Name == "thead")
                        {
                            WriteTag(new TagContext("tr", _tags.PeekOrDefault()));
                        }

                        if (_tags.Peek().Name == "tr")
                        {
                            WriteTag(new TagContext("td", _tags.PeekOrDefault()));
                            currLevel++;
                        }
                    }

                    if (!(_tags.Peek().Name == "table" || _tags.Peek().Name == "tr" || _tags.Peek().Name == "tbody" || _tags.Peek().Name == "thead"))
                    {
                        tag = new TagContext("table", _tags.PeekOrDefault());
                        tag.AddRange(format.Where(t => t is CellSpacing || t is RowLeft));
                        WriteTag(tag);
                        tableLevel++;
                        var boundaries = format.OfType <ColumnBoundaries>().FirstOrDefault();
                        if (boundaries != null)
                        {
                            _writer.WriteStartElement("colgroup");
                            var rightBorders = boundaries
                                               .GroupBy(v => v.Value)
                                               .OrderBy(g => g.Key)
                                               .Select(g => UnitValue.Average(g.Select(k => k.Key)))
                                               .ToList();
                            var widths = new UnitValue[rightBorders.Count];
                            for (var i = 0; i < rightBorders.Count; i++)
                            {
                                widths[i] = i == 0
                  ? rightBorders[i]
                  : rightBorders[i] - rightBorders[i - 1];
                            }

                            var cells     = format.OfType <CellToken>().ToList();
                            var everyCell = cells.Count == widths.Length || cells.Count == (widths.Length * 2);
                            for (var i = 0; i < widths.Length; i++)
                            {
                                if (everyCell && cells[i].WidthUnit == CellWidthUnit.Twip)
                                {
                                    widths[i] = new UnitValue(cells[i].Width, UnitType.Twip);
                                }

                                _writer.WriteStartElement("col");
                                _writer.WriteAttributeString("style", "width:" + TagContext.PxString(widths[i]));
                                _writer.WriteEndElement();
                            }

                            _writer.WriteEndElement();
                        }
                    }

                    if (format.OfType <HeaderRow>().Any())
                    {
                        if (_tags.Peek().Name == "tbody")
                        {
                            EndTag();
                        }

                        if (_tags.Peek().Name == "table")
                        {
                            WriteTag(new TagContext("thead", _tags.PeekOrDefault()));
                        }
                    }
                    else if (_tags.Peek().Name == "thead")
                    {
                        EndTag();
                        WriteTag(new TagContext("tbody", _tags.PeekOrDefault()));
                    }

                    if (_tags.Peek().Name == "table" || _tags.Peek().Name == "tbody" || _tags.Peek().Name == "thead")
                    {
                        WriteTag(new TagContext("tr", _tags.PeekOrDefault()));
                    }

                    var cellTag = ParagraphTag("td", format);
                    WriteTag(cellTag);
                    var cellToken = cellTag.CellToken();
                    if (cellToken?.ColSpan > 1)
                    {
                        _writer.WriteAttributeString("colspan", cellToken.ColSpan.ToString());
                    }
                    _state = WriteState.Other;

                    currLevel++;
                }

                while (reqLevel < tableLevel)
                {
                    while (_tags.Peek().Name != "table")
                    {
                        EndTag();
                    }
                    EndTag();
                    tableLevel--;
                }
            }

            if (format.Any(IsListMarker))
            {
                var listLevel = new KeyValuePair <int, int>(
                    format.OfType <ListStyleId>().FirstOrDefault()?.Value ?? 1
                    , format.OfType <ListLevelNumber>().FirstOrDefault()?.Value ?? 0);

                if (listLevel.Key == _lastListLevel.Key)
                {
                    while (!(_tags.Peek().Name == "div" || _tags.Peek().Name == "ul" || _tags.Peek().Name == "ol" || _tags.Peek().Name == "li" || _tags.Peek().Name == "td"))
                    {
                        EndTag();
                    }

                    for (var i = 0; i < _lastListLevel.Value - listLevel.Value; i++)
                    {
                        if (_tags.Peek().Name == "li")
                        {
                            EndTag();
                        }
                        if (_tags.Peek().Name == "ol" || _tags.Peek().Name == "ul")
                        {
                            EndTag();
                        }
                    }

                    if (_lastListLevel.Value >= listLevel.Value && _tags.Peek().Name == "li" && _state == WriteState.NeedListEnd)
                    {
                        EndTag();
                    }

                    if (_lastListLevel.Value > listLevel.Value)
                    {
                        foreach (var keyToRemove in _listPositions.Keys
                                 .Where(k => k.Key == listLevel.Key && k.Value > listLevel.Value)
                                 .ToList())
                        {
                            _listPositions.Remove(keyToRemove);
                        }
                    }
                }
                else
                {
                    while (!(_tags.Peek().Name == "div" || _tags.Peek().Name == "td"))
                    {
                        EndTag();
                    }
                }
                _lastListLevel = listLevel;

                if (!_listPositions.TryGetValue(listLevel, out var startAt))
                {
                    startAt = format.OfType <NumberingStart>().FirstOrDefault()?.Value - 1 ?? 0;
                }
                _listPositions[listLevel] = ++startAt;

                if (!(_tags.Peek().Name == "ol" || _tags.Peek().Name == "ul"))
                {
                    var numType = format.OfType <ListLevelType>().FirstOrDefault()?.Value
                                  ?? (format.OfType <NumberLevelBullet>().Any() ? (NumberingType?)NumberingType.Bullet : null)
                                  ?? format.OfType <NumberingTypeToken>().FirstOrDefault()?.Value
                                  ?? NumberingType.Bullet;

                    var tag = new TagContext(numType == NumberingType.Bullet ? "ul" : "ol", _tags.PeekOrDefault());
                    tag.AddRange(format.Where(t => !IsSpanElement(t) && !(t is CapitalToken) &&
                                              (t.Type == TokenType.ParagraphFormat ||
                                               t.Type == TokenType.CharacterFormat)));
                    WriteTag(tag);

                    switch (numType)
                    {
                    case NumberingType.LowerLetter:
                        _writer.WriteAttributeString("type", "a");
                        break;

                    case NumberingType.LowerRoman:
                        _writer.WriteAttributeString("type", "i");
                        break;

                    case NumberingType.UpperLetter:
                        _writer.WriteAttributeString("type", "A");
                        break;

                    case NumberingType.UpperRoman:
                        _writer.WriteAttributeString("type", "I");
                        break;
                    }

                    if (startAt > 1 && numType != NumberingType.Bullet)
                    {
                        _writer.WriteAttributeString("start", startAt.ToString());
                    }
                }

                WriteTag(ParagraphTag("li", format));
            }
            else if (format.TryGetValue <OutlineLevel>(out var outline) && outline.Value >= 0 && outline.Value < 6)
            {
                _lastListLevel = default;
                var tagName = "h" + (outline.Value + 1);
                while (!(_tags.Peek().Name == "div" || _tags.Peek().Name == tagName || _tags.Peek().Name == "td"))
                {
                    EndTag();
                }

                WriteTag(ParagraphTag(tagName, format));
            }
Esempio n. 11
0
 public void EnsureCell(FormatContext format)
 {
     _state = WriteState.Other;
     EnsureParagraph(format);
 }
Esempio n. 12
0
        public void AddBreak(FormatContext format, IToken token, int count = 1)
        {
            if (token is ParagraphBreak)
            {
                EnsureParagraph(format);
                while (_tags.Peek().Type != TagType.Paragraph)
                {
                    EndTag();
                }

                if (_tags.Peek().Name == "td")
                {
                    _state = WriteState.NeedParagraphStart;
                    if (_lastTokenType == typeof(LineBreak))
                    {
                        _writer.WriteValue("\u00a0");
                    }
                }
                else if (_tags.Peek().Name == "li")
                {
                    _state = WriteState.NeedListEnd;
                }
                else
                {
                    EndTag();
                }
                _startOfLine = true;
            }
            else if (token is SectionBreak || token is PageBreak)
            {
                EnsureSection(format);
                while (_tags.Count > 1)
                {
                    EndTag();
                }
                EndTag();
                _startOfLine = true;
                if (token is PageBreak)
                {
                    format.Add(token);
                    EnsureSection(format);
                }
                _state = WriteState.Other;
            }
            else if (token is FootnoteBreak)
            {
                EnsureSection(format);
                while (_tags.Count > 1)
                {
                    EndTag();
                }
                _writer.WriteStartElement("hr");
                _writer.WriteAttributeString("style", "width:2in;border:0.5px solid black;margin-left:0");
                _writer.WriteEndElement();
                _startOfLine = true;
                _state       = WriteState.Other;
            }
            else if (token is CellBreak || token is NestCell)
            {
                if (_state == WriteState.NeedListEnd)
                {
                    while (_tags.Peek().Name != "td")
                    {
                        EndTag();
                    }
                    WriteTag(ParagraphTag("p", format));
                }
                else
                {
                    EnsureParagraph(format);
                }

                while (_tags.Peek().Name != "td")
                {
                    EndTag();
                }
                EndTag();
                _startOfLine = true;
                _state       = WriteState.Other;
            }
            else if (token is RowBreak || token is NestRow)
            {
                while (_tags.Peek().Name != "tr")
                {
                    EndTag();
                }
                EndTag();
                _startOfLine = true;
                _state       = WriteState.Other;
            }
            else if (token is LineBreak)
            {
                EnsureSection(format);
                _writer.WriteStartElement("br");
                _writer.WriteEndElement();
                _tags.Peek().ChildCount++;
                _startOfLine = true;
            }
            else if (token is Tab)
            {
                if (_startOfLine)
                {
                    if (_tags.PeekOrDefault()?.Type == TagType.Section)
                    {
                        var start = default(UnitValue);
                        if (format.TryGetValue <FirstLineIndent>(out var firstIndent))
                        {
                            start = firstIndent.Value;
                        }
                        var tab = format.GetTab(count, DefaultTabWidth, start);
                        format.Add(new FirstLineIndent(tab.Position));
                    }
                    else
                    {
                        var tab = format.GetTab(count, DefaultTabWidth);
                        _writer.WriteStartElement("span");
                        _writer.WriteAttributeString("style", $"display:inline-block;width:{tab.Position.ToPx():0.#}px");
                        _writer.WriteEndElement();
                    }
                }
                else
                {
                    var width = DefaultTabWidth * count;
                    _writer.WriteStartElement("span");
                    _writer.WriteAttributeString("style", $"display:inline-block;width:{width.ToPx():0.#}px");
                    _writer.WriteEndElement();
                }
                _startOfLine = false;
            }
            else if (token is ObjectAttachment)
            {
                EnsureParagraph(format);
                _settings.AttachmentRenderer(_attachIndex, _writer);
                _attachIndex++;
            }
            _lastTokenType = token.GetType();
        }