示例#1
0
        /// <summary>
        /// Utility for printing the correct XHTML for a given MarkupContext.
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="context"></param>
        /// <param name="text"></param>
        private static void printContext(HtmlWriter writer, MarkupContext context, string text, MarkupRange range)
        {
            switch (context.Context)
            {
            case _MARKUP_CONTEXT_TYPE.CONTEXT_TYPE_EnterScope:
                printElementStart(writer, context.Element);
                if (HtmlLinebreakStripper.IsPreserveWhitespaceTag(context.Element.tagName))
                {
                    // <pre> was losing whitespace using the normal markup pointer traversal method

                    writer.WriteString(BalanceHtml(context.Element.innerHTML));
                    printElementEnd(writer, context.Element);
                    range.End.MoveAdjacentToElement(context.Element, _ELEMENT_ADJACENCY.ELEM_ADJ_AfterEnd);
                    break;
                }
                else
                {
                    if (text != null)
                    {
                        writer.WriteString(trimHtmlText(text));
                    }
                    break;
                }

            case _MARKUP_CONTEXT_TYPE.CONTEXT_TYPE_ExitScope:
                if (text != null)
                {
                    writer.WriteString(trimHtmlText(text));
                }
                printElementEnd(writer, context.Element);
                break;

            case _MARKUP_CONTEXT_TYPE.CONTEXT_TYPE_None:
                break;

            case _MARKUP_CONTEXT_TYPE.CONTEXT_TYPE_NoScope:
                if (context.Element is IHTMLCommentElement ||
                    context.Element is IHTMLUnknownElement)
                {
                    //bugfix: 1777 - comments should just be inserted raw.
                    string html = context.Element.outerHTML;
                    // bugfix: 534222 - embed tag markup generation issues
                    if (html != null && html.ToUpper(CultureInfo.InvariantCulture) != "</EMBED>")
                    {
                        writer.WriteString(html);
                    }
                }
                else
                {
                    printElementStart(writer, context.Element);
                    if (text == null && context.Element.innerHTML != null)
                    {
                        //Avoid MSHTML bug: in some cases (like title or script elements), MSHTML improperly
                        //reports a tag as being NoScope, even through it clearly has a start and end tag with
                        //text in between. To cover this case, we look for text in a noscope element, and add
                        //it to the XML stream if it is detected.
                        writer.WriteString(context.Element.innerHTML);
                    }
                    printElementEnd(writer, context.Element);
                }
                break;

            case _MARKUP_CONTEXT_TYPE.CONTEXT_TYPE_Text:
                if (text != null)
                {
                    writer.WriteString(trimHtmlText(text));
                }
                break;

            default:
                break;
            }
        }
        /// <summary>
        /// Utility for printing the correct XHTML for a given MarkupContext.
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="context"></param>
        /// <param name="text"></param>
        private static void printContext(HtmlWriter writer, MarkupContext context, string text, MarkupRange range)
        {
            switch (context.Context)
            {
                case _MARKUP_CONTEXT_TYPE.CONTEXT_TYPE_EnterScope:
                    printElementStart(writer, context.Element);
                    if (HtmlLinebreakStripper.IsPreserveWhitespaceTag(context.Element.tagName))
                    {
                        // <pre> was losing whitespace using the normal markup pointer traversal method

                        writer.WriteString(BalanceHtml(context.Element.innerHTML));
                        printElementEnd(writer, context.Element);
                        range.End.MoveAdjacentToElement(context.Element, _ELEMENT_ADJACENCY.ELEM_ADJ_AfterEnd);
                        break;
                    }
                    else
                    {
                        if (text != null)
                            writer.WriteString(trimHtmlText(text));
                        break;
                    }
                case _MARKUP_CONTEXT_TYPE.CONTEXT_TYPE_ExitScope:
                    if (text != null)
                        writer.WriteString(trimHtmlText(text));
                    printElementEnd(writer, context.Element);
                    break;
                case _MARKUP_CONTEXT_TYPE.CONTEXT_TYPE_None:
                    break;
                case _MARKUP_CONTEXT_TYPE.CONTEXT_TYPE_NoScope:
                    if (context.Element is IHTMLCommentElement
                       || context.Element is IHTMLUnknownElement)
                    {
                        //bugfix: 1777 - comments should just be inserted raw.
                        string html = context.Element.outerHTML;
                        // bugfix: 534222 - embed tag markup generation issues
                        if (html != null && html.ToUpper(CultureInfo.InvariantCulture) != "</EMBED>")
                            writer.WriteString(html);
                    }
                    else
                    {
                        printElementStart(writer, context.Element);
                        if (text == null && context.Element.innerHTML != null)
                        {
                            //Avoid MSHTML bug: in some cases (like title or script elements), MSHTML improperly
                            //reports a tag as being NoScope, even through it clearly has a start and end tag with
                            //text in between. To cover this case, we look for text in a noscope element, and add
                            //it to the XML stream if it is detected.
                            writer.WriteString(context.Element.innerHTML);
                        }
                        printElementEnd(writer, context.Element);
                    }
                    break;
                case _MARKUP_CONTEXT_TYPE.CONTEXT_TYPE_Text:
                    if (text != null)
                        writer.WriteString(trimHtmlText(text));
                    break;
                default:
                    break;
            }
        }