public void AddBreak(FormatContext format, IToken token, int count = 1) { if (!(token is Tab)) { _writer.WriteRaw("\r\n"); } }
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); } }
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); }
public void AddText(FormatContext format, string text) { if (format.OfType <HtmlTag>().Any()) { _writer.WriteRaw(text); } else { _writer.WriteValue(text); } }
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); }
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; } } }
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); }
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(); } }
public void AddPicture(FormatContext format, Picture picture) { throw new NotSupportedException(); }
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)); }
public void EnsureCell(FormatContext format) { _state = WriteState.Other; EnsureParagraph(format); }
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(); }