Esempio n. 1
0
        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;
            }
        }
Esempio n. 2
0
        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;
            }
        }