public static void RenderPages(string messageFilename, int scale, bool withWav, string outputDir) { if (!Directory.Exists(outputDir)) { Directory.CreateDirectory(outputDir); } var messageDir = Path.GetDirectoryName(messageFilename) !; var message = File.ReadAllText(messageFilename); var pages = message.Replace("\r", "").Split("\n\n"); for (int i = 0; i < pages.Length; i++) { var renderer = new RenderContext(Renderer.Instance); var lines = pages[i].Split("\n"); var needBorder = false; foreach (var line in lines) { try { if (line.StartsWith("//")) { continue; } if (line.StartsWith("IMAGE_")) { var imageName = line.Split("_", 2)[1]; using var stream = new FileStream(Path.Combine(messageDir, imageName), FileMode.Open); var pixels = CoreImplementations.ImageToPixels(stream); renderer.AddPixels(pixels); } else { ReportIncorrectMessagesToConsole(line); needBorder = true; renderer.AddLine(line); } } catch (Exception e) { throw new Exception(line, e); } } if (renderer.Points.Count == 0) { throw new Exception(i.ToString()); } var humanReadableIndex = i + 1; var points = needBorder ? AddBorder(renderer.Points.ToList()).ToList() : renderer.Points; SaveImageFile(scale, points, Path.Combine(outputDir, $"message{humanReadableIndex}.png")); if (withWav && i == 0) { SaveAudioFile(points, Path.Combine(outputDir, $"message{humanReadableIndex}.wav")); } } }