highmark-markdown 0.0.404 → 0.0.406

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 (88) hide show
  1. package/example.js +1537 -728
  2. package/lib/defaultMarkdownStyle.js +2 -2
  3. package/lib/example/constants.js +7 -11
  4. package/lib/example/importer.js +56 -0
  5. package/lib/example/view/textarea/css.js +2 -2
  6. package/lib/example/view.js +51 -16
  7. package/lib/example.js +2 -2
  8. package/lib/index.js +9 -9
  9. package/lib/markdown/bnf.js +2 -2
  10. package/lib/mixins/node.js +42 -6
  11. package/lib/node/markdown/contentsLink.js +2 -2
  12. package/lib/node/markdown/contentsList.js +2 -2
  13. package/lib/node/markdown/directive/embee.js +15 -18
  14. package/lib/node/markdown/directive/include.js +18 -23
  15. package/lib/node/markdown/directives.js +13 -62
  16. package/lib/node/markdown/division.js +63 -54
  17. package/lib/node/markdown/footnotesList.js +2 -9
  18. package/lib/node/markdown/heading.js +3 -3
  19. package/lib/node/markdown/plainText.js +10 -2
  20. package/lib/node/markdown/subDivision.js +24 -8
  21. package/lib/node/markdown/tableCell.js +4 -5
  22. package/lib/node/markdown.js +24 -60
  23. package/lib/replacement/contentsItem.js +9 -7
  24. package/lib/replacement/contentsLink.js +2 -31
  25. package/lib/replacement/contentsList.js +4 -10
  26. package/lib/replacement/embedDirective.js +163 -0
  27. package/lib/replacement/footnote.js +81 -5
  28. package/lib/replacement/footnotesItem.js +13 -17
  29. package/lib/replacement/footnotesList.js +23 -22
  30. package/lib/replacement/includeDirective.js +176 -0
  31. package/lib/replacement/line.js +9 -7
  32. package/lib/replacement/subDivision/embedDirectives.js +152 -0
  33. package/lib/replacement/subDivision/footnote.js +10 -2
  34. package/lib/replacement/subDivision/footnotesDirective.js +33 -2
  35. package/lib/replacement/subDivision/includeDirectives.js +184 -0
  36. package/lib/replacement/subDivision.js +55 -12
  37. package/lib/replacement.js +28 -6
  38. package/lib/utilities/childNodes.js +4 -17
  39. package/lib/utilities/footnotes.js +9 -6
  40. package/lib/utilities/processing.js +83 -0
  41. package/lib/utilities/query.js +2 -2
  42. package/lib/utilities/replacement.js +31 -6
  43. package/package.json +1 -1
  44. package/src/defaultMarkdownStyle.js +0 -1
  45. package/src/example/constants.js +3 -4
  46. package/src/example/importer.js +115 -0
  47. package/src/example/view/textarea/css.js +1 -1
  48. package/src/example/view.js +11 -36
  49. package/src/example.js +2 -2
  50. package/src/index.js +1 -1
  51. package/src/markdown/bnf.js +3 -1
  52. package/src/mixins/node.js +54 -5
  53. package/src/node/markdown/contentsLink.js +1 -2
  54. package/src/node/markdown/contentsList.js +1 -1
  55. package/src/node/markdown/directive/embee.js +15 -18
  56. package/src/node/markdown/directive/include.js +20 -28
  57. package/src/node/markdown/directives.js +15 -52
  58. package/src/node/markdown/division.js +74 -69
  59. package/src/node/markdown/footnotesList.js +2 -8
  60. package/src/node/markdown/heading.js +2 -2
  61. package/src/node/markdown/plainText.js +6 -0
  62. package/src/node/markdown/subDivision.js +24 -7
  63. package/src/node/markdown/tableCell.js +4 -5
  64. package/src/node/markdown.js +15 -70
  65. package/src/replacement/contentsItem.js +7 -2
  66. package/src/replacement/contentsLink.js +1 -3
  67. package/src/replacement/contentsList.js +4 -6
  68. package/src/replacement/embedDirective.js +34 -0
  69. package/src/replacement/footnote.js +38 -1
  70. package/src/replacement/footnotesItem.js +10 -23
  71. package/src/replacement/footnotesList.js +28 -20
  72. package/src/replacement/includeDirective.js +49 -0
  73. package/src/replacement/line.js +7 -2
  74. package/src/replacement/subDivision/embedDirectives.js +52 -0
  75. package/src/replacement/subDivision/footnote.js +9 -0
  76. package/src/replacement/subDivision/footnotesDirective.js +6 -0
  77. package/src/replacement/subDivision/includeDirectives.js +58 -0
  78. package/src/replacement/subDivision.js +13 -14
  79. package/src/replacement.js +19 -9
  80. package/src/utilities/childNodes.js +3 -5
  81. package/src/utilities/footnotes.js +9 -7
  82. package/src/utilities/processing.js +93 -0
  83. package/src/utilities/query.js +9 -9
  84. package/src/utilities/replacement.js +28 -5
  85. package/lib/replacement/imported.js +0 -151
  86. package/lib/utilities/markdown.js +0 -87
  87. package/src/replacement/imported.js +0 -13
  88. package/src/utilities/markdown.js +0 -103
@@ -1,37 +1,24 @@
1
1
  "use strict";
2
2
 
3
- import { arrayUtilities } from "necessary";
4
-
5
3
  import Replacement from "../replacement";
6
4
 
7
5
  import FootnotesItemMarkdownNode from "../node/markdown/footnotesItem";
8
6
 
9
- const { extract } = arrayUtilities;
10
-
11
7
  export default class FootnotesItemReplacement extends Replacement {
12
- static fromNode(node, context) { return Replacement.fromNode(FootnotesItemReplacement, node, context); }
13
-
14
- static fromFootnoteReplacementsAndIdentifier(footnoteReplacements, identifier, context) {
15
- let footnotesItemReplacement = null;
8
+ getFootnotesItemMarkdownNode() {
9
+ const node = this.getNode(),
10
+ footnotesItemMarkdownNode = node; ///
16
11
 
17
- const footnoteReplacement = extract(footnoteReplacements, (footnoteReplacement) => {
18
- const node = footnoteReplacement.getNode(),
19
- footnoteMarkdownNode = node, ///
20
- footnoteMarkdownNodeIdentifier = footnoteMarkdownNode.identifier(context);
12
+ return footnotesItemMarkdownNode;
13
+ }
21
14
 
22
- if (footnoteMarkdownNodeIdentifier === identifier) {
23
- return true;
24
- }
25
- }) || null;
15
+ static fromNode(node, context) { return Replacement.fromNode(FootnotesItemReplacement, node, context); }
26
16
 
27
- if (footnoteReplacement !== null) {
28
- const node = footnoteReplacement.getNode(),
29
- footnoteMarkdownNode = node, ///
17
+ static fromFootnoteReplacementAndIdentifier(footnoteReplacement, identifier) {
18
+ const footnoteMarkdownNode = footnoteReplacement.getFootnoteMarkdownNode(),
30
19
  footnotesItemMarkdownNode = FootnotesItemMarkdownNode.fromFootnotesMarkdownNodeAndIdentifier(footnoteMarkdownNode, identifier),
31
- ascendantNode = footnotesItemMarkdownNode; ///
32
-
33
- footnotesItemReplacement = footnoteReplacement.expand(FootnotesItemReplacement, ascendantNode);
34
- }
20
+ ascendantNode = footnotesItemMarkdownNode, ///
21
+ footnotesItemReplacement = footnoteReplacement.expand(FootnotesItemReplacement, ascendantNode);
35
22
 
36
23
  return footnotesItemReplacement;
37
24
  }
@@ -13,43 +13,36 @@ export default class FootnotesListReplacement extends Replacement {
13
13
  super.appendTo(parentNode, context);
14
14
  }
15
15
 
16
- static fromNodeAndTokens(node, tokens) { return Replacement.fromNodeAndTokens(FootnotesListReplacement, node, tokens); }
17
-
18
- static fromFootnoteReplacementsAndDivisionMarkdownNode(footnoteReplacements, divisionMarkdownNode, context) {
16
+ static fromDivisionMarkdownNodeAndFootnoteMap(divisionMarkdownNode, footnoteMap, context) {
19
17
  let footnotesListReplacement = null;
20
18
 
21
- const { footnoteNumberMap } = context;
22
-
23
19
  const node = divisionMarkdownNode, ///
24
- footnoteNumbers = Object.values(footnoteNumberMap),
20
+ start = startFromFootnoteMap(footnoteMap),
25
21
  linkMarkdownNodes = linkMarkdownNodesFromNode(node),
26
- footnoteNumbersLength = footnoteNumbers.length,
27
22
  footnotesItemReplacements = [];
28
23
 
29
- let count = 0;
24
+ let number = start;
30
25
 
31
26
  linkMarkdownNodes.forEach((linkMarkdownNode) => {
32
- const identifier = linkMarkdownNode.identifier(context);
27
+ const identifier = linkMarkdownNode.identifier(context),
28
+ footnoteReplacement = footnoteMap[identifier] || null;
33
29
 
34
- let footnoteNumber = footnoteNumberMap[identifier] || null;
30
+ if (footnoteReplacement !== null) {
31
+ const footnoteReplacementUnnumbered = footnoteReplacement.isUnnumbered();
35
32
 
36
- if (footnoteNumber === null) {
37
- const footnotesItemReplacement = FootnotesItemReplacement.fromFootnoteReplacementsAndIdentifier(footnoteReplacements, identifier, context);
33
+ if (footnoteReplacementUnnumbered) {
34
+ const footnotesItemReplacement = FootnotesItemReplacement.fromFootnoteReplacementAndIdentifier(footnoteReplacement, identifier, context);
38
35
 
39
- if (footnotesItemReplacement !== null) {
40
36
  footnotesItemReplacements.push(footnotesItemReplacement);
41
37
 
42
- count++;
38
+ footnoteReplacement.setNumber(number);
43
39
 
44
- footnoteNumber = footnoteNumbersLength + count;
45
-
46
- footnoteNumberMap[identifier] = footnoteNumber;
40
+ number++;
47
41
  }
48
42
  }
49
43
  });
50
44
 
51
- const start = footnoteNumbersLength + 1,
52
- footnotesListMarkdownNode = FootnotesListMarkdownNode.fromFootnotesItemReplacementsAndStart(footnotesItemReplacements, start);
45
+ const footnotesListMarkdownNode = FootnotesListMarkdownNode.fromFootnotesItemReplacementsAndStart(footnotesItemReplacements, start);
53
46
 
54
47
  if (footnotesListMarkdownNode !== null) {
55
48
  const node = footnotesListMarkdownNode, ///
@@ -59,9 +52,24 @@ export default class FootnotesListReplacement extends Replacement {
59
52
  footnotesItemReplacement.getTokens(tokens);
60
53
  });
61
54
 
62
- footnotesListReplacement = FootnotesListReplacement.fromNodeAndTokens(node, tokens);
55
+ footnotesListReplacement = Replacement.fromNodeAndTokens(FootnotesListReplacement, node, tokens);
63
56
  }
64
57
 
65
58
  return footnotesListReplacement;
66
59
  }
67
60
  }
61
+
62
+ function startFromFootnoteMap(footnoteMap) {
63
+ const footnoteReplacements = Object.values(footnoteMap), ///
64
+ numberedFootnoteReplacements = footnoteReplacements.filter((footnoteReplacement) => {
65
+ const footnoteReplacementNumbered = footnoteReplacement.isNumbered();
66
+
67
+ if (footnoteReplacementNumbered) {
68
+ return true;
69
+ }
70
+ }),
71
+ numberedFootnoteReplacementsLength = numberedFootnoteReplacements.length,
72
+ start = numberedFootnoteReplacementsLength + 1;
73
+
74
+ return start;
75
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ import Replacement from "../replacement";
4
+
5
+ import { subDivisionMarkdownNodesFromNode } from "../utilities/query";
6
+
7
+ export default class IncludeDirectiveReplacement extends Replacement {
8
+ addDivisionMarkdownNode(context) {
9
+ const divisionMarkdownNode = this.getDivisionMarkdownNode(),
10
+ ignored = divisionMarkdownNode.isIgnored();
11
+
12
+ if (!ignored) {
13
+ const { divisionMarkdownNodes } = context;
14
+
15
+ divisionMarkdownNodes.push(divisionMarkdownNode);
16
+
17
+ let tokens = this.getTokens();
18
+
19
+ const includedTokens = tokens; ///
20
+
21
+ ({ tokens } = context);
22
+
23
+ const tokensLength = tokens.length,
24
+ start = tokensLength, ///
25
+ deleteCount = 0;
26
+
27
+ tokens.splice(start, deleteCount, ...includedTokens);
28
+ }
29
+
30
+ const node = divisionMarkdownNode, ///
31
+ subDivisionMarkdownNodes = subDivisionMarkdownNodesFromNode(node);
32
+
33
+ return subDivisionMarkdownNodes;
34
+ }
35
+
36
+ getDivisionMarkdownNode() {
37
+ const node = this.getNode(),
38
+ divisionMarkdownNode = node; ///
39
+
40
+ return divisionMarkdownNode;
41
+ }
42
+
43
+ static fromDivisionMarkdownNodeAndTokens(divisionMarkdownNode, tokens) {
44
+ const node = divisionMarkdownNode, ///
45
+ includeDirectiveReplacement = Replacement.fromNodeAndTokens(IncludeDirectiveReplacement, node, tokens);
46
+
47
+ return includeDirectiveReplacement;
48
+ }
49
+ }
@@ -3,11 +3,16 @@
3
3
  import Replacement from "../replacement";
4
4
 
5
5
  export default class LineReplacement extends Replacement {
6
- static fromNode(node, context) { return Replacement.fromNode(LineReplacement, node, context); }
6
+ getLineMarkdownNode() {
7
+ const node = this.getNode(),
8
+ lineMarkdownNode = node; ///
9
+
10
+ return lineMarkdownNode;
11
+ }
7
12
 
8
13
  static fromLineMarkdownNode(lineMarkdownNode, context) {
9
14
  const node = lineMarkdownNode, ///
10
- lineReplacement = LineReplacement.fromNode(node, context);
15
+ lineReplacement = Replacement.fromNode(LineReplacement, node, context);
11
16
 
12
17
  return lineReplacement;
13
18
  }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ import { arrayUtilities } from "necessary";
4
+
5
+ import SubDivisionReplacement from "../../replacement/subDivision";
6
+
7
+ import { embedDirectiveMarkdownNodesFromNode } from "../../utilities/query";
8
+
9
+ const { backwardsForEach } = arrayUtilities;
10
+
11
+ export default class EmbedDirectivesSubDivisionReplacement extends SubDivisionReplacement {
12
+ constructor(node, tokens, subDivisionMarkdownNode, embedDirectiveMarkdownNodes) {
13
+ super(node, tokens, subDivisionMarkdownNode);
14
+
15
+ this.embedDirectiveMarkdownNodes = embedDirectiveMarkdownNodes;
16
+ }
17
+
18
+ getEmbedDirectiveMarkdownNodes() {
19
+ return this.embedDirectiveMarkdownNodes;
20
+ }
21
+
22
+ replaceSubDivisionMarkdownNode(divisionMarkdownNode, context) {
23
+ const subDivisionMarkdownNodes = [],
24
+ subDivisionMarkdownNode = this.getSubDivisionMarkdownNode();
25
+
26
+ backwardsForEach(this.embedDirectiveMarkdownNodes, (embedDirectiveMarkdownNode) => {
27
+ const embedDirectiveReplacement = embedDirectiveMarkdownNode.resolve(context);
28
+
29
+ if (embedDirectiveReplacement !== null) {
30
+ embedDirectiveReplacement.addAfterSubDivisionMarkdownNode(subDivisionMarkdownNode, divisionMarkdownNode, subDivisionMarkdownNodes, context);
31
+ }
32
+ });
33
+
34
+ this.removeFromDivisionMarkdownNode(divisionMarkdownNode, context);
35
+
36
+ return subDivisionMarkdownNodes;
37
+ }
38
+
39
+ static fromSubDivisionMarkdownNode(subDivisionMarkdownNode, context) {
40
+ let embedDirectivesSubDivisionReplacement = null;
41
+
42
+ const node = subDivisionMarkdownNode, ///
43
+ embedDirectiveMarkdownNodes = embedDirectiveMarkdownNodesFromNode(node),
44
+ embedDirectiveMarkdownNodesLength = embedDirectiveMarkdownNodes.length;
45
+
46
+ if (embedDirectiveMarkdownNodesLength > 0) {
47
+ embedDirectivesSubDivisionReplacement = SubDivisionReplacement.fromSubDivisionMarkdownNode(EmbedDirectivesSubDivisionReplacement, subDivisionMarkdownNode, context, embedDirectiveMarkdownNodes);
48
+ }
49
+
50
+ return embedDirectivesSubDivisionReplacement;
51
+ }
52
+ }
@@ -5,6 +5,15 @@ import SubDivisionReplacement from "../../replacement/subDivision";
5
5
  import { footnoteMarkdownNodeFromNode } from "../../utilities/query";
6
6
 
7
7
  export default class FootnoteSubDivisionReplacement extends SubDivisionReplacement {
8
+ identifier(context) {
9
+ const subDivisionMarkdownNode = this.getSubDivisionMarkdownNode(),
10
+ node = subDivisionMarkdownNode, ///
11
+ footnoteMarkdownNode = footnoteMarkdownNodeFromNode(node),
12
+ identifier = footnoteMarkdownNode.identifier(context);
13
+
14
+ return identifier;
15
+ }
16
+
8
17
  static fromSubDivisionMarkdownNode(subDivisionMarkdownNode, context) {
9
18
  let footnoteSubDivisionReplacement = null;
10
19
 
@@ -5,6 +5,12 @@ import SubDivisionReplacement from "../../replacement/subDivision";
5
5
  import { footnotesDirectiveMarkdownNodeFromNode } from "../../utilities/query";
6
6
 
7
7
  export default class FootnotesDirectiveSubDivisionReplacement extends SubDivisionReplacement {
8
+ appendToDivisionMarkdownNode(divisionMarkdownNode, context) {
9
+ const parentNode = divisionMarkdownNode; ///
10
+
11
+ super.appendTo(parentNode, context);
12
+ }
13
+
8
14
  static fromSubDivisionMarkdownNode(subDivisionMarkdownNode, context) {
9
15
  let footnotesDirectiveSubDivisionReplacement = null;
10
16
 
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ import SubDivisionReplacement from "../../replacement/subDivision";
4
+
5
+ import { includeDirectiveMarkdownNodesFromNode } from "../../utilities/query";
6
+
7
+ export default class IncludeDirectivesSubDivisionReplacement extends SubDivisionReplacement {
8
+ constructor(node, tokens, subDivisionMarkdownNode, includeDirectiveMarkdownNodes) {
9
+ super(node, tokens, subDivisionMarkdownNode);
10
+
11
+ this.includeDirectiveMarkdownNodes = includeDirectiveMarkdownNodes;
12
+ }
13
+
14
+ getIncludeDirectiveMarkdownNodes() {
15
+ return this.includeDirectiveMarkdownNodes;
16
+ }
17
+
18
+ removeFromDivisionMarkdownNode(divisionMarkdownNode, context) {
19
+ const ignored = divisionMarkdownNode.isIgnored();
20
+
21
+ if (ignored) {
22
+ return;
23
+ }
24
+
25
+ super.removeFromDivisionMarkdownNode(divisionMarkdownNode, context);
26
+ }
27
+
28
+ removeSubDivisionMarkdownNode(divisionMarkdownNode, context) {
29
+ this.includeDirectiveMarkdownNodes.forEach((includeDirectiveMarkdownNode) => {
30
+ const includeDirectiveReplacement = includeDirectiveMarkdownNode.resolve(context);
31
+
32
+ if (includeDirectiveReplacement !== null) {
33
+ const divisionMarkdownNode = includeDirectiveReplacement.getDivisionMarkdownNode(),
34
+ subDivisionMarkdownNodes = includeDirectiveReplacement.addDivisionMarkdownNode(context);
35
+
36
+ subDivisionMarkdownNodes.forEach((subDivisionMarkdownNode) => {
37
+ subDivisionMarkdownNode.resolveIncludes(divisionMarkdownNode, context);
38
+ });
39
+ }
40
+ });
41
+
42
+ this.removeFromDivisionMarkdownNode(divisionMarkdownNode, context);
43
+ }
44
+
45
+ static fromSubDivisionMarkdownNode(subDivisionMarkdownNode, context) {
46
+ let includeDirectivesSubDivisionReplacement = null;
47
+
48
+ const node = subDivisionMarkdownNode, ///
49
+ includeDirectiveMarkdownNodes = includeDirectiveMarkdownNodesFromNode(node),
50
+ includeDirectiveMarkdownNodesLength = includeDirectiveMarkdownNodes.length;
51
+
52
+ if (includeDirectiveMarkdownNodesLength > 0) {
53
+ includeDirectivesSubDivisionReplacement = SubDivisionReplacement.fromSubDivisionMarkdownNode(IncludeDirectivesSubDivisionReplacement, subDivisionMarkdownNode, context, includeDirectiveMarkdownNodes);
54
+ }
55
+
56
+ return includeDirectivesSubDivisionReplacement;
57
+ }
58
+ }
@@ -3,34 +3,33 @@
3
3
  import Replacement from "../replacement";
4
4
 
5
5
  export default class SubDivisionReplacement extends Replacement {
6
- constructor(node, tokens, removedNode) {
6
+ constructor(node, tokens, subDivisionMarkdownNode) {
7
7
  super(node, tokens);
8
8
 
9
- this.removedNode = removedNode;
9
+ this.subDivisionMarkdownNode = subDivisionMarkdownNode;
10
10
  }
11
11
 
12
- getRemovedNode() {
13
- return this.removedNode;
12
+ getSubDivisionMarkdownNode() {
13
+ return this.subDivisionMarkdownNode;
14
14
  }
15
15
 
16
- removeFromMarkdownNode(divisionMarkdownNode, context) {
17
- const childNode = this.removedNode, ///
18
- parentNode = divisionMarkdownNode.retrieveParentNode(childNode);
16
+ removeFromDivisionMarkdownNode(divisionMarkdownNode, context) {
17
+ const removedNode = this.subDivisionMarkdownNode, ///
18
+ parentNode = divisionMarkdownNode;
19
19
 
20
- super.removeFrom(this.removedNode, parentNode, context);
20
+ super.removeFrom(removedNode, parentNode, context);
21
21
  }
22
22
 
23
- static fromNodeAndTokens(Class, node, tokens) {
24
- const removedNode = null,
25
- subDivisionReplacement = Replacement.fromNodeAndTokens(Class, node, tokens, removedNode);
23
+ static fromNodeAndTokens(Class, node, tokens, ...remainingArguments) {
24
+ const subDivisionMarkdownNode = null,
25
+ subDivisionReplacement = Replacement.fromNodeAndTokens(Class, node, tokens, subDivisionMarkdownNode, ...remainingArguments);
26
26
 
27
27
  return subDivisionReplacement;
28
28
  }
29
29
 
30
- static fromSubDivisionMarkdownNode(Class, subDivisionMarkdownNode, context) {
30
+ static fromSubDivisionMarkdownNode(Class, subDivisionMarkdownNode, context, ...remainingArguments) {
31
31
  const node = subDivisionMarkdownNode, ///
32
- removedNode = subDivisionMarkdownNode, ///
33
- subDivisionReplacement = Replacement.fromNode(Class, node, context, removedNode);
32
+ subDivisionReplacement = Replacement.fromNode(Class, node, context, subDivisionMarkdownNode, ...remainingArguments);
34
33
 
35
34
  return subDivisionReplacement;
36
35
  }
@@ -3,7 +3,7 @@
3
3
  import { arrayUtilities } from "necessary";
4
4
 
5
5
  import { leadingIndexFromNodeAndTokens, trailingIndexFromNodeAndTokens } from "./utilities/node";
6
- import { removeNode, appendNode, removeTokens, appendTokens, replaceNode, replaceNodes, replaceTokens } from "./utilities/replacement";
6
+ import { removeNode, appendNode, removeTokens, appendTokens, replaceNode, replaceNodes, replaceTokens, addNodesAfter, addTokensAfter } from "./utilities/replacement";
7
7
 
8
8
  const { push } = arrayUtilities;
9
9
 
@@ -25,7 +25,7 @@ export default class Replacement {
25
25
 
26
26
  getChildNodes() { return this.node.getChildNodes(); }
27
27
 
28
- contract(Class, descendentNode) {
28
+ contract(Class, descendentNode, ...remainingArguments) {
29
29
  if (descendentNode === undefined) {
30
30
  descendentNode = Class; ///
31
31
 
@@ -37,12 +37,12 @@ export default class Replacement {
37
37
  context = { ///
38
38
  tokens
39
39
  },
40
- replacement = Class.fromNode(node, context); ///
40
+ replacement = Class.fromNode(node, context, ...remainingArguments);
41
41
 
42
42
  return replacement;
43
43
  }
44
44
 
45
- expand(Class, ascendantNode) {
45
+ expand(Class, ascendantNode, ...remainingArguments) {
46
46
  if (ascendantNode === undefined) {
47
47
  ascendantNode = Class;
48
48
 
@@ -54,19 +54,29 @@ export default class Replacement {
54
54
  context = {
55
55
  tokens
56
56
  },
57
- replacement = Class.fromNode(node, context); ///
57
+ replacement = Class.fromNode(node, context, ...remainingArguments);
58
58
 
59
59
  return replacement;
60
60
  }
61
61
 
62
62
  appendTo(parentNode, context) {
63
63
  const { tokens } = context,
64
- replacementNode = this.node, ///
65
- replacementTokens = this.tokens; ///
64
+ appendedNode = this.node, ///
65
+ appendedTokens = this.tokens; ///
66
66
 
67
- appendNode(replacementNode, parentNode);
67
+ appendNode(appendedNode, parentNode);
68
68
 
69
- appendTokens(replacementTokens, parentNode, tokens);
69
+ appendTokens(appendedTokens, parentNode, tokens);
70
+ }
71
+
72
+ addAfter(existingNode, parentNode, context) {
73
+ const { tokens } = context,
74
+ addedNodes = this.getChildNodes(), ///
75
+ addedTokens = this.tokens; ///
76
+
77
+ addNodesAfter(existingNode, addedNodes, parentNode);
78
+
79
+ addTokensAfter(existingNode, addedTokens, tokens);
70
80
  }
71
81
 
72
82
  replace(replacedNode, parentNode, context) {
@@ -2,8 +2,6 @@
2
2
 
3
3
  import { arrayUtilities } from "necessary";
4
4
 
5
- import PlainTextMarkdownNode from "../node/markdown/plainText";
6
-
7
5
  import { EMPTY_STRING } from "../constants";
8
6
  import { contentFromNodes } from "../utilities/content";
9
7
 
@@ -19,7 +17,7 @@ export function htmlFromChildNodes(childNodes, context) {
19
17
  if (childNodeNonTerminalNode) {
20
18
  const nonTerminalNode = childNode, ///
21
19
  markdownNode = nonTerminalNode, ///
22
- markdownNodePlainTextMarkdownNode = (markdownNode instanceof PlainTextMarkdownNode);
20
+ markdownNodePlainTextMarkdownNode = markdownNode.isPlainTextMarkdownNode();
23
21
 
24
22
  if (markdownNodePlainTextMarkdownNode) {
25
23
  const plainTextMarkdownNode = markdownNode; ///
@@ -67,7 +65,7 @@ export function plainTextFromChildNodes(childNodes, context) {
67
65
  if (childNodeNonTerminalNode) {
68
66
  const nonTerminalNode = childNode, ///
69
67
  markdownNode = nonTerminalNode, ///
70
- markdownNodePlainTextMarkdownNode = (markdownNode instanceof PlainTextMarkdownNode);
68
+ markdownNodePlainTextMarkdownNode = markdownNode.isPlainTextMarkdownNode();
71
69
 
72
70
  if (markdownNodePlainTextMarkdownNode) {
73
71
  const plainTextMarkdownNode = markdownNode; ///
@@ -117,7 +115,7 @@ export function domElementsFromChildNodes(childNodes, context) {
117
115
  if (childNodeNonTerminalNode) {
118
116
  const nonTerminalNode = childNode, ///
119
117
  markdownNode = nonTerminalNode, ///
120
- markdownNodePlainTextMarkdownNode = (markdownNode instanceof PlainTextMarkdownNode);
118
+ markdownNodePlainTextMarkdownNode = markdownNode.isPlainTextMarkdownNode();
121
119
 
122
120
  if (markdownNodePlainTextMarkdownNode) {
123
121
  const plainTextMarkdownNode = markdownNode; ///
@@ -2,19 +2,21 @@
2
2
 
3
3
  import { linkMarkdownNodesFromNode } from "../utilities/query";
4
4
 
5
- export function renumberLinkMarkdownNodes(divisionMarkdownNode, callback, context) {
6
- const { footnoteNumberMap } = context,
7
- node = divisionMarkdownNode, ///
5
+ export function renumberLinkMarkdownNodes(divisionMarkdownNode, footnoteMap, callback, context) {
6
+ const node = divisionMarkdownNode, ///
8
7
  linkMarkdownNodes = linkMarkdownNodesFromNode(node);
9
8
 
10
9
  linkMarkdownNodes.forEach((linkMarkdownNode) => {
11
10
  const identifier = linkMarkdownNode.identifier(context),
12
- footnoteNumber = footnoteNumberMap[identifier] || null,
13
- number = footnoteNumber; ///
11
+ footnoteReplacement = footnoteMap[identifier] || null;
14
12
 
15
- linkMarkdownNode.setNumber(number);
13
+ if (footnoteReplacement !== null) {
14
+ const number = footnoteReplacement.getNumber();
16
15
 
17
- callback(linkMarkdownNode);
16
+ linkMarkdownNode.setNumber(number);
17
+
18
+ callback(linkMarkdownNode);
19
+ }
18
20
  });
19
21
  }
20
22
 
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ export function postprocess(divisionMarkdownNode, context) {
4
+ let divisionMarkdownNodes;
5
+
6
+ divisionMarkdownNodes = resolveIncludes(divisionMarkdownNode, context);
7
+
8
+ resolveEmbeddings(divisionMarkdownNodes, context);
9
+
10
+ const footnoteMap = prepareFootnotes(divisionMarkdownNodes, context);
11
+
12
+ divisionMarkdownNodes = paginate(divisionMarkdownNodes, context);
13
+
14
+ createFootnotes(divisionMarkdownNodes, footnoteMap, context);
15
+
16
+ createContents(divisionMarkdownNodes, context);
17
+
18
+ return divisionMarkdownNodes;
19
+ }
20
+
21
+ function paginate(divisionMarkdownNodes, context) {
22
+ const paginatedDivisionMarkdownNodes = [];
23
+
24
+ divisionMarkdownNodes.forEach((divisionMarkdownNode) => {
25
+ divisionMarkdownNode.paginate(paginatedDivisionMarkdownNodes, context);
26
+ });
27
+
28
+ paginatedDivisionMarkdownNodes.forEach((paginatedDivisionMarkdownNode, index) => {
29
+ const pageNumber = index + 1;
30
+
31
+ paginatedDivisionMarkdownNode.setPageNumber(pageNumber);
32
+ });
33
+
34
+ divisionMarkdownNodes = paginatedDivisionMarkdownNodes; ///
35
+
36
+ return divisionMarkdownNodes;
37
+ }
38
+
39
+ function createContents(divisionMarkdownNodes, context) {
40
+ divisionMarkdownNodes.some((divisionMarkdownNode) => {
41
+ const contentsCreated = divisionMarkdownNode.createContents(divisionMarkdownNodes, context);
42
+
43
+ if (contentsCreated) {
44
+ return true;
45
+ }
46
+ });
47
+ }
48
+
49
+ function createFootnotes(divisionMarkdownNodes, footnoteMap, context) {
50
+ divisionMarkdownNodes.forEach((divisionMarkdownNode) => {
51
+ divisionMarkdownNode.createFootnotes(footnoteMap, context);
52
+ });
53
+ }
54
+
55
+ function resolveIncludes(divisionMarkdownNode, context) {
56
+ const divisionMarkdownNodes = [];
57
+
58
+ Object.assign(context, {
59
+ divisionMarkdownNodes
60
+ });
61
+
62
+ const divisionMarkdownNodeIgnored = divisionMarkdownNode.isIgnored();
63
+
64
+ if (!divisionMarkdownNodeIgnored) {
65
+ divisionMarkdownNodes.push(divisionMarkdownNode);
66
+ }
67
+
68
+ divisionMarkdownNode.resolveIncludes(context);
69
+
70
+ delete context.divisionMarkdownNodes;
71
+
72
+ return divisionMarkdownNodes;
73
+ }
74
+
75
+ function prepareFootnotes(divisionMarkdownNodes, context) {
76
+ const footnoteMap = {};
77
+
78
+ divisionMarkdownNodes.forEach((divisionMarkdownNode) => {
79
+ divisionMarkdownNode.prepareFootnotes(footnoteMap, context);
80
+ });
81
+
82
+ return footnoteMap;
83
+ }
84
+
85
+ function resolveEmbeddings(divisionMarkdownNodes, context) {
86
+ divisionMarkdownNodes.forEach((divisionMarkdownNode) => {
87
+ divisionMarkdownNode.resolveEmbeddings(context);
88
+ });
89
+ }
90
+
91
+ export default {
92
+ postprocess
93
+ };
@@ -5,16 +5,16 @@ import { arrayUtilities } from "necessary";
5
5
 
6
6
  const { first, push } = arrayUtilities;
7
7
 
8
- const footnoteMarkdownNodeQuery = Query.fromExpression("/*/footnote"),
9
- ignoreDirectiveMarkdownNodeQuery = Query.fromExpression("//directives/ignoreDirective"),
10
- contentsDirectiveMarkdownNodeQuery = Query.fromExpression("//directives/contentsDirective"),
11
- footnotesDirectiveMarkdownNodeQuery = Query.fromExpression("//directives/footnotesDirective"),
12
- pageNumberDirectiveMarkdownNodeQuery = Query.fromExpression("//directives/pageNumber"),
8
+ const footnoteMarkdownNodeQuery = Query.fromExpression("/subDivision/footnote"),
9
+ ignoreDirectiveMarkdownNodeQuery = Query.fromExpression("/division/subDivision/directives/ignoreDirective"),
10
+ contentsDirectiveMarkdownNodeQuery = Query.fromExpression("/subDivision/directives/contentsDirective"),
11
+ footnotesDirectiveMarkdownNodeQuery = Query.fromExpression("/subDivision/directives/footnotesDirective"),
12
+ pageNumberDirectiveMarkdownNodeQuery = Query.fromExpression("/subDivision/directives/pageNumber"), ///
13
13
  linkMarkdownNodesQuery = Query.fromExpression("//link"),
14
- headingMarkdownNodesQuery = Query.fromExpression("//primaryHeading|secondaryHeading|tertiaryHeading|quaternaryHeading"),
15
- subDivisionMarkdownNodesQuery = Query.fromExpression("//subDivision"),
16
- embedDirectiveMarkdownNodesQuery = Query.fromExpression("//directives/embedDirective"),
17
- includeDirectiveMarkdownNodesQuery = Query.fromExpression("//directives/includeDirective"),
14
+ headingMarkdownNodesQuery = Query.fromExpression("/division/subDivision/primaryHeading|secondaryHeading|tertiaryHeading|quaternaryHeading"),
15
+ subDivisionMarkdownNodesQuery = Query.fromExpression("/division/subDivision"),
16
+ embedDirectiveMarkdownNodesQuery = Query.fromExpression("/subDivision/directives/embedDirective"),
17
+ includeDirectiveMarkdownNodesQuery = Query.fromExpression("/subDivision/directives/includeDirective"),
18
18
  linkFootnoteOrFootnotesDirectiveMarkdownNodesQuery = Query.fromExpression("//link|footnote|footnotesDirective");
19
19
 
20
20
  export function nodeQuery(expression) {