private void WriteStartElementEnd() { if (_nodes.Count > 0 && _state == InternalState.Element) { var start = _nodes.Peek(); string buffer; switch (start.Value) { case "a": buffer = null; StartInline(); if (start.Attributes.Count > 0 && (!start.TryGetValue("href", out buffer) || string.IsNullOrEmpty(buffer))) { _writer.Write("<a "); foreach (var attr in start) { _writer.Write(attr.Key); if (!string.IsNullOrEmpty(attr.Value)) { _writer.Write('='); _writer.Write('"'); WriteEscaped(attr.Value); _writer.Write('"'); } } _writer.Write('>'); _preserveWhitespace = PreserveState.HtmlEncoding; } else if (!string.IsNullOrEmpty(buffer)) { _writer.Write('['); } break; case "img": StartInline(); _writer.Write('!'); _writer.Write('['); _writer.Write(start["alt"]); _writer.Write(']'); _writer.Write('('); _writer.Write(start["src"]); if (start.TryGetValue("title", out buffer)) { _writer.Write(' '); _writer.Write('"'); _writer.Write(buffer); _writer.Write('"'); } _writer.Write(')'); _minify = MinifyState.Compressed; break; default: if (_settings.ShouldSkipElement(start)) { _ignoreDepth = _nodes.Count; } break; } _state = InternalState.Content; } }
private void WriteStartElementEnd(string nextTag = null) { if (_nodes.Count > 0 && _state == InternalState.Element) { var start = _nodes.Peek(); string buffer; switch (start.Value) { case "a": buffer = null; StartInline(); if (start.Attributes.Count > 0 && (!start.TryGetValue("href", out buffer) || string.IsNullOrEmpty(buffer))) { _writer.Write("<a "); foreach (var attr in start) { _writer.Write(attr.Key); if (!string.IsNullOrEmpty(attr.Value)) { _writer.Write('='); _writer.Write('"'); WriteEscaped(attr.Value); _writer.Write('"'); } } _writer.Write('>'); _preserveWhitespace = PreserveState.HtmlEncoding; } else if (!string.IsNullOrEmpty(buffer)) { _writer.Write('['); _writer.Write('"'); WriteAttributes(start, _writer); } break; case "blockquote": StartBlock("bq", start); if (start.TryGetValue("cite", out buffer)) { _writer.Write(':'); _writer.Write(buffer); } break; case "b": StartInline(); if (_boldDepth > _nodes.Count) { _boldDepth = _nodes.Count; _writer.Write('*'); _writer.Write('*'); WriteAttributes(start, _writer); } break; case "strong": StartInline(); if (_boldDepth > _nodes.Count) { _boldDepth = _nodes.Count; _writer.Write('*'); WriteAttributes(start, _writer); } break; case "br": _minify = MinifyState.LastCharWasSpace; switch (_preserveWhitespace) { case PreserveState.BeforeContent: _preserveWhitespace = PreserveState.Preserve; break; case PreserveState.InternalLineFeed: _writer.Write(_settings.NewLineChars); WritePrefix(); _preserveWhitespace = PreserveState.InternalLineFeed; break; case PreserveState.None: _writer.Write(_settings.NewLineChars); WritePrefix(); break; default: _preserveWhitespace = PreserveState.InternalLineFeed; break; } break; case "cite": StartInline(); _writer.Write('?'); _writer.Write('?'); WriteAttributes(start, _writer); break; case "code": if (_preserveWhitespace == PreserveState.None) { StartInline(); _writer.Write('@'); WriteAttributes(start, _writer); } break; case "del": StartInline(); _writer.Write('['); _writer.Write('-'); break; case "div": StartBlock("div", start); break; case "em": StartInline(); if (_italicDepth > _nodes.Count) { _italicDepth = _nodes.Count; _writer.Write('_'); WriteAttributes(start, _writer); } break; case "i": StartInline(); if (_italicDepth > _nodes.Count) { _italicDepth = _nodes.Count; _writer.Write('_'); _writer.Write('_'); WriteAttributes(start, _writer); } break; case "h1": StartBlock("h1", start); break; case "h2": StartBlock("h2", start); break; case "h3": StartBlock("h3", start); break; case "h4": StartBlock("h4", start); break; case "h5": StartBlock("h5", start); break; case "h6": StartBlock("h6", start); break; case "img": StartInline(); _writer.Write('!'); WriteAttributes(start, _writer); _writer.Write(start["src"]); if (start.TryGetValue("alt", out buffer)) { _writer.Write('('); _writer.Write(buffer); _writer.Write(')'); } _writer.Write('!'); _minify = MinifyState.Compressed; break; case "ins": StartInline(); _writer.Write('['); _writer.Write('+'); break; case "hr": StartBlock("---", start); EndBlock(); _writer.Write(_settings.NewLineChars); _minify = MinifyState.LastCharWasSpace; break; case "li": if (_outputStarted) { _writer.Write(_settings.NewLineChars); } WritePrefix(); break; case "p": StartBlock("", start); break; case "pre": if (nextTag == "code") { StartBlock("bc", start, true); } else { StartBlock("pre", start, true); } _preserveWhitespace = PreserveState.BeforeContent; break; case "span": _writer.Write('?'); WriteAttributes(start, _writer); break; case "sub": StartInline(); _writer.Write('['); _writer.Write('~'); break; case "sup": StartInline(); _writer.Write('['); _writer.Write('^'); break; case "ol": StartList("#"); break; case "ul": StartList("*"); break; default: if (_settings.ShouldSkipElement(start)) { _ignoreDepth = _nodes.Count; } break; } _state = InternalState.Content; } }