Beispiel #1
0
        /*
         * /// <summary>
         * /// 使用指定文本替换元素内容(警告,此方法会清除元素所有内容)
         * /// </summary>
         * /// <param name="element">要替换内容的元素</param>
         * /// <param name="text">文本内容</param>
         * public static void ReplaceChildsWithText( this IHtmlElement element, string text )
         * {
         * if ( element == null )
         *  throw new ArgumentNullException( "element" );
         *
         * var factory = element.Document.GetNodeFactory();
         * if ( factory == null )
         *  throw new NotSupportedException();
         *
         * lock ( element.SyncRoot )
         * {
         *  ClearNodes( element );
         *
         *  if ( !HtmlSpecification.cdataTags.Contains( element.Name, StringComparer.OrdinalIgnoreCase ) )
         *  {
         *    var fragment = HtmlEncode( text, factory );
         *
         *    fragment.InsertTo( element, 0 );
         *  }
         *  else
         *  {
         *    var textNode = factory.CreateTextNode( text );
         *    textNode.Into( element, 0 );
         *  }
         * }
         *
         * }
         *
         * /// <summary>
         * /// 使用指定的HTML文本替换元素内容(警告,此方法会清除元素所有内容)
         * /// </summary>
         * /// <param name="element">要替换内容的元素</param>
         * /// <param name="html">要替换的HTML代码</param>
         * public static void ReplaceChildsWithHtml( this IHtmlElement element, string html )
         * {
         * if ( element == null )
         *  throw new ArgumentNullException( "element" );
         *
         * var factory = element.Document.GetNodeFactory();
         * if ( factory == null )
         *  throw new NotSupportedException();
         *
         * lock ( element.SyncRoot )
         * {
         *  ClearNodes( element );
         *
         *  if ( HtmlSpecification.cdataTags.Contains( element.Name, StringComparer.OrdinalIgnoreCase ) )
         *  {
         *    var textNode = factory.CreateTextNode( html );
         *    textNode.Into( element, 0 );
         *  }
         *  else
         *  {
         *    var fragment = factory.ParseFragment( html );
         *    fragment.InsertTo( element, 0 );
         *  }
         * }
         * }
         */



        private static HtmlFragment HtmlEncode(string text, IHtmlNodeFactory factory)
        {
            if (text == null)
            {
                throw new ArgumentNullException("text");
            }

            if (factory == null)
            {
                throw new ArgumentNullException("factory");
            }


            var fragment = new HtmlFragment(factory);
            var encoded  = HtmlEncoding.HtmlEncode(text);

            encoded = encoded.Replace("\r\n", "\n").Replace("\r", "\n");

            int index = 0, brIndex = 0;

            while (true)
            {
                brIndex = encoded.IndexOf('\n', index);

                if (brIndex == -1)
                {
                    if (index < encoded.Length)
                    {
                        fragment.AddNode(factory.CreateTextNode(encoded.Substring(index)));
                    }

                    break;
                }



                if (index != brIndex)
                {
                    fragment.AddNode(factory.CreateTextNode(encoded.Substring(index, brIndex - index)));
                }
                fragment.AddNode(factory.CreateElement("br"));
                index = brIndex + 1;
            }

            return(fragment);
        }
Beispiel #2
0
 /// <summary>
 /// 创建文本节点的副本
 /// </summary>
 /// <param name="factory">用于创建文本节点的构建器</param>
 /// <param name="textNode">需要被创建副本的文本节点</param>
 /// <returns>文本节点的未分配副本</returns>
 public static IFreeTextNode MakeCopy(this IHtmlNodeFactory factory, IHtmlTextNode textNode)
 {
     return(factory.CreateTextNode(textNode.HtmlText));
 }