Skip to content

Commit 5818f01

Browse files
committed
feat(markdown-transform): add table transforms
Signed-off-by: TC5022 <[email protected]>
1 parent ac06acd commit 5818f01

File tree

8 files changed

+287
-2
lines changed

8 files changed

+287
-2
lines changed

packages/markdown-common/lib/CommonMarkUtils.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,10 @@ function mkATXHeading(level) {
173173
return Array(level).fill('#').join('');
174174
}
175175

176+
function mkTableHeading(col) {
177+
return Array(col).fill("|---------").join("") + "|";
178+
}
179+
176180
/**
177181
* Adding escapes for text nodes
178182
* @param {string} input - unescaped
@@ -334,6 +338,7 @@ module.exports.mkNewLine = mkNewLine;
334338
module.exports.mkPrefix = mkPrefix;
335339
module.exports.mkSetextHeading = mkSetextHeading;
336340
module.exports.mkATXHeading = mkATXHeading;
341+
module.exports.mkTableHeading = mkTableHeading;
337342

338343
module.exports.escapeText = escapeText;
339344
module.exports.escapeCodeBlock = escapeCodeBlock;

packages/markdown-common/lib/fromcommonmarkrules.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,43 @@ rules.Document = (visitor,thing,children,parameters,resultString,resultSeq) => {
149149
resultSeq(parameters,result);
150150
};
151151

152+
rules.Table = (visitor,thing,children,parameters,resultString,resultSeq) => {
153+
const result = [children];
154+
resultSeq(parameters,result);
155+
};
156+
157+
rules.TableBody = (visitor,thing,children,parameters,resultString,resultSeq) => {
158+
const result = [children];
159+
resultSeq(parameters,result);
160+
};
161+
162+
rules.TableRow = (visitor,thing,children,parameters,resultString,resultSeq) => {
163+
const next1 = "|";
164+
const newLine = CommonMarkUtils.mkNewLine(parameters);
165+
const result = [children, resultString(next1), newLine];
166+
resultSeq(parameters,result);
167+
};
168+
169+
rules.TableCell = (visitor,thing,children,parameters,resultString,resultSeq) => {
170+
const next1 = "|";
171+
const next2 = ' ';
172+
const result = [resultString(next1),resultString(next2),children, resultString(next2)];
173+
resultSeq(parameters,result);
174+
};
175+
176+
rules.TableHead = (visitor,thing,children,parameters,resultString,resultSeq) => {
177+
const col = thing["nodes"][0]["nodes"].length;
178+
const next1 = CommonMarkUtils.mkTableHeading(col);
179+
const newLine = CommonMarkUtils.mkNewLine(parameters);
180+
const result = [children, resultString(next1), resultString(newLine)];
181+
resultSeq(parameters,result);
182+
};
183+
184+
rules.HeaderCell = (visitor,thing,children,parameters,resultString,resultSeq) => {
185+
const next1 = "|";
186+
const next2 = ' ';
187+
const result = [resultString(next1),resultString(next2),children, resultString(next2)];
188+
resultSeq(parameters,result);
189+
};
190+
152191
module.exports = rules;

packages/markdown-common/lib/tocommonmarkrules.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,96 @@ const listItemCloseRule = {
243243
close: true,
244244
};
245245

246+
const tableOpenRule = {
247+
tag: NS_PREFIX_CommonMarkModel + "Table",
248+
leaf: false,
249+
open: true,
250+
close: false,
251+
enter: (node, token, callback) => {},
252+
};
253+
254+
const tableCloseRule = {
255+
tag: NS_PREFIX_CommonMarkModel + "Table",
256+
leaf: false,
257+
open: false,
258+
close: true,
259+
};
260+
261+
const tableHeadOpenRule = {
262+
tag: NS_PREFIX_CommonMarkModel + "TableHead",
263+
leaf: false,
264+
open: true,
265+
close: false,
266+
enter: (node, token, callback) => {},
267+
};
268+
269+
const tableHeadCloseRule = {
270+
tag: NS_PREFIX_CommonMarkModel + "TableHead",
271+
leaf: false,
272+
open: false,
273+
close: true,
274+
};
275+
276+
const tableBodyOpenRule = {
277+
tag: NS_PREFIX_CommonMarkModel + "TableBody",
278+
leaf: false,
279+
open: true,
280+
close: false,
281+
enter: (node, token, callback) => {},
282+
};
283+
284+
const tableBodyCloseRule = {
285+
tag: NS_PREFIX_CommonMarkModel + "TableBody",
286+
leaf: false,
287+
open: false,
288+
close: true,
289+
};
290+
291+
const tableRowOpenRule = {
292+
tag: NS_PREFIX_CommonMarkModel + "TableRow",
293+
leaf: false,
294+
open: true,
295+
close: false,
296+
enter: (node, token, callback) => {},
297+
};
298+
299+
const tableRowCloseRule = {
300+
tag: NS_PREFIX_CommonMarkModel + "TableRow",
301+
leaf: false,
302+
open: false,
303+
close: true,
304+
};
305+
306+
const headerCellOpenRule = {
307+
tag: NS_PREFIX_CommonMarkModel + "HeaderCell",
308+
leaf: false,
309+
open: true,
310+
close: false,
311+
enter: (node, token, callback) => {},
312+
};
313+
314+
const headerCellCloseRule = {
315+
tag: NS_PREFIX_CommonMarkModel + "HeaderCell",
316+
leaf: false,
317+
open: false,
318+
close: true,
319+
};
320+
321+
const tableCellOpenRule = {
322+
tag: NS_PREFIX_CommonMarkModel + "TableCell",
323+
leaf: false,
324+
open: true,
325+
close: false,
326+
enter: (node, token, callback) => {},
327+
};
328+
329+
const tableCellCloseRule = {
330+
tag: NS_PREFIX_CommonMarkModel + "TableCell",
331+
leaf: false,
332+
open: false,
333+
close: true,
334+
};
335+
246336
const rules = { inlines: {}, blocks: {}};
247337
rules.inlines.text = textRule;
248338
rules.inlines.code_inline = codeInlineRule;
@@ -273,5 +363,17 @@ rules.blocks.ordered_list_open = orderedListOpenRule;
273363
rules.blocks.ordered_list_close = orderedListCloseRule;
274364
rules.blocks.list_item_open = listItemOpenRule;
275365
rules.blocks.list_item_close = listItemCloseRule;
366+
rules.blocks.table_open = tableOpenRule;
367+
rules.blocks.table_close = tableCloseRule;
368+
rules.blocks.thead_open = tableHeadOpenRule;
369+
rules.blocks.thead_close = tableHeadCloseRule;
370+
rules.blocks.tbody_open = tableBodyOpenRule;
371+
rules.blocks.tbody_close = tableBodyCloseRule;
372+
rules.blocks.tr_open = tableRowOpenRule;
373+
rules.blocks.tr_close = tableRowCloseRule;
374+
rules.blocks.th_open = headerCellOpenRule;
375+
rules.blocks.th_close = headerCellCloseRule;
376+
rules.blocks.td_open = tableCellOpenRule;
377+
rules.blocks.td_close = tableCellCloseRule;
276378

277379
module.exports = rules;

packages/markdown-html/src/ToHtmlStringVisitor.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,32 @@ class ToHtmlStringVisitor {
205205
case 'Item':
206206
parameters.result += `<li>${ToHtmlStringVisitor.visitChildren(this, thing)}</li>\n`;
207207
break;
208+
209+
case "Table":
210+
parameters.result += "\n";
211+
parameters.result += `<table>${ToHtmlStringVisitor.visitChildren(this, thing)}\n</table>\n`;
212+
break;
213+
214+
case "TableHead":
215+
parameters.result += `\n<thead>${ToHtmlStringVisitor.visitChildren(this,thing)}\n</thead>`;
216+
break;
217+
218+
case "TableBody":
219+
parameters.result += `\n<tbody>${ToHtmlStringVisitor.visitChildren(this,thing)}\n</tbody>`;
220+
break;
221+
222+
case "TableRow":
223+
parameters.result += `\n<tr>\n${ToHtmlStringVisitor.visitChildren(this,thing)}</tr>`;
224+
break;
225+
226+
case "TableCell":
227+
parameters.result += `<td>${ToHtmlStringVisitor.visitChildren(this,thing)}</td>\n`;
228+
break;
229+
230+
case "HeaderCell":
231+
parameters.result += `<th>${ToHtmlStringVisitor.visitChildren(this,thing)}</th>\n`;
232+
break;
233+
208234
case 'Document':
209235
parameters.result += `<html>\n<head><meta charset="UTF-8"></head>\n<body>\n<div class="document">\n${ToHtmlStringVisitor.visitChildren(this, thing)}</div>\n</body>\n</html>`;
210236
break;

packages/markdown-html/src/rules.js

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,47 @@ const HTML_BLOCK_RULE = {
500500
}
501501
};
502502

503+
const TABLE_RULE = {
504+
deserialize(el, next, ignoreSpace) {
505+
if (el.tagName && el.tagName.toLowerCase() === 'table') {
506+
return {
507+
$class: `${NS_PREFIX_CommonMarkModel}Table`,
508+
nodes: next(el.childNodes),
509+
};
510+
}
511+
if (el.tagName && el.tagName.toLowerCase() === "thead") {
512+
return {
513+
$class: `${NS_PREFIX_CommonMarkModel}TableHead`,
514+
nodes: next(el.childNodes),
515+
};
516+
}
517+
if (el.tagName && el.tagName.toLowerCase() === "tbody") {
518+
return {
519+
$class: `${NS_PREFIX_CommonMarkModel}TableBody`,
520+
nodes: next(el.childNodes),
521+
};
522+
}
523+
if (el.tagName && el.tagName.toLowerCase() === "tr") {
524+
return {
525+
$class: `${NS_PREFIX_CommonMarkModel}TableRow`,
526+
nodes: next(el.childNodes),
527+
};
528+
}
529+
if (el.tagName && el.tagName.toLowerCase() === "th") {
530+
return {
531+
$class: `${NS_PREFIX_CommonMarkModel}HeaderCell`,
532+
nodes: next(el.childNodes),
533+
};
534+
}
535+
if (el.tagName && el.tagName.toLowerCase() === "td") {
536+
return {
537+
$class: `${NS_PREFIX_CommonMarkModel}TableCell`,
538+
nodes: next(el.childNodes),
539+
};
540+
}
541+
}
542+
};
543+
503544
const rules = [
504545
LIST_RULE,
505546
PARAGRAPH_RULE,
@@ -520,7 +561,8 @@ const rules = [
520561
TEXT_RULE,
521562
HTML_INLINE_RULE,
522563
HTML_BLOCK_RULE,
523-
IMAGE_RULE
564+
IMAGE_RULE,
565+
TABLE_RULE
524566
];
525567

526568

packages/markdown-slate/lib/commonmarkfromslaterules.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,23 @@ rules.ol_list = (node,processNodes) => {
7878
rules.ul_list = (node,processNodes) => {
7979
return {$class : `${NS_PREFIX_CommonMarkModel}List`, type: 'bullet', delimiter: node.data.delimiter, start: node.data.start, tight: node.data.tight, nodes: []};
8080
};
81+
rules.table = (node, processNodes) => {
82+
return { $class: `${NS_PREFIX_CommonMarkModel}Table`, nodes: [] };
83+
};
84+
rules.table_head = (node, processNodes) => {
85+
return { $class: `${NS_PREFIX_CommonMarkModel}TableHead`, nodes: [] };
86+
};
87+
rules.table_body = (node, processNodes) => {
88+
return { $class: `${NS_PREFIX_CommonMarkModel}TableBody`, nodes: [] };
89+
};
90+
rules.table_row = (node, processNodes) => {
91+
return { $class: `${NS_PREFIX_CommonMarkModel}TableRow`, nodes: [] };
92+
};
93+
rules.table_cell = (node, processNodes) => {
94+
return { $class: `${NS_PREFIX_CommonMarkModel}TableCell`, nodes: [] };
95+
};
96+
rules.header_cell = (node, processNodes) => {
97+
return { $class: `${NS_PREFIX_CommonMarkModel}HeaderCell`, nodes: [] };
98+
};
8199

82100
module.exports = rules;

packages/markdown-slate/lib/commonmarktoslaterules.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,5 +174,58 @@ rules.Document = (thing,processChildren,parameters) => {
174174
data : {}
175175
};
176176
};
177+
rules.Table = (thing, processChildren, parameters) => {
178+
return {
179+
object: "block",
180+
type: "table",
181+
data: {},
182+
children: processChildren(thing, "nodes", parameters),
183+
};
184+
};
185+
186+
rules.TableHead = (thing, processChildren, parameters) => {
187+
return {
188+
object: "block",
189+
type: "table_head",
190+
data: {},
191+
children: processChildren(thing, "nodes", parameters),
192+
};
193+
};
194+
195+
rules.TableBody = (thing, processChildren, parameters) => {
196+
return {
197+
object: "block",
198+
type: "table_body",
199+
data: {},
200+
children: processChildren(thing, "nodes", parameters),
201+
};
202+
};
203+
204+
rules.TableRow = (thing, processChildren, parameters) => {
205+
return {
206+
object: "block",
207+
type: "table_row",
208+
data: {},
209+
children: processChildren(thing, "nodes", parameters),
210+
};
211+
};
212+
213+
rules.TableCell = (thing, processChildren, parameters) => {
214+
return {
215+
object: "block",
216+
type: "table_cell",
217+
data: {},
218+
children: processChildren(thing, "nodes", parameters),
219+
};
220+
};
221+
222+
rules.HeaderCell = (thing, processChildren, parameters) => {
223+
return {
224+
object: "block",
225+
type: "header_cell",
226+
data: {},
227+
children: processChildren(thing, "nodes", parameters),
228+
};
229+
};
177230

178231
module.exports = rules;

scripts/external/models.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"models": [
44
{ "name": "CommonMarkModel",
55
"namespace" : "org.accordproject.commonmark",
6-
"from": "https://models.accordproject.org/markdown/commonmark@0.2.0.cto",
6+
"from": "https://models.accordproject.org/markdown/commonmark@0.4.0.cto",
77
"js": "packages/markdown-common/lib/externalModels" },
88
{ "name": "ConcertoMetaModel",
99
"namespace" : "concerto.metamodel",

0 commit comments

Comments
 (0)