public override bool Execute() { if (!File.Exists(ChangelogFilePath)) { Log.LogError($"Could not found changelog file {ChangelogFilePath}"); return(false); } using var inputStream = new FileStream(ChangelogFilePath, FileMode.Open, FileAccess.Read, FileShare.Read); using var inputMdStream = new MarkdownStream(inputStream); if (OutputType.Equals("PlainText", StringComparison.OrdinalIgnoreCase)) { ChangelogSectionContent = GetResult( new MarkdownToPlainTextConverter().ExtractVersionSectionPlainText(inputMdStream)); } else if (OutputType.Equals("Markdown", StringComparison.OrdinalIgnoreCase)) { ChangelogSectionContent = GetResult( new MarkdownToMarkdownConverter().ExtractVersionSection(inputMdStream)); } else { Log.LogError($"Couldn't parse OutputType = {OutputType}"); return(false); } return(true); }
public TokenStream Read(string markdown, string path) { _Context = MarkdownReaderMode.None; _Stream = new MarkdownStream(markdown); YamlHeader(); if (_YamlHeaderOnly) { return(_Output); } while (!_Stream.EOF) { var processed = UnderlineHeader() || HashHeader() || FencedBlock() || Link() || LineBreak(); if (!processed) { Text(); } } return(_Output); }
public async Task Run( [Option(0, "Path to the input Markdown file")] string inputFilePath, [Option("o", "Output file path")] string?outputFilePath = null, [Option("t", "Output type, either Markdown or PlainText")] ContentType contentType = ContentType.Markdown) { Console.OutputEncoding = Encoding.UTF8; await using var inputStream = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read, FileShare.Read); using var inputMdStream = new MarkdownStream(inputStream); var text = contentType switch { ContentType.PlainText => (await _plainTextConverter.ExtractVersionSectionPlainText(inputMdStream)).Content, _ => (await _markdownConverter.ExtractVersionSection(inputMdStream)).Content }; if (outputFilePath == null) { await Console.Out.WriteLineAsync(text); } else { await using var outputFile = new FileStream(outputFilePath, FileMode.CreateNew); await using var writer = new StreamWriter(outputFile); await writer.WriteLineAsync(text); } } }
private string UnwrapStyleMarkers(MarkdownStream stream, out MarkdownTokens flag) { flag = MarkdownTokens.None; // Check for style var styleChar = stream.Current; var stylePrevious = stream.Previous; var styleCount = styleChar == Asterix || styleChar == Underscore?stream.Skip(styleChar, max : 0) : 0; var codeCount = styleChar == Backtick?stream.Skip(Backtick, max : 0) : 0; var text = stream.CaptureUntil(IsTextStop, ignoreEscaping: false); // Check for italic and bold endings if (styleCount > 0) { if (stream.Current == styleChar) { var styleEnding = stream.Skip(styleChar, max: styleCount); // Add back underscores within text if (styleChar == Underscore && stylePrevious != Whitespace) { return(Pad(text, styleChar, left: styleCount, right: styleCount)); } // Add back asterixes/underscores that are part of text if (styleEnding < styleCount) { text = Pad(text, styleChar, left: styleCount - styleEnding); } if (styleEnding == 1 || styleEnding == 3) { flag |= MarkdownTokens.Italic; } if (styleEnding >= 2) { flag |= MarkdownTokens.Bold; } } else { // Add back asterixes/underscores that are part of text text = Pad(text, styleChar, left: styleCount); } } if (codeCount > 0) { if (stream.Current == styleChar) { var codeEnding = stream.Skip(styleChar, max: 1); // Add back backticks that are part of text if (codeEnding < codeCount) { text = Pad(text, styleChar, left: codeCount - codeEnding); } if (codeEnding == 1) { flag |= MarkdownTokens.Code; } } else { // Add back backticks that are part of text text = Pad(text, styleChar, left: codeCount); } } return(text); }