-
Notifications
You must be signed in to change notification settings - Fork 3.5k
fix: Refactor table tokens #2166
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
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 |
UziTech
left a comment
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 ofitemswhich 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.
headerandcellsare now formatted as "sub-tokens" (similar tolist itemsin alist) rather than having separateheadersandtokens.headers. This also means child tokens are now in atokensproperty 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