Skip to content

feat(md/fmt): autolink, setext header#9929

Merged
ematipico merged 1 commit intomainfrom
feat/setext-and-fences
Apr 14, 2026
Merged

feat(md/fmt): autolink, setext header#9929
ematipico merged 1 commit intomainfrom
feat/setext-and-fences

Conversation

@ematipico
Copy link
Copy Markdown
Member

Summary

More formatter markdown advancements:

  • SETEXT headers
  • autolink

Prettier transforms STX headers into ATX headers.

Also added logic to keep the fences of italics in some cases.

Test Plan

Added new test

Docs

@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Apr 11, 2026

⚠️ No Changeset found

Latest commit: c06805e

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@github-actions github-actions bot added A-Formatter Area: formatter L-Markdown Language: Markdown labels Apr 11, 2026
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq bot commented Apr 11, 2026

Merging this PR will not alter performance

✅ 58 untouched benchmarks
⏩ 196 skipped benchmarks1


Comparing feat/setext-and-fences (c06805e) with main (27dd7b1)

Open in CodSpeed

Footnotes

  1. 196 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Apr 11, 2026

Walkthrough

This PR threads a new keep_fences_in_italics flag through the inline-item-list formatter and many inline auxiliary formatters, updates several formatters to format from parsed fields rather than verbatim syntax (continuation indent, indent code block, reference link, setext header, etc.), makes FormatMdInlineItalic stateful with an options API, adjusts newline/header detection to include setext headers, adds test fixtures for reference links and setext headers, adds an idempotence quick test, and adds similar-asserts as a dev-dependency.

Possibly related PRs

Suggested reviewers

  • dyc3
🚥 Pre-merge checks | ✅ 2
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title directly reflects the two main features introduced: SETEXT header formatting and autolink improvements, which are core components of this PR's changes.
Description check ✅ Passed The description accurately outlines the PR's objectives—SETEXT header formatting, autolink enhancements, and italic fence preservation—with context about Prettier's similar transformations.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/setext-and-fences

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
crates/biome_markdown_formatter/src/markdown/auxiliary/inline_italic.rs (1)

39-47: Consider using || instead of | for boolean OR.

Line 44 uses bitwise OR (|) rather than logical OR (||). Both work for bools, but || is more idiomatic in Rust for boolean conditions. The difference is minor here since self.should_keep_fences is a simple field access, but || makes the intent clearer.

✨ Optional: use logical OR
         if node
             .syntax()
             .ancestors()
             .skip(1)
             .any(|a| MdReferenceImage::can_cast(a.kind()))
-            | self.should_keep_fences
+            || self.should_keep_fences
         {
             return write!(f, [l_fence.format(), content.format(), r_fence.format()]);
         }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_markdown_formatter/src/markdown/auxiliary/inline_italic.rs`
around lines 39 - 47, The conditional combines the ancestor check and the field
self.should_keep_fences using a bitwise OR; replace the bitwise OR (`|`) with a
logical OR (`||`) so the condition reads "...any(|a|
MdReferenceImage::can_cast(a.kind())) || self.should_keep_fences" (the branch
that returns write!(f, [l_fence.format(), content.format(), r_fence.format()])
inside the inline italic formatter). This uses the idiomatic boolean operator
and preserves short-circuiting semantics when evaluating
self.should_keep_fences.
crates/biome_markdown_formatter/src/markdown/auxiliary/setext_header.rs (1)

18-25: Minor formatting inconsistency.

There's a trailing comma after token("#") on line 20 but not after token("##") on line 24. Either style is fine, but consistency would be tidier.

✨ Optional: consistent trailing comma
         // h1
         if underline_token.token_text_trimmed().starts_with("=") {
-            write!(f, [token("#"),])?;
+            write!(f, [token("#")])?;
         }
         // h2
         else {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_markdown_formatter/src/markdown/auxiliary/setext_header.rs`
around lines 18 - 25, The two write! calls in setext_header handling h1/h2 are
inconsistent: write!(f, [token("#"),]) has a trailing comma while write!(f,
[token("##"),]) does not; make them consistent by adding or removing the
trailing comma in the other call so both write!(f, [token("#"),]) and write!(f,
[token("##"),]) use the same punctuation style (update the occurrences around
underline_token.token_text_trimmed() in setext_header.rs).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@crates/biome_markdown_formatter/src/markdown/lists/inline_item_list.rs`:
- Around line 341-345: The doc comment on the struct
FormatMdFormatInlineItemListOptions has a typo: change "instructions the
formatter to keep the fences." to "instructs the formatter to keep the fences."
in the comment for the keep_fences_in_italics field so the grammar is correct
and consistent.
- Around line 12-13: Fix the typo in the doc comment for the struct field
keep_fences_in_italics: change "instrustructs" to "instructs" in the
triple-slash comment that documents keep_fences_in_italics so the comment reads
"When true, and there's a [MdInlineItalic], it instructs the formatter to keep
the fences".

---

Nitpick comments:
In `@crates/biome_markdown_formatter/src/markdown/auxiliary/inline_italic.rs`:
- Around line 39-47: The conditional combines the ancestor check and the field
self.should_keep_fences using a bitwise OR; replace the bitwise OR (`|`) with a
logical OR (`||`) so the condition reads "...any(|a|
MdReferenceImage::can_cast(a.kind())) || self.should_keep_fences" (the branch
that returns write!(f, [l_fence.format(), content.format(), r_fence.format()])
inside the inline italic formatter). This uses the idiomatic boolean operator
and preserves short-circuiting semantics when evaluating
self.should_keep_fences.

In `@crates/biome_markdown_formatter/src/markdown/auxiliary/setext_header.rs`:
- Around line 18-25: The two write! calls in setext_header handling h1/h2 are
inconsistent: write!(f, [token("#"),]) has a trailing comma while write!(f,
[token("##"),]) does not; make them consistent by adding or removing the
trailing comma in the other call so both write!(f, [token("#"),]) and write!(f,
[token("##"),]) use the same punctuation style (update the occurrences around
underline_token.token_text_trimmed() in setext_header.rs).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 392a0b69-3ad8-435f-9ebe-29043ee47ee3

📥 Commits

Reviewing files that changed from the base of the PR and between 80c5c00 and f3976a3.

⛔ Files ignored due to path filters (27)
  • Cargo.lock is excluded by !**/*.lock and included by **
  • crates/biome_markdown_formatter/tests/specs/markdown/reference_link.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/markdown/setext_header.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/linkReference/case-and-space/case-and-space.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/list/checkbox.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/list/indent.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/markdown/test-case.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-108.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-259.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-27.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-49.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-50.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-51.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-518.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-52.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-54.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-57.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-59.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-63.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-64.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-70.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-71.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-79.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-80.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-83.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/yaml/simple-2.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/yaml/simple.md.snap is excluded by !**/*.snap and included by **
📒 Files selected for processing (21)
  • crates/biome_markdown_formatter/Cargo.toml
  • crates/biome_markdown_formatter/src/markdown/auxiliary/autolink.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/continuation_indent.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/fenced_code_block.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/hard_line.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/indent_code_block.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/inline_code.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/inline_image.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/inline_italic.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/inline_link.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/link_destination.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/link_label.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/link_title.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/newline.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/paragraph.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/reference_link.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/setext_header.rs
  • crates/biome_markdown_formatter/src/markdown/lists/inline_item_list.rs
  • crates/biome_markdown_formatter/tests/quick_test.rs
  • crates/biome_markdown_formatter/tests/specs/markdown/reference_link.md
  • crates/biome_markdown_formatter/tests/specs/markdown/setext_header.md

@ematipico ematipico force-pushed the feat/setext-and-fences branch from 7e3dbaa to c06805e Compare April 12, 2026 09:19
@ematipico ematipico requested review from a team April 12, 2026 09:19
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@crates/biome_markdown_formatter/src/markdown/auxiliary/inline_italic.rs`:
- Line 44: The conditional expression currently uses the bitwise OR operator
('|') with self.should_keep_fences, which prevents short-circuiting; update the
condition in the function/block that contains self.should_keep_fences (the same
expression that checks the ancestor condition) to use the logical OR operator
('||') instead so the ancestor check short-circuits and self.should_keep_fences
is only evaluated when needed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e84d2355-b806-4fc8-97d4-5030b0c80224

📥 Commits

Reviewing files that changed from the base of the PR and between 7e3dbaa and c06805e.

⛔ Files ignored due to path filters (27)
  • Cargo.lock is excluded by !**/*.lock and included by **
  • crates/biome_markdown_formatter/tests/specs/markdown/reference_link.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/markdown/setext_header.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/linkReference/case-and-space/case-and-space.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/list/checkbox.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/list/indent.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/markdown/test-case.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-108.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-259.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-27.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-49.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-50.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-51.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-518.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-52.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-54.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-57.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-59.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-63.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-64.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-70.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-71.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-79.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-80.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/spec/example-83.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/yaml/simple-2.md.snap is excluded by !**/*.snap and included by **
  • crates/biome_markdown_formatter/tests/specs/prettier/markdown/yaml/simple.md.snap is excluded by !**/*.snap and included by **
📒 Files selected for processing (21)
  • crates/biome_markdown_formatter/Cargo.toml
  • crates/biome_markdown_formatter/src/markdown/auxiliary/autolink.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/continuation_indent.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/fenced_code_block.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/hard_line.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/indent_code_block.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/inline_code.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/inline_image.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/inline_italic.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/inline_link.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/link_destination.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/link_label.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/link_title.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/newline.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/paragraph.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/reference_link.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/setext_header.rs
  • crates/biome_markdown_formatter/src/markdown/lists/inline_item_list.rs
  • crates/biome_markdown_formatter/tests/quick_test.rs
  • crates/biome_markdown_formatter/tests/specs/markdown/reference_link.md
  • crates/biome_markdown_formatter/tests/specs/markdown/setext_header.md
✅ Files skipped from review due to trivial changes (11)
  • crates/biome_markdown_formatter/src/markdown/auxiliary/fenced_code_block.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/hard_line.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/inline_code.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/link_label.rs
  • crates/biome_markdown_formatter/Cargo.toml
  • crates/biome_markdown_formatter/src/markdown/auxiliary/inline_link.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/newline.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/link_destination.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/inline_image.rs
  • crates/biome_markdown_formatter/tests/specs/markdown/reference_link.md
  • crates/biome_markdown_formatter/tests/quick_test.rs
🚧 Files skipped from review as they are similar to previous changes (8)
  • crates/biome_markdown_formatter/src/markdown/auxiliary/autolink.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/paragraph.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/link_title.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/continuation_indent.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/indent_code_block.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/setext_header.rs
  • crates/biome_markdown_formatter/src/markdown/auxiliary/reference_link.rs
  • crates/biome_markdown_formatter/src/markdown/lists/inline_item_list.rs

.ancestors()
.skip(1)
.any(|a| MdReferenceImage::can_cast(a.kind()))
| self.should_keep_fences
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify the boolean operator usage at the relevant site.
rg -nP --type=rust '\.any\(\|a\|\s*MdReferenceImage::can_cast\(a\.kind\(\)\)\)\s*\|\s*self\.should_keep_fences' crates/biome_markdown_formatter/src/markdown/auxiliary/inline_italic.rs

Repository: biomejs/biome

Length of output: 39


🏁 Script executed:

cat -n crates/biome_markdown_formatter/src/markdown/auxiliary/inline_italic.rs | sed -n '35,55p'

Repository: biomejs/biome

Length of output: 1029


Use || instead of | on line 44.

The condition currently uses bitwise OR, which doesn't short-circuit. Swapping to logical OR is idiomatic and avoids evaluating self.should_keep_fences if the ancestor check is already true.

Suggested fix
         if node
             .syntax()
             .ancestors()
             .skip(1)
             .any(|a| MdReferenceImage::can_cast(a.kind()))
-            | self.should_keep_fences
+            || self.should_keep_fences
         {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| self.should_keep_fences
if node
.syntax()
.ancestors()
.skip(1)
.any(|a| MdReferenceImage::can_cast(a.kind()))
|| self.should_keep_fences
{
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@crates/biome_markdown_formatter/src/markdown/auxiliary/inline_italic.rs` at
line 44, The conditional expression currently uses the bitwise OR operator ('|')
with self.should_keep_fences, which prevents short-circuiting; update the
condition in the function/block that contains self.should_keep_fences (the same
expression that checks the ancestor condition) to use the logical OR operator
('||') instead so the ancestor check short-circuits and self.should_keep_fences
is only evaluated when needed.

@ematipico ematipico merged commit 3f89810 into main Apr 14, 2026
35 checks passed
@ematipico ematipico deleted the feat/setext-and-fences branch April 14, 2026 07:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-Formatter Area: formatter L-Markdown Language: Markdown

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant