╭ changed ───────╮ │src/markdown.zig│ ╰────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────╮ │45 for (lines, expanded) |line, *out| out.* = try expandTabs(arena, line);│ │46 var parser: Parser = .{ .arena = arena }; │ │47 return .{ .blocks = try parser.parseBlocks(expanded) }; │ │48 +} │ │49 + │ │50 +// parse, for text not yet split into lines. │ │51 +pub fn parseText(arena: std.mem.Allocator, text: []const u8) !Document { │ │52 + var lines: std.ArrayList([]const u8) = .empty; │ │53 + var it = std.mem.splitScalar(u8, text, '\n'); │ │54 + while (it.next()) |line| try lines.append(arena, line); │ │55 + return parse(arena, lines.items); │ │56 } │ │57 │ │58 // how deeply quotes and lists nest │ ╰───────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──╮ │src/try.zig│ ╰───────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │475 │ │476 // the timestamps issue's description, in paragraphs, so the │ │477 // seeded conflict below can insert and delete among them │ │478 - const tz_p1 = "All timestamps in the activity feed render in UTC regardless of the system timezone."; │ │479 - const tz_p2 = "The tooltip on each entry repeats the same UTC value, so there is no way to see the local time without converting by hand."; │ │480 - const tz_p3 = "A quick survey of other clients shows every one of them rendering local time by default."; │ │481 - const tz_p4 = "Convert to local time and include the offset in tooltips."; │ │478 + const tz_p1 = "All timestamps in the activity feed render in `UTC` regardless of the system timezone."; │ │479 + const tz_p2 = "The tooltip on each entry repeats the same UTC value, so there is *no way* to see the local time without converting by hand.";│ │480 + const tz_p3 = "A quick survey of [other clients](https://github.com/xit-vcs/haxy) shows every one of them rendering local time by default."; │ │481 + const tz_p4 = "Convert to local time and include the **offset** in tooltips."; │ │482 │ │483 // the sync issue's description, in paragraphs, so each side of its │ │484 // seeded conflict can rework a different one │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │485 - const sync_p1 = "The sync engine only has unit tests with mocked transports."; │ │486 - const sync_p2 = "Failures seen in production involve reconnects and partial writes, which the mocks can't reproduce."; │ │485 + const sync_p1 = "The sync engine only has *unit tests* with mocked transports."; │ │486 + const sync_p2 = "Failures seen in production involve reconnects and **partial writes**, which the mocks can't reproduce.";│ │487 const sync_p3 = "Add end-to-end tests that run two instances against a real local server."; │ │488 │ │489 // seed issues so every repo's issue tracker has content │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │495 }{ │ │496 .{ │ │497 .title = "Crash on startup when config file is missing", │ │498 - .description = "Running the program without a config file present dereferences a null pointer and segfaults. Fall back to the built-in defaults and log a warning instead.", │ │498 + .description = "Running the program without a `config.toml` present dereferences a null pointer and segfaults. Fall back to the built-in defaults and log a **warning** instead.",│ │499 .labels = "bug priority-high crash", │ │500 }, │ │501 .{ │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │502 .title = "Support dark mode in the settings panel", │ │503 - .description = "The settings panel is always rendered with the light palette even when the rest of the app is in dark mode. Read the active theme and pick colors accordingly.", │ │503 + .description = "The settings panel is *always* rendered with the light palette even when the rest of the app is in dark mode. Read the active theme and pick colors accordingly.",│ │504 .labels = "enhancement ui theme", │ │505 }, │ │506 .{ │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │507 .title = "Memory leak when reconnecting after network failure", │ │508 - .description = "Each reconnect allocates a new connection state without freeing the previous one. After a flaky network session, memory usage grows by several megabytes per hour.", │ │508 + .description = "Each reconnect allocates a new connection state without freeing the previous one.\n\n> After a flaky network session, memory usage grows by several megabytes per hour.",│ │509 .labels = "bug memory networking", │ │510 .status = .closed, │ │511 }, │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │512 .{ │ │513 .title = "Document the plugin API", │ │514 - .description = "The plugin interface has no documentation beyond the header comments. Add a guide covering the lifecycle hooks, the event callbacks, and a minimal working plugin.", │ │514 + .description = "The plugin interface has no documentation beyond the header comments. Add a guide covering:\n\n- the lifecycle hooks\n- the event callbacks\n- a minimal working plugin",│ │515 .labels = "documentation plugins", │ │516 }, │ │517 .{ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │518 .title = "Slow file indexing on large directories", │ │519 - .description = "Indexing a directory with more than 100k files takes several minutes because every entry is stat'd twice. Cache the first stat result and batch the reads.", │ │519 + .description = "Indexing a directory with more than 100k files takes several minutes because every entry is `stat`'d twice. Cache the first stat result and batch the reads.",│ │520 .labels = "performance indexing", │ │521 }, │ │522 .{ │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │523 .title = "Add keyboard shortcut for quick search", │ │524 - .description = "Opening the search box currently requires clicking the toolbar icon. Bind a shortcut and show it in the tooltip so keyboard users can search without the mouse.", │ │524 + .description = "Opening the search box currently requires clicking the toolbar icon. Bind a shortcut and show it in the tooltip so **keyboard users** can search without the mouse.",│ │525 .labels = "enhancement ux keyboard", │ │526 }, │ │527 .{ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │528 .title = "Unicode filenames are garbled in the export dialog", │ │529 - .description = "Filenames containing non-ASCII characters display as replacement characters in the export dialog. The dialog decodes the path as Latin-1 instead of UTF-8.", │ │529 + .description = "Filenames containing non-ASCII characters display as replacement characters in the export dialog. The dialog decodes the path as *Latin-1* instead of *UTF-8*.",│ │530 .labels = "bug unicode i18n", │ │531 }, │ │532 .{ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯