-
Notifications
You must be signed in to change notification settings - Fork 3.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: Refactor table tokens #2166
fix: Refactor table tokens #2166
Conversation
This pull request is being automatically deployed with Vercel (learn more). 🔍 Inspect: https://vercel.com/markedjs/markedjs/38ErXbTFie3utmH93Wg33w7gpLRQ |
This edge case is already handled within the splitCells function
…child/marked into RefactorTableCellTokens
Bonus! CodeQL found a Regex vulnerability for an edge case that we already handled in #2126 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
src/Tokenizer.js
Outdated
item.header.tokens[j] = []; | ||
this.lexer.inlineTokens(item.header.text[j], item.header.tokens[j]); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Now that I think about it the tokens
property here is an array of token arrays.
Maybe instead we should do:
{
type: 'table',
align: [null, null],
raw: '| a | b |\n|---|---|\n| 1 | 2 |\n',
header: {
items: [
{
text: 'a',
tokens: [{ type: 'text', raw: 'a', text: 'a' }],
},
{
text: 'b',
tokens: [{ type: 'text', raw: 'b', text: 'b' }],
}
]
},
rows: [ // replace `cells` with `rows`
{ // row 1
items: [
{
text: '1',
tokens: [{ type: 'text', raw: '1', text: '1' }],
},
{
text: '2',
tokens: [{ type: 'text', raw: '2', text: '2' }],
}
]
}
]
}
That seems to be more consistent with the rest of the tokens (including lists)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hm. Good point. I have a thought on this then:
Is it worth it to have header
and row
as objects with a single property items
? An object with a single property seems redundant and maybe slightly slows things with extra object accesses? What if instead header
and rows
are just arrays like items
is an array? So a List has Items
, a Table has Headers
and Rows
, but they use the same format of being an array of "sub-tokens" (with rows
being and array of arrays of sub-tokens):
{
type: 'table',
align: [null, null],
raw: '| a | b |\n|---|---|\n| 1 | 2 |\n',
header: [
{
text: 'a',
tokens: [{ type: 'text', raw: 'a', text: 'a' }],
},
{
text: 'b',
tokens: [{ type: 'text', raw: 'b', text: 'b' }],
}
],
rows: [ // replace `cells` with `rows`
[ // row 1
{
text: '1',
tokens: [{ type: 'text', raw: '1', text: '1' }],
},
{
text: '2',
tokens: [{ type: 'text', raw: '2', text: '2' }],
}
]
]
}
TLDR:
Instead of
Table
- which has a property of
header
*which has as sub-token ofitems
which seems like one level too deep.
- which has a property of
we could have:
Table
- which as some sub-tokens
header
.
- which as some sub-tokens
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That sounds good
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@UziTech This is now changed. Want another look at it?
224e0e2
to
3f57f4e
Compare
# [3.0.0](v2.1.3...v3.0.0) (2021-08-16) ### Bug Fixes * Add module field to package.json ([#2143](#2143)) ([edc2e6d](edc2e6d)) * drop node 10 support ([#2157](#2157)) ([433b16f](433b16f)) * Full Commonmark compliance for Lists ([#2112](#2112)) ([eb33d3b](eb33d3b)) * Refactor table tokens ([#2166](#2166)) ([bc400ac](bc400ac)) ### BREAKING CHANGES * - `table` tokens `header` property changed to contain an array of objects for each header cell with `text` and `tokens` properties. - `table` tokens `cells` property changed to `rows` and is an array of rows where each row contains an array of objects for each cell with `text` and `tokens` properties. v2: ```json { "type": "table", "align": [null, null], "raw": "| a | b |\n|---|---|\n| 1 | 2 |\n", "header": ["a", "b"], "cells": [["1", "2"]], "tokens": { "header": [ [{ "type": "text", "raw": "a", "text": "a" }], [{ "type": "text", "raw": "b", "text": "b" }] ], "cells": [[ [{ "type": "text", "raw": "1", "text": "1" }], [{ "type": "text", "raw": "2", "text": "2" }] ]] } } ``` v3: ```json { "type": "table", "align": [null, null], "raw": "| a | b |\n|---|---|\n| 1 | 2 |\n", "header": [ { "text": "a", "tokens": [{ "type": "text", "raw": "a", "text": "a" }] }, { "text": "b", "tokens": [{ "type": "text", "raw": "b", "text": "b" }] } ], "rows": [ { "text": "1", "tokens": [{ "type": "text", "raw": "1", "text": "1" }] }, { "text": "2", "tokens": [{ "type": "text", "raw": "2", "text": "2" }] } ] } ``` * Add module field to package.json * drop node 10 support
🎉 This PR is included in version 3.0.0 🎉 The release is available on: Your semantic-release bot 📦🚀 |
Pretty small change to address #2165.
header
andcells
are now formatted as "sub-tokens" (similar tolist items
in alist
) rather than having separateheaders
andtokens.headers
. This also means child tokens are now in atokens
property to follow the convention of the other lexer tokens for consistency.Changes the Table signature though so this is breaking and should be in V3.0
Previous token signature:
New token signature