/*private void DumpBreakRegions(params ElementBreakRegion[] breakRegions) * { * foreach(ElementBreakRegion breakRegion in breakRegions) * { * String elementStartName = breakRegion.BreakStartElement != null ? breakRegion.BreakStartElement.tagName : ""; * String elementEndName = breakRegion.BreakEndElement != null ? breakRegion.BreakEndElement.tagName : ""; * String breakContent = breakRegion.ContentRange.Text; * if(breakContent != null) * breakContent = breakContent.Replace('\r', ' ').Replace('\n', ' '); * else * breakContent = ""; * Trace.WriteLine(String.Format("<{0}>{1}<{2}>", elementStartName, breakContent, elementEndName)); * } * }*/ /// <summary> /// Splits the specified range into regions based on a region break filter. /// </summary> /// <param name="range"></param> /// <returns></returns> private ElementBreakRegion[] SplitIntoElementRegions(MarkupRange range, IHTMLElementFilter regionBreakFilter) { ArrayList regions = new ArrayList(); MarkupRange blockRange = _markupServices.CreateMarkupRange(); blockRange.Start.MoveToPointer(range.Start); blockRange.End.MoveToPointer(range.Start); MarkupContext moveContext = new MarkupContext(); ElementBreakRegion currentRegion = new ElementBreakRegion(blockRange, null, null); while (currentRegion.ContentRange.End.IsLeftOf(range.End)) { if (moveContext.Element != null) { if (regionBreakFilter(moveContext.Element)) { //move the end of the region back before the break element to close this region currentRegion.ContentRange.End.Left(true); //save the closed region and start the next region currentRegion.BreakEndElement = moveContext.Element; regions.Add(currentRegion); currentRegion = new ElementBreakRegion(currentRegion.ContentRange.Clone(), moveContext.Element, null); currentRegion.ContentRange.Start.MoveToPointer(currentRegion.ContentRange.End); //move the region start over the break element currentRegion.ContentRange.Start.Right(true, moveContext); currentRegion.ContentRange.End.MoveToPointer(currentRegion.ContentRange.Start); } } currentRegion.ContentRange.End.Right(true, moveContext); } //save the last break region if (moveContext.Element != null && regionBreakFilter(moveContext.Element)) { //move the end of the region back before the break element to close this region currentRegion.ContentRange.End.Left(true); } if (currentRegion.ContentRange.End.IsRightOf(range.End)) { currentRegion.ContentRange.End.MoveToPointer(range.End); } regions.Add(currentRegion); return((ElementBreakRegion[])regions.ToArray(typeof(ElementBreakRegion))); }
/*private void DumpBreakRegions(params ElementBreakRegion[] breakRegions) { foreach(ElementBreakRegion breakRegion in breakRegions) { String elementStartName = breakRegion.BreakStartElement != null ? breakRegion.BreakStartElement.tagName : ""; String elementEndName = breakRegion.BreakEndElement != null ? breakRegion.BreakEndElement.tagName : ""; String breakContent = breakRegion.ContentRange.Text; if(breakContent != null) breakContent = breakContent.Replace('\r', ' ').Replace('\n', ' '); else breakContent = ""; Trace.WriteLine(String.Format("<{0}>{1}<{2}>", elementStartName, breakContent, elementEndName)); } }*/ /// <summary> /// Splits the specified range into regions based on a region break filter. /// </summary> /// <param name="range"></param> /// <returns></returns> private ElementBreakRegion[] SplitIntoElementRegions(MarkupRange range, IHTMLElementFilter regionBreakFilter) { ArrayList regions = new ArrayList(); MarkupRange blockRange = _markupServices.CreateMarkupRange(); blockRange.Start.MoveToPointer(range.Start); blockRange.End.MoveToPointer(range.Start); MarkupContext moveContext = new MarkupContext(); ElementBreakRegion currentRegion = new ElementBreakRegion(blockRange, null, null); while (currentRegion.ContentRange.End.IsLeftOf(range.End)) { if (moveContext.Element != null) { if (regionBreakFilter(moveContext.Element)) { //move the end of the region back before the break element to close this region currentRegion.ContentRange.End.Left(true); //save the closed region and start the next region currentRegion.BreakEndElement = moveContext.Element; regions.Add(currentRegion); currentRegion = new ElementBreakRegion(currentRegion.ContentRange.Clone(), moveContext.Element, null); currentRegion.ContentRange.Start.MoveToPointer(currentRegion.ContentRange.End); //move the region start over the break element currentRegion.ContentRange.Start.Right(true, moveContext); currentRegion.ContentRange.End.MoveToPointer(currentRegion.ContentRange.Start); } } currentRegion.ContentRange.End.Right(true, moveContext); } //save the last break region if (moveContext.Element != null && regionBreakFilter(moveContext.Element)) { //move the end of the region back before the break element to close this region currentRegion.ContentRange.End.Left(true); } if (currentRegion.ContentRange.End.IsRightOf(range.End)) currentRegion.ContentRange.End.MoveToPointer(range.End); regions.Add(currentRegion); return (ElementBreakRegion[])regions.ToArray(typeof(ElementBreakRegion)); }