Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @kellyjosephprice
4 changes: 2 additions & 2 deletions .github/workflows/bundlewatch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ jobs:
runs-on: ubuntu-latest
if: "!contains(github.event.head_commit.message, 'SKIP CI')"
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@v5
- uses: actions/setup-node@v6
with:
node-version: 20.x

Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ jobs:
- latest
react: [18]
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}

Expand All @@ -40,7 +40,7 @@ jobs:
react: [18]

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5

- name: Run visual tests (node ${{ matrix.node-version }})
run: make ci
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v4

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v4
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ jobs:
# Setup the git repo & Node environemnt.
#
- name: Checkout branch (${{ github.ref }})
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
persist-credentials: false # install breaks with persistant creds!

- name: Setup node
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: 20

Expand Down
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,22 @@
Changelog
===

## Version 11.4.0
### ✨ New & Improved

* add regex to fix <br> ([#1210](https://github.com/readmeio/markdown/issues/1210)) ([ff4aa28](https://github.com/readmeio/markdown/commit/ff4aa28495de2faa81466d5c9f2da0eaad401ba1))

### 🛠 Fixes & Updates

* **deps:** bump actions/checkout from 4 to 5 ([#1171](https://github.com/readmeio/markdown/issues/1171)) ([6610a81](https://github.com/readmeio/markdown/commit/6610a819db6e76d673ba897aee266792e8258dc9)), closes [actions/checkout#2226](https://github.com/actions/checkout/issues/2226) [actions/checkout#2238](https://github.com/actions/checkout/issues/2238) [actions/checkout#1971](https://github.com/actions/checkout/issues/1971) [actions/checkout#1977](https://github.com/actions/checkout/issues/1977) [actions/checkout#2043](https://github.com/actions/checkout/issues/2043) [actions/checkout#2044](https://github.com/actions/checkout/issues/2044) [actions/checkout#2194](https://github.com/actions/checkout/issues/2194) [actions/checkout#2224](https://github.com/actions/checkout/issues/2224) [actions/checkout#2236](https://github.com/actions/checkout/issues/2236) [actions/checkout#2237](https://github.com/actions/checkout/issues/2237) [actions/checkout#1971](https://github.com/actions/checkout/issues/1971) [actions/checkout#1977](https://github.com/actions/checkout/issues/1977) [actions/checkout#2043](https://github.com/actions/checkout/issues/2043) [actions/checkout#2194](https://github.com/actions/checkout/issues/2194) [actions/checkout#2236](https://github.com/actions/checkout/issues/2236) [actions/checkout#1941](https://github.com/actions/checkout/issues/1941) [actions/checkout#1946](https://github.com/actions/checkout/issues/1946) [actions/checkout#1924](https://github.com/actions/checkout/issues/1924) [actions/checkout#1919](https://github.com/actions/checkout/issues/1919) [actions/checkout#2226](https://github.com/actions/checkout/issues/2226) [actions/checkout#1971](https://github.com/actions/checkout/issues/1971) [actions/checkout#1977](https://github.com/actions/checkout/issues/1977) [actions/checkout#2043](https://github.com/actions/checkout/issues/2043) [actions/checkout#2044](https://github.com/actions/checkout/issues/2044) [actions/checkout#2194](https://github.com/actions/checkout/issues/2194) [actions/checkout#2224](https://github.com/actions/checkout/issues/2224) [actions/checkout#2236](https://github.com/actions/checkout/issues/2236) [actions/checkout#1941](https://github.com/actions/checkout/issues/1941) [actions/checkout#1946](https://github.com/actions/checkout/issues/1946) [actions/checkout#1924](https://github.com/actions/checkout/issues/1924) [actions/checkout#1180](https://github.com/actions/checkout/issues/1180) [actions/checkout#1777](https://github.com/actions/checkout/issues/1777) [actions/checkout#1872](https://github.com/actions/checkout/issues/1872) [actions/checkout#1739](https://github.com/actions/checkout/issues/1739) [actions/checkout#1697](https://github.com/actions/checkout/issues/1697) [actions/checkout#1774](https://github.com/actions/checkout/issues/1774) [actions/checkout#1776](https://github.com/actions/checkout/issues/1776) [actions/checkout#1732](https://github.com/actions/checkout/issues/1732) [actions/checkout#1703](https://github.com/actions/checkout/issues/1703) [actions/checkout#1694](https://github.com/actions/checkout/issues/1694) [actions/checkout#1696](https://github.com/actions/checkout/issues/1696) [actions/checkout#1695](https://github.com/actions/checkout/issues/1695) [actions/checkout#1707](https://github.com/actions/checkout/issues/1707) [actions/checkout#1692](https://github.com/actions/checkout/issues/1692) [actions/checkout#1688](https://github.com/actions/checkout/issues/1688) [actions/checkout#1693](https://github.com/actions/checkout/issues/1693) [actions/checkout#1643](https://github.com/actions/checkout/issues/1643) [#2238](https://github.com/readmeio/markdown/issues/2238) [#2226](https://github.com/readmeio/markdown/issues/2226)
* **deps:** bump github/codeql-action from 3 to 4 ([#1208](https://github.com/readmeio/markdown/issues/1208)) ([9db6259](https://github.com/readmeio/markdown/commit/9db625927d91e078c74b21a8eba2fab614860c88)), closes [#3168](https://github.com/readmeio/markdown/issues/3168) [#3160](https://github.com/readmeio/markdown/issues/3160) [#2935](https://github.com/readmeio/markdown/issues/2935) [#2938](https://github.com/readmeio/markdown/issues/2938) [#2950](https://github.com/readmeio/markdown/issues/2950) [#2925](https://github.com/readmeio/markdown/issues/2925) [#2912](https://github.com/readmeio/markdown/issues/2912) [#2959](https://github.com/readmeio/markdown/issues/2959) [#2910](https://github.com/readmeio/markdown/issues/2910) [#2893](https://github.com/readmeio/markdown/issues/2893) [#2894](https://github.com/readmeio/markdown/issues/2894) [#2891](https://github.com/readmeio/markdown/issues/2891) [#2872](https://github.com/readmeio/markdown/issues/2872) [#3189](https://github.com/readmeio/markdown/issues/3189) [#3188](https://github.com/readmeio/markdown/issues/3188)
* creating a CODEOWNERS file ([8a24361](https://github.com/readmeio/markdown/commit/8a24361398cac8d3ef5cbe9fa7d4ceb9843d1ffe))

## Version 11.3.0
### ✨ New & Improved

* **TableOfContents:** add prop to control TOC heading label ([#1207](https://github.com/readmeio/markdown/issues/1207)) ([5f28c5e](https://github.com/readmeio/markdown/commit/5f28c5e060badf566536465ee680367fa089efd0))

## Version 11.2.1
### 🛠 Fixes & Updates

Expand Down
47 changes: 47 additions & 0 deletions __tests__/migration/html-tags.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { migrate } from '../helpers';

describe('migrating html tags', () => {
describe('br tags', () => {
it('converts unclosed br tags to self-closing', () => {
const md = `This is a line with a break<br>and another line.
Multiple breaks<br><br>in sequence.
Already closed<br />should remain unchanged.`;

const mdx = migrate(md);
expect(mdx).toMatchInlineSnapshot(`
"This is a line with a break<br />and another line.\\
Multiple breaks<br /><br />in sequence.\\
Already closed<br />should remain unchanged.
"
`);
});

it('handles br tags with attributes', () => {
const md = 'Line with styled break<br class="clear">and more text.';

const mdx = migrate(md);
expect(mdx).toMatchInlineSnapshot(`
"Line with styled break<br class="clear" />and more text.
"
`);
});

it('does not change br tags inside code blocks', () => {
const md = `Not a \`<br>\` tag.

\`\`\`
Also not a \`<br>\` tag.
\`\`\``;

const mdx = migrate(md);
expect(mdx).toMatchInlineSnapshot(`
"Not a \`<br>\` tag.

\`\`\`
Also not a \`<br>\` tag.
\`\`\`
"
`);
});
});
});
3 changes: 2 additions & 1 deletion lib/migrate.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import migrateCallouts from '../processor/transform/migrate-callouts';
import migrateHtmlTags from '../processor/transform/migrate-html-tags';
import migrateLinkReferences from '../processor/transform/migrate-link-references';

import mdastV6 from './mdastV6';
Expand All @@ -8,7 +9,7 @@ const migrate = (doc: string, { rdmd }): string => {
const ast = mdastV6(doc, { rdmd });

return (
mdx(ast, { remarkTransformers: [migrateCallouts, migrateLinkReferences], file: doc })
mdx(ast, { remarkTransformers: [migrateCallouts, migrateLinkReferences, migrateHtmlTags], file: doc })
.replaceAll(/&#x20;/g, ' ')
// @note: I'm not sure what's happening, but I think mdx is converting an
// 'a' to '&#x61;' as a means of escaping it. I think this helps with
Expand Down
74 changes: 39 additions & 35 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "@readme/markdown",
"description": "ReadMe's React-based Markdown parser",
"author": "Rafe Goldberg <rafe@readme.io>",
"version": "11.2.1",
"version": "11.4.0",
"main": "dist/main.node.js",
"types": "dist/index.d.ts",
"browser": "dist/main.js",
Expand Down
13 changes: 13 additions & 0 deletions processor/transform/migrate-html-tags.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import type { Root } from 'mdast';

import { visit } from 'unist-util-visit';

// Add more visits to migrate other HTML tags here
const migrateHtmlTags = () => (tree: Root) => {
// A common issue is that <br> tags are not properly closed
visit(tree, 'html', htmlNode => {
htmlNode.value = htmlNode.value.replaceAll(/<br(?!\s*\/>)([^>]*?)>/g, '<br$1 />');
});
};

export default migrateHtmlTags;