highmark-markdown 0.0.383 → 0.0.388

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 (70) hide show
  1. package/example.js +2972 -865
  2. package/lib/defaultMarkdownStyle.js +2 -2
  3. package/lib/elementMap.js +4 -4
  4. package/lib/example/constants.js +6 -2
  5. package/lib/example/view.js +5 -4
  6. package/lib/markdown/bnf.js +2 -2
  7. package/lib/mixins/node.js +6 -1
  8. package/lib/node/markdown/contentsItem.js +8 -30
  9. package/lib/node/markdown/contentsLink.js +9 -30
  10. package/lib/node/markdown/contentsList.js +8 -33
  11. package/lib/node/markdown/directive/embee.js +8 -8
  12. package/lib/node/markdown/division.js +90 -103
  13. package/lib/node/markdown/{footnoteItem.js → footnotesItem.js} +12 -12
  14. package/lib/node/markdown/footnotesList.js +9 -47
  15. package/lib/node/markdown/subDivision.js +2 -3
  16. package/lib/node/markdown.js +25 -1
  17. package/lib/nodeMap.js +6 -3
  18. package/lib/replacement/contentsItem.js +145 -0
  19. package/lib/replacement/contentsLink.js +157 -0
  20. package/lib/replacement/contentsList.js +212 -0
  21. package/lib/replacement/footnote.js +122 -0
  22. package/lib/replacement/footnotesItem.js +140 -0
  23. package/lib/replacement/footnotesList.js +189 -0
  24. package/lib/replacement/imported.js +151 -0
  25. package/lib/replacement/line.js +127 -0
  26. package/lib/replacement/subDivision/contentsDirective.js +126 -0
  27. package/lib/replacement/subDivision/footnote.js +126 -0
  28. package/lib/replacement/subDivision/footnotesDirective.js +126 -0
  29. package/lib/replacement/subDivision/pageNumberDirective.js +126 -0
  30. package/lib/replacement/subDivision.js +175 -0
  31. package/lib/replacement.js +139 -46
  32. package/lib/ruleNames.js +6 -6
  33. package/lib/utilities/markdown.js +8 -8
  34. package/lib/utilities/node.js +1 -72
  35. package/lib/utilities/replacement.js +104 -0
  36. package/package.json +1 -1
  37. package/src/defaultMarkdownStyle.js +20 -1
  38. package/src/elementMap.js +5 -5
  39. package/src/example/constants.js +2 -1
  40. package/src/example/view.js +13 -12
  41. package/src/markdown/bnf.js +23 -9
  42. package/src/mixins/node.js +10 -0
  43. package/src/node/markdown/contentsItem.js +7 -38
  44. package/src/node/markdown/contentsLink.js +8 -41
  45. package/src/node/markdown/contentsList.js +7 -39
  46. package/src/node/markdown/directive/embee.js +9 -9
  47. package/src/node/markdown/division.js +90 -158
  48. package/src/node/markdown/{footnoteItem.js → footnotesItem.js} +5 -5
  49. package/src/node/markdown/footnotesList.js +10 -78
  50. package/src/node/markdown/subDivision.js +1 -5
  51. package/src/node/markdown.js +28 -0
  52. package/src/nodeMap.js +12 -3
  53. package/src/replacement/contentsItem.js +49 -0
  54. package/src/replacement/contentsLink.js +29 -0
  55. package/src/replacement/contentsList.js +111 -0
  56. package/src/replacement/footnote.js +16 -0
  57. package/src/replacement/footnotesItem.js +38 -0
  58. package/src/replacement/footnotesList.js +73 -0
  59. package/src/replacement/imported.js +13 -0
  60. package/src/replacement/line.js +14 -0
  61. package/src/replacement/subDivision/contentsDirective.js +20 -0
  62. package/src/replacement/subDivision/footnote.js +20 -0
  63. package/src/replacement/subDivision/footnotesDirective.js +20 -0
  64. package/src/replacement/subDivision/pageNumberDirective.js +20 -0
  65. package/src/replacement/subDivision.js +42 -0
  66. package/src/replacement.js +108 -53
  67. package/src/ruleNames.js +2 -2
  68. package/src/utilities/markdown.js +9 -9
  69. package/src/utilities/node.js +0 -48
  70. package/src/utilities/replacement.js +66 -0
@@ -2,24 +2,23 @@
2
2
 
3
3
  import { arrayUtilities } from "necessary";
4
4
 
5
- import Replacement from "../../replacement";
6
5
  import MarkdownNode from "../../node/markdown";
7
- import ContentsListMarkdownNode from "../../node/markdown/contentsList";
8
- import FootnotesListMarkdownNode from "../../node/markdown/footnotesList";
6
+ import FootnoteReplacement from "../../replacement/footnote";
7
+ import ContentsListReplacement from "../../replacement/contentsList";
8
+ import FootnotesListReplacement from "../../replacement/footnotesList";
9
+ import FootnoteSubDivisionReplacement from "../../replacement/subDivision/footnote";
10
+ import ContentsDirectiveSubDivisionReplacement from "../../replacement/subDivision/contentsDirective";
11
+ import FootnotesDirectiveSubDivisionReplacement from "../../replacement/subDivision/footnotesDirective";
12
+ import PageNumberDirectiveSubDivisionReplacement from "../../replacement/subDivision/pageNumberDirective";
9
13
 
10
14
  import { EMPTY_STRING } from "../../constants";
11
15
  import { DIVISION_RULE_NAME } from "../../ruleNames";
12
- import { removeNode, removeTokens, replaceNode, replaceNodes, replaceTokens } from "../../utilities/node";
13
- import { footnoteMarkdownNodsFromNode,
14
- headingMarkdownNodesFromNode,
15
- subDivisionMarkdownNodesFromNode,
16
+ import { subDivisionMarkdownNodesFromNode,
16
17
  embedDirectiveMarkdownNodesFromNode,
17
18
  ignoreDirectiveMarkdownNodeFromNode,
18
- contentsDirectiveMarkdownNodeFromNode,
19
- footnotesDirectiveMarkdownNodeFromNode,
20
19
  pageNumberDirectiveMarkdownNodeFromNode } from "../../utilities/query";
21
20
 
22
- const { clear, filter } = arrayUtilities;
21
+ const { clear } = arrayUtilities;
23
22
 
24
23
  export default class DivisionMarkdownNode extends MarkdownNode {
25
24
  constructor(ruleName, childNodes, precedence, opacity, domElement, divisionClassName) {
@@ -50,40 +49,12 @@ export default class DivisionMarkdownNode extends MarkdownNode {
50
49
  return ignored;
51
50
  }
52
51
 
53
- findParentNode(childNode, node = this) {
54
- let parentNode = null;
55
-
56
- const nodeNonTerminalNode = node.isNonTerminalNode();
57
-
58
- if (nodeNonTerminalNode) {
59
- const nonTerminalNode = node, ///
60
- childNodes = nonTerminalNode.getChildNodes(),
61
- index = childNodes.indexOf(childNode);
62
-
63
- if (index !== -1) {
64
- parentNode = node; ///
65
- } else {
66
- const nodes = childNodes; ///
67
-
68
- nodes.some((node) => {
69
- parentNode = this.findParentNode(childNode, node);
70
-
71
- if (parentNode !== null) {
72
- return true;
73
- }
74
- });
75
- }
76
- }
77
-
78
- return parentNode;
79
- }
80
-
81
52
  paginate(context) {
82
53
  const { linesPerPage } = context,
83
54
  childNodes = this.getChildNodes(),
84
55
  paginatedChildNodes = [],
85
56
  divisionMarkdownNodes = [],
86
- subDivisionReplacements = this.removeSubdivisionMarkdownNodes(pageNumberDirectiveMarkdownNodeFromNode, context);
57
+ pageNumberDirectiveSubDivisionReplacement = this.removeSubDivisionMarkdownNode(PageNumberDirectiveSubDivisionReplacement, context);
87
58
 
88
59
  let totalLines = 0;
89
60
 
@@ -96,7 +67,7 @@ export default class DivisionMarkdownNode extends MarkdownNode {
96
67
  paginatedChildNodes.push(paginatedChildNode);
97
68
 
98
69
  if (totalLines > linesPerPage) {
99
- const divisionMarkdownNode = DivisionMarkdownNode.fromSubdivisionReplacementsPaginatedChildNodesAndDivisionClassName(subDivisionReplacements, paginatedChildNodes, this.divisionClassName, context);
70
+ const divisionMarkdownNode = DivisionMarkdownNode.fromPageNumberDirectiveSubDivisionReplacementPaginatedChildNodesAndDivisionClassName(pageNumberDirectiveSubDivisionReplacement, paginatedChildNodes, this.divisionClassName, context);
100
71
 
101
72
  divisionMarkdownNodes.push(divisionMarkdownNode);
102
73
 
@@ -107,7 +78,7 @@ export default class DivisionMarkdownNode extends MarkdownNode {
107
78
  });
108
79
 
109
80
  if (totalLines > 0) {
110
- const divisionMarkdownNode = DivisionMarkdownNode.fromSubdivisionReplacementsPaginatedChildNodesAndDivisionClassName(subDivisionReplacements, paginatedChildNodes, this.divisionClassName, context);
81
+ const divisionMarkdownNode = DivisionMarkdownNode.fromPageNumberDirectiveSubDivisionReplacementPaginatedChildNodesAndDivisionClassName(pageNumberDirectiveSubDivisionReplacement, paginatedChildNodes, this.divisionClassName, context);
111
82
 
112
83
  divisionMarkdownNodes.push(divisionMarkdownNode);
113
84
  }
@@ -127,67 +98,45 @@ export default class DivisionMarkdownNode extends MarkdownNode {
127
98
  createContents(divisionMarkdownNodes, context) {
128
99
  let contentsCreated = false;
129
100
 
130
- const node = this, ///
131
- contentsDirectiveMarkdownNode = contentsDirectiveMarkdownNodeFromNode(node);
101
+ const contentsDirectiveSubDivisionReplacement = this.findSubDivisionReplacement(ContentsDirectiveSubDivisionReplacement, context);
132
102
 
133
- if (contentsDirectiveMarkdownNode !== null) {
103
+ if (contentsDirectiveSubDivisionReplacement !== null) {
134
104
  const divisionMarkdownNode = this, ///
135
- headingMarkdownNodes = headingMarkdownNodesFromDivisionMarkdownNodesAndDivisionMarkdownNode(divisionMarkdownNodes, divisionMarkdownNode, context),
136
- headingMarkdownNodesLength = headingMarkdownNodes.length;
137
-
138
- if (headingMarkdownNodesLength === 0) {
139
- return;
140
- }
105
+ contentsListReplacement = ContentsListReplacement.fromDivisionMarkdownNodesAndDivisionMarkdownNode(divisionMarkdownNodes, divisionMarkdownNode, context);
141
106
 
142
- const { tokens } = context,
143
- contentsListMarkdownNode = ContentsListMarkdownNode.fromHeadingMarkdownNodes(headingMarkdownNodes, context),
144
- contentsListMarkdownNodeTokens = contentsListMarkdownNode.getTokens(),
145
- childNode = contentsDirectiveMarkdownNode, ///
146
- parentNode = this.findParentNode(childNode),
147
- replacedNode = contentsDirectiveMarkdownNode, ///
148
- replacementNode = contentsListMarkdownNode, ///
149
- replacementTokens = contentsListMarkdownNodeTokens; ///
107
+ if (contentsListReplacement !== null) {
108
+ contentsListReplacement.replaceContentsDirectiveSubdivisionReplacement(contentsDirectiveSubDivisionReplacement, divisionMarkdownNode, context);
150
109
 
151
- replaceNode(replacementNode, replacedNode, parentNode);
152
-
153
- replaceTokens(replacementTokens, replacedNode, tokens);
154
-
155
- contentsCreated = true;
110
+ contentsCreated = true;
111
+ }
156
112
  }
157
113
 
158
114
  return contentsCreated;
159
115
  }
160
116
 
161
117
  createFootnotes(footnoteReplacements, context) {
162
- if (footnoteReplacements === null) {
163
- return;
164
- }
165
-
166
- const divisionMarkdownNode = this, ///
167
- footnotesListMarkdownNode = FootnotesListMarkdownNode.fromFootnoteReplacementsAndDivisionMarkdownNode(footnoteReplacements, divisionMarkdownNode, context);
118
+ if (footnoteReplacements !== null) {
119
+ const divisionMarkdownNode = this, ///
120
+ footnotesListReplacement = FootnotesListReplacement.fromFootnoteReplacementsAndDivisionMarkdownNode(footnoteReplacements, divisionMarkdownNode, context);
168
121
 
169
- if (footnotesListMarkdownNode === null) {
170
- return;
122
+ if (footnotesListReplacement !== null) {
123
+ footnotesListReplacement.appendToDivisionMarkdownNode(divisionMarkdownNode, context);
124
+ }
171
125
  }
172
-
173
- const node = footnotesListMarkdownNode, ///
174
- replacement = Replacement.fromNode(node, context);
175
-
176
- replacement.appendTo(divisionMarkdownNode, context);
177
126
  }
178
127
 
179
128
  prepareFootnotes(context) {
180
- let subdivisionReplacements;
129
+ const footnoteSubDivisionReplacements = this.removeSubDivisionMarkdownNodes(FootnoteSubDivisionReplacement, context);
181
130
 
182
- subdivisionReplacements = this.removeSubdivisionMarkdownNodes(footnoteMarkdownNodsFromNode, context);
131
+ let footnoteReplacements = footnoteSubDivisionReplacements.map((footnoteSubDivisionReplacement) => {
132
+ const footnoteReplacement = FootnoteReplacement.fromFootnoteSubDivisionReplacement(footnoteSubDivisionReplacement);
183
133
 
184
- let footnoteReplacements = footnoteReplacementsFromSubdivisionReplacements(subdivisionReplacements);
185
-
186
- subdivisionReplacements = this.removeSubdivisionMarkdownNodes(footnotesDirectiveMarkdownNodeFromNode, context);
134
+ return footnoteReplacement;
135
+ });
187
136
 
188
- const subdivisionReplacementsLength = subdivisionReplacements.length;
137
+ const footnotesDirectiveSubDivisionReplacement = this.removeSubDivisionMarkdownNode(FootnotesDirectiveSubDivisionReplacement, context);
189
138
 
190
- if (subdivisionReplacementsLength === 0) {
139
+ if (footnotesDirectiveSubDivisionReplacement === null) {
191
140
  footnoteReplacements = null;
192
141
  }
193
142
 
@@ -199,48 +148,40 @@ export default class DivisionMarkdownNode extends MarkdownNode {
199
148
  embedDirectiveMarkdownNodes = embedDirectiveMarkdownNodesFromNode(node);
200
149
 
201
150
  embedDirectiveMarkdownNodes.map((embedDirectiveMarkdownNode) => {
202
- const replacement = embedDirectiveMarkdownNode.replacement(context);
151
+ const importedReplacement = embedDirectiveMarkdownNode.import(context);
203
152
 
204
- if (replacement !== null) {
205
- let tokens;
206
-
207
- tokens = replacement.getTokens();
153
+ if (importedReplacement !== null) {
154
+ const childNode = embedDirectiveMarkdownNode, ///
155
+ parentNode = this.findParentNode(childNode);
208
156
 
209
- const childNodes = replacement.getChildNodes(),
210
- replacementNodes = childNodes, ///
211
- replacementTokens = tokens; ///
157
+ importedReplacement.replaceEmbedDirectiveMarkdownNode(embedDirectiveMarkdownNode, parentNode, context);
158
+ }
159
+ });
160
+ }
212
161
 
213
- ({ tokens } = context);
162
+ findSubDivisionReplacement(SubDivisionReplacement, context) {
163
+ let subDivisionReplacement = null;
214
164
 
215
- const childNode = embedDirectiveMarkdownNode, ///
216
- parentNode = this.findParentNode(childNode),
217
- replacedNode = embedDirectiveMarkdownNode; ///
165
+ const subDivisionMarkdownNodes = this.findSubDivisionMarkdownNodes();
218
166
 
219
- replaceNodes(replacementNodes, replacedNode, parentNode);
167
+ subDivisionMarkdownNodes.some((subDivisionMarkdownNode) => {
168
+ subDivisionReplacement = SubDivisionReplacement.fromSubDivisionMarkdownNode(subDivisionMarkdownNode, context);
220
169
 
221
- replaceTokens(replacementTokens, replacedNode, tokens);
170
+ if (subDivisionReplacement !== null) {
171
+ return true;
222
172
  }
223
173
  });
174
+
175
+ return subDivisionReplacement;
224
176
  }
225
177
 
226
- removeSubdivisionMarkdownNodes(markdownNodeFromNode, context) {
227
- const { tokens } = context,
228
- node = this, ///
229
- parentNode = this, ///
230
- subDivisionMarkdownNodes = subDivisionMarkdownNodesFromNode(node),
178
+ findSubDivisionReplacements(SubDivisionReplacement, context) {
179
+ const subDivisionMarkdownNodes = this.findSubDivisionMarkdownNodes(),
231
180
  subDivisionReplacements = subDivisionMarkdownNodes.reduce((subDivisionReplacements, subDivisionMarkdownNode) => {
232
- const node = subDivisionMarkdownNode, ///
233
- markdownNode = markdownNodeFromNode(node);
234
-
235
- if (markdownNode !== null) {
236
- const removedNode = subDivisionMarkdownNode, ///
237
- subDivisionReplacement = Replacement.fromNode(subDivisionMarkdownNode, context);
181
+ const subDivisionReplacement = SubDivisionReplacement.fromSubDivisionMarkdownNode(subDivisionMarkdownNode, context);
238
182
 
183
+ if (subDivisionReplacement !== null) {
239
184
  subDivisionReplacements.push(subDivisionReplacement);
240
-
241
- removeTokens(removedNode, tokens);
242
-
243
- removeNode(removedNode, parentNode);
244
185
  }
245
186
 
246
187
  return subDivisionReplacements;
@@ -249,11 +190,40 @@ export default class DivisionMarkdownNode extends MarkdownNode {
249
190
  return subDivisionReplacements;
250
191
  }
251
192
 
252
- createFootnotesListMarkdownNode(context) {
193
+ findSubDivisionMarkdownNodes() {
194
+ const node = this, ///
195
+ subDivisionMarkdownNodes = subDivisionMarkdownNodesFromNode(node);
196
+
197
+ return subDivisionMarkdownNodes;
198
+ }
199
+
200
+ removeSubDivisionMarkdownNode(SubDivisionReplacement, context) {
253
201
  const divisionMarkdownNode = this, ///
254
- footnotesListMarkdownNode = FootnotesListMarkdownNode.fromDivisionMarkdownNode(divisionMarkdownNode, context);
202
+ subDivisionReplacement = this.findSubDivisionReplacement(SubDivisionReplacement, context);
203
+
204
+ if (subDivisionReplacement !== null) {
205
+ subDivisionReplacement.removeFromDivisionMarkdownNode(divisionMarkdownNode, context);
206
+ }
255
207
 
256
- return footnotesListMarkdownNode;
208
+ return subDivisionReplacement;
209
+ }
210
+
211
+ removeSubDivisionMarkdownNodes(SubDivisionReplacement, context) {
212
+ const divisionMarkdownNode = this, ///
213
+ subDivisionReplacements = this.findSubDivisionReplacements(SubDivisionReplacement, context);
214
+
215
+ subDivisionReplacements.forEach((subDivisionReplacement) => {
216
+ subDivisionReplacement.removeFromDivisionMarkdownNode(divisionMarkdownNode, context);
217
+ });
218
+
219
+ return subDivisionReplacements;
220
+ }
221
+
222
+ createFootnotesListMarkdownNode(context) {
223
+ // const divisionMarkdownNode = this, ///
224
+ // footnotesListMarkdownNode = FootnotesListMarkdownNode.fromDivisionMarkdownNode(divisionMarkdownNode, context);
225
+ //
226
+ // return footnotesListMarkdownNode;
257
227
  }
258
228
 
259
229
  asHTML(context) {
@@ -283,7 +253,7 @@ ${childNodesHTML}${indent}${closingTag}
283
253
  return divisionMarkdownNode;
284
254
  }
285
255
 
286
- static fromSubdivisionReplacementsPaginatedChildNodesAndDivisionClassName(subDivisionReplacements, paginatedChildNodes, divisionClassName, context) {
256
+ static fromPageNumberDirectiveSubDivisionReplacementPaginatedChildNodesAndDivisionClassName(pageNumberDirectiveSubDivisionReplacement, paginatedChildNodes, divisionClassName, context) {
287
257
  const ruleName = DIVISION_RULE_NAME,
288
258
  childNodes = [
289
259
  ...paginatedChildNodes
@@ -291,50 +261,12 @@ ${childNodesHTML}${indent}${closingTag}
291
261
  opacity = null,
292
262
  divisionMarkdownNode = MarkdownNode.fromRuleNameChildNodesAndOpacity(DivisionMarkdownNode, ruleName, childNodes, opacity, divisionClassName);
293
263
 
294
- subDivisionReplacements.some((subDivisionReplacement) => {
295
- subDivisionReplacement.appendTo(divisionMarkdownNode, context);
264
+ if (pageNumberDirectiveSubDivisionReplacement !== null) {
265
+ pageNumberDirectiveSubDivisionReplacement = pageNumberDirectiveSubDivisionReplacement.clone(); ///
296
266
 
297
- return true; ///
298
- });
267
+ pageNumberDirectiveSubDivisionReplacement.appendToDivisionMarkdownNode(divisionMarkdownNode, context);
268
+ }
299
269
 
300
270
  return divisionMarkdownNode;
301
271
  }
302
272
  }
303
-
304
- function footnoteReplacementsFromSubdivisionReplacements(subdivisionReplacements) {
305
- const footnoteReplacements = subdivisionReplacements.map((subdivisionReplacement) => {
306
- const node = subdivisionReplacement.getNode(),
307
- footnoteMarkdownNode = footnoteMarkdownNodsFromNode(node),
308
- descendentNode = footnoteMarkdownNode, ///
309
- footnoteReplacement = subdivisionReplacement.contract(descendentNode);
310
-
311
- return footnoteReplacement;
312
- });
313
-
314
- return footnoteReplacements;
315
- }
316
-
317
- function headingMarkdownNodesFromDivisionMarkdownNodesAndDivisionMarkdownNode(divisionMarkdownNodes, divisionMarkdownNode, context) {
318
- const headingMarkdownNodes = [],
319
- index = divisionMarkdownNodes.indexOf(divisionMarkdownNode),
320
- start = index + 1;
321
-
322
- divisionMarkdownNodes = divisionMarkdownNodes.slice(start); ///
323
-
324
- divisionMarkdownNodes.forEach((divisionMarkdownNode) => {
325
- const node = divisionMarkdownNode; ///
326
-
327
- headingMarkdownNodesFromNode(node, headingMarkdownNodes);
328
- });
329
-
330
- filter(headingMarkdownNodes, (headingMarkdownNode) => {
331
- const { contentsDepth } = context,
332
- depth = headingMarkdownNode.getDepth();
333
-
334
- if (depth <= contentsDepth) {
335
- return true;
336
- }
337
- });
338
-
339
- return headingMarkdownNodes;
340
- }
@@ -5,11 +5,11 @@ import { arrayUtilities } from "necessary";
5
5
  import MarkdownNode from "../../node/markdown";
6
6
  import AnchorMarkdownNode from "../../node/markdown/anchor";
7
7
 
8
- import { FOOTNOTE_ITEM_RULE_NAME } from "../../ruleNames";
8
+ import { FOOTNOTES_ITEM_RULE_NAME } from "../../ruleNames";
9
9
 
10
10
  const { first, second } = arrayUtilities;
11
11
 
12
- export default class FootnoteItemMarkdownNode extends MarkdownNode {
12
+ export default class FootnotesItemMarkdownNode extends MarkdownNode {
13
13
  identifier(context) {
14
14
  const childNodes = this.getChildNodes(),
15
15
  firstChildNode = first(childNodes),
@@ -24,14 +24,14 @@ export default class FootnoteItemMarkdownNode extends MarkdownNode {
24
24
  footnoteMarkdownNodeChildNodes = footnoteMarkdownNode.getChildNodes(),
25
25
  secondFootnoteMarkdownNodeChildNode = second(footnoteMarkdownNodeChildNodes),
26
26
  paragraphMarkdownNode = secondFootnoteMarkdownNodeChildNode, ///
27
- ruleName = FOOTNOTE_ITEM_RULE_NAME,
27
+ ruleName = FOOTNOTES_ITEM_RULE_NAME,
28
28
  childNodes = [
29
29
  anchorMarkdownNode,
30
30
  paragraphMarkdownNode
31
31
  ],
32
32
  opacity = null,
33
- footnoteItemMarkdownNode = MarkdownNode.fromRuleNameChildNodesAndOpacity(FootnoteItemMarkdownNode, ruleName, childNodes, opacity);
33
+ footnotesItemMarkdownNode = MarkdownNode.fromRuleNameChildNodesAndOpacity(FootnotesItemMarkdownNode, ruleName, childNodes, opacity);
34
34
 
35
- return footnoteItemMarkdownNode;
35
+ return footnotesItemMarkdownNode;
36
36
  }
37
37
  }
@@ -1,15 +1,9 @@
1
1
  "use strict";
2
2
 
3
- import { arrayUtilities } from "necessary";
4
-
5
3
  import MarkdownNode from "../../node/markdown";
6
- import FootnoteItemMarkdownNode from "./footnoteItem";
7
4
 
8
5
  import { START_ATTRIBUTE_NAME } from "../../attributeNames";
9
6
  import { FOOTNOTES_LIST_RULE_NAME } from "../../ruleNames";
10
- import { linkMarkdownNodesFromNode } from "../../utilities/query";
11
-
12
- const { extract } = arrayUtilities;
13
7
 
14
8
  export default class FootnotesListMarkdownNode extends MarkdownNode {
15
9
  constructor(ruleName, childNodes, opacity, precedence, domElement, start) {
@@ -36,86 +30,24 @@ export default class FootnotesListMarkdownNode extends MarkdownNode {
36
30
 
37
31
  clone() { return super.clone(this.start); }
38
32
 
39
- static fromFootnoteReplacementsAndDivisionMarkdownNode(footnoteReplacements, divisionMarkdownNode, context) {
33
+ static fromFootnotesItemReplacementsAndStart(footnotesItemReplacements, start) {
40
34
  let footnotesListMarkdownNode = null;
41
35
 
42
- const { footnoteNumberMap } = context;
43
-
44
- const node = divisionMarkdownNode, ///
45
- footnoteNumbers = Object.values(footnoteNumberMap),
46
- linkMarkdownNodes = linkMarkdownNodesFromNode(node),
47
- footnoteNumbersLength = footnoteNumbers.length,
48
- footnoteItemReplacements = [];
49
-
50
- let count = 0;
51
-
52
- linkMarkdownNodes.forEach((linkMarkdownNode) => {
53
- const identifier = linkMarkdownNode.identifier(context);
54
-
55
- let footnoteNumber = footnoteNumberMap[identifier] || null;
56
-
57
- if (footnoteNumber === null) {
58
- const footnoteReplacement = footnoteReplacementFromFootnoteReplacementsAndIdentifier(footnoteReplacements, identifier, context);
59
-
60
- if (footnoteReplacement !== null) {
61
- const footnoteItemReplacement = footnoteItemReplacementFromFootnoteReplacementAndIdentifier(footnoteReplacement, identifier);
62
-
63
- footnoteItemReplacements.push(footnoteItemReplacement);
64
-
65
- count++;
66
-
67
- footnoteNumber = footnoteNumbersLength + count;
68
-
69
- footnoteNumberMap[identifier] = footnoteNumber;
70
- }
71
- }
36
+ const footnotesItemReplacementsLength = footnotesItemReplacements.length;
72
37
 
73
- if (footnoteNumber !== null) {
74
- const number = footnoteNumber; ///
75
-
76
- linkMarkdownNode.setNumber(number);
77
- }
78
- });
79
-
80
- const footnoteItemReplacementsLength = footnoteItemReplacements.length;
81
-
82
- if (footnoteItemReplacementsLength > 0) {
38
+ if (footnotesItemReplacementsLength > 0) {
83
39
  const ruleName = FOOTNOTES_LIST_RULE_NAME,
84
- childNodes = [], ///
85
- opacity = null,
86
- start = footnoteNumbersLength + 1;
40
+ childNodes = footnotesItemReplacements.map((footnotesItemReplacement) => {
41
+ const footnotesItemReplacementMode = footnotesItemReplacement.getNode(),
42
+ childNode = footnotesItemReplacementMode; ///
87
43
 
88
- footnotesListMarkdownNode = MarkdownNode.fromRuleNameChildNodesAndOpacity(FootnotesListMarkdownNode, ruleName, childNodes, opacity, start);
44
+ return childNode;
45
+ }),
46
+ opacity = null;
89
47
 
90
- footnoteItemReplacements.forEach((footnotesItemReplacement) => {
91
- footnotesItemReplacement.appendTo(footnotesListMarkdownNode, context);
92
- });
48
+ footnotesListMarkdownNode = MarkdownNode.fromRuleNameChildNodesAndOpacity(FootnotesListMarkdownNode, ruleName, childNodes, opacity, start);
93
49
  }
94
50
 
95
51
  return footnotesListMarkdownNode;
96
52
  }
97
53
  }
98
-
99
- function footnoteReplacementFromFootnoteReplacementsAndIdentifier(footnoteReplacements, identifier, context) {
100
- const footnoteReplacement = extract(footnoteReplacements, (footnoteReplacement) => {
101
- const node = footnoteReplacement.getNode(),
102
- footnoteMarkdownNode = node, ///
103
- footnoteMarkdownNodeIdentifier = footnoteMarkdownNode.identifier(context);
104
-
105
- if (footnoteMarkdownNodeIdentifier === identifier) {
106
- return true;
107
- }
108
- }) || null;
109
-
110
- return footnoteReplacement;
111
- }
112
-
113
- function footnoteItemReplacementFromFootnoteReplacementAndIdentifier(footnoteReplacement, identifier) {
114
- const node = footnoteReplacement.getNode(),
115
- footnoteMarkdownNode = node, ///
116
- footnoteItemMarkdownNode = FootnoteItemMarkdownNode.fromFootnotesMarkdownNodeAndIdentifier(footnoteMarkdownNode, identifier),
117
- ascendantNode = footnoteItemMarkdownNode, ///
118
- footnoteItemReplacement = footnoteReplacement.expand(ascendantNode);
119
-
120
- return footnoteItemReplacement;
121
- }
@@ -52,9 +52,5 @@ export default class SubDivisionMarkdownNode extends MarkdownNode {
52
52
  return secondMarkdownNode;
53
53
  }
54
54
 
55
- static fromRuleNameChildNodesAndOpacity(ruleName, childNodes, opacity) {
56
- const subDivisionMarkdownNode = MarkdownNode.fromRuleNameChildNodesAndOpacity(SubDivisionMarkdownNode, ruleName, childNodes, opacity);
57
-
58
- return subDivisionMarkdownNode;
59
- }
55
+ static fromRuleNameChildNodesAndOpacity(ruleName, childNodes, opacity) { return MarkdownNode.fromRuleNameChildNodesAndOpacity(SubDivisionMarkdownNode, ruleName, childNodes, opacity); }
60
56
  }
@@ -132,6 +132,34 @@ class MarkdownNode extends NonTerminalNode {
132
132
  });
133
133
  }
134
134
 
135
+ findParentNode(childNode, node = this) {
136
+ let parentNode = null;
137
+
138
+ const nodeNonTerminalNode = node.isNonTerminalNode();
139
+
140
+ if (nodeNonTerminalNode) {
141
+ const nonTerminalNode = node, ///
142
+ childNodes = nonTerminalNode.getChildNodes(),
143
+ index = childNodes.indexOf(childNode);
144
+
145
+ if (index !== -1) {
146
+ parentNode = node; ///
147
+ } else {
148
+ const nodes = childNodes; ///
149
+
150
+ nodes.some((node) => {
151
+ parentNode = this.findParentNode(childNode, node);
152
+
153
+ if (parentNode !== null) {
154
+ return true;
155
+ }
156
+ });
157
+ }
158
+ }
159
+
160
+ return parentNode;
161
+ }
162
+
135
163
  lines(context) {
136
164
  const childNodes = this.getChildNodes(),
137
165
  lines = childNodes.reduce((lines, childNode) => {
package/src/nodeMap.js CHANGED
@@ -25,11 +25,14 @@ import StrongTextMarkdownNode from "./node/markdown/strongText";
25
25
  import SubDivisionMarkdownNode from "./node/markdown/subDivision";
26
26
  import OrderedListMarkdownNode from "./node/markdown/orderedList";
27
27
  import BlockListingMarkdownNode from "./node/markdown/blockListing";
28
- import FootnoteItemMarkdownNode from "./node/markdown/footnoteItem";
29
28
  import TableHeadRowMarkdownNode from "./node/markdown/tableHeadRow";
30
29
  import TableBodyRowMarkdownNode from "./node/markdown/tableBodyRow";
30
+ import ContentsLinkMarkdownNode from "./node/markdown/contentsLink";
31
+ import ContentsItemMarkdownNode from "./node/markdown/contentsItem";
32
+ import ContentsListMarkdownNode from "./node/markdown/contentsList";
31
33
  import InlineListingMarkdownNode from "./node/markdown/inlineListing";
32
34
  import UnorderedListMarkdownNode from "./node/markdown/unorderedList";
35
+ import FootnotesItemMarkdownNode from "./node/markdown/footnotesItem";
33
36
  import FootnotesListMarkdownNode from "./node/markdown/footnotesList";
34
37
  import VerticalSpaceMarkdownNode from "./node/markdown/verticalSpace";
35
38
  import TableHeadCellMarkdownNode from "./node/markdown/tableHeadCell";
@@ -77,11 +80,14 @@ import { LINE_RULE_NAME,
77
80
  SUB_DIVISION_RULE_NAME,
78
81
  ORDERED_LIST_RULE_NAME,
79
82
  BLOCK_LISTING_RULE_NAME,
80
- FOOTNOTE_ITEM_RULE_NAME,
83
+ CONTENTS_LINK_RULE_NAME,
84
+ CONTENTS_ITEM_RULE_NAME,
85
+ CONTENTS_LIST_RULE_NAME,
81
86
  TABLE_HEAD_ROW_RULE_NAME,
82
87
  TABLE_BODY_ROW_RULE_NAME,
83
88
  INLINE_LISTING_RULE_NAME,
84
89
  UNORDERED_LIST_RULE_NAME,
90
+ FOOTNOTES_ITEM_RULE_NAME,
85
91
  FOOTNOTES_LIST_RULE_NAME,
86
92
  VERTICAL_SPACE_RULE_NAME,
87
93
  TABLE_HEAD_CELL_RULE_NAME,
@@ -130,11 +136,14 @@ const nodeMap = {
130
136
  [SUB_DIVISION_RULE_NAME]: SubDivisionMarkdownNode,
131
137
  [ORDERED_LIST_RULE_NAME]: OrderedListMarkdownNode,
132
138
  [BLOCK_LISTING_RULE_NAME]: BlockListingMarkdownNode,
133
- [FOOTNOTE_ITEM_RULE_NAME]: FootnoteItemMarkdownNode,
139
+ [CONTENTS_LINK_RULE_NAME]: ContentsLinkMarkdownNode,
140
+ [CONTENTS_ITEM_RULE_NAME]: ContentsItemMarkdownNode,
141
+ [CONTENTS_LIST_RULE_NAME]: ContentsListMarkdownNode,
134
142
  [TABLE_HEAD_ROW_RULE_NAME]: TableHeadRowMarkdownNode,
135
143
  [TABLE_BODY_ROW_RULE_NAME]: TableBodyRowMarkdownNode,
136
144
  [INLINE_LISTING_RULE_NAME]: InlineListingMarkdownNode,
137
145
  [UNORDERED_LIST_RULE_NAME]: UnorderedListMarkdownNode,
146
+ [FOOTNOTES_ITEM_RULE_NAME]: FootnotesItemMarkdownNode,
138
147
  [FOOTNOTES_LIST_RULE_NAME]: FootnotesListMarkdownNode,
139
148
  [VERTICAL_SPACE_RULE_NAME]: VerticalSpaceMarkdownNode,
140
149
  [TABLE_HEAD_CELL_RULE_NAME]: TableHeadCellMarkdownNode,
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ import Replacement from "../replacement";
4
+ import ContentsLinkReplacement from "../replacement/contentsLink";
5
+ import ContentsItemMarkdownNode from "../node/markdown/contentsItem";
6
+
7
+ export default class ContentsItemReplacement extends Replacement {
8
+ static fromNodeAndTokens(node, tokens) { return Replacement.fromNodeAndTokens(ContentsItemReplacement, node, tokens); }
9
+
10
+ static fromNestedHeadingMarkdownNode(nestedHeadingMarkdownNode, context) {
11
+ const replacements = [],
12
+ contentsLinkReplacement = ContentsLinkReplacement.fromNestedHeadingMarkdownNode(nestedHeadingMarkdownNode, context);
13
+
14
+ if (contentsLinkReplacement !== null) {
15
+ const node = nestedHeadingMarkdownNode.getNode(),
16
+ headingMarkdownNode = node; ///
17
+
18
+ headingMarkdownNode.addAnchor(context);
19
+
20
+ const replacement = contentsLinkReplacement;
21
+
22
+ replacements.push(replacement);
23
+ }
24
+
25
+ const childNestedNodes = nestedHeadingMarkdownNode.getChildNestedNodes(),
26
+ nestedHeadingMarkdownNodes = childNestedNodes, ///
27
+ nestedHeadingMarkdownNodesLength = nestedHeadingMarkdownNodes.length;
28
+
29
+ if (nestedHeadingMarkdownNodesLength > 0) {
30
+ const { ContentsListReplacement } = ContentsItemReplacement,
31
+ contentsListReplacement = ContentsListReplacement.fromNestedHeadingMarkdownNodes(nestedHeadingMarkdownNodes, context),
32
+ replacement = contentsListReplacement; ///
33
+
34
+ replacements.push(replacement);
35
+ }
36
+
37
+ const contentsItemMarkdownNode = ContentsItemMarkdownNode.fromReplacements(replacements),
38
+ node = contentsItemMarkdownNode, ///
39
+ tokens = [];
40
+
41
+ replacements.forEach((replacement) => {
42
+ replacement.getTokens(tokens);
43
+ });
44
+
45
+ const contentsItemReplacement = ContentsItemReplacement.fromNodeAndTokens(node, tokens);
46
+
47
+ return contentsItemReplacement;
48
+ }
49
+ }