private void PrettyPrintStream() { try { m_Stream.Seek(0, SeekOrigin.Begin); m_MemoryStream?.Dispose(); m_MemoryStream = new MemoryStream(); var encoding = Encoding.GetEncoding(m_CodePage); using (var textReader = new StreamReader((Stream)m_Stream, encoding, true, 4096, true)) using (var stringWriter = new StreamWriter(m_MemoryStream, encoding, 4096, true)) { var jsonReader = new JsonTextReader(textReader); var jsonWriter = new JsonTextWriter(stringWriter) { Formatting = Formatting.Indented }; jsonWriter.WriteToken(jsonReader); } m_MemoryStream.Seek(0, SeekOrigin.Begin); textBox.OpenBindingStream(m_MemoryStream, encoding); HighlightVisibleRange(); prettyPrintJsonToolStripMenuItem.Checked = true; originalFileToolStripMenuItem.Checked = false; } catch (Exception ex) { this.ShowError(ex, "Pretty Print"); } }
/// <summary> /// Resets the position and buffer to the first line, excluding headers, use /// ResetPositionToStart if you want to go to first data line /// </summary> private void ResetPositionToStartOrOpen() { if (SelfOpenedStream) { m_ImprovedStream?.Dispose(); m_ImprovedStream = FunctionalDI.OpenStream(new SourceAccess(FullPath)); } else { m_ImprovedStream.Seek(0, SeekOrigin.Begin); } // in case we can not seek need to reopen the stream reader m_StreamReader?.Close(); m_StreamReader = new StreamReader(m_ImprovedStream as Stream ?? throw new InvalidOperationException(), Encoding.UTF8, true, 4096, true); // End Line should be at 1, later on as the line is read the start line s set to this value StartLineNumber = 1; EndLineNumber = 1; RecordNumber = 0; EndOfFile = m_StreamReader.EndOfStream; m_JsonTextReader?.Close(); m_JsonTextReader = new JsonTextReader(m_StreamReader) { SupportMultipleContent = true }; }
/// <summary> /// Creates an instance of the TextReader /// </summary> /// <param name="improvedStream">An Improved Stream</param> /// <param name="codePageId">The assumed code page id</param> /// <param name="skipLines"> /// Number of lines that should be skipped at the beginning of the file /// </param> /// <remarks> /// This routine uses a TextReader to allow character decoding, it will always read they the /// first few bytes of the source stream to look at a possible existing BOM if found, it will /// overwrite the provided data /// </remarks> public ImprovedTextReader([NotNull] IImprovedStream improvedStream, int codePageId = 65001, int skipLines = 0) { m_SkipLines = skipLines; m_ImprovedStream = improvedStream as Stream ?? throw new ArgumentNullException(nameof(improvedStream)); // read the BOM in any case var buff = new byte[4]; m_ImprovedStream.Read(buff, 0, buff.Length); var intCodePageByBom = EncodingHelper.GetEncodingByByteOrderMark(buff); improvedStream.Seek(0, SeekOrigin.Begin); var byteOrderMark = false; if (intCodePageByBom != null) { byteOrderMark = true; m_CodePage = intCodePageByBom.CodePage; } else { try { m_CodePage = codePageId; } catch (Exception) { Logger.Warning("Codepage {0} not supported, using UTF8", codePageId); m_CodePage = Encoding.UTF8.CodePage; } } m_BomLength = byteOrderMark ? EncodingHelper.BOMLength(m_CodePage) : 0; ToBeginning(); }