|
|
@@ -22,16 +22,6 @@
|
|
22
|
22
|
background-color: var(--color-background);
|
|
23
|
23
|
color: var(--color-text);
|
|
24
|
24
|
}
|
|
25
|
|
-/* body {
|
|
26
|
|
- width: 87.5%;
|
|
27
|
|
- margin-left: auto;
|
|
28
|
|
- margin-right: auto;
|
|
29
|
|
- padding-left: 12.5%;
|
|
30
|
|
- background-color: #fffff8;
|
|
31
|
|
- color: #111;
|
|
32
|
|
- max-width: 1400px;
|
|
33
|
|
- counter-reset: sidenote-counter;
|
|
34
|
|
-} */
|
|
35
|
25
|
.inputhalf {
|
|
36
|
26
|
position: absolute;
|
|
37
|
27
|
width: 50%;
|
|
|
@@ -54,15 +44,44 @@
|
|
54
|
44
|
margin: 0 auto;
|
|
55
|
45
|
max-width: 600px;
|
|
56
|
46
|
}
|
|
|
47
|
+ .toolbar {
|
|
|
48
|
+ position: absolute;
|
|
|
49
|
+ z-index: 1;
|
|
|
50
|
+ background-color: #eee;
|
|
|
51
|
+ min-height: 32px;
|
|
|
52
|
+ /* max-height: 300px; */
|
|
|
53
|
+ width: 100%;
|
|
|
54
|
+ color: black;
|
|
|
55
|
+ border-bottom: 1px solid black;
|
|
|
56
|
+ box-sizing: border-box;
|
|
|
57
|
+ padding: 4px 20px;
|
|
|
58
|
+ }
|
|
|
59
|
+ #readercontainer {
|
|
|
60
|
+ overflow-y: scroll;
|
|
|
61
|
+ }
|
|
|
62
|
+ .reader-header {
|
|
|
63
|
+ margin-top: 0.25em;
|
|
|
64
|
+ font-weight: bold;
|
|
|
65
|
+ }
|
|
|
66
|
+ .reader-check {
|
|
|
67
|
+ display: inline-block;
|
|
|
68
|
+ padding: 4px 8px;
|
|
|
69
|
+ border: 1px dotted gray;
|
|
|
70
|
+ margin: 4px;
|
|
|
71
|
+ }
|
|
57
|
72
|
#markdowninput {
|
|
|
73
|
+ position: absolute;
|
|
|
74
|
+ top: 32px;
|
|
|
75
|
+ margin-top: 32px;
|
|
58
|
76
|
width: 100%;
|
|
59
|
|
- height: 100%;
|
|
|
77
|
+ height: calc(100% - 32px);
|
|
60
|
78
|
box-sizing: border-box;
|
|
61
|
79
|
margin: 0;
|
|
62
|
80
|
padding: 0.5em;
|
|
63
|
81
|
border: 0;
|
|
64
|
82
|
background-color: var(--color-editor-background);
|
|
65
|
83
|
color: var(--color-editor-text);
|
|
|
84
|
+ box-sizing: border-box;
|
|
66
|
85
|
}
|
|
67
|
86
|
.calculated {
|
|
68
|
87
|
background-color: var(--color-calculated-background);
|
|
|
@@ -203,6 +222,7 @@
|
|
203
|
222
|
var parser = new Markdown([ ...Markdown.allReaders, new MDSpreadsheetReader() ]);
|
|
204
|
223
|
function onDocumentLoad() {
|
|
205
|
224
|
document.getElementById('markdowninput').addEventListener('input', onMarkdownChange);
|
|
|
225
|
+ populateReaderCheckboxes();
|
|
206
|
226
|
setTimeout(onMarkdownChange, 0);
|
|
207
|
227
|
}
|
|
208
|
228
|
function onMarkdownChange() {
|
|
|
@@ -210,6 +230,94 @@
|
|
210
|
230
|
let html = parser.toHTML(markdown);
|
|
211
|
231
|
document.getElementById('preview').innerHTML = html;
|
|
212
|
232
|
}
|
|
|
233
|
+ var blockReaderClasses = {
|
|
|
234
|
+ 'Heading (underline)': MDUnderlinedHeadingReader,
|
|
|
235
|
+ 'Heading (hash)': MDHashHeadingReader,
|
|
|
236
|
+ 'Subtext': MDSubtextReader,
|
|
|
237
|
+ 'Block quote': MDBlockQuoteReader,
|
|
|
238
|
+ 'Unordered list': MDUnorderedListReader,
|
|
|
239
|
+ 'Ordered list': MDOrderedListReader,
|
|
|
240
|
+ 'Code block (fenced)': MDFencedCodeBlockReader,
|
|
|
241
|
+ 'Code block (indented)': MDIndentedCodeBlockReader,
|
|
|
242
|
+ 'Horizontal rule': MDHorizontalRuleReader,
|
|
|
243
|
+ 'Table': MDTableReader,
|
|
|
244
|
+ 'Definition list': MDDefinitionListReader,
|
|
|
245
|
+ 'Paragraph': MDParagraphReader,
|
|
|
246
|
+ 'Spreadsheets': MDSpreadsheetReader,
|
|
|
247
|
+ };
|
|
|
248
|
+ var inlineReaderClasses = {
|
|
|
249
|
+ 'Emphasis': MDEmphasisReader,
|
|
|
250
|
+ 'Strong': MDStrongReader,
|
|
|
251
|
+ 'Strikethrough': MDStrikethroughReader,
|
|
|
252
|
+ 'Underline': MDUnderlineReader,
|
|
|
253
|
+ 'Highlight': MDHighlightReader,
|
|
|
254
|
+ 'Links': MDLinkReader,
|
|
|
255
|
+ 'Referenced links': MDReferencedLinkReader,
|
|
|
256
|
+ 'Images': MDImageReader,
|
|
|
257
|
+ 'Referenced images': MDReferencedImageReader,
|
|
|
258
|
+ 'Code span': MDCodeSpanReader,
|
|
|
259
|
+ 'Subscript': MDSubscriptReader,
|
|
|
260
|
+ 'Superscript': MDSuperscriptReader,
|
|
|
261
|
+ 'Footnotes': MDFootnoteReader,
|
|
|
262
|
+ 'Abbrevations': MDAbbreviationReader,
|
|
|
263
|
+ 'HTML tags': MDHTMLTagReader,
|
|
|
264
|
+ 'Modifiers': MDModifierReader,
|
|
|
265
|
+ };
|
|
|
266
|
+ var activeReaders = [];
|
|
|
267
|
+ function populateReaderCheckboxes() {
|
|
|
268
|
+ const container = document.getElementById('readercontainer');
|
|
|
269
|
+ var header = document.createElement('div');
|
|
|
270
|
+ header.classList.add('reader-header');
|
|
|
271
|
+ header.append(document.createTextNode('Block Readers'));
|
|
|
272
|
+ container.append(header);
|
|
|
273
|
+ const blockContainer = document.createElement('div');
|
|
|
274
|
+ container.append(blockContainer);
|
|
|
275
|
+ for (const name of Object.keys(blockReaderClasses).sort()) {
|
|
|
276
|
+ const readerClass = blockReaderClasses[name];
|
|
|
277
|
+ activeReaders.push(new readerClass());
|
|
|
278
|
+ const checkbox = makeReaderCheckbox(name, readerClass);
|
|
|
279
|
+ blockContainer.append(checkbox);
|
|
|
280
|
+ }
|
|
|
281
|
+ header = document.createElement('div');
|
|
|
282
|
+ header.classList.add('reader-header');
|
|
|
283
|
+ header.append(document.createTextNode('Inline Readers'));
|
|
|
284
|
+ container.append(header);
|
|
|
285
|
+ const inlineContainer = document.createElement('div');
|
|
|
286
|
+ container.append(inlineContainer);
|
|
|
287
|
+ for (const name of Object.keys(inlineReaderClasses).sort()) {
|
|
|
288
|
+ const readerClass = inlineReaderClasses[name];
|
|
|
289
|
+ activeReaders.push(new readerClass());
|
|
|
290
|
+ const checkbox = makeReaderCheckbox(name, readerClass);
|
|
|
291
|
+ inlineContainer.append(checkbox);
|
|
|
292
|
+ }
|
|
|
293
|
+ }
|
|
|
294
|
+ function makeReaderCheckbox(name, readerClass) {
|
|
|
295
|
+ const check = document.createElement('input');
|
|
|
296
|
+ check.type = 'checkbox';
|
|
|
297
|
+ check.checked = true;
|
|
|
298
|
+ check.addEventListener('change', () => {
|
|
|
299
|
+ handleCheckChanged(readerClass, check);
|
|
|
300
|
+ });
|
|
|
301
|
+ check.id = `reader-${readerClass.name}`;
|
|
|
302
|
+ const label = document.createElement('label');
|
|
|
303
|
+ label.htmlFor = check.id;
|
|
|
304
|
+ label.append(document.createTextNode(name));
|
|
|
305
|
+ const div = document.createElement('div');
|
|
|
306
|
+ div.classList.add('reader-check');
|
|
|
307
|
+ div.append(check);
|
|
|
308
|
+ div.append(label);
|
|
|
309
|
+ return div;
|
|
|
310
|
+ }
|
|
|
311
|
+ function handleCheckChanged(readerClass, check) {
|
|
|
312
|
+ console.info(`${readerClass.name}: ${check.checked}`);
|
|
|
313
|
+ if (check.checked) {
|
|
|
314
|
+ activeReaders.push(new readerClass());
|
|
|
315
|
+ } else {
|
|
|
316
|
+ activeReaders = activeReaders.filter((reader) => reader.constructor.name !== readerClass.name);
|
|
|
317
|
+ }
|
|
|
318
|
+ parser = new Markdown(activeReaders);
|
|
|
319
|
+ onMarkdownChange();
|
|
|
320
|
+ }
|
|
213
|
321
|
|
|
214
|
322
|
document.addEventListener('DOMContentLoaded', onDocumentLoad);
|
|
215
|
323
|
</script>
|
|
|
@@ -217,15 +325,85 @@
|
|
217
|
325
|
|
|
218
|
326
|
<body>
|
|
219
|
327
|
<div class="inputhalf half">
|
|
220
|
|
- <textarea id="markdowninput">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut mollis vel metus ut tempor. Morbi dictum, velit quis venenatis consequat, ante leo dignissim magna, quis efficitur ex magna nec ex. In egestas aliquet tortor, vitae posuere dui lobortis ac. Pellentesque quis hendrerit lorem. In maximus ut sapien vel tristique. Pellentesque ut tincidunt orci. Phasellus dignissim massa sit amet tellus placerat finibus. Ut elementum tortor ex, non aliquam libero semper eu.
|
|
221
|
|
-
|
|
222
|
|
-Duis gravida convallis nisi ullamcorper tempor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc bibendum varius arcu non molestie. Ut cursus, lorem nec pellentesque interdum, augue risus pellentesque ligula, at vehicula turpis mi vitae nisi. Vivamus pulvinar eget lorem non lacinia. Pellentesque pretium ex at metus elementum semper. Donec tincidunt metus ac ex aliquam, ac iaculis purus facilisis. Phasellus iaculis scelerisque nisl, eu molestie dui sollicitudin sed. Suspendisse ut felis porttitor, sollicitudin urna in, venenatis neque. Donec nec mi ultrices, molestie quam quis, iaculis libero.
|
|
223
|
|
-
|
|
224
|
|
-Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut congue consequat vestibulum. Etiam luctus, leo placerat ullamcorper venenatis, nunc metus fringilla sapien, id elementum tellus nulla eu nunc. Integer pulvinar egestas scelerisque. Sed accumsan libero eget pretium sodales. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla pretium egestas elit id cursus. Morbi euismod elementum eros ut eleifend. Praesent velit sem, faucibus sed sapien sit amet, pellentesque fermentum nibh. Nulla consequat turpis nec lacus consequat, sed congue magna consectetur. Nam id urna rhoncus, consectetur eros ac, tempor nisl.
|
|
|
328
|
+ <div class="toolbar">
|
|
|
329
|
+ <details>
|
|
|
330
|
+ <summary>Readers</summary>
|
|
225
|
331
|
|
|
226
|
|
-Curabitur fermentum nunc sed dapibus feugiat. Etiam volutpat viverra eros sit amet tristique. Suspendisse cursus venenatis accumsan. Suspendisse venenatis vehicula lectus, sed venenatis augue pretium eu. Cras dui eros, iaculis in dictum hendrerit, tincidunt ut sapien. Ut nec nulla ut mauris cursus tincidunt. Suspendisse interdum pulvinar elit sit amet auctor. Donec id lacus tincidunt, varius elit non, tempor felis.
|
|
|
332
|
+ <div id="readercontainer"></div>
|
|
|
333
|
+ </details>
|
|
|
334
|
+ </div>
|
|
|
335
|
+ <textarea id="markdowninput">## Block Formats {#top}
|
|
227
|
336
|
|
|
228
|
|
-Quisque posuere, libero ac elementum maximus, lacus nulla lobortis nibh, id aliquam tortor lacus vel quam. Nunc eget dolor non nunc sagittis varius. Proin viverra vestibulum placerat. Fusce placerat interdum diam quis sollicitudin. Praesent sed tincidunt orci. Suspendisse lectus lorem, porta vel quam sit amet, pharetra interdum purus. Suspendisse ac lacus consequat, dapibus nunc in, porttitor purus. Nam dictum elit eget massa tincidunt tempus. Vestibulum blandit, lorem et accumsan tristique, orci dolor vulputate magna, et posuere lorem sapien non sapien. Vivamus nulla justo, eleifend et metus sit amet, gravida iaculis erat. Fusce lacinia cursus accumsan.
|
|
|
337
|
+ * Unordered
|
|
|
338
|
+ * Lists
|
|
|
339
|
+ * Sub list
|
|
|
340
|
+
|
|
|
341
|
+ 1. Ordered
|
|
|
342
|
+ 2. Lists
|
|
|
343
|
+ 6. Sub list
|
|
|
344
|
+
|
|
|
345
|
+ > A block quote lorem ipsum dolor sit amet
|
|
|
346
|
+
|
|
|
347
|
+ A regular paragraph
|
|
|
348
|
+
|
|
|
349
|
+ word
|
|
|
350
|
+ : a unit of meaning in a sentence
|
|
|
351
|
+ sentence
|
|
|
352
|
+ : a collection of words
|
|
|
353
|
+
|
|
|
354
|
+ ```javascript
|
|
|
355
|
+ function foo() {
|
|
|
356
|
+ return 'Fenced code block';
|
|
|
357
|
+ }
|
|
|
358
|
+ ```
|
|
|
359
|
+
|
|
|
360
|
+ function bar() {
|
|
|
361
|
+ return 'Indented code';
|
|
|
362
|
+ }
|
|
|
363
|
+
|
|
|
364
|
+ ### Heading, hash style
|
|
|
365
|
+
|
|
|
366
|
+ Heading, underline style
|
|
|
367
|
+ ---
|
|
|
368
|
+
|
|
|
369
|
+ ### Modified Heading {style=color:red;}
|
|
|
370
|
+
|
|
|
371
|
+ -# Sub text
|
|
|
372
|
+
|
|
|
373
|
+ | Unit Price | Qty | Subtotal |
|
|
|
374
|
+ | ---: | ---: | ---: |
|
|
|
375
|
+ | $1.23 | 2 | =A*B FILL |
|
|
|
376
|
+ | $4.99 | 6 | |
|
|
|
377
|
+ | Total | | =SUM(C:C) |
|
|
|
378
|
+
|
|
|
379
|
+ ---
|
|
|
380
|
+
|
|
|
381
|
+ ## Inline Formats
|
|
|
382
|
+
|
|
|
383
|
+ Normal, **double asterisk,** __double underscore,__ *asterisks,* _underscores,_ ~~double tildes,~~ ~single tildes,~ ^carets,^ ==double equals==, ``double backticks``, `single backticks`.
|
|
|
384
|
+
|
|
|
385
|
+ Lorem ipsum dolor sit amet,[^1] consectetur adipiscing elit.[^abc] Sed sodales in odio eget porta. Proin et erat sit amet erat semper mollis vitae ut turpis.[^foo] Ut ipsum dui, maximus sit amet suscipit at, dictum id nulla.[^bar] Aenean efficitur rhoncus nulla non fermentum.
|
|
|
386
|
+
|
|
|
387
|
+ [^1]: Donec ut felis volutpat, gravida ipsum scelerisque, accumsan est.
|
|
|
388
|
+ [^abc]: Cras dictum rutrum quam.
|
|
|
389
|
+ [^foo]: Donec maximus bibendum lorem.
|
|
|
390
|
+ [^bar]: Praesent consectetur tristique leo. Morbi nec nisi sit amet quam imperdiet vehicula eu feugiat tortor.
|
|
|
391
|
+
|
|
|
392
|
+ The HTML on the WWW is often full of JS and CSS.
|
|
|
393
|
+
|
|
|
394
|
+ *[HTML]: Hypertext Markup Language
|
|
|
395
|
+ *[WWW]: World Wide Web
|
|
|
396
|
+ *[JS]: JavaScript
|
|
|
397
|
+ *[CSS]: Cascading Style Sheets
|
|
|
398
|
+
|
|
|
399
|
+ Click [here](#top) to return to the top. Referenced link to [Google][google title="I prefer Duck Duck Go"].
|
|
|
400
|
+
|
|
|
401
|
+   ![][testimage]
|
|
|
402
|
+
|
|
|
403
|
+ [testimage]: https://picsum.photos/102/75
|
|
|
404
|
+ [google]: https://google.com
|
|
|
405
|
+
|
|
|
406
|
+ Some verbatim <span style="color:green;">HTML</span>. A script tag will be ignored. <script></script>
|
|
229
|
407
|
</textarea>
|
|
230
|
408
|
</div>
|
|
231
|
409
|
<div class="previewhalf half">
|