瀏覽代碼

Tidying

main
Rocketsoup 1 年之前
父節點
當前提交
3cf9199fe9
共有 1 個文件被更改,包括 148 次插入55 次删除
  1. 148
    55
      js/markdown.js

+ 148
- 55
js/markdown.js 查看文件

1
 // TODO: Linked image not parsed correctly.  [![](image.jpg)](link.html)
1
 // TODO: Linked image not parsed correctly.  [![](image.jpg)](link.html)
2
+// TODO: Referenced URL definitions
3
+// TODO: HTML tags probably need better handling. Consider whether interior of matched tags should be interpreted as markdown.
2
 // TODO: {.class #cssid lang=fr}
4
 // TODO: {.class #cssid lang=fr}
3
 //     # Header {.class}
5
 //     # Header {.class}
4
 //     Header {.class}
6
 //     Header {.class}
22
 	}
24
 	}
23
 
25
 
24
 	toString() {
26
 	toString() {
25
-		return `_MDHAlign.${this.name}`;
27
+		return `${this.constructor.name}.${this.name}`;
26
 	}
28
 	}
27
 
29
 
28
 	static toHTMLAttribute(align) {
30
 	static toHTMLAttribute(align) {
57
 
59
 
58
 	static META_AnyNonWhitespace = new _MDTokenType('METAAnyNonWhitespace');
60
 	static META_AnyNonWhitespace = new _MDTokenType('METAAnyNonWhitespace');
59
 
61
 
60
-	#name;
61
-
62
-	get name() {
63
-		return this.#name;
64
-	}
62
+	/** @var {String} */
63
+	name;
65
 
64
 
66
 	constructor(name) {
65
 	constructor(name) {
67
-		this.#name = name;
66
+		this.name = name;
68
 	}
67
 	}
69
 
68
 
70
 	toString() {
69
 	toString() {
71
-		return this.constructor.name + `.${this.#name}`;
70
+		return `${this.constructor.name}.${this.name}`;
72
 	}
71
 	}
73
 }
72
 }
74
-class _MDToken {
75
 
73
 
76
-	/** @var {String} */
74
+class _MDToken {
75
+	/**
76
+	 * The original token string.
77
+	 * @var {String}
78
+	 */
77
 	original;
79
 	original;
78
 	/** @var {_MDTokenType} */
80
 	/** @var {_MDTokenType} */
79
 	type;
81
 	type;
84
 	/** @var {_MDHTMLTag|null} */
86
 	/** @var {_MDHTMLTag|null} */
85
 	tag;
87
 	tag;
86
 
88
 
89
+	/**
90
+	 * @param {String} original
91
+	 * @param {_MDTokenType} type
92
+	 * @param {String|null} content
93
+	 * @param {String|null} extra
94
+	 * @param {_MDHTMLTag|null} tag
95
+	 */
87
 	constructor(original, type, content=null, extra=null, tag=null) {
96
 	constructor(original, type, content=null, extra=null, tag=null) {
88
 		this.original = original;
97
 		this.original = original;
89
 		this.type = type;
98
 		this.type = type;
98
 
107
 
99
 
108
 
100
 class _MDSpan {
109
 class _MDSpan {
110
+	/** @var {String[]} */
111
+	cssClasses = [];
112
+	/** @var {String|null} */
113
+	id = null;
114
+	/** @var {Object} */
115
+	attributes = {};
116
+
101
 	/**
117
 	/**
102
 	 * @param {_MDState} state
118
 	 * @param {_MDState} state
103
 	 * @returns {String} HTML
119
 	 * @returns {String} HTML
106
 		throw new Error(self.constructor.name + ".toHTML not implemented");
122
 		throw new Error(self.constructor.name + ".toHTML not implemented");
107
 	}
123
 	}
108
 
124
 
125
+	htmlAttributes() {
126
+		var html = '';
127
+		if (this.cssClasses.length > 0) {
128
+			html += ` class="${this.cssClasses.join(' ')}"`;
129
+		}
130
+		if (this.id !== null) {
131
+			html += ` id="${this.id}"`;
132
+		}
133
+		for (const name in this.attributes) {
134
+			let value = this.attributes[name];
135
+			html += ` ${name}="${value.replace('"', '"')}"`;
136
+		}
137
+		return html;
138
+	}
139
+
109
 	/**
140
 	/**
110
 	 * @param {_MDSpan[]} spans
141
 	 * @param {_MDSpan[]} spans
111
 	 * @param {_MDState} state
142
 	 * @param {_MDState} state
114
 		return spans.map((span) => span.toHTML(state)).join("");
145
 		return spans.map((span) => span.toHTML(state)).join("");
115
 	}
146
 	}
116
 }
147
 }
148
+
117
 class _MDMultiSpan extends _MDSpan {
149
 class _MDMultiSpan extends _MDSpan {
118
 	/** @var {_MDSpan[]} */
150
 	/** @var {_MDSpan[]} */
119
 	content;
151
 	content;
152
+
120
 	/**
153
 	/**
121
 	 * @param {_MDSpan[]} content
154
 	 * @param {_MDSpan[]} content
122
 	 */
155
 	 */
124
 		super();
157
 		super();
125
 		this.content = content;
158
 		this.content = content;
126
 	}
159
 	}
160
+
127
 	toHTML(state) {
161
 	toHTML(state) {
128
 		return _MDSpan.toHTML(this.content, state);
162
 		return _MDSpan.toHTML(this.content, state);
129
 	}
163
 	}
130
 }
164
 }
165
+
131
 class _MDTextSpan extends _MDSpan {
166
 class _MDTextSpan extends _MDSpan {
132
 	/** @param {String} text */
167
 	/** @param {String} text */
133
 	text;
168
 	text;
169
+
134
 	/**
170
 	/**
135
 	 * @param {String} text
171
 	 * @param {String} text
136
 	 */
172
 	 */
138
 		super();
174
 		super();
139
 		this.text = text;
175
 		this.text = text;
140
 	}
176
 	}
177
+
141
 	toHTML(state) {
178
 	toHTML(state) {
142
 		let html = this.text.replace('<', '&lt;');
179
 		let html = this.text.replace('<', '&lt;');
143
 		let abbrevs = state.abbreviations;
180
 		let abbrevs = state.abbreviations;
151
 		return html;
188
 		return html;
152
 	}
189
 	}
153
 }
190
 }
191
+
154
 class _MDHTMLSpan extends _MDSpan {
192
 class _MDHTMLSpan extends _MDSpan {
155
 	/** @param {String} html */
193
 	/** @param {String} html */
156
 	html;
194
 	html;
195
+
157
 	/**
196
 	/**
158
 	 * @param {String} html
197
 	 * @param {String} html
159
 	 */
198
 	 */
161
 		super();
200
 		super();
162
 		this.html = html;
201
 		this.html = html;
163
 	}
202
 	}
203
+
164
 	toHTML(state) {
204
 	toHTML(state) {
165
 		return this.html;
205
 		return this.html;
166
 	}
206
 	}
167
 }
207
 }
208
+
168
 class _MDLinkSpan extends _MDSpan {
209
 class _MDLinkSpan extends _MDSpan {
169
 	/** @var {String} */
210
 	/** @var {String} */
170
 	link;
211
 	link;
190
 			let escapedTarget = this.target.replace('"', '&quot;');
231
 			let escapedTarget = this.target.replace('"', '&quot;');
191
 			html += ` target="${escapedTarget}"`;
232
 			html += ` target="${escapedTarget}"`;
192
 		}
233
 		}
234
+		html += this.htmlAttributes();
193
 		html += '>' + this.content.toHTML(state) + '</a>';
235
 		html += '>' + this.content.toHTML(state) + '</a>';
194
 		return html;
236
 		return html;
195
 	}
237
 	}
196
 }
238
 }
239
+
197
 class _MDReferencedLinkSpan extends _MDLinkSpan {
240
 class _MDReferencedLinkSpan extends _MDLinkSpan {
198
 	/** @var {String} id */
241
 	/** @var {String} id */
199
 	id;
242
 	id;
243
+
200
 	constructor(id, content) {
244
 	constructor(id, content) {
201
 		super(null, content);
245
 		super(null, content);
202
 		this.id = id;
246
 		this.id = id;
203
 	}
247
 	}
248
+
204
 	toHTML(state) {
249
 	toHTML(state) {
205
 		if (this.link) {
250
 		if (this.link) {
206
 			return super.toHTML(state);
251
 			return super.toHTML(state);
210
 		}
255
 		}
211
 	}
256
 	}
212
 }
257
 }
258
+
213
 class _MDEmphasisSpan extends _MDSpan {
259
 class _MDEmphasisSpan extends _MDSpan {
214
-	/** @var {_MDSpan} content */
260
+	/** @var {_MDSpan} */
215
 	#content;
261
 	#content;
262
+
216
 	/**
263
 	/**
217
 	 * @param {_MDSpan} content
264
 	 * @param {_MDSpan} content
218
 	 */
265
 	 */
220
 		super();
267
 		super();
221
 		this.#content = content;
268
 		this.#content = content;
222
 	}
269
 	}
270
+
223
 	toHTML(state) {
271
 	toHTML(state) {
224
 		let contentHTML = this.#content.toHTML(state);
272
 		let contentHTML = this.#content.toHTML(state);
225
-		return `<em>${contentHTML}</em>`;
273
+		return `<em${this.htmlAttributes()}>${contentHTML}</em>`;
226
 	}
274
 	}
227
 }
275
 }
276
+
228
 class _MDStrongSpan extends _MDSpan {
277
 class _MDStrongSpan extends _MDSpan {
229
 	/** @var {_MDSpan} content */
278
 	/** @var {_MDSpan} content */
230
 	#content;
279
 	#content;
280
+
231
 	/**
281
 	/**
232
 	 * @param {_MDSpan} content
282
 	 * @param {_MDSpan} content
233
 	 */
283
 	 */
235
 		super();
285
 		super();
236
 		this.#content = content;
286
 		this.#content = content;
237
 	}
287
 	}
288
+
238
 	toHTML(state) {
289
 	toHTML(state) {
239
 		let contentHTML = this.#content.toHTML(state);
290
 		let contentHTML = this.#content.toHTML(state);
240
-		return `<strong>${contentHTML}</strong>`;
291
+		return `<strong${this.htmlAttributes()}>${contentHTML}</strong>`;
241
 	}
292
 	}
242
 }
293
 }
294
+
243
 class _MDStrikethroughSpan extends _MDSpan {
295
 class _MDStrikethroughSpan extends _MDSpan {
244
 	/** @var {_MDSpan} content */
296
 	/** @var {_MDSpan} content */
245
 	#content;
297
 	#content;
298
+
246
 	/**
299
 	/**
247
 	 * @param {_MDSpan} content
300
 	 * @param {_MDSpan} content
248
 	 */
301
 	 */
250
 		super();
303
 		super();
251
 		this.#content = content;
304
 		this.#content = content;
252
 	}
305
 	}
306
+
253
 	toHTML(state) {
307
 	toHTML(state) {
254
 		let contentHTML = this.#content.toHTML(state);
308
 		let contentHTML = this.#content.toHTML(state);
255
-		return `<strike>${contentHTML}</strike>`;
309
+		return `<strike${this.htmlAttributes()}>${contentHTML}</strike>`;
256
 	}
310
 	}
257
 }
311
 }
312
+
258
 class _MDCodeSpan extends _MDSpan {
313
 class _MDCodeSpan extends _MDSpan {
259
 	/** @var {_MDSpan} content */
314
 	/** @var {_MDSpan} content */
260
 	#content;
315
 	#content;
316
+
261
 	/**
317
 	/**
262
 	 * @param {_MDSpan} content
318
 	 * @param {_MDSpan} content
263
 	 */
319
 	 */
265
 		super();
321
 		super();
266
 		this.#content = content;
322
 		this.#content = content;
267
 	}
323
 	}
324
+
268
 	toHTML(state) {
325
 	toHTML(state) {
269
 		let contentHTML = this.#content.toHTML(state);
326
 		let contentHTML = this.#content.toHTML(state);
270
-		return `<code>${contentHTML}</code>`;
327
+		return `<code${this.htmlAttributes()}>${contentHTML}</code>`;
271
 	}
328
 	}
272
 }
329
 }
330
+
273
 class _MDImageSpan extends _MDSpan {
331
 class _MDImageSpan extends _MDSpan {
274
 	/** @var {String} */
332
 	/** @var {String} */
275
 	source;
333
 	source;
277
 	alt;
335
 	alt;
278
 	/** @var {String|null} */
336
 	/** @var {String|null} */
279
 	title;
337
 	title;
338
+
280
 	/**
339
 	/**
281
 	 * @param {String} source
340
 	 * @param {String} source
282
 	 */
341
 	 */
286
 		this.alt = alt;
345
 		this.alt = alt;
287
 		this.title = title;
346
 		this.title = title;
288
 	}
347
 	}
348
+
289
 	toHTML(state) {
349
 	toHTML(state) {
290
 		let escapedSource = this.source.replace('"', '&quot;');
350
 		let escapedSource = this.source.replace('"', '&quot;');
291
 		let html = `<img src="${escapedSource}"`;
351
 		let html = `<img src="${escapedSource}"`;
297
 			let titleEscaped = this.title.replace('"', '&quot;');
357
 			let titleEscaped = this.title.replace('"', '&quot;');
298
 			html += ` title="${titleEscaped}"`;
358
 			html += ` title="${titleEscaped}"`;
299
 		}
359
 		}
360
+		html += this.htmlAttributes();
300
 		html += '>';
361
 		html += '>';
301
 		return html;
362
 		return html;
302
 	}
363
 	}
303
 }
364
 }
365
+
304
 class _MDReferencedImageSpan extends _MDImageSpan {
366
 class _MDReferencedImageSpan extends _MDImageSpan {
305
 	/** @var {String} */
367
 	/** @var {String} */
306
 	id;
368
 	id;
369
+
307
 	/**
370
 	/**
308
 	 * @param {String} id
371
 	 * @param {String} id
309
 	 */
372
 	 */
311
 		super(null, alt);
374
 		super(null, alt);
312
 		this.id = id;
375
 		this.id = id;
313
 	}
376
 	}
377
+
314
 	toHTML(state) {
378
 	toHTML(state) {
315
 		if (this.source) {
379
 		if (this.source) {
316
 			return super.toHTML(state);
380
 			return super.toHTML(state);
321
 		}
385
 		}
322
 	}
386
 	}
323
 }
387
 }
388
+
324
 class _MDFootnoteReferenceSpan extends _MDSpan {
389
 class _MDFootnoteReferenceSpan extends _MDSpan {
325
 	/** @var {String} */
390
 	/** @var {String} */
326
 	symbol;
391
 	symbol;
392
+
327
 	/**
393
 	/**
328
 	 * @param {String} symbol
394
 	 * @param {String} symbol
329
 	 */
395
 	 */
331
 		super();
397
 		super();
332
 		this.symbol = symbol;
398
 		this.symbol = symbol;
333
 	}
399
 	}
400
+
334
 	toHTML(state) {
401
 	toHTML(state) {
335
-		return `<!--FNREF:{${this.symbol}}-->`
336
-	}
337
-}
338
-class _MDAbbreviationSpan extends _MDSpan {
339
-	/** @var {String} */
340
-	abbreviation;
341
-	/** @var {String|null} definition */
342
-	definition;
343
-	/**
344
-	 * @param {String} abbreviation
345
-	 * @param {String|null} definition
346
-	 */
347
-	constructor(abbreviation, definition=null) {
348
-		super();
349
-		this.abbreviation = abbreviation;
350
-		this.definition = definition;
351
-	}
352
-	toHTML(state) {
353
-		let definitionEscaped = this.definition.replace('"', '&quot;');
354
-		return `<abbr title="${definitionEscaped}">${this.abbreviation}</em>`;
402
+		return `<!--FNREF:{${this.symbol}}-->`;
355
 	}
403
 	}
356
 }
404
 }
357
 
405
 
360
 
408
 
361
 
409
 
362
 class _MDBlock {
410
 class _MDBlock {
411
+	/** @var {String[]} */
412
+	cssClasses = [];
413
+	/** @var {String|null} */
414
+	id = null;
415
+	/** @var {Object} */
416
+	attributes = {};
417
+
363
 	/**
418
 	/**
364
 	 * @param {_MDState} state
419
 	 * @param {_MDState} state
365
 	 */
420
 	 */
367
 		throw new Error(self.constructor.name + ".toHTML not implemented");
422
 		throw new Error(self.constructor.name + ".toHTML not implemented");
368
 	}
423
 	}
369
 
424
 
425
+	htmlAttributes() {
426
+		var html = '';
427
+		if (this.cssClasses.length > 0) {
428
+			html += ` class="${this.cssClasses.join(' ')}"`;
429
+		}
430
+		if (this.id !== null) {
431
+			html += ` id="${this.id}"`;
432
+		}
433
+		for (const name in this.attributes) {
434
+			let value = this.attributes[name];
435
+			html += ` ${name}="${value.replace('"', '&quot;')}"`;
436
+		}
437
+		return html;
438
+	}
439
+
370
 	/**
440
 	/**
371
 	 * @param {_MDBlock[]} blocks
441
 	 * @param {_MDBlock[]} blocks
372
 	 * @param {_MDState} state
442
 	 * @param {_MDState} state
406
 
476
 
407
 	toHTML(state) {
477
 	toHTML(state) {
408
 		let contentHTML = this.content.toHTML(state);
478
 		let contentHTML = this.content.toHTML(state);
409
-		return `<p>${contentHTML}</p>\n`;
479
+		return `<p${this.htmlAttributes()}>${contentHTML}</p>\n`;
410
 	}
480
 	}
411
 }
481
 }
412
 
482
 
428
 
498
 
429
 	toHTML(state) {
499
 	toHTML(state) {
430
 		let contentHTML = this.content.toHTML(state);
500
 		let contentHTML = this.content.toHTML(state);
431
-		return `<h${this.level}>${contentHTML}</h${this.level}>\n`;
501
+		return `<h${this.level}${this.htmlAttributes()}>${contentHTML}</h${this.level}>\n`;
432
 	}
502
 	}
433
 }
503
 }
434
 
504
 
435
 class _MDBlockquoteBlock extends _MDBlock {
505
 class _MDBlockquoteBlock extends _MDBlock {
436
 	/** @var {_MDBlock[]} */
506
 	/** @var {_MDBlock[]} */
437
 	content;
507
 	content;
508
+
438
 	/**
509
 	/**
439
 	 * @param {_MDBlock[]} content
510
 	 * @param {_MDBlock[]} content
440
 	 */
511
 	 */
442
 		super();
513
 		super();
443
 		this.content = content;
514
 		this.content = content;
444
 	}
515
 	}
516
+
445
 	toHTML(state) {
517
 	toHTML(state) {
446
 		let contentHTML = _MDBlock.toHTML(this.content, state);
518
 		let contentHTML = _MDBlock.toHTML(this.content, state);
447
-		return `<blockquote>\n${contentHTML}\n</blockquote>`;
519
+		return `<blockquote${this.htmlAttributes()}>\n${contentHTML}\n</blockquote>`;
448
 	}
520
 	}
449
 }
521
 }
450
 
522
 
451
 class _MDUnorderedListBlock extends _MDBlock {
523
 class _MDUnorderedListBlock extends _MDBlock {
452
 	/** @var {_MDListItemBlock[]} */
524
 	/** @var {_MDListItemBlock[]} */
453
 	items;
525
 	items;
526
+
454
 	/**
527
 	/**
455
 	 * @param {_MDListItemBlock[]} items
528
 	 * @param {_MDListItemBlock[]} items
456
 	 */
529
 	 */
458
 		super();
531
 		super();
459
 		this.items = items;
532
 		this.items = items;
460
 	}
533
 	}
534
+
461
 	toHTML(state) {
535
 	toHTML(state) {
462
 		let contentHTML = _MDBlock.toHTML(this.items, state);
536
 		let contentHTML = _MDBlock.toHTML(this.items, state);
463
-		return `<ul>\n${contentHTML}\n</ul>`;
537
+		return `<ul${this.htmlAttributes()}>\n${contentHTML}\n</ul>`;
464
 	}
538
 	}
465
 }
539
 }
466
 
540
 
467
 class _MDOrderedListBlock extends _MDBlock {
541
 class _MDOrderedListBlock extends _MDBlock {
468
 	/** @var {_MDListItemBlock[]} */
542
 	/** @var {_MDListItemBlock[]} */
469
 	items;
543
 	items;
544
+
470
 	/**
545
 	/**
471
 	 * @param {_MDListItemBlock[]} items
546
 	 * @param {_MDListItemBlock[]} items
472
 	 */
547
 	 */
474
 		super();
549
 		super();
475
 		this.items = items;
550
 		this.items = items;
476
 	}
551
 	}
552
+
477
 	toHTML(state) {
553
 	toHTML(state) {
478
 		let contentHTML = _MDBlock.toHTML(this.items, state);
554
 		let contentHTML = _MDBlock.toHTML(this.items, state);
479
-		return `<ol>\n${contentHTML}\n</ol>`;
555
+		return `<ol${this.htmlAttributes()}>\n${contentHTML}\n</ol>`;
480
 	}
556
 	}
481
 }
557
 }
482
 
558
 
494
 
570
 
495
 	toHTML(state) {
571
 	toHTML(state) {
496
 		let contentHTML = this.content.toHTML(state);
572
 		let contentHTML = this.content.toHTML(state);
497
-		return `<li>${contentHTML}</li>`;
573
+		return `<li${this.htmlAttributes()}>${contentHTML}</li>`;
498
 	}
574
 	}
499
 }
575
 }
500
 
576
 
501
 class _MDCodeBlock extends _MDBlock {
577
 class _MDCodeBlock extends _MDBlock {
502
 	/** @var {String} */
578
 	/** @var {String} */
503
 	#code;
579
 	#code;
580
+
504
 	/**
581
 	/**
505
 	 * @param {String} code
582
 	 * @param {String} code
506
 	 */
583
 	 */
508
 		super();
585
 		super();
509
 		this.#code = code;
586
 		this.#code = code;
510
 	}
587
 	}
588
+
511
 	toHTML(state) {
589
 	toHTML(state) {
512
-		return `<pre><code>${this.#code}</code></pre>`;
590
+		return `<pre${this.htmlAttributes()}><code>${this.#code}</code></pre>`;
513
 	}
591
 	}
514
 }
592
 }
515
 
593
 
516
 class _MDHorizontalRuleBlock extends _MDBlock {
594
 class _MDHorizontalRuleBlock extends _MDBlock {
517
 	toHTML(state) {
595
 	toHTML(state) {
518
-		return "<hr>\n";
596
+		return `<hr${this.htmlAttributes()}>\n`;
519
 	}
597
 	}
520
 }
598
 }
521
 
599
 
524
 	#content;
602
 	#content;
525
 	/** @var {_MDHAlign|null} */
603
 	/** @var {_MDHAlign|null} */
526
 	align = null;
604
 	align = null;
605
+
527
 	/**
606
 	/**
528
 	 * @param {_MDBlock} content
607
 	 * @param {_MDBlock} content
529
 	 */
608
 	 */
531
 		super();
610
 		super();
532
 		this.#content = content;
611
 		this.#content = content;
533
 	}
612
 	}
613
+
614
+	htmlAttributes() {
615
+		var html = super.htmlAttributes();
616
+		html += _MDHAlign.toHTMLAttribute(this.align);
617
+		return html;
618
+	}
619
+
534
 	toHTML(state) {
620
 	toHTML(state) {
535
 		let contentHTML = this.#content.toHTML(state);
621
 		let contentHTML = this.#content.toHTML(state);
536
-		let alignAttribute = _MDHAlign.toHTMLAttribute(this.align);
537
-		return `<td${alignAttribute}>${contentHTML}</td>`;
622
+		return `<td${this.htmlAttributes()}>${contentHTML}</td>`;
538
 	}
623
 	}
539
 }
624
 }
540
 
625
 
549
 class _MDTableRowBlock extends _MDBlock {
634
 class _MDTableRowBlock extends _MDBlock {
550
 	/** @var {_MDTableCellBlock[]|_MDTableHeaderCellBlock[]} */
635
 	/** @var {_MDTableCellBlock[]|_MDTableHeaderCellBlock[]} */
551
 	#cells;
636
 	#cells;
637
+
552
 	/**
638
 	/**
553
 	 * @param {_MDTableCellBlock[]|_MDTableHeaderCellBlock[]} cells
639
 	 * @param {_MDTableCellBlock[]|_MDTableHeaderCellBlock[]} cells
554
 	 */
640
 	 */
556
 		super();
642
 		super();
557
 		this.#cells = cells;
643
 		this.#cells = cells;
558
 	}
644
 	}
645
+
559
 	/**
646
 	/**
560
 	 * @param {_MDHAlign[]} alignments
647
 	 * @param {_MDHAlign[]} alignments
561
 	 */
648
 	 */
566
 			cell.align = align;
653
 			cell.align = align;
567
 		}
654
 		}
568
 	}
655
 	}
656
+
569
 	toHTML(state) {
657
 	toHTML(state) {
570
 		let cellsHTML = _MDBlock.toHTML(this.#cells, state);
658
 		let cellsHTML = _MDBlock.toHTML(this.#cells, state);
571
-		return `<tr>\n${cellsHTML}\n</tr>`;
659
+		return `<tr${this.htmlAttributes()}>\n${cellsHTML}\n</tr>`;
572
 	}
660
 	}
573
 }
661
 }
574
 
662
 
577
 	#headerRow;
665
 	#headerRow;
578
 	/** @var {_MDTableRowBlock[]} */
666
 	/** @var {_MDTableRowBlock[]} */
579
 	#bodyRows;
667
 	#bodyRows;
668
+
580
 	/**
669
 	/**
581
 	 * @param {_MDTableRowBlock} headerRow
670
 	 * @param {_MDTableRowBlock} headerRow
582
 	 * @param {_MDTableRowBlock[]} bodyRows
671
 	 * @param {_MDTableRowBlock[]} bodyRows
586
 		this.#headerRow = headerRow;
675
 		this.#headerRow = headerRow;
587
 		this.#bodyRows = bodyRows;
676
 		this.#bodyRows = bodyRows;
588
 	}
677
 	}
678
+
589
 	toHTML(state) {
679
 	toHTML(state) {
590
 		let headerRowHTML = this.#headerRow.toHTML(state);
680
 		let headerRowHTML = this.#headerRow.toHTML(state);
591
 		let bodyRowsHTML = _MDBlock.toHTML(this.#bodyRows, state);
681
 		let bodyRowsHTML = _MDBlock.toHTML(this.#bodyRows, state);
592
-		return `<table>\n<thead>\n${headerRowHTML}\n</thead>\n<tbody>\n${bodyRowsHTML}\n</tbody>\n</table>`;
682
+		return `<table${this.htmlAttributes()}>\n<thead>\n${headerRowHTML}\n</thead>\n<tbody>\n${bodyRowsHTML}\n</tbody>\n</table>`;
593
 	}
683
 	}
594
 }
684
 }
595
 
685
 
596
 class _MDDefinitionListBlock extends _MDBlock {
686
 class _MDDefinitionListBlock extends _MDBlock {
597
 	/** @var {_MDBlock[]} */
687
 	/** @var {_MDBlock[]} */
598
 	#content;
688
 	#content;
689
+
599
 	/**
690
 	/**
600
 	 * @param {_MDBlock[]} content
691
 	 * @param {_MDBlock[]} content
601
 	 */
692
 	 */
603
 		super();
694
 		super();
604
 		this.#content = content;
695
 		this.#content = content;
605
 	}
696
 	}
697
+
606
 	toHTML(state) {
698
 	toHTML(state) {
607
 		let contentHTML = _MDBlock.toHTML(this.#content, state);
699
 		let contentHTML = _MDBlock.toHTML(this.#content, state);
608
-		return `<dl>\n${contentHTML}\n</dl>`;
700
+		return `<dl${this.htmlAttributes()}>\n${contentHTML}\n</dl>`;
609
 	}
701
 	}
610
 }
702
 }
611
 
703
 
612
 class _MDDefinitionTermBlock extends _MDBlock {
704
 class _MDDefinitionTermBlock extends _MDBlock {
613
 	/** @var {_MDBlock} */
705
 	/** @var {_MDBlock} */
614
 	#content;
706
 	#content;
707
+
615
 	/**
708
 	/**
616
 	 * @param {_MDBlock} content
709
 	 * @param {_MDBlock} content
617
 	 */
710
 	 */
619
 		super();
712
 		super();
620
 		this.#content = content;
713
 		this.#content = content;
621
 	}
714
 	}
715
+
622
 	toHTML(state) {
716
 	toHTML(state) {
623
 		let contentHTML = this.#content.toHTML(state);
717
 		let contentHTML = this.#content.toHTML(state);
624
-		return `<dt>${contentHTML}</dt>`;
718
+		return `<dt${this.htmlAttributes()}>${contentHTML}</dt>`;
625
 	}
719
 	}
626
 }
720
 }
627
 
721
 
628
 class _MDDefinitionDefinitionBlock extends _MDBlock {
722
 class _MDDefinitionDefinitionBlock extends _MDBlock {
629
 	/** @var {_MDBlock} */
723
 	/** @var {_MDBlock} */
630
 	#content;
724
 	#content;
725
+
631
 	/**
726
 	/**
632
 	 * @param {_MDBlock} content
727
 	 * @param {_MDBlock} content
633
 	 */
728
 	 */
635
 		super();
730
 		super();
636
 		this.#content = content;
731
 		this.#content = content;
637
 	}
732
 	}
733
+
638
 	toHTML(state) {
734
 	toHTML(state) {
639
 		let contentHTML = this.#content.toHTML(state);
735
 		let contentHTML = this.#content.toHTML(state);
640
-		return `<dd>${contentHTML}</dd>`;
736
+		return `<dd${this.htmlAttributes()}>${contentHTML}</dd>`;
641
 	}
737
 	}
642
 }
738
 }
643
 
739
 
644
 class _MDInlineBlock extends _MDBlock {
740
 class _MDInlineBlock extends _MDBlock {
645
 	/** @var {_MDSpan[]} */
741
 	/** @var {_MDSpan[]} */
646
 	#content;
742
 	#content;
743
+
647
 	/**
744
 	/**
648
 	 * @param {_MDSpan[]} content
745
 	 * @param {_MDSpan[]} content
649
 	 */
746
 	 */
758
 	}
855
 	}
759
 }
856
 }
760
 
857
 
761
-class MDConfig {
762
-
763
-}
764
-
765
 class Markdown {
858
 class Markdown {
766
 	/**
859
 	/**
767
 	 * @param {String} line
860
 	 * @param {String} line
1781
 	 * @param  {String} markdown
1874
 	 * @param  {String} markdown
1782
 	 * @returns {String} HTML
1875
 	 * @returns {String} HTML
1783
 	 */
1876
 	 */
1784
-	static toHTML(markdown, config=new MDConfig()) {
1877
+	static toHTML(markdown) {
1785
 		var state = new _MDState();
1878
 		var state = new _MDState();
1786
 		let lines = markdown.split(/(?:\n|\r|\r\n)/);
1879
 		let lines = markdown.split(/(?:\n|\r|\r\n)/);
1787
 		state.lines = lines;
1880
 		state.lines = lines;

Loading…
取消
儲存