clarity-pattern-parser 4.0.2 → 5.0.0

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 (132) hide show
  1. package/README.md +176 -1
  2. package/TODO.md +22 -2
  3. package/dist/ast/Node.d.ts +43 -11
  4. package/dist/ast/Visitor.d.ts +31 -31
  5. package/dist/index.browser.js +1248 -1495
  6. package/dist/index.browser.js.map +1 -1
  7. package/dist/index.d.ts +12 -16
  8. package/dist/index.esm.js +1218 -1460
  9. package/dist/index.esm.js.map +1 -1
  10. package/dist/index.js +1217 -1464
  11. package/dist/index.js.map +1 -1
  12. package/dist/patterns/And.d.ts +37 -24
  13. package/dist/patterns/Cursor.d.ts +35 -0
  14. package/dist/patterns/CursorHistory.d.ts +30 -0
  15. package/dist/patterns/Literal.d.ts +36 -19
  16. package/dist/patterns/Not.d.ts +26 -11
  17. package/dist/patterns/Or.d.ts +31 -22
  18. package/dist/patterns/ParseError.d.ts +6 -8
  19. package/dist/patterns/ParseResult.d.ts +6 -0
  20. package/dist/patterns/Pattern.d.ts +17 -26
  21. package/dist/patterns/Reference.d.ts +31 -12
  22. package/dist/patterns/Regex.d.ts +42 -21
  23. package/dist/patterns/Repeat.d.ts +38 -20
  24. package/dist/patterns/clonePatterns.d.ts +2 -0
  25. package/dist/patterns/filterOutNull.d.ts +2 -0
  26. package/dist/patterns/findPattern.d.ts +2 -0
  27. package/dist/patterns/getNextPattern.d.ts +2 -0
  28. package/jest.config.js +2 -1
  29. package/package.json +4 -5
  30. package/rollup.config.js +1 -1
  31. package/src/ast/Node.test.ts +254 -0
  32. package/src/ast/Node.ts +171 -23
  33. package/src/index.ts +11 -19
  34. package/src/intellisense/AutoComplete.test.ts +72 -0
  35. package/src/intellisense/AutoComplete.ts +146 -0
  36. package/src/intellisense/Suggestion.ts +13 -0
  37. package/src/intellisense/SuggestionOption.ts +4 -0
  38. package/src/{tests/cssPatterns → intellisense/css}/cssValue.ts +1 -1
  39. package/src/{tests/cssPatterns → intellisense/css}/divider.ts +2 -1
  40. package/src/intellisense/css/hex.ts +6 -0
  41. package/src/{tests/cssPatterns → intellisense/css}/method.ts +8 -9
  42. package/src/intellisense/css/name.ts +5 -0
  43. package/src/{tests/javascriptPatterns → intellisense/css}/number.ts +3 -3
  44. package/src/intellisense/css/spaces.ts +6 -0
  45. package/src/intellisense/css/unit.ts +10 -0
  46. package/src/{tests/cssPatterns → intellisense/css}/value.ts +1 -1
  47. package/src/{tests/cssPatterns → intellisense/css}/values.ts +1 -1
  48. package/src/intellisense/javascript/Javascript.test.ts +203 -0
  49. package/src/intellisense/javascript/arrayLiteral.ts +25 -0
  50. package/src/intellisense/javascript/deleteStatement.ts +14 -0
  51. package/src/intellisense/javascript/escapedCharacter.ts +50 -0
  52. package/src/intellisense/javascript/exponent.ts +26 -0
  53. package/src/intellisense/javascript/expression.ts +87 -0
  54. package/src/intellisense/javascript/expressionStatement.ts +29 -0
  55. package/src/intellisense/javascript/fraction.ts +13 -0
  56. package/src/intellisense/javascript/infixOperator.ts +36 -0
  57. package/src/intellisense/javascript/integer.ts +7 -0
  58. package/src/intellisense/javascript/invocation.ts +28 -0
  59. package/src/intellisense/javascript/literal.ts +14 -0
  60. package/src/intellisense/javascript/name.ts +3 -0
  61. package/src/intellisense/javascript/numberLiteral.ts +10 -0
  62. package/src/intellisense/javascript/objectLiteral.ts +30 -0
  63. package/src/intellisense/javascript/optionalSpaces.ts +3 -0
  64. package/src/intellisense/javascript/parameters.ts +20 -0
  65. package/src/intellisense/javascript/prefixOperator.ts +13 -0
  66. package/src/intellisense/javascript/propertyAccess.ts +23 -0
  67. package/src/intellisense/javascript/stringLiteral.ts +28 -0
  68. package/src/patterns/And.test.ts +299 -0
  69. package/src/patterns/And.ts +222 -119
  70. package/src/patterns/Cursor.test.ts +93 -0
  71. package/src/patterns/Cursor.ts +130 -0
  72. package/src/patterns/CursorHistory.test.ts +54 -0
  73. package/src/patterns/CursorHistory.ts +95 -0
  74. package/src/patterns/Literal.test.ts +134 -0
  75. package/src/patterns/Literal.ts +151 -61
  76. package/src/patterns/Not.test.ts +88 -0
  77. package/src/patterns/Not.ts +74 -33
  78. package/src/patterns/Or.test.ts +105 -0
  79. package/src/patterns/Or.ts +106 -98
  80. package/src/patterns/ParseError.ts +3 -7
  81. package/src/patterns/ParseResult.ts +7 -0
  82. package/src/patterns/Pattern.ts +18 -150
  83. package/src/patterns/Reference.test.ts +104 -0
  84. package/src/patterns/Reference.ts +94 -94
  85. package/src/patterns/Regex.test.ts +101 -0
  86. package/src/patterns/Regex.ts +129 -60
  87. package/src/patterns/Repeat.test.ts +196 -0
  88. package/src/patterns/Repeat.ts +208 -104
  89. package/src/patterns/clonePatterns.ts +5 -0
  90. package/src/patterns/filterOutNull.ts +13 -0
  91. package/src/patterns/findPattern.ts +25 -0
  92. package/src/patterns/getNextPattern.test.ts +39 -0
  93. package/src/patterns/getNextPattern.ts +18 -0
  94. package/src/Cursor.ts +0 -141
  95. package/src/CursorHistory.ts +0 -146
  96. package/src/TextSuggester.ts +0 -317
  97. package/src/ast/Visitor.ts +0 -271
  98. package/src/patterns/LookAhead.ts +0 -32
  99. package/src/patterns/Recursive.ts +0 -92
  100. package/src/tests/And.test.ts +0 -180
  101. package/src/tests/ComplexExamples.test.ts +0 -86
  102. package/src/tests/CssPatterns.test.ts +0 -90
  103. package/src/tests/CursorHistory.test.ts +0 -107
  104. package/src/tests/Cusor.test.ts +0 -174
  105. package/src/tests/HtmlPatterns.test.ts +0 -34
  106. package/src/tests/Literal.test.ts +0 -79
  107. package/src/tests/LookAhead.test.ts +0 -44
  108. package/src/tests/Not.test.ts +0 -51
  109. package/src/tests/Or.test.ts +0 -113
  110. package/src/tests/Pattern.test.ts +0 -290
  111. package/src/tests/Recursive.test.ts +0 -64
  112. package/src/tests/Reference.test.ts +0 -16
  113. package/src/tests/Repeat.test.ts +0 -75
  114. package/src/tests/SpeedTest.test.ts +0 -31
  115. package/src/tests/TextSuggester.test.ts +0 -297
  116. package/src/tests/Visitor.test.ts +0 -331
  117. package/src/tests/cssPatterns/hex.ts +0 -5
  118. package/src/tests/cssPatterns/name.ts +0 -5
  119. package/src/tests/cssPatterns/number.ts +0 -8
  120. package/src/tests/cssPatterns/spaces.ts +0 -5
  121. package/src/tests/cssPatterns/unit.ts +0 -8
  122. package/src/tests/htmlPatterns/element.ts +0 -49
  123. package/src/tests/javascriptPatterns/boolean.ts +0 -10
  124. package/src/tests/javascriptPatterns/json.ts +0 -67
  125. package/src/tests/javascriptPatterns/name.ts +0 -5
  126. package/src/tests/javascriptPatterns/objectLiteral.ts +0 -40
  127. package/src/tests/javascriptPatterns/string.ts +0 -84
  128. package/src/tests/javascriptPatterns/unit.ts +0 -8
  129. package/src/tests/javascriptPatterns/whitespace.ts +0 -44
  130. package/src/tests/naturalLanguage/filter.ts +0 -37
  131. package/src/tests/patterns/sentence.ts +0 -37
  132. /package/src/{tests/cssPatterns → intellisense/css}/optionalSpaces.ts +0 -0
package/README.md CHANGED
@@ -3,5 +3,180 @@
3
3
  ```
4
4
  npm install clarity-pattern-parser
5
5
  ```
6
+ ## Overview
6
7
 
7
- ## How to use
8
+ ### Leaf Patterns
9
+ * Literal
10
+ * Regex
11
+
12
+ ### Composing Patterns
13
+ * And
14
+ * Or
15
+ * Repeat
16
+ * Reference
17
+
18
+ The "Not" pattern is a negative look ahead and mostly used with the "And" pattern. This will be illustrated in more detail within the "Not" pattern section.
19
+
20
+
21
+ ## Literal
22
+ The "Literal" pattern uses a string literal to match patterns.
23
+ ```ts
24
+ import { Literal } from "clarity-pattern-parser";
25
+
26
+ const firstName = new Literal("first-name", "John");
27
+ const { ast } = firstName.parseText("John");
28
+
29
+ ast.type // ==> "literal"
30
+ ast.name // ==> "first-name"
31
+ ast.value // ==> "John"
32
+ ```
33
+
34
+ ## Regex
35
+ The "Regex" pattern uses regular expressions to match patterns
36
+ ```ts
37
+ import { Regex } from "clarity-pattern-parser";
38
+
39
+ const digits = new Regex("digits", "\\d+");
40
+ const { ast } = digit.parseText("12");
41
+
42
+ ast.type // ==> "regex"
43
+ ast.name // ==> "digits"
44
+ ast.value // ==> "12"
45
+ ```
46
+
47
+ ### Regex Caveats
48
+ Do not use "^" at the beginning or "$" at the end of your regular expression. If you are creating a regular expression that is concerned about the beginning and end of the text you should probably just use a regular expression.
49
+
50
+ ## And
51
+ The "And" pattern is a way to make a sequence pattern. And accepts any other patterns as children, even other "And" patterns.
52
+ ```ts
53
+ import { And, Literal } from "clarity-pattern-parser";
54
+
55
+ const jane = new Literal("first-name", "Jane");
56
+ const space = new Literal("space", " ");
57
+ const doe = new Literal("last-name", "Doe");
58
+
59
+ const fullName = new And("full-name", [jane, space, doe]);
60
+
61
+ const { ast } = fullName.parseText("Jane Doe");
62
+
63
+ ast.toJson(); // Look Below for output
64
+ ```
65
+
66
+ ```json
67
+ {
68
+ "type": "and",
69
+ "name": "full-name",
70
+ "value": "Jane Doe",
71
+ "firstIndex": 0,
72
+ "lastIndex": 7,
73
+ "startIndex": 0,
74
+ "endIndex": 8,
75
+ "children": [
76
+ {
77
+ "type": "literal",
78
+ "name": "first-name",
79
+ "value": "Jane",
80
+ "firstIndex": 0,
81
+ "lastIndex": 3,
82
+ "startIndex": 0,
83
+ "endIndex": 4,
84
+ "children": []
85
+ },
86
+ {
87
+ "type": "and",
88
+ "name": "space",
89
+ "value": " ",
90
+ "firstIndex": 4,
91
+ "lastIndex": 4,
92
+ "startIndex": 4,
93
+ "endIndex": 5,
94
+ "children": []
95
+ },
96
+ {
97
+ "type": "and",
98
+ "name": "last-name",
99
+ "value": "Doe",
100
+ "firstIndex": 5,
101
+ "lastIndex": 7,
102
+ "startIndex": 5,
103
+ "endIndex": 8,
104
+ "children": []
105
+ }
106
+ ]
107
+ }
108
+ ```
109
+
110
+ ## Or
111
+ The "Or" pattern mathes any of the patterns given to the constructor.
112
+ ```ts
113
+ import { Or, Literal } from "clarity-pattern-parser";
114
+
115
+ const jane = new Literal("jane", "Jane");
116
+ const john = new Literal("john", "John");
117
+ const firstName = new Or("first-name", [jane, john]);
118
+
119
+ let ast= firstName.parseText("Jane").ast;
120
+
121
+ ast.type // ==> "literal"
122
+ ast.name // ==> "jane"
123
+ ast.value // ==> "Jane"
124
+
125
+ ast = firstName.parseText("John").ast;
126
+
127
+ ast.type // ==> "literal"
128
+ ast.name // ==> "john"
129
+ ast.value // ==> "John"
130
+ ```
131
+
132
+ ## Repeat
133
+ The "Repeat" patterns allows you to match repeating patterns with, or without a divider.
134
+
135
+ For example you may want to match a pattern like so.
136
+ ```
137
+ 1,2,3
138
+ ```
139
+ Here is the code to do so.
140
+ ```ts
141
+ import { Repeat, Literal, Regex } from "clarity-pattern-parser";
142
+
143
+ const digit = new Regex("digit", "\\d+");
144
+ const comma = new Literal("comma", ",");
145
+ const numberList = new Repeat("number-list", digit, comma);
146
+
147
+ const ast = numberList.parseText("1,2,3").ast;
148
+
149
+ ast.type // ==> "repeat"
150
+ ast.name // ==> "number-list"
151
+ ast.value // ==> "1,2,3
152
+
153
+ ast.children[0].value // ==> "1"
154
+ ast.children[1].value // ==> ","
155
+ ast.children[2].value // ==> "2"
156
+ ast.children[3].value // ==> ","
157
+ ast.children[4].value // ==> "3"
158
+ ```
159
+
160
+ If there is a trailing divider without a the repeating pattern, it will not include the trailing divider as part of the result. Here is an example.
161
+
162
+ ```ts
163
+ import { Repeat, Literal, Regex } from "clarity-pattern-parser";
164
+
165
+ const digit = new Regex("digit", "\\d+");
166
+ const comma = new Literal("comma", ",");
167
+ const numberList = new Repeat("number-list", digit, comma);
168
+
169
+ const ast = numberList.parseText("1,2,").ast;
170
+
171
+ ast.type // ==> "repeat"
172
+ ast.name // ==> "number-list"
173
+ ast.value // ==> "1,2
174
+
175
+ ast.children[0].value // ==> "1"
176
+ ast.children[1].value // ==> ","
177
+ ast.children[2].value // ==> "2"
178
+ ast.children.length // ==> 3
179
+ ```
180
+
181
+ T
182
+ ## Error Handling
package/TODO.md CHANGED
@@ -1,2 +1,22 @@
1
- - Remove the getNextToken from the Patterns. Use a Visitor pattern to figure out the tokens. Patterns should just be data.
2
- - Build a visitor and remove the filter off of the node. Nodes should just be data.
1
+ ## Grammar Ideas
2
+ ```
3
+ #comment
4
+ integer = /0|([1-9][0-9]+)/
5
+ method-name = "subtract" | "add" | "multiply"
6
+ divider = /\s*,\s*/
7
+ open-paren = "("
8
+ close-paren = ")"
9
+ argument = integer | method
10
+ arguments = argument* divider
11
+ not-integer = !integer
12
+ method = method-name open-paren arguments close-paren
13
+
14
+ integer.tokens = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
15
+ integer.enableContextualTokenAggregation
16
+ arguments.shouldReduceAst
17
+
18
+ export (method, arguments)
19
+ ```
20
+
21
+ // Other file
22
+ import (method, arguments) from "./method.grammar"
@@ -1,11 +1,43 @@
1
- export default class Node {
2
- type: string;
3
- name: string;
4
- startIndex: number;
5
- endIndex: number;
6
- children: Node[];
7
- value: string;
8
- constructor(type: string, name: string, startIndex: number, endIndex: number, children?: Node[], value?: string);
9
- clone(): Node;
10
- toString(): string;
11
- }
1
+ export interface CycleFreeNode {
2
+ type: string;
3
+ name: string;
4
+ firstIndex: number;
5
+ lastIndex: number;
6
+ startIndex: number;
7
+ endIndex: number;
8
+ value: string;
9
+ children: CycleFreeNode[];
10
+ }
11
+ export declare class Node {
12
+ private _type;
13
+ private _name;
14
+ private _firstIndex;
15
+ private _lastIndex;
16
+ private _parent;
17
+ private _children;
18
+ private _value;
19
+ get type(): string;
20
+ get name(): string;
21
+ get firstIndex(): number;
22
+ get lastIndex(): number;
23
+ get startIndex(): number;
24
+ get endIndex(): number;
25
+ get parent(): Node | null;
26
+ get children(): readonly Node[];
27
+ get value(): string;
28
+ constructor(type: string, name: string, firstIndex: number, lastIndex: number, children?: Node[], value?: string);
29
+ removeChild(node: Node): void;
30
+ removeAllChildren(): void;
31
+ replaceChild(newNode: Node, referenceNode: Node): void;
32
+ insertBefore(newNode: Node, referenceNode: Node | null): void;
33
+ appendChild(newNode: Node): void;
34
+ spliceChildren(index: number, deleteCount: number, ...items: Node[]): Node[];
35
+ find(isMatch: (node: Node) => boolean): Node | null;
36
+ findAll(isMatch: (node: Node) => boolean): Node[];
37
+ walkUp(callback: (node: Node) => void): void;
38
+ walkDown(callback: (node: Node) => void): void;
39
+ clone(): Node;
40
+ toString(): string;
41
+ toCycleFreeObject(): CycleFreeNode;
42
+ toJson(space?: number): string;
43
+ }
@@ -1,31 +1,31 @@
1
- import Node from "./Node";
2
- export default class Visitor {
3
- root: Node | null;
4
- selectedNodes: Node[];
5
- constructor(root?: Node | null, selectedNodes?: Node[]);
6
- flatten(): this;
7
- remove(): this;
8
- private recursiveRemove;
9
- wrap(callback: (node: Node) => Node): this;
10
- unwrap(): this;
11
- prepend(callback: (node: Node) => Node): this;
12
- append(callback: (node: Node) => Node): this;
13
- transform(callback: (node: Node) => Node): this;
14
- private recursiveTransform;
15
- selectAll(): Visitor;
16
- selectNode(node: Node): Visitor;
17
- deselectNode(node: Node): Visitor;
18
- select(callback: (node: Node) => boolean): Visitor;
19
- forEach(callback: (node: Node) => void): this;
20
- filter(callback: (node: Node) => boolean): Visitor;
21
- map(callback: (node: Node) => Node): Visitor;
22
- selectRoot(): Visitor;
23
- first(): Visitor;
24
- last(): Visitor;
25
- get(index: number): Visitor;
26
- clear(): this;
27
- setRoot(root: Node | null): this;
28
- static select(root: Node, callback?: (node: Node) => boolean): Visitor;
29
- static walkUp(node: Node, callback: (node: Node, ancestors: Node[]) => void, ancestors?: Node[]): typeof Visitor;
30
- static walkDown(node: Node, callback: (node: Node, ancestors: Node[]) => void, ancestors?: Node[]): typeof Visitor;
31
- }
1
+ import { Node } from "./Node";
2
+ export declare class Visitor {
3
+ root: Node | null;
4
+ selectedNodes: Node[];
5
+ constructor(root?: Node | null, selectedNodes?: Node[]);
6
+ flatten(): this;
7
+ remove(): this;
8
+ private recursiveRemove;
9
+ wrap(callback: (node: Node) => Node): this;
10
+ unwrap(): this;
11
+ prepend(callback: (node: Node) => Node): this;
12
+ append(callback: (node: Node) => Node): this;
13
+ transform(callback: (node: Node) => Node): this;
14
+ private recursiveTransform;
15
+ selectAll(): Visitor;
16
+ selectNode(node: Node): Visitor;
17
+ deselectNode(node: Node): Visitor;
18
+ select(callback: (node: Node) => boolean): Visitor;
19
+ forEach(callback: (node: Node) => void): this;
20
+ filter(callback: (node: Node) => boolean): Visitor;
21
+ map(callback: (node: Node) => Node): Visitor;
22
+ selectRoot(): Visitor;
23
+ first(): Visitor;
24
+ last(): Visitor;
25
+ get(index: number): Visitor;
26
+ clear(): this;
27
+ setRoot(root: Node | null): this;
28
+ static select(root: Node, callback?: (node: Node) => boolean): Visitor;
29
+ static walkUp(node: Node, callback: (node: Node, ancestors: Node[]) => void, ancestors?: Node[]): typeof Visitor;
30
+ static walkDown(node: Node, callback: (node: Node, ancestors: Node[]) => void, ancestors?: Node[]): typeof Visitor;
31
+ }