@khanacademy/perseus 0.2.7 → 0.3.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 (97) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +5 -0
  3. package/dist/es/index.css +1 -436
  4. package/dist/es/index.js +3172 -5450
  5. package/dist/es/index.js.map +1 -1
  6. package/dist/index.css +1 -436
  7. package/dist/index.js +13520 -15805
  8. package/dist/index.js.map +1 -1
  9. package/package.json +4 -2
  10. package/src/__tests__/perseus-markdown_test.jsx +6 -6
  11. package/src/__tests__/renderer_test.jsx +9 -9
  12. package/src/article-renderer.jsx +4 -5
  13. package/src/components/input-with-examples.jsx +4 -5
  14. package/src/components/lint.jsx +2 -1
  15. package/src/components/sortable.jsx +6 -7
  16. package/src/hint-renderer.jsx +3 -4
  17. package/src/hints-renderer.jsx +3 -4
  18. package/src/index.js +1 -0
  19. package/src/item-renderer.jsx +4 -5
  20. package/src/jquery.mobile.vmouse.js +2 -1
  21. package/src/perseus-markdown.jsx +3 -3
  22. package/src/renderer.jsx +31 -33
  23. package/src/styles/perseus-renderer.less +1 -1
  24. package/src/{not-gorgon.js → translation-linter.js} +10 -14
  25. package/src/types.js +3 -1
  26. package/src/widget-container.jsx +1 -1
  27. package/src/widgets/__tests__/__snapshots__/definition_test.js.snap +30 -12
  28. package/src/widgets/__tests__/definition_test.js +18 -33
  29. package/src/widgets/__tests__/grapher.cypress.jsx +2 -2
  30. package/src/widgets/__tests__/interactive-graph.cypress.jsx +2 -2
  31. package/src/widgets/categorizer.jsx +1 -1
  32. package/src/widgets/definition.jsx +36 -71
  33. package/src/widgets/explanation.jsx +1 -1
  34. package/src/widgets/expression.jsx +1 -1
  35. package/src/widgets/graded-group-set.jsx +1 -1
  36. package/src/widgets/graded-group.jsx +1 -1
  37. package/src/widgets/group.jsx +1 -1
  38. package/src/widgets/image.jsx +1 -1
  39. package/src/widgets/input-number.jsx +1 -1
  40. package/src/widgets/matcher.jsx +4 -1
  41. package/src/widgets/matrix.jsx +1 -1
  42. package/src/widgets/numeric-input.jsx +1 -1
  43. package/src/widgets/orderer.jsx +4 -1
  44. package/src/widgets/passage-ref-target.jsx +4 -1
  45. package/src/widgets/passage.jsx +1 -1
  46. package/src/widgets/radio/widget.jsx +1 -1
  47. package/src/widgets/sequence.jsx +4 -1
  48. package/src/widgets/sorter.jsx +4 -1
  49. package/src/widgets/table.jsx +4 -1
  50. package/src/README.md +0 -35
  51. package/src/__tests__/__snapshots__/pure-markdown_test.js.snap +0 -113
  52. package/src/__tests__/pure-markdown_test.js +0 -552
  53. package/src/gorgon/README +0 -40
  54. package/src/gorgon/__tests__/matcher_test.js +0 -497
  55. package/src/gorgon/__tests__/rule_test.js +0 -101
  56. package/src/gorgon/__tests__/rules_test.js +0 -487
  57. package/src/gorgon/__tests__/selector-parser_test.js +0 -52
  58. package/src/gorgon/__tests__/tree-transformer_test.js +0 -446
  59. package/src/gorgon/gorgon.js +0 -290
  60. package/src/gorgon/proptypes.js +0 -29
  61. package/src/gorgon/rule.js +0 -413
  62. package/src/gorgon/rules/absolute-url.js +0 -24
  63. package/src/gorgon/rules/all-rules.js +0 -72
  64. package/src/gorgon/rules/blockquoted-math.js +0 -10
  65. package/src/gorgon/rules/blockquoted-widget.js +0 -10
  66. package/src/gorgon/rules/double-spacing-after-terminal.js +0 -12
  67. package/src/gorgon/rules/extra-content-spacing.js +0 -12
  68. package/src/gorgon/rules/heading-level-1.js +0 -14
  69. package/src/gorgon/rules/heading-level-skip.js +0 -20
  70. package/src/gorgon/rules/heading-sentence-case.js +0 -11
  71. package/src/gorgon/rules/heading-title-case.js +0 -63
  72. package/src/gorgon/rules/image-alt-text.js +0 -21
  73. package/src/gorgon/rules/image-in-table.js +0 -10
  74. package/src/gorgon/rules/image-spaces-around-urls.js +0 -35
  75. package/src/gorgon/rules/image-widget.js +0 -50
  76. package/src/gorgon/rules/link-click-here.js +0 -11
  77. package/src/gorgon/rules/lint-utils.js +0 -48
  78. package/src/gorgon/rules/long-paragraph.js +0 -14
  79. package/src/gorgon/rules/math-adjacent.js +0 -10
  80. package/src/gorgon/rules/math-align-extra-break.js +0 -11
  81. package/src/gorgon/rules/math-align-linebreaks.js +0 -43
  82. package/src/gorgon/rules/math-empty.js +0 -10
  83. package/src/gorgon/rules/math-font-size.js +0 -12
  84. package/src/gorgon/rules/math-frac.js +0 -10
  85. package/src/gorgon/rules/math-nested.js +0 -11
  86. package/src/gorgon/rules/math-starts-with-space.js +0 -12
  87. package/src/gorgon/rules/math-text-empty.js +0 -10
  88. package/src/gorgon/rules/math-without-dollars.js +0 -14
  89. package/src/gorgon/rules/nested-lists.js +0 -11
  90. package/src/gorgon/rules/profanity.js +0 -10
  91. package/src/gorgon/rules/table-missing-cells.js +0 -20
  92. package/src/gorgon/rules/unbalanced-code-delimiters.js +0 -14
  93. package/src/gorgon/rules/unescaped-dollar.js +0 -10
  94. package/src/gorgon/rules/widget-in-table.js +0 -10
  95. package/src/gorgon/selector.js +0 -506
  96. package/src/gorgon/tree-transformer.js +0 -588
  97. package/src/pure-markdown.js +0 -347
@@ -1,487 +0,0 @@
1
- // @flow
2
- import PerseusMarkdown from "../../perseus-markdown.jsx";
3
- import absoluteUrlRule from "../rules/absolute-url.js";
4
- import blockquotedMathRule from "../rules/blockquoted-math.js";
5
- import blockquotedWidgetRule from "../rules/blockquoted-widget.js";
6
- import doubleSpacingAfterTerminalRule from "../rules/double-spacing-after-terminal.js";
7
- import extraContentSpacingRule from "../rules/extra-content-spacing.js";
8
- import headingLevel1Rule from "../rules/heading-level-1.js";
9
- import headingLevelSkipRule from "../rules/heading-level-skip.js";
10
- import headingSentenceCaseRule from "../rules/heading-sentence-case.js";
11
- import headingTitleCaseRule from "../rules/heading-title-case.js";
12
- import imageAltTextRule from "../rules/image-alt-text.js";
13
- import imageInTableRule from "../rules/image-in-table.js";
14
- import imageSpacesAroundUrlsRule from "../rules/image-spaces-around-urls.js";
15
- import imageWidgetRule from "../rules/image-widget.js";
16
- import linkClickHereRule from "../rules/link-click-here.js";
17
- import longParagraphRule from "../rules/long-paragraph.js";
18
- import mathAdjacentRule from "../rules/math-adjacent.js";
19
- import mathAlignExtraBreakRule from "../rules/math-align-extra-break.js";
20
- import mathAlignLinebreaksRule from "../rules/math-align-linebreaks.js";
21
- import mathEmptyRule from "../rules/math-empty.js";
22
- import mathFontSizeRule from "../rules/math-font-size.js";
23
- import mathFracRule from "../rules/math-frac.js";
24
- import mathNestedRule from "../rules/math-nested.js";
25
- import mathStartsWithSpaceRule from "../rules/math-starts-with-space.js";
26
- import mathTextEmptyRule from "../rules/math-text-empty.js";
27
- import mathWithoutDollarsRule from "../rules/math-without-dollars.js";
28
- import nestedListsRule from "../rules/nested-lists.js";
29
- import profanityRule from "../rules/profanity.js";
30
- import tableMissingCellsRule from "../rules/table-missing-cells.js";
31
- import unbalancedCodeDelimitersRule from "../rules/unbalanced-code-delimiters.js";
32
- import unescapedDollarRule from "../rules/unescaped-dollar.js";
33
- import widgetInTableRule from "../rules/widget-in-table.js";
34
- import TreeTransformer from "../tree-transformer.js";
35
-
36
- describe("Individual lint rules tests", () => {
37
- function testRule(rule, markdown, context) {
38
- const tree = PerseusMarkdown.parse(markdown);
39
- const tt = new TreeTransformer(tree);
40
- const warnings = [];
41
-
42
- // The markdown parser often outputs adjacent text nodes. We
43
- // coalesce them before linting for efficiency and accuracy.
44
- tt.traverse((node, state, content) => {
45
- if (TreeTransformer.isTextNode(node)) {
46
- let next = state.nextSibling();
47
- while (TreeTransformer.isTextNode(next)) {
48
- // $FlowFixMe[prop-missing]
49
- // $FlowFixMe[incompatible-use]
50
- node.content += next.content;
51
- state.removeNextSibling();
52
- next = state.nextSibling();
53
- }
54
- }
55
- });
56
-
57
- if (context) {
58
- // $FlowFixMe[prop-missing]
59
- context.content = markdown;
60
- } else {
61
- context = {
62
- content: markdown,
63
- widgets: {},
64
- };
65
- }
66
- tt.traverse((node, state, content) => {
67
- const check = rule.check(node, state, content, context);
68
- if (check) {
69
- warnings.push(check);
70
- }
71
- });
72
-
73
- return warnings.length === 0 ? null : warnings;
74
- }
75
-
76
- function expectWarning(rule, strings, context) {
77
- if (typeof strings === "string") {
78
- strings = [strings];
79
- }
80
-
81
- it(`Rule ${rule.name} warns`, () => {
82
- for (const string of strings) {
83
- expect(testRule(rule, string, context) !== null).toBeTruthy();
84
- }
85
- });
86
- }
87
-
88
- function expectPass(rule, strings, context) {
89
- if (typeof strings === "string") {
90
- strings = [strings];
91
- }
92
-
93
- it(`Rule ${rule.name} passes`, () => {
94
- for (const string of strings) {
95
- expect(testRule(rule, string, context) === null).toBeTruthy();
96
- }
97
- });
98
- }
99
-
100
- // 299 characters
101
- const sentence = new Array(25).fill("lorem ipsum").join(" ");
102
-
103
- // long-paragraph rule warns about paragraphs over 500 characters
104
- expectWarning(longParagraphRule, sentence + sentence);
105
- expectPass(longParagraphRule, [sentence, sentence + "\n\n" + sentence]);
106
-
107
- expectWarning(headingLevel1Rule, "# Level 1 heading");
108
- expectPass(headingLevel1Rule, "## Level 1 heading\n\n### Level 3 heading");
109
-
110
- expectWarning(headingLevelSkipRule, "## heading 1\n\n#### heading 2");
111
- expectPass(headingLevelSkipRule, [
112
- "## heading 1\n\n### heading 2\n\n#### heading 3\n\n### heading 4",
113
- "## heading 1\n\n##heading 2\n\n##heading3",
114
- ]);
115
-
116
- expectWarning(
117
- headingTitleCaseRule,
118
- "## This Heading is in Title Case and the but nor for Too",
119
- );
120
- expectPass(headingTitleCaseRule, [
121
- "## This heading is in sentence case",
122
- "## Acronyms: The CIA, NSA, DNI, and FBI",
123
- "## The Great War",
124
- ]);
125
-
126
- expectWarning(headingSentenceCaseRule, [
127
- "## this heading is uncapitalized",
128
- "## 'this' heading is uncapitalized",
129
- "## this heading is uncapitalized",
130
- ]);
131
- expectPass(headingSentenceCaseRule, [
132
- "## This heading is in sentence case",
133
- "## 'This heading too'",
134
- "## 2 + 2 = 4",
135
- ]);
136
-
137
- expectWarning(nestedListsRule, [
138
- "1. outer\n * nested\n *nested",
139
- " + outer\n\n 1. nested",
140
- ]);
141
- expectPass(nestedListsRule, [
142
- "-one\n-two\n-three",
143
- "1. one\n 2. two\n3. three",
144
- " * one\n\n * two\n\n * three",
145
- ]);
146
-
147
- expectWarning(imageAltTextRule, [
148
- "![](http://google.com/)",
149
- '![](http://google.com/ "title")',
150
- "![][url-ref]",
151
- "![ ](http://google.com/)",
152
- "![ \t\n ](http://google.com/)", // all whitespace
153
- "![blah](http://google.com/)", // too short to be meaningful
154
- ]);
155
-
156
- expectPass(imageAltTextRule, [
157
- "![alt-text](http://google.com)",
158
- '![alternative text](http://google.com/ "title")',
159
- "![alt alt alt][url-ref]",
160
- ]);
161
-
162
- expectWarning(blockquotedMathRule, ["> $1$", "Quote:\n\n> $x$\n\n"]);
163
- expectPass(blockquotedMathRule, [
164
- "$x$",
165
- "\n$x$\n $y$\n",
166
- "> bq #1\n\n$x+y=1$\n\n> bq #2",
167
- ]);
168
-
169
- expectWarning(blockquotedWidgetRule, ["> [[☃ passage 1]]"]);
170
- expectPass(blockquotedWidgetRule, [
171
- "[[☃ passage 1]]",
172
- "> bq #1\n\nTesting [[☃ passage 1]] testing\n\n> bq #2",
173
- ]);
174
-
175
- expectWarning(linkClickHereRule, [
176
- "[click here](http://google.com)",
177
- "[Click here, please](http://google.com)",
178
- "[For a good time, Click Here](http://google.com)",
179
- ]);
180
- expectPass(linkClickHereRule, [
181
- "[click to activate this link here](http://google.com)",
182
- ]);
183
-
184
- expectWarning(absoluteUrlRule, [
185
- // Warn about absolute khanacademy.org urls
186
- "[target](http://khanacademy.org/about)",
187
- "[target](https://khanacademy.org/about)",
188
- "[target](http://www.khanacademy.org/about)",
189
- "[target](https://www.khanacademy.org/about)",
190
- "[target](http://es.khanacademy.org/about)",
191
- "[target](https://es.khanacademy.org/about)",
192
- "[target](//www.khanacademy.org/about)",
193
- "[target](//www.khanacademy.org/about)",
194
-
195
- // We should get the same warnings for images
196
- "![alt text](http://khanacademy.org/about)",
197
- "![alt text](https://www.khanacademy.org/about)",
198
- "![alt text](https://es.khanacademy.org/about)",
199
- ]);
200
- expectPass(absoluteUrlRule, [
201
- "[target](/about)", // relative URLs okay
202
- "[target](https://kasandbox.org/path)",
203
- "[target](https://fastly.kastatic.org/path)",
204
- "[target](https://cdn.kastatic.org/path)",
205
- "[target](https://ka-perseus-images.s3.amazonaws.com/path)",
206
- "[target](https://ka-youtube-converted.storage.googleapis.com)",
207
-
208
- // Same warnings for images
209
- "![alt text](/about)",
210
- "![alt text](https://cdn.kastatic.org/path)",
211
- "![alt text](https://ka-perseus-images.s3.amazonaws.com/path)",
212
- ]);
213
-
214
- expectWarning(imageInTableRule, [
215
- "|col1|col2|\n|----|----|\n|![alt-text](/link.gif)|cell2|",
216
- ]);
217
- expectPass(imageInTableRule, [
218
- "![alt-text](/link.gif)\n|col1|col2|\n|----|----|\n|cell1|cell2|",
219
- ]);
220
-
221
- expectWarning(widgetInTableRule, [
222
- "|col1|col2|\n|----|----|\n|[[☃ passage 1]]|cell2|",
223
- ]);
224
- expectPass(widgetInTableRule, [
225
- "[[☃ passage 1]]\n|col1|col2|\n|----|----|\n|cell1|cell2|",
226
- ]);
227
-
228
- expectWarning(tableMissingCellsRule, [
229
- "|col1|col2|col3|\n|----|----|----|\n|col1|col2|col3|\n|cell1|cell2|",
230
- "|col1|col2|col3|\n|----|----|----|\n|col1|col2|\n|cell1|cell2|",
231
- "|col1|col2|\n|----|----|\n|cell1|cell2|\n|cell1|cell2|cell3|",
232
- "|col1|\n|----|----|\n|col1|\n|cell1|cell2|",
233
- "|col1|col2|\n|----|----|\n|col1|\n|cell1|cell2|",
234
- ]);
235
- expectPass(tableMissingCellsRule, [
236
- "|col1|col2|\n|----|----|\n|cell1|cell2|\n|cell1|cell2|",
237
- "|cell1|\n|----|\n|cell2|\n|cell3|",
238
- ]);
239
-
240
- expectWarning(unescapedDollarRule, ["It costs $10", "It costs $$10$"]);
241
-
242
- expectPass(unescapedDollarRule, ["It costs \\$10", "It costs $10x$"]);
243
-
244
- expectWarning(mathStartsWithSpaceRule, [
245
- "foo$~ x$bar",
246
- "$\\qquad x$",
247
- "$\\quad x$",
248
- "$\\, x$",
249
- "$\\; x$",
250
- "$\\: x$",
251
- "$\\ x$",
252
- "$\\! x$",
253
- "$\\enspace x$",
254
- "$\\phantom{xyz} x$",
255
- ]);
256
- expectPass(mathStartsWithSpaceRule, [
257
- "$a~ x$",
258
- "$a\\qquad x$",
259
- "$a\\quad x$",
260
- "$a\\, x$",
261
- "$a\\; x$",
262
- "$a\\: x$",
263
- "$a\\ x$",
264
- "$a\\! x$",
265
- "$a\\enspace x$",
266
- "$a\\phantom{xyz} x$",
267
- ]);
268
-
269
- expectWarning(mathEmptyRule, [
270
- "foo $$ bar",
271
- "foo\n\n$$\n\nbar",
272
- "$$ | $$ | $$\n- | - | -\ndata 1 | data 2 | data 3",
273
- ]);
274
- expectPass(mathEmptyRule, [
275
- "foo $x$ bar",
276
- "foo\n\n$x$\n\nbar",
277
- "$x$ | $y$ | $z$\n- | - | -\ndata 1 | data 2 | data 3",
278
- ]);
279
-
280
- expectWarning(mathFracRule, ["$\\frac 12$", "$\\frac{1}{2}$"]);
281
- expectPass(mathFracRule, [
282
- "$\\dfrac 12$",
283
- "$\\dfrac{1}{2}$",
284
- "$\\fraction 12$",
285
- ]);
286
-
287
- expectWarning(mathTextEmptyRule, [
288
- "$x\\text{}y$",
289
- "$x\\text{ }y$",
290
- "$x\\text{\n}y$",
291
- "$x\\text{\t}y$",
292
- ]);
293
- expectPass(mathTextEmptyRule, ["$x\\text{z}y$"]);
294
-
295
- expectWarning(mathAdjacentRule, ["$x=b+c$\n\n$x-b=c$"]);
296
- expectPass(mathAdjacentRule, ["$x=b+c$\n\nnew paragraph\n\n$x-b=c$"]);
297
-
298
- expectWarning(mathAlignLinebreaksRule, [
299
- "$\\begin{align}x\\\\y\\end{align}$",
300
- "$\\begin{align} x \\\\ y \\end{align}$",
301
- "$\\begin{align}x\\\\\\\\\\\\y\\end{align}$",
302
- "$\\begin{align}\nx\\\\\n\\\\\\\\\ny\n\\end{align}$",
303
- ]);
304
- expectPass(mathAlignLinebreaksRule, [
305
- "$\\begin{align}x\\sqrty\\end{align}$",
306
- "$\\begin{align}x\\\\\\\\y\\end{align}$",
307
- "$\\begin{align}x\\\\\n\\\\y\\end{align}$",
308
- "$\\begin{align}x \\\\ \\\\ y\\end{align}$",
309
- ]);
310
-
311
- expectWarning(mathAlignExtraBreakRule, [
312
- "$\\begin{align}x \\\\\\\\ y \\\\ \\end{align}$",
313
- "$\\begin{align}x \\\\\\\\ y \\\\\\\\ \\end{align}$",
314
- ]);
315
- expectPass(mathAlignExtraBreakRule, [
316
- "$\\begin{align} x \\\\\\\\ y \\end{align}$",
317
- ]);
318
-
319
- expectWarning(mathNestedRule, [
320
- "$\\text{4$x$}$",
321
- "inline $\\text{4$x$}$ math",
322
- "$\\text{$$}$",
323
- ]);
324
- expectPass(mathNestedRule, ["$\\text{4}x$", "inline $\\text{4}x$ math"]);
325
-
326
- expectWarning(mathFontSizeRule, [
327
- "$\\tiny{x}$",
328
- "inline $\\Tiny{x}$ math",
329
- "$a \\small{x} b$",
330
- "$\\large{ xyz }$",
331
- "$ \\Large { x } $",
332
- "$\\LARGE{x}$",
333
- "$\\huge{x}$",
334
- "$\\Huge{x}$",
335
- "$\\normalsize{x}$",
336
- "$\\scriptsize{x}$",
337
- ]);
338
- expectPass(mathFontSizeRule, ["$\\sqrt{x}$", "inline $\\sqrt{x}$ math"]);
339
-
340
- expectWarning(profanityRule, [
341
- "Shit",
342
- "taking a piss",
343
- "He said 'Fuck that!'",
344
- "cunt",
345
- "cocksucker",
346
- "motherfucker",
347
- ]);
348
- expectPass(profanityRule, ["spit", "miss", "duck"]);
349
-
350
- expectWarning(mathWithoutDollarsRule, [
351
- "One half: \\frac{1}{2}!",
352
- "\\Large{BIG}!",
353
- "This looks like someone's ear: {",
354
- "Here's the other ear: }. Weird!",
355
- ]);
356
- expectPass(mathWithoutDollarsRule, [
357
- "One half: $\\frac{1}{2}$",
358
- "$\\Large{BIG}$!",
359
- "`{`",
360
- "`\\frac{1}{2}`",
361
- "``\\frac{1}{2}``",
362
- "```\n\\frac{1}{2}\n```",
363
- "~~~\n\\frac{1}{2}\n~~~",
364
- "\n \\frac{1}{2}\n {\n }\n",
365
- ]);
366
-
367
- expectWarning(unbalancedCodeDelimitersRule, [
368
- "`code``",
369
- "``code```",
370
- "```code\n",
371
- "~~~\ncode\n~~",
372
- ]);
373
- expectPass(unbalancedCodeDelimitersRule, [
374
- "`code`",
375
- "``code``",
376
- "```code```",
377
- "```\ncode\n```",
378
- "~~~\ncode\n~~~",
379
- "``co`de``",
380
- "`co~de`",
381
- "$`~$",
382
- ]);
383
-
384
- expectWarning(imageSpacesAroundUrlsRule, [
385
- "![alternative]( http://example.com/image.jpg )",
386
- "![alternative]( http://example.com/image.jpg)",
387
- "![alternative](http://example.com/image.jpg )",
388
- "![alternative](\thttp://example.com/image.jpg)",
389
- "![alternative](http://example.com/image.jpg\t)",
390
- "![alternative](\nhttp://example.com/image.jpg)",
391
- "![alternative](http://example.com/image.jpg\n)",
392
- ]);
393
- expectPass(imageSpacesAroundUrlsRule, [
394
- "![alternative](http://example.com/image.jpg)",
395
- "![alternative](image.jpg)",
396
- "![alternative](--image.jpg--)",
397
- ]);
398
-
399
- // Warn for image widget with no alt text
400
- expectWarning(imageWidgetRule, "[[☃ image 1]]", {
401
- widgets: {
402
- "image 1": {
403
- options: {},
404
- },
405
- },
406
- });
407
-
408
- // Warn for image widget with short alt text
409
- expectWarning(imageWidgetRule, "[[☃ image 1]]", {
410
- widgets: {
411
- "image 1": {
412
- options: {
413
- alt: "1234567",
414
- },
415
- },
416
- },
417
- });
418
-
419
- // Pass for image widget with long alt text
420
- expectPass(imageWidgetRule, "[[☃ image 1]]", {
421
- widgets: {
422
- "image 1": {
423
- options: {
424
- alt: "1234567890",
425
- },
426
- },
427
- },
428
- });
429
-
430
- // Warn for image widget with math in its caption
431
- expectWarning(imageWidgetRule, "[[☃ image 1]]", {
432
- widgets: {
433
- "image 1": {
434
- options: {
435
- alt: "1234567890",
436
- caption: "Test: $x$",
437
- },
438
- },
439
- },
440
- });
441
-
442
- // Pass for image widget with caption and no math
443
- expectPass(imageWidgetRule, "[[☃ image 1]]", {
444
- widgets: {
445
- "image 1": {
446
- options: {
447
- alt: "1234567890",
448
- caption: "Test: x",
449
- },
450
- },
451
- },
452
- });
453
-
454
- // Pass for image widget with escaped dollar in its caption
455
- expectPass(imageWidgetRule, "[[☃ image 1]]", {
456
- widgets: {
457
- "image 1": {
458
- options: {
459
- alt: "1234567890",
460
- caption: "Test: \\$10",
461
- },
462
- },
463
- },
464
- });
465
-
466
- expectWarning(doubleSpacingAfterTerminalRule, [
467
- "Good times. Great oldies.",
468
- "End of the line! ",
469
- "You? Me!",
470
- ]);
471
- expectPass(doubleSpacingAfterTerminalRule, [
472
- "This is okay.",
473
- "This is definitely okay. Yeah.",
474
- "$a == 3. 125$",
475
- ]);
476
-
477
- expectWarning(extraContentSpacingRule, [
478
- "There's extra spaces here. ",
479
- "There's extra spaces here ",
480
- " ",
481
- ]);
482
- expectPass(extraContentSpacingRule, [
483
- "This is okay.",
484
- "This is definitely okay. Yeah.",
485
- "$a == 3. 125$",
486
- ]);
487
- });
@@ -1,52 +0,0 @@
1
- // @flow
2
- import Selector from "../selector.js";
3
-
4
- describe("gorgon selector parser", () => {
5
- const validExpressions = [
6
- "*",
7
- " * ",
8
- "para",
9
- "list para",
10
- "\tlist para\n",
11
- "list > para",
12
- "list + para",
13
- "list ~ para",
14
- "list list para",
15
- "para~heading~para~heading",
16
- "list, para",
17
- "list > para, list text, heading *, heading+para",
18
- ];
19
-
20
- const invalidExpressions = [
21
- "", // Expected node type
22
- "", // Expected node type
23
- "<", // Expected node type
24
- "+", // Expected node type
25
- "~", // Expected node type
26
- "**", // Unexpected token
27
- "foo*", // Unexpected token
28
- "*/foo/", // Unexpected token
29
- "()", // Unexpected token
30
- ",",
31
- "list,",
32
- ",list",
33
- ];
34
-
35
- validExpressions.forEach((s) => {
36
- it("parses '" + s + "'", () => {
37
- const e = Selector.parse(s);
38
- expect(e instanceof Selector).toBeTruthy();
39
- expect(e.toString().replace(/\s/g, "")).toEqual(
40
- s.replace(/\s/g, ""),
41
- );
42
- });
43
- });
44
-
45
- invalidExpressions.forEach((s) => {
46
- it("rejects '" + s + "'", () => {
47
- expect(() => {
48
- Selector.parse(s);
49
- }).toThrow();
50
- });
51
- });
52
- });