public void Run() { if (endOfFile) { return; } char[] buffer = null; var start = 0; var current = 0; var end = 0; if (!input.ReadMore(ref buffer, ref start, ref current, ref end)) { // cannot decode more data until next input chunk is available return; } if (input.EndOfFile) { endOfFile = true; } if (end - start != 0) { if (!gotAnyText) { if (output is ConverterEncodingOutput) { var encodingOutput = output as ConverterEncodingOutput; if (encodingOutput.CodePageSameAsInput) { if (input is ConverterDecodingInput) { encodingOutput.Encoding = (input as ConverterDecodingInput).Encoding; } else { encodingOutput.Encoding = Encoding.UTF8; } } } gotAnyText = true; } output.Write(buffer, start, end - start); input.ReportProcessed(end - start); } if (endOfFile) { output.Flush(); } }
/// <summary> /// Flushes the converted output. /// </summary> internal void Flush() { if (lineWrapping) { if (lineLength != 0) { FlushLine('\r'); OutputNewLine(); } } else if (lineLength != 0) { OutputNewLine(); } output.Flush(); }
private void Process(HtmlTokenId tokenId) { var token = parser.Token; switch (tokenId) { case HtmlTokenId.Tag: if (token.IsTagBegin) { switch (token.TagIndex) { case HtmlTagIndex.Title: break; case HtmlTagIndex.Comment: case HtmlTagIndex.Script: case HtmlTagIndex.Style: insideComment = !token.IsEndTag; break; case HtmlTagIndex.A: if (outputAnchorLinks) { insideAnchor = !token.IsEndTag; if (!token.IsEndTag) { } else { } } break; case HtmlTagIndex.Base: case HtmlTagIndex.BaseFont: case HtmlTagIndex.BGSound: case HtmlTagIndex.Link: case HtmlTagIndex.FrameSet: case HtmlTagIndex.Frame: case HtmlTagIndex.Iframe: break; case HtmlTagIndex.Map: case HtmlTagIndex.Div: case HtmlTagIndex.P: case HtmlTagIndex.H1: case HtmlTagIndex.H2: case HtmlTagIndex.H3: case HtmlTagIndex.H4: case HtmlTagIndex.H5: case HtmlTagIndex.H6: case HtmlTagIndex.Center: case HtmlTagIndex.BlockQuote: case HtmlTagIndex.Address: case HtmlTagIndex.Marquee: case HtmlTagIndex.BR: case HtmlTagIndex.HR: case HtmlTagIndex.Form: case HtmlTagIndex.FieldSet: case HtmlTagIndex.OptGroup: case HtmlTagIndex.Select: case HtmlTagIndex.Option: case HtmlTagIndex.OL: case HtmlTagIndex.UL: case HtmlTagIndex.Dir: case HtmlTagIndex.Menu: case HtmlTagIndex.LI: case HtmlTagIndex.DL: case HtmlTagIndex.DT: case HtmlTagIndex.DD: case HtmlTagIndex.Table: case HtmlTagIndex.Caption: case HtmlTagIndex.ColGroup: case HtmlTagIndex.Col: case HtmlTagIndex.Tbody: case HtmlTagIndex.Thead: case HtmlTagIndex.Tfoot: case HtmlTagIndex.TR: case HtmlTagIndex.TC: case HtmlTagIndex.Pre: case HtmlTagIndex.PlainText: case HtmlTagIndex.Listing: collapseWhitespaceState = CollapseWhitespaceState.NewLine; break; case HtmlTagIndex.TH: case HtmlTagIndex.TD: if (!token.IsEndTag) { output.Write("\t"); } break; case HtmlTagIndex.NoEmbed: case HtmlTagIndex.NoFrames: insideComment = !token.IsEndTag; break; } } switch (token.TagIndex) { case HtmlTagIndex.A: if (!token.IsEndTag && outputAnchorLinks) { } break; case HtmlTagIndex.Area: if (!token.IsEndTag && outputAnchorLinks) { } break; case HtmlTagIndex.Img: case HtmlTagIndex.Image: if (!token.IsEndTag && outputAnchorLinks) { } break; } break; case HtmlTokenId.Text: if (!insideComment) { token.Text.WriteToAndCollapseWhitespace(output, ref collapseWhitespaceState); } break; case HtmlTokenId.OverlappedClose: case HtmlTokenId.OverlappedReopen: break; case HtmlTokenId.Restart: break; case HtmlTokenId.EncodingChange: var encodingOutput = output as ConverterEncodingOutput; if (encodingOutput != null) { var codePage = token.Argument; if (encodingOutput.CodePageSameAsInput) { #if DEBUG Encoding newOutputEncoding; InternalDebug.Assert(Charset.TryGetEncoding(codePage, out newOutputEncoding)); #endif encodingOutput.Encoding = Charset.GetEncoding(codePage); } } break; case HtmlTokenId.EndOfFile: output.Write("\r\n"); output.Flush(); endOfFile = true; break; } }