highmark-yapp 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/.swcrc +11 -0
  2. package/README.md +18 -0
  3. package/bin/main.js +15 -0
  4. package/css/markdown.css +37 -0
  5. package/css/woff2/FiraCode-Bold.woff2 +0 -0
  6. package/css/woff2/FiraCode-Regular.woff2 +0 -0
  7. package/example.js +51256 -0
  8. package/index.html +48 -0
  9. package/lib/attributeNames.js +13 -0
  10. package/lib/constants.js +13 -0
  11. package/lib/example/constants.js +22 -0
  12. package/lib/example/markdown/lexer.js +116 -0
  13. package/lib/example/markdown/parser.js +115 -0
  14. package/lib/example/node/markdown/yappListing.js +159 -0
  15. package/lib/example/styles.js +13 -0
  16. package/lib/example/view/div/sizeable.js +39 -0
  17. package/lib/example/view/heading.js +39 -0
  18. package/lib/example/view/input/startRuleName.js +155 -0
  19. package/lib/example/view/input.js +39 -0
  20. package/lib/example/view/listing.js +140 -0
  21. package/lib/example/view/section/markdown.js +252 -0
  22. package/lib/example/view/subHeading.js +39 -0
  23. package/lib/example/view/textarea/bnf.js +176 -0
  24. package/lib/example/view/textarea/content.js +176 -0
  25. package/lib/example/view/textarea/lexicalEntries.js +183 -0
  26. package/lib/example/view/textarea/parseTree.js +183 -0
  27. package/lib/example/view/textarea.js +39 -0
  28. package/lib/example/view.js +271 -0
  29. package/lib/example.js +21 -0
  30. package/lib/index.js +99 -0
  31. package/lib/markdown/bnf.js +14 -0
  32. package/lib/markdown/entries.js +39 -0
  33. package/lib/markdown/lexer.js +157 -0
  34. package/lib/markdown/parser.js +156 -0
  35. package/lib/mixins/element.js +48 -0
  36. package/lib/node/markdown/document.js +141 -0
  37. package/lib/node/markdown/error.js +177 -0
  38. package/lib/node/markdown/heading.js +136 -0
  39. package/lib/node/markdown/language.js +136 -0
  40. package/lib/node/markdown/line.js +150 -0
  41. package/lib/node/markdown/lineBreak.js +140 -0
  42. package/lib/node/markdown/listing.js +224 -0
  43. package/lib/node/markdown/listingEnd.js +126 -0
  44. package/lib/node/markdown/listingStart.js +141 -0
  45. package/lib/node/markdown/orderedList.js +175 -0
  46. package/lib/node/markdown/orderedListItem.js +150 -0
  47. package/lib/node/markdown/paragraph.js +140 -0
  48. package/lib/node/markdown/unorderedList.js +140 -0
  49. package/lib/node/markdown/unorderedListItem.js +140 -0
  50. package/lib/node/markdown/verticalSpace.js +140 -0
  51. package/lib/node/markdown.js +237 -0
  52. package/lib/nodeMap.js +49 -0
  53. package/lib/ruleNames.js +94 -0
  54. package/lib/tokenTypes.js +46 -0
  55. package/lib/utilities/parser.js +21 -0
  56. package/lib/utilities/token.js +22 -0
  57. package/license.txt +48 -0
  58. package/package.json +43 -0
  59. package/src/attributeNames.js +3 -0
  60. package/src/constants.js +3 -0
  61. package/src/example/constants.js +4 -0
  62. package/src/example/markdown/lexer.js +25 -0
  63. package/src/example/markdown/parser.js +15 -0
  64. package/src/example/node/markdown/yappListing.js +48 -0
  65. package/src/example/styles.js +3 -0
  66. package/src/example/view/div/sizeable.js +12 -0
  67. package/src/example/view/heading.js +14 -0
  68. package/src/example/view/input/startRuleName.js +33 -0
  69. package/src/example/view/input.js +15 -0
  70. package/src/example/view/listing.js +22 -0
  71. package/src/example/view/section/markdown.js +73 -0
  72. package/src/example/view/subHeading.js +16 -0
  73. package/src/example/view/textarea/bnf.js +41 -0
  74. package/src/example/view/textarea/content.js +41 -0
  75. package/src/example/view/textarea/lexicalEntries.js +52 -0
  76. package/src/example/view/textarea/parseTree.js +50 -0
  77. package/src/example/view/textarea.js +17 -0
  78. package/src/example/view.js +155 -0
  79. package/src/example.js +24 -0
  80. package/src/index.js +24 -0
  81. package/src/markdown/bnf.js +51 -0
  82. package/src/markdown/entries.js +30 -0
  83. package/src/markdown/lexer.js +35 -0
  84. package/src/markdown/parser.js +38 -0
  85. package/src/mixins/element.js +53 -0
  86. package/src/node/markdown/document.js +13 -0
  87. package/src/node/markdown/error.js +32 -0
  88. package/src/node/markdown/heading.js +24 -0
  89. package/src/node/markdown/language.js +23 -0
  90. package/src/node/markdown/line.js +42 -0
  91. package/src/node/markdown/lineBreak.js +11 -0
  92. package/src/node/markdown/listing.js +102 -0
  93. package/src/node/markdown/listingEnd.js +9 -0
  94. package/src/node/markdown/listingStart.js +29 -0
  95. package/src/node/markdown/orderedList.js +31 -0
  96. package/src/node/markdown/orderedListItem.js +27 -0
  97. package/src/node/markdown/paragraph.js +11 -0
  98. package/src/node/markdown/unorderedList.js +11 -0
  99. package/src/node/markdown/unorderedListItem.js +11 -0
  100. package/src/node/markdown/verticalSpace.js +27 -0
  101. package/src/node/markdown.js +88 -0
  102. package/src/nodeMap.js +53 -0
  103. package/src/ruleNames.js +35 -0
  104. package/src/tokenTypes.js +10 -0
  105. package/src/utilities/parser.js +20 -0
  106. package/src/utilities/token.js +17 -0
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ import withStyle from "easy-with-style"; ///
4
+
5
+ import Textarea from "../textarea";
6
+
7
+ import { DOUBLE_SPACE } from "../../constants";
8
+
9
+ class LexicalEntriesTextarea extends Textarea {
10
+ getLexicalEntries() {
11
+ let lexicalEntries = {};
12
+
13
+ try {
14
+ const value = this.getValue(),
15
+ lexicalEntriesString = value; ///
16
+
17
+ lexicalEntries = JSON.parse(lexicalEntriesString);
18
+ } catch (error) {
19
+ ///
20
+ }
21
+
22
+ return lexicalEntries;
23
+ }
24
+
25
+ setLexicalEntries(lexicalEntries) {
26
+ const lexicalEntriesString = JSON.stringify(lexicalEntries, null, DOUBLE_SPACE),
27
+ value = lexicalEntriesString; ///
28
+
29
+ this.setValue(value);
30
+ }
31
+
32
+ parentContext() {
33
+ const getLexicalEntries = this.getLexicalEntries.bind(this),
34
+ setLexicalEntries = this.setLexicalEntries.bind(this);
35
+
36
+ return ({
37
+ getLexicalEntries,
38
+ setLexicalEntries
39
+ });
40
+ }
41
+
42
+ static defaultProperties = {
43
+ className: "lexical-entries",
44
+ spellCheck: "false"
45
+ };
46
+ }
47
+
48
+ export default withStyle(LexicalEntriesTextarea)`
49
+
50
+ height: 12rem;
51
+
52
+ `;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ import withStyle from "easy-with-style"; ///
4
+
5
+ import Textarea from "../textarea";
6
+
7
+ import { EMPTY_STRING } from "../../constants";
8
+
9
+ class ParseTreeTextarea extends Textarea {
10
+ setParseTree(parseTree) {
11
+ if (parseTree !== null) {
12
+ parseTree.shiftLine(); //
13
+
14
+ const parseTreeString = parseTree.asString(),
15
+ value = parseTreeString; ///
16
+
17
+ this.setValue(value);
18
+ } else {
19
+ this.clearParseTree();
20
+ }
21
+ }
22
+
23
+ clearParseTree() {
24
+ const value = EMPTY_STRING;
25
+
26
+ this.setValue(value);
27
+ }
28
+
29
+ parentContext() {
30
+ const setParseTree = this.setParseTree.bind(this),
31
+ clearParseTree = this.clearParseTree.bind(this);
32
+
33
+ return ({
34
+ setParseTree,
35
+ clearParseTree
36
+ });
37
+ }
38
+
39
+ static defaultProperties = {
40
+ className: "tokens",
41
+ spellCheck: "false",
42
+ readOnly: true
43
+ };
44
+ }
45
+
46
+ export default withStyle(ParseTreeTextarea)`
47
+
48
+ height: 56rem;
49
+
50
+ `;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ import withStyle from "easy-with-style"; ///
4
+
5
+ import { Textarea } from "easy";
6
+
7
+ export default withStyle(Textarea)`
8
+
9
+ border: 1px solid darkgrey;
10
+ resize: vertical;
11
+ padding: 0.25rem;
12
+ font-size: 1.2rem;
13
+ line-height: 1.5rem;
14
+ white-space: pre;
15
+ font-family: monospace;
16
+
17
+ `;
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+
3
+ import withStyle from "easy-with-style"; ///
4
+
5
+ import { Element } from "easy";
6
+ import { rulesUtilities, parserUtilities } from "occam-parsers";
7
+ import { RowsDiv, ColumnDiv, ColumnsDiv, VerticalSplitterDiv } from "easy-layout";
8
+
9
+ import SubHeading from "./view/subHeading";
10
+ import SizeableDiv from "./view/div/sizeable";
11
+ import BNFTextarea from "./view/textarea/bnf";
12
+ import MarkdownLexer from "./markdown/lexer";
13
+ import MarkdownParser from "./markdown/parser";
14
+ import ContentTextarea from "./view/textarea/content";
15
+ import MarkdownSection from "./view/section/markdown";
16
+ import ParseTreeTextarea from "./view/textarea/parseTree";
17
+ import StartRuleNameInput from "./view/input/startRuleName";
18
+ import LexicalEntriesTextarea from "./view/textarea/lexicalEntries";
19
+
20
+ import { setNonTerminalNodes } from "../utilities/parser";
21
+
22
+ const { rulesFromBNF } = parserUtilities,
23
+ { ruleMapFromRules, startRuleFromRulesAndStartRuleName } = rulesUtilities;
24
+
25
+ class View extends Element {
26
+ changeHandler = (event, element) => {
27
+ this.update();
28
+ }
29
+
30
+ keyUpHandler = (event, element) => {
31
+ this.update();
32
+ }
33
+
34
+ update() {
35
+ const bnf = this.getBNF(),
36
+ rules = rulesFromBNF(bnf),
37
+ startRuleName = this.getStartRuleName(),
38
+ lexicalEntries = this.getLexicalEntries();
39
+
40
+ const markdownLexer = markdownLexerFromLexicalEntries(lexicalEntries),
41
+ markdownParser = markdownParserFromRulesAndStartRuleName(rules, startRuleName);
42
+
43
+ const content = this.getContent(),
44
+ tokens = markdownLexer.tokenise(content),
45
+ node = markdownParser.parse(tokens);
46
+
47
+ let parseTree = null;
48
+
49
+ if (node !== null) {
50
+ parseTree = node.asParseTree(tokens);
51
+ }
52
+
53
+ this.updateMarkdownSection(node, tokens);
54
+
55
+ this.setParseTree(parseTree);
56
+ }
57
+
58
+ childElements() {
59
+ return (
60
+
61
+ <ColumnsDiv>
62
+ <SizeableDiv>
63
+ <RowsDiv>
64
+ <SubHeading>
65
+ Start rule name
66
+ </SubHeading>
67
+ <StartRuleNameInput onKeyUp={this.keyUpHandler} />
68
+ <SubHeading>
69
+ Lexical entries
70
+ </SubHeading>
71
+ <LexicalEntriesTextarea onKeyUp={this.keyUpHandler} />
72
+ <SubHeading>
73
+ BNF
74
+ </SubHeading>
75
+ <BNFTextarea onKeyUp={this.keyUpHandler} />
76
+ <SubHeading>
77
+ Content
78
+ </SubHeading>
79
+ <ContentTextarea onKeyUp={this.keyUpHandler} />
80
+ </RowsDiv>
81
+ </SizeableDiv>
82
+ <VerticalSplitterDiv/>
83
+ <ColumnDiv>
84
+ <RowsDiv>
85
+ <MarkdownSection/>
86
+ <SubHeading>
87
+ Parse tree
88
+ </SubHeading>
89
+ <ParseTreeTextarea />
90
+ </RowsDiv>
91
+ </ColumnDiv>
92
+ </ColumnsDiv>
93
+
94
+ );
95
+ }
96
+
97
+ initialise() {
98
+ this.assignContext();
99
+
100
+ const { bnf } = MarkdownParser,
101
+ { entries } = MarkdownLexer,
102
+ { initialContent, initialStartRuleName } = this.constructor,
103
+ content = initialContent, ///
104
+ startRuleName = initialStartRuleName, ///
105
+ lexicalEntries = entries; ///
106
+
107
+ this.setBNF(bnf);
108
+
109
+ this.setContent(content);
110
+
111
+ this.setLexicalEntries(lexicalEntries);
112
+
113
+ this.setStartRuleName(startRuleName);
114
+
115
+ this.update();
116
+ }
117
+
118
+ static initialContent = `===json
119
+ {
120
+ "hello": "world"
121
+ }
122
+ ===
123
+ `;
124
+
125
+ static initialStartRuleName = "";
126
+
127
+ static tagName = "div";
128
+
129
+ static defaultProperties = {
130
+ className: "view"
131
+ };
132
+ }
133
+
134
+ export default withStyle(View)`
135
+
136
+ padding: 1rem;
137
+
138
+ `;
139
+
140
+ function markdownLexerFromLexicalEntries(lexicalEntries) {
141
+ const entries = lexicalEntries, ///
142
+ markdownLexer = MarkdownLexer.fromEntries(entries);
143
+
144
+ return markdownLexer;
145
+ }
146
+
147
+ function markdownParserFromRulesAndStartRuleName(rules, startRuleName) {
148
+ const ruleMap = ruleMapFromRules(rules),
149
+ startRule = startRuleFromRulesAndStartRuleName(rules, startRuleName),
150
+ markdownParser = new MarkdownParser(startRule, ruleMap);
151
+
152
+ setNonTerminalNodes(markdownParser);
153
+
154
+ return markdownParser;
155
+ }
package/src/example.js ADDED
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ import "juxtapose";
4
+
5
+ import withStyle from "easy-with-style"; ///
6
+
7
+ import { Body } from "easy";
8
+ import { renderYappStyles } from "yapp";
9
+
10
+ import View from "./example/view";
11
+
12
+ const { renderStyles } = withStyle;
13
+
14
+ const body = new Body();
15
+
16
+ renderYappStyles();
17
+
18
+ renderStyles();
19
+
20
+ body.mount(
21
+
22
+ <View/>
23
+
24
+ );
package/src/index.js ADDED
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ export { default as nodeMap } from "./nodeMap";
4
+ export { default as ruleNames } from "./ruleNames";
5
+ export { default as tokenTypes } from "./tokenTypes";
6
+
7
+ export { default as MarkdownLexer } from "./markdown/lexer";
8
+ export { default as MarkdownParser } from "./markdown/parser";
9
+
10
+ export { default as LineMarkdownNode } from "./node/markdown/line";
11
+ export { default as ErrorMarkdownNode } from "./node/markdown/error";
12
+ export { default as ListingMarkdownNode } from "./node/markdown/listing";
13
+ export { default as HeadingMarkdownNode } from "./node/markdown/heading";
14
+ export { default as LanguageMarkdownNode } from "./node/markdown/language";
15
+ export { default as DocumentMarkdownNode } from "./node/markdown/document";
16
+ export { default as ParagraphMarkdownNode } from "./node/markdown/paragraph";
17
+ export { default as LineBreakMarkdownNode } from "./node/markdown/lineBreak";
18
+ export { default as ListingEndMarkdownNode } from "./node/markdown/listingEnd";
19
+ export { default as OrderedListMarkdownNode } from "./node/markdown/orderedList";
20
+ export { default as ListingStartMarkdownNode } from "./node/markdown/listingStart";
21
+ export { default as VerticalSpaceMarkdownNode } from "./node/markdown/verticalSpace";
22
+ export { default as UnorderedListMarkdownNode } from "./node/markdown/unorderedList";
23
+ export { default as OrderedListItemMarkdownNode } from "./node/markdown/orderedListItem";
24
+ export { default as UnorderedListItemMarkdownNode } from "./node/markdown/unorderedListItem";
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ const bnf = `
4
+
5
+ document ::= ( unorderedList | orderedList | listing | heading | lineBreak | paragraph | verticalSpace | error )+ ;
6
+
7
+
8
+ unorderedList ::= unorderedListItem+ ;
9
+
10
+
11
+ orderedList ::= orderedListItem+ ;
12
+
13
+
14
+ listing ::= listingStart ( line | verticalSpace )* listingEnd ;
15
+
16
+
17
+ heading ::= [heading] line ;
18
+
19
+
20
+ lineBreak ::= [line-break] <END_OF_LINE> ;
21
+
22
+
23
+ paragraph ::= line+ ;
24
+
25
+
26
+ verticalSpace ::= <END_OF_LINE>+ ;
27
+
28
+
29
+ error ::= . ;
30
+
31
+
32
+ unorderedListItem ::= [bullet] line ;
33
+
34
+
35
+ orderedListItem ::= [marker] line ;
36
+
37
+
38
+ listingStart ::= [listing] language? <END_OF_LINE> ;
39
+
40
+
41
+ listingEnd ::= [listing] <END_OF_LINE> ;
42
+
43
+
44
+ language ::= <NO_WHITESPACE>[identifier] ;
45
+
46
+
47
+ line ::= ( [escaped] | [identifier] | [unassigned] )+ <END_OF_LINE> ;
48
+
49
+ `;
50
+
51
+ export default bnf;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ const entries = [
4
+ {
5
+ "escaped": "^\\\\[^\\s]+"
6
+ },
7
+ {
8
+ "bullet": "^\\*"
9
+ },
10
+ {
11
+ "marker": "^[1-9][0-9]*\\."
12
+ },
13
+ {
14
+ "listing": "^```"
15
+ },
16
+ {
17
+ "heading": "^#{1,4}"
18
+ },
19
+ {
20
+ "line-break": "^-{2,3}"
21
+ },
22
+ {
23
+ "identifier": "^[a-z]+"
24
+ },
25
+ {
26
+ "unassigned": "^[^\\s]+"
27
+ }
28
+ ];
29
+
30
+ export default entries;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ import { CommonLexer, WhitespaceToken, EndOfLineSignificantToken } from "occam-lexers";
4
+
5
+ import entries from "./entries";
6
+
7
+ export default class MarkdownLexer extends CommonLexer {
8
+ static entries = entries;
9
+
10
+ static EndOfLineToken = EndOfLineSignificantToken;
11
+
12
+ static WhitespaceToken = WhitespaceToken;
13
+
14
+ static EndOfLineCommentToken = null;
15
+
16
+ static SingleLineCommentToken = null;
17
+
18
+ static RegularExpressionToken = null;
19
+
20
+ static EndOfMultiLineCommentToken = null;
21
+
22
+ static StartOfMultiLineCommentToken = null;
23
+
24
+ static MiddleOfMultiLineCommentToken = null;
25
+
26
+ static SinglyQuotedStringLiteralToken = null;
27
+
28
+ static DoublyQuotedStringLiteralToken = null;
29
+
30
+ static fromNothing() { return CommonLexer.fromNothing(MarkdownLexer); }
31
+
32
+ static fromRules(rules) { return CommonLexer.fromRules(MarkdownLexer, rules); }
33
+
34
+ static fromEntries(entries) { return CommonLexer.fromEntries(MarkdownLexer, entries); }
35
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ import { CommonParser } from "occam-parsers";
4
+
5
+ import bnf from "./bnf";
6
+ import nodeMap from "../nodeMap";
7
+
8
+ import { setNonTerminalNodes } from "../utilities/parser";
9
+
10
+ export default class MarkdownParser extends CommonParser {
11
+ static bnf = bnf;
12
+
13
+ static nodeMap = nodeMap;
14
+
15
+ static fromNothing() {
16
+ const markdownParser = CommonParser.fromNothing(MarkdownParser);
17
+
18
+ setNonTerminalNodes(markdownParser);
19
+
20
+ return markdownParser;
21
+ }
22
+
23
+ static fromBNF(bnf) {
24
+ const markdownParser = CommonParser.fromBNF(MarkdownParser, bnf);
25
+
26
+ setNonTerminalNodes(markdownParser);
27
+
28
+ return markdownParser;
29
+ }
30
+
31
+ static fromRules(rules) {
32
+ const markdownParser = CommonParser.fromRules(MarkdownParser, rules);
33
+
34
+ setNonTerminalNodes(markdownParser);
35
+
36
+ return markdownParser;
37
+ }
38
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ function add(node) {
4
+ const domElement = this.getDOMElement(),
5
+ nodeDOMEElement = node.getDOMElement();
6
+
7
+ domElement.insertBefore(nodeDOMEElement, null); ///
8
+ }
9
+
10
+ function remove(node) {
11
+ const domElement = this.getDOMElement();
12
+
13
+ if (node) {
14
+ const nodeDOMEElement = node.getDOMElement();
15
+
16
+ domElement.removeChild(nodeDOMEElement);
17
+ } else {
18
+ domElement.remove();
19
+ }
20
+ }
21
+
22
+ function getDescendantNodes(descendantNodes = []) {
23
+ const domElement = this.getDOMElement();
24
+
25
+ if (domElement !== null) {
26
+ const childNodes = this.getChildNodes(),
27
+ descendantNode = this; ///
28
+
29
+ descendantNodes.push(descendantNode);
30
+
31
+ childNodes.forEach((childNode) => {
32
+ childNode.getDescendantNodes(descendantNodes);
33
+ })
34
+ }
35
+
36
+ return descendantNodes;
37
+ }
38
+
39
+ function getDescendantElements() {
40
+ const descendantNodes = this.getDescendantNodes(),
41
+ descendantElements = descendantNodes; ///
42
+
43
+ return descendantElements;
44
+ }
45
+
46
+ const elementMixins = {
47
+ add,
48
+ remove,
49
+ getDescendantNodes,
50
+ getDescendantElements
51
+ };
52
+
53
+ export default elementMixins;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ import MarkdownNode from "../../node/markdown";
4
+
5
+ export default class DocumentMarkdownNode extends MarkdownNode {
6
+ static tagName = "div";
7
+
8
+ static className = "document";
9
+
10
+ static fromRuleNameAndChildNodes(ruleName, childNodes) { return MarkdownNode.fromRuleNameAndChildNodes(DocumentMarkdownNode, ruleName, childNodes); }
11
+
12
+ static fromRuleNameChildNodesAndPrecedence(ruleName, childNodes, precedence) { return MarkdownNode.fromRuleNameChildNodesAndPrecedence(DocumentMarkdownNode, ruleName, childNodes, precedence); }
13
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ import { arrayUtilities } from "necessary";
4
+
5
+ import MarkdownNode from "../../node/markdown";
6
+
7
+ const { first } = arrayUtilities;
8
+
9
+ export default class ErrorMarkdownNode extends MarkdownNode {
10
+ createDOMElement(tokens) {
11
+ const domElement = super.createDOMElement(tokens),
12
+ childNodes = this.getChildNodes(),
13
+ firstChildNode = first(childNodes),
14
+ terminalNode = firstChildNode, ///
15
+ content = terminalNode.getContent(),
16
+ textContent = content; ///
17
+
18
+ Object.assign(domElement, {
19
+ textContent
20
+ });
21
+
22
+ return domElement;
23
+ }
24
+
25
+ static tagName = "span";
26
+
27
+ static className = "error";
28
+
29
+ static fromRuleNameAndChildNodes(ruleName, childNodes) { return MarkdownNode.fromRuleNameAndChildNodes(ErrorMarkdownNode, ruleName, childNodes); }
30
+
31
+ static fromRuleNameChildNodesAndPrecedence(ruleName, childNodes, precedence) { return MarkdownNode.fromRuleNameChildNodesAndPrecedence(ErrorMarkdownNode, ruleName, childNodes, precedence); }
32
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ import { arrayUtilities } from "necessary";
4
+
5
+ import MarkdownNode from "../../node/markdown";
6
+
7
+ const { first } = arrayUtilities;
8
+
9
+ export default class HeadingMarkdownNode extends MarkdownNode {
10
+ getTagName() {
11
+ const childNodes = this.getChildNodes(),
12
+ firstChildNode = first(childNodes),
13
+ headingTerminalNode = firstChildNode, ///
14
+ headingTerminalNodeContent = headingTerminalNode.getContent(),
15
+ headingTerminalNodeContentLength = headingTerminalNodeContent.length,
16
+ tagName = `h${headingTerminalNodeContentLength}`;
17
+
18
+ return tagName;
19
+ }
20
+
21
+ static fromRuleNameAndChildNodes(ruleName, childNodes) { return MarkdownNode.fromRuleNameAndChildNodes(HeadingMarkdownNode, ruleName, childNodes); }
22
+
23
+ static fromRuleNameChildNodesAndPrecedence(ruleName, childNodes, precedence) { return MarkdownNode.fromRuleNameChildNodesAndPrecedence(HeadingMarkdownNode, ruleName, childNodes, precedence); }
24
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ import { arrayUtilities } from "necessary";
4
+
5
+ import MarkdownNode from "../../node/markdown";
6
+
7
+ const { second } = arrayUtilities;
8
+
9
+ export default class LanguageMarkdownNode extends MarkdownNode {
10
+ getLanguage() {
11
+ const childNodes = this.getChildNodes(),
12
+ secondChildNode = second(childNodes),
13
+ identifierTerminalNode = secondChildNode, ///
14
+ identifierTerminalNodeContent = identifierTerminalNode.getContent(),
15
+ language = identifierTerminalNodeContent; ///
16
+
17
+ return language;
18
+ }
19
+
20
+ static fromRuleNameAndChildNodes(ruleName, childNodes) { return MarkdownNode.fromRuleNameAndChildNodes(LanguageMarkdownNode, ruleName, childNodes); }
21
+
22
+ static fromRuleNameChildNodesAndPrecedence(ruleName, childNodes, precedence) { return MarkdownNode.fromRuleNameChildNodesAndPrecedence(LanguageMarkdownNode, ruleName, childNodes, precedence); }
23
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ import MarkdownNode from "../../node/markdown";
4
+
5
+ import { EMPTY_STRING } from "../../constants";
6
+ import { tokenContentFromToken } from "../../utilities/token";
7
+
8
+ export default class LineMarkdownNode extends MarkdownNode {
9
+ createDOMElement(tokens) {
10
+ const content = this.getContent(tokens),
11
+ domElement = document.createTextNode(content); ///
12
+
13
+ this.setDOMElement(domElement);
14
+
15
+ return domElement;
16
+ }
17
+
18
+ getContent(tokens) {
19
+ let content = EMPTY_STRING;
20
+
21
+ const lastSignificantToken = this.getLastSignificantToken(),
22
+ firstSignificantToken = this.getFirstSignificantToken(),
23
+ lastSignificantTokenIndex = tokens.indexOf(lastSignificantToken),
24
+ firstSignificantTokenIndex = tokens.indexOf(firstSignificantToken),
25
+ start = firstSignificantTokenIndex, ///
26
+ end = lastSignificantTokenIndex + 1;
27
+
28
+ tokens = tokens.slice(start, end); ///
29
+
30
+ tokens.forEach((token) => {
31
+ const tokenContent = tokenContentFromToken(token);
32
+
33
+ content += tokenContent;
34
+ });
35
+
36
+ return content;
37
+ }
38
+
39
+ static fromRuleNameAndChildNodes(ruleName, childNodes) { return MarkdownNode.fromRuleNameAndChildNodes(LineMarkdownNode, ruleName, childNodes); }
40
+
41
+ static fromRuleNameChildNodesAndPrecedence(ruleName, childNodes, precedence) { return MarkdownNode.fromRuleNameChildNodesAndPrecedence(LineMarkdownNode, ruleName, childNodes, precedence); }
42
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ import MarkdownNode from "../../node/markdown";
4
+
5
+ export default class LineBreakMarkdownNode extends MarkdownNode {
6
+ static tagName = "br";
7
+
8
+ static fromRuleNameAndChildNodes(ruleName, childNodes) { return MarkdownNode.fromRuleNameAndChildNodes(LineBreakMarkdownNode, ruleName, childNodes); }
9
+
10
+ static fromRuleNameChildNodesAndPrecedence(ruleName, childNodes, precedence) { return MarkdownNode.fromRuleNameChildNodesAndPrecedence(LineBreakMarkdownNode, ruleName, childNodes, precedence); }
11
+ }