highmark-markdown 0.0.428 → 0.0.431

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 (96) hide show
  1. package/example.js +3995 -1864
  2. package/lib/constants.js +17 -1
  3. package/lib/defaultMarkdownStyle.js +2 -2
  4. package/lib/elementMap.js +20 -5
  5. package/lib/example/importer.js +5 -5
  6. package/lib/example/indexOptions.js +143 -0
  7. package/lib/example/view/div/sizeable/right.js +2 -2
  8. package/lib/example/view.js +14 -2
  9. package/lib/index/phraseMatcher.js +76 -0
  10. package/lib/markdown/bnf.js +2 -2
  11. package/lib/markdown/lexer.js +11 -11
  12. package/lib/markdown/parser.js +12 -12
  13. package/lib/node/markdown/anchor.js +15 -8
  14. package/lib/node/markdown/comma.js +144 -0
  15. package/lib/node/markdown/contentsLink.js +3 -2
  16. package/lib/node/markdown/contentsList.js +10 -2
  17. package/lib/node/markdown/directive/index.js +120 -0
  18. package/lib/node/markdown/directive.js +10 -2
  19. package/lib/node/markdown/division.js +49 -9
  20. package/lib/node/markdown/{link.js → footnoteLink.js} +14 -13
  21. package/lib/node/markdown/footnotesItem.js +5 -12
  22. package/lib/node/markdown/heading.js +10 -2
  23. package/lib/node/markdown/indexItem.js +120 -0
  24. package/lib/node/markdown/indexLink.js +168 -0
  25. package/lib/node/markdown/indexList.js +138 -0
  26. package/lib/node/markdown/line.js +16 -2
  27. package/lib/node/markdown/subDivision.js +21 -2
  28. package/lib/node/markdown/verticalSpace.js +12 -1
  29. package/lib/node/markdown.js +32 -2
  30. package/lib/nodeMap.js +8 -3
  31. package/lib/prepends.js +26 -0
  32. package/lib/replacement/contentsList.js +3 -2
  33. package/lib/replacement/footnotesList.js +8 -8
  34. package/lib/replacement/indexItem.js +131 -0
  35. package/lib/replacement/indexList.js +166 -0
  36. package/lib/replacement/subDivision/footnotesDirective.js +2 -33
  37. package/lib/replacement/subDivision/indexAnchor.js +124 -0
  38. package/lib/replacement/subDivision/indexDirective.js +126 -0
  39. package/lib/replacement/subDivision/pageNumberDirective.js +2 -33
  40. package/lib/replacement/subDivision.js +15 -1
  41. package/lib/replacement.js +22 -45
  42. package/lib/ruleNames.js +31 -6
  43. package/lib/utilities/footnotes.js +10 -10
  44. package/lib/utilities/index.js +246 -0
  45. package/lib/utilities/object.js +59 -0
  46. package/lib/utilities/processing.js +10 -1
  47. package/lib/utilities/query.js +26 -18
  48. package/lib/utilities/replacement.js +67 -1
  49. package/package.json +5 -5
  50. package/src/constants.js +4 -0
  51. package/src/defaultMarkdownStyle.js +13 -1
  52. package/src/elementMap.js +30 -5
  53. package/src/example/importer.js +21 -5
  54. package/src/example/indexOptions.js +134 -0
  55. package/src/example/view/div/sizeable/right.js +1 -1
  56. package/src/example/view.js +20 -1
  57. package/src/index/phraseMatcher.js +38 -0
  58. package/src/markdown/bnf.js +21 -5
  59. package/src/markdown/lexer.js +10 -10
  60. package/src/markdown/parser.js +12 -12
  61. package/src/node/markdown/anchor.js +11 -6
  62. package/src/node/markdown/comma.js +32 -0
  63. package/src/node/markdown/contentsLink.js +3 -1
  64. package/src/node/markdown/contentsList.js +6 -0
  65. package/src/node/markdown/directive/index.js +7 -0
  66. package/src/node/markdown/directive.js +6 -0
  67. package/src/node/markdown/division.js +60 -9
  68. package/src/node/markdown/{link.js → footnoteLink.js} +7 -5
  69. package/src/node/markdown/footnotesItem.js +4 -11
  70. package/src/node/markdown/heading.js +11 -2
  71. package/src/node/markdown/indexItem.js +7 -0
  72. package/src/node/markdown/indexLink.js +63 -0
  73. package/src/node/markdown/indexList.js +34 -0
  74. package/src/node/markdown/line.js +15 -2
  75. package/src/node/markdown/subDivision.js +25 -2
  76. package/src/node/markdown/verticalSpace.js +15 -0
  77. package/src/node/markdown.js +44 -2
  78. package/src/nodeMap.js +18 -3
  79. package/src/prepends.js +5 -0
  80. package/src/replacement/contentsList.js +3 -1
  81. package/src/replacement/footnotesList.js +9 -7
  82. package/src/replacement/indexItem.js +28 -0
  83. package/src/replacement/indexList.js +45 -0
  84. package/src/replacement/subDivision/footnotesDirective.js +0 -6
  85. package/src/replacement/subDivision/indexAnchor.js +20 -0
  86. package/src/replacement/subDivision/indexDirective.js +20 -0
  87. package/src/replacement/subDivision/pageNumberDirective.js +0 -6
  88. package/src/replacement/subDivision.js +12 -0
  89. package/src/replacement.js +41 -68
  90. package/src/ruleNames.js +12 -2
  91. package/src/utilities/footnotes.js +8 -8
  92. package/src/utilities/index.js +335 -0
  93. package/src/utilities/object.js +50 -0
  94. package/src/utilities/processing.js +12 -0
  95. package/src/utilities/query.js +21 -13
  96. package/src/utilities/replacement.js +81 -0
@@ -126,10 +126,10 @@ class MarkdownNode extends NonTerminalNode {
126
126
  }
127
127
 
128
128
  asHTML(indent, context) {
129
- const tagName = this.tagName(context);
130
-
131
129
  let html = null;
132
130
 
131
+ const tagName = this.tagName(context);
132
+
133
133
  if (tagName !== null) {
134
134
  indent = this.adjustIndent(indent);
135
135
 
@@ -157,6 +157,25 @@ ${childNodesHTML}${indent}${closingTag}
157
157
  return html;
158
158
  }
159
159
 
160
+ asPlainText(context) {
161
+ let plainText = null;
162
+
163
+ const tagName = this.tagName(context);
164
+
165
+ if (tagName !== null) {
166
+ const childNodesPlainText = this.childNodesAsPlainText(context);
167
+
168
+ if (childNodesPlainText !== null) {
169
+ plainText = (plainText === null) ?
170
+ childNodesPlainText :
171
+ `${plainText}
172
+ ${childNodesPlainText};`;
173
+ }
174
+ }
175
+
176
+ return plainText;
177
+ }
178
+
160
179
  childNodesAsHTML(indent, context) {
161
180
  const childNodes = this.getChildNodes(),
162
181
  childNodesHTML = childNodes.reduce((childNodesHTML, childNode) => {
@@ -209,6 +228,29 @@ ${childNodesHTML}${indent}${closingTag}
209
228
  return domElement;
210
229
  }
211
230
 
231
+ childNodesAsPlainText(context) {
232
+ const childNodes = this.getChildNodes(),
233
+ childNodesPlainText = childNodes.reduce((childNodesPlainText, childNode) => {
234
+ const childNodeMarkdownNode = (childNode instanceof MarkdownNode);
235
+
236
+ if (childNodeMarkdownNode) {
237
+ const markdownNode = childNode, ///
238
+ markdownNodePlainText = markdownNode.asPlainText(context);
239
+
240
+ if (markdownNodePlainText !== null) {
241
+ childNodesPlainText = (childNodesPlainText === null) ?
242
+ markdownNodePlainText : ///
243
+ `${childNodesPlainText}
244
+ ${markdownNodePlainText}`;
245
+ }
246
+ }
247
+
248
+ return childNodesPlainText;
249
+ }, null);
250
+
251
+ return childNodesPlainText;
252
+ }
253
+
212
254
  createChildNodeDOMElements(context) {
213
255
  const childNodes = this.getChildNodes();
214
256
 
package/src/nodeMap.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import LineMarkdownNode from "./node/markdown/line";
4
- import LinkMarkdownNode from "./node/markdown/link";
4
+ import CommaMarkdownNode from "./node/markdown/comma";
5
5
  import ImageMarkdownNode from "./node/markdown/image";
6
6
  import TableMarkdownNode from "./node/markdown/table";
7
7
  import ErrorMarkdownNode from "./node/markdown/error";
@@ -11,6 +11,9 @@ import FootnoteMarkdownNode from "./node/markdown/footnote";
11
11
  import ReferenceMarkdownNode from "./node/markdown/reference";
12
12
  import ParagraphMarkdownNode from "./node/markdown/paragraph";
13
13
  import HyperlinkMarkdownNode from "./node/markdown/hyperlink";
14
+ import IndexListMarkdownNode from "./node/markdown/indexList";
15
+ import IndexItemMarkdownNode from "./node/markdown/indexItem";
16
+ import IndexLinkMarkdownNode from "./node/markdown/indexLink";
14
17
  import TableCellMarkdownNode from "./node/markdown/tableCell";
15
18
  import TableHeadMarkdownNode from "./node/markdown/tableHead";
16
19
  import TableBodyMarkdownNode from "./node/markdown/tableBody";
@@ -30,6 +33,7 @@ import TableBodyRowMarkdownNode from "./node/markdown/tableBodyRow";
30
33
  import ContentsLinkMarkdownNode from "./node/markdown/contentsLink";
31
34
  import ContentsItemMarkdownNode from "./node/markdown/contentsItem";
32
35
  import ContentsListMarkdownNode from "./node/markdown/contentsList";
36
+ import FootnoteLinkMarkdownNode from "./node/markdown/footnoteLink";
33
37
  import InlineListingMarkdownNode from "./node/markdown/inlineListing";
34
38
  import UnorderedListMarkdownNode from "./node/markdown/unorderedList";
35
39
  import FootnotesItemMarkdownNode from "./node/markdown/footnotesItem";
@@ -40,6 +44,7 @@ import TableBodyCellMarkdownNode from "./node/markdown/tableBodyCell";
40
44
  import EmphasisedTextMarkdownNode from "./node/markdown/emphasisedText";
41
45
  import PrimaryHeadingMarkdownNode from "./node/markdown/heading/primary";
42
46
  import EmptyTableCellMarkdownNode from "./node/markdown/emptyTableCell";
47
+ import IndexDirectiveMarkdownNode from "./node/markdown/directive/index";
43
48
  import EmbedDirectiveMarkdownNode from "./node/markdown/directive/embee";
44
49
  import TertiaryHeadingMarkdownNode from "./node/markdown/heading/tertiary";
45
50
  import OrderedListItemMarkdownNode from "./node/markdown/listItem/ordered";
@@ -56,7 +61,7 @@ import PageNumberDirectiveMarkdownNode from "./node/markdown/directive/pageNumbe
56
61
  import StronglyEmphasisedTextMarkdownNode from "./node/markdown/stronglyEmphasisedText";
57
62
 
58
63
  import { LINE_RULE_NAME,
59
- LINK_RULE_NAME,
64
+ COMMA_RULE_NAME,
60
65
  IMAGE_RULE_NAME,
61
66
  TABLE_RULE_NAME,
62
67
  ERROR_RULE_NAME,
@@ -66,6 +71,9 @@ import { LINE_RULE_NAME,
66
71
  REFERENCE_RULE_NAME,
67
72
  PARAGRAPH_RULE_NAME,
68
73
  HYPERLINK_RULE_NAME,
74
+ INDEX_LIST_RULE_NAME,
75
+ INDEX_ITEM_RULE_NAME,
76
+ INDEX_LINK_RULE_NAME,
69
77
  TABLE_CELL_RULE_NAME,
70
78
  TABLE_HEAD_RULE_NAME,
71
79
  TABLE_BODY_RULE_NAME,
@@ -79,6 +87,7 @@ import { LINE_RULE_NAME,
79
87
  STRONG_TEXT_RULE_NAME,
80
88
  SUB_DIVISION_RULE_NAME,
81
89
  ORDERED_LIST_RULE_NAME,
90
+ FOOTNOTE_LINK_RULE_NAME,
82
91
  BLOCK_LISTING_RULE_NAME,
83
92
  CONTENTS_LINK_RULE_NAME,
84
93
  CONTENTS_ITEM_RULE_NAME,
@@ -94,6 +103,7 @@ import { LINE_RULE_NAME,
94
103
  TABLE_BODY_CELL_RULE_NAME,
95
104
  EMPHASISED_TEXT_RULE_NAME,
96
105
  PRIMARY_HEADING_RULE_NAME,
106
+ INDEX_DIRECTIVE_RULE_NAME,
97
107
  EMBED_DIRECTIVE_RULE_NAME,
98
108
  EMPTY_TABLE_CELL_RULE_NAME,
99
109
  TERTIARY_HEADING_RULE_NAME,
@@ -112,7 +122,7 @@ import { LINE_RULE_NAME,
112
122
 
113
123
  const nodeMap = {
114
124
  [LINE_RULE_NAME]: LineMarkdownNode,
115
- [LINK_RULE_NAME]: LinkMarkdownNode,
125
+ [COMMA_RULE_NAME]: CommaMarkdownNode,
116
126
  [IMAGE_RULE_NAME]: ImageMarkdownNode,
117
127
  [TABLE_RULE_NAME]: TableMarkdownNode,
118
128
  [ERROR_RULE_NAME]: ErrorMarkdownNode,
@@ -122,6 +132,9 @@ const nodeMap = {
122
132
  [REFERENCE_RULE_NAME]: ReferenceMarkdownNode,
123
133
  [PARAGRAPH_RULE_NAME]: ParagraphMarkdownNode,
124
134
  [HYPERLINK_RULE_NAME]: HyperlinkMarkdownNode,
135
+ [INDEX_LIST_RULE_NAME]: IndexListMarkdownNode,
136
+ [INDEX_ITEM_RULE_NAME]: IndexItemMarkdownNode,
137
+ [INDEX_LINK_RULE_NAME]: IndexLinkMarkdownNode,
125
138
  [TABLE_CELL_RULE_NAME]: TableCellMarkdownNode,
126
139
  [TABLE_HEAD_RULE_NAME]: TableHeadMarkdownNode,
127
140
  [TABLE_BODY_RULE_NAME]: TableBodyMarkdownNode,
@@ -139,6 +152,7 @@ const nodeMap = {
139
152
  [CONTENTS_LINK_RULE_NAME]: ContentsLinkMarkdownNode,
140
153
  [CONTENTS_ITEM_RULE_NAME]: ContentsItemMarkdownNode,
141
154
  [CONTENTS_LIST_RULE_NAME]: ContentsListMarkdownNode,
155
+ [FOOTNOTE_LINK_RULE_NAME]: FootnoteLinkMarkdownNode,
142
156
  [TABLE_HEAD_ROW_RULE_NAME]: TableHeadRowMarkdownNode,
143
157
  [TABLE_BODY_ROW_RULE_NAME]: TableBodyRowMarkdownNode,
144
158
  [INLINE_LISTING_RULE_NAME]: InlineListingMarkdownNode,
@@ -150,6 +164,7 @@ const nodeMap = {
150
164
  [TABLE_BODY_CELL_RULE_NAME]: TableBodyCellMarkdownNode,
151
165
  [EMPHASISED_TEXT_RULE_NAME]: EmphasisedTextMarkdownNode,
152
166
  [PRIMARY_HEADING_RULE_NAME]: PrimaryHeadingMarkdownNode,
167
+ [INDEX_DIRECTIVE_RULE_NAME]: IndexDirectiveMarkdownNode,
153
168
  [EMBED_DIRECTIVE_RULE_NAME]: EmbedDirectiveMarkdownNode,
154
169
  [EMPTY_TABLE_CELL_RULE_NAME]: EmptyTableCellMarkdownNode,
155
170
  [TERTIARY_HEADING_RULE_NAME]: TertiaryHeadingMarkdownNode,
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ export const INDEX_PREPEND = "index";
4
+ export const CONTENTS_PREPEND = "contents";
5
+ export const FOOTNOTE_PREPEND = "footnote";
@@ -11,7 +11,7 @@ import { headingMarkdownNodesFromNode } from "../utilities/query";
11
11
 
12
12
  const { filter } = arrayUtilities;
13
13
 
14
- export default class ContentsListReplacement extends Replacement {
14
+ class ContentsListReplacement extends Replacement {
15
15
  replaceContentsDirectiveSubdivisionReplacement(contentsDirectiveSubDivisionReplacement, divisionMarkdownNode, context) {
16
16
  const subDivisionMarkdownNode = contentsDirectiveSubDivisionReplacement.getSubDivisionMarkdownNode(),
17
17
  replacedNode = subDivisionMarkdownNode, ///
@@ -63,6 +63,8 @@ Object.assign(ContentsItemReplacement, { ///
63
63
  ContentsListReplacement
64
64
  });
65
65
 
66
+ export default ContentsListReplacement;
67
+
66
68
  function nestedHeadingMarkdownNodesFromHeadingMarkdownNodes(headingMarkdownNodes) {
67
69
  const nodes = headingMarkdownNodes, ///
68
70
  nestedNode = nestNodes(nodes),
@@ -4,13 +4,15 @@ import Replacement from "../replacement";
4
4
  import FootnotesItemReplacement from "../replacement/footnotesItem";
5
5
  import FootnotesListMarkdownNode from "../node/markdown/footnotesList";
6
6
 
7
- import { linkMarkdownNodesFromNode } from "../utilities/query";
7
+ import { footnoteLinkMarkdownNodesFromNode } from "../utilities/query";
8
8
 
9
9
  export default class FootnotesListReplacement extends Replacement {
10
- appendToDivisionMarkdownNode(divisionMarkdownNode, context) {
11
- const parentNode = divisionMarkdownNode; ///
10
+ replaceFootnotesDirectiveSubDivisionReplacement(footnotesDirectiveSubDivisionReplacement, divisionMarkdownNode, context) {
11
+ const subDivisionMarkdownNode = footnotesDirectiveSubDivisionReplacement.getSubDivisionMarkdownNode(),
12
+ replacedNode = subDivisionMarkdownNode, ///
13
+ parentNode = divisionMarkdownNode; ///
12
14
 
13
- super.appendTo(parentNode, context);
15
+ super.replace(replacedNode, parentNode, context)
14
16
  }
15
17
 
16
18
  static fromDivisionMarkdownNodeAndFootnoteReplacementMap(divisionMarkdownNode, footnoteReplacementMap, context) {
@@ -18,13 +20,13 @@ export default class FootnotesListReplacement extends Replacement {
18
20
 
19
21
  const node = divisionMarkdownNode, ///
20
22
  start = startFromFootnoteReplacementMap(footnoteReplacementMap),
21
- linkMarkdownNodes = linkMarkdownNodesFromNode(node),
23
+ footnoteLinkMarkdownNodes = footnoteLinkMarkdownNodesFromNode(node),
22
24
  footnotesItemReplacements = [];
23
25
 
24
26
  let number = start;
25
27
 
26
- linkMarkdownNodes.forEach((linkMarkdownNode) => {
27
- const identifier = linkMarkdownNode.identifier(context),
28
+ footnoteLinkMarkdownNodes.forEach((footnoteLinkMarkdownNode) => {
29
+ const identifier = footnoteLinkMarkdownNode.identifier(context),
28
30
  footnoteReplacement = footnoteReplacementMap[identifier] || null;
29
31
 
30
32
  if (footnoteReplacement !== null) {
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ import Replacement from "../replacement";
4
+
5
+ import { COMMA } from "../constants";
6
+ import { INDEX_ITEM_RULE_NAME } from "../ruleNames";
7
+
8
+ export default class IndexItemReplacement extends Replacement {
9
+ getIndexItemMarkdownNode() {
10
+ const node = this.getNode(),
11
+ indexItemMarkdownNode = node; ///
12
+
13
+ return indexItemMarkdownNode;
14
+ }
15
+
16
+ static fromEntryAndPageNumbers(entry, pageNumbers, context) {
17
+ const { tokensFromContent, nodeFromTokensAndStartRuleName } = context,
18
+ entryContent = entry, ///
19
+ pageNumbersContent = pageNumbers.join(COMMA),
20
+ content = `${entryContent} ${pageNumbersContent}`,
21
+ startRuleName = INDEX_ITEM_RULE_NAME,
22
+ tokens = tokensFromContent(content),
23
+ node = nodeFromTokensAndStartRuleName(tokens, startRuleName),
24
+ indexItemReplacement = Replacement.fromNodeAndTokens(IndexItemReplacement, node, tokens);
25
+
26
+ return indexItemReplacement;
27
+ }
28
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ import Replacement from "../replacement";
4
+
5
+ import IndexItemReplacement from "../replacement/indexItem";
6
+ import IndexListMarkdownNode from "../node/markdown/indexList";
7
+
8
+ import { indexMapFromDivisionMarkdownNodes } from "../utilities/index";
9
+
10
+ export default class IndexListReplacement extends Replacement {
11
+ replaceIndexDirectiveSubdivisionReplacement(indexDirectiveSubDivisionReplacement, divisionMarkdownNode, context) {
12
+ const subDivisionMarkdownNode = indexDirectiveSubDivisionReplacement.getSubDivisionMarkdownNode(),
13
+ replacedNode = subDivisionMarkdownNode, ///
14
+ parentNode = divisionMarkdownNode; ///
15
+
16
+ super.replace(replacedNode, parentNode, context)
17
+ }
18
+
19
+ static fromDivisionMarkdownNodesAndDivisionMarkdownNode(divisionMarkdownNodes, divisionMarkdownNode, context) {
20
+ let indexListReplacement = null;
21
+
22
+ const indexMap = indexMapFromDivisionMarkdownNodes(divisionMarkdownNodes, context),
23
+ entries = Object.keys(indexMap), ///
24
+ indexItemReplacements = entries.map((entry) => {
25
+ const pageNumbers = indexMap[entry],
26
+ indexItemReplacement = IndexItemReplacement.fromEntryAndPageNumbers(entry, pageNumbers, context);
27
+
28
+ return indexItemReplacement;
29
+ }),
30
+ indexListMarkdownNode = IndexListMarkdownNode.fromIndexItemReplacements(indexItemReplacements);
31
+
32
+ if (indexListMarkdownNode !== null) {
33
+ const node = indexListMarkdownNode, ///
34
+ tokens = [];
35
+
36
+ indexItemReplacements.forEach((indexItemReplacement) => {
37
+ indexItemReplacement.getTokens(tokens);
38
+ });
39
+
40
+ indexListReplacement = Replacement.fromNodeAndTokens(IndexListReplacement, node, tokens);
41
+ }
42
+
43
+ return indexListReplacement;
44
+ }
45
+ }
@@ -5,12 +5,6 @@ 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
-
14
8
  static fromSubDivisionMarkdownNode(subDivisionMarkdownNode, context) {
15
9
  let footnotesDirectiveSubDivisionReplacement = null;
16
10
 
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ import SubDivisionReplacement from "../../replacement/subDivision";
4
+
5
+ import AnchorMarkdownNode from "../../node/markdown/anchor";
6
+ import SubDivisionMarkdownNode from "../../node/markdown/subDivision";
7
+
8
+ import { INDEX_PREPEND } from "../../prepends";
9
+
10
+ export default class IndexAnchorSubDivisionReplacement extends SubDivisionReplacement {
11
+ static fromPageNumber(pageNumber, context) {
12
+ const prepend = INDEX_PREPEND,
13
+ identifier = pageNumber, ///
14
+ anchorMarkdownNode = AnchorMarkdownNode.fromPrependAndIdentifier(prepend, identifier),
15
+ subDivisionMarkdownNode = SubDivisionMarkdownNode.fromAnchorMarkdownNode(anchorMarkdownNode),
16
+ indexAnchorSubdivisionReplacement = SubDivisionReplacement.fromSubDivisionMarkdownNode(IndexAnchorSubDivisionReplacement, subDivisionMarkdownNode, context);
17
+
18
+ return indexAnchorSubdivisionReplacement;
19
+ }
20
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ import SubDivisionReplacement from "../../replacement/subDivision";
4
+
5
+ import { indexDirectiveMarkdownNodeFromNode } from "../../utilities/query";
6
+
7
+ export default class IndexDirectiveSubDivisionReplacement extends SubDivisionReplacement {
8
+ static fromSubDivisionMarkdownNode(subDivisionMarkdownNode, context) {
9
+ let indexDirectiveSubDivisionReplacement = null;
10
+
11
+ const node = subDivisionMarkdownNode, ///
12
+ indexDirectiveMarkdownNode = indexDirectiveMarkdownNodeFromNode(node);
13
+
14
+ if (indexDirectiveMarkdownNode !== null) {
15
+ indexDirectiveSubDivisionReplacement = SubDivisionReplacement.fromSubDivisionMarkdownNode(IndexDirectiveSubDivisionReplacement, subDivisionMarkdownNode, context);
16
+ }
17
+
18
+ return indexDirectiveSubDivisionReplacement;
19
+ }
20
+ }
@@ -5,12 +5,6 @@ import SubDivisionReplacement from "../../replacement/subDivision";
5
5
  import { pageNumberDirectiveMarkdownNodeFromNode } from "../../utilities/query";
6
6
 
7
7
  export default class PageNumberDirectiveSubDivisionReplacement extends SubDivisionReplacement {
8
- appendToDivisionMarkdownNode(divisionMarkdownNode, context) {
9
- const parentNode = divisionMarkdownNode; ///
10
-
11
- super.appendTo(parentNode, context);
12
- }
13
-
14
8
  static fromSubDivisionMarkdownNode(subDivisionMarkdownNode, context) {
15
9
  let pageNumberDirectiveSubDivisionReplacement = null;
16
10
 
@@ -13,6 +13,18 @@ export default class SubDivisionReplacement extends Replacement {
13
13
  return this.subDivisionMarkdownNode;
14
14
  }
15
15
 
16
+ appendToDivisionMarkdownNode(divisionMarkdownNode, context) {
17
+ const parentNode = divisionMarkdownNode; ///
18
+
19
+ super.appendTo(parentNode, context);
20
+ }
21
+
22
+ prependToDivisionMarkdownNode(divisionMarkdownNode, context) {
23
+ const parentNode = divisionMarkdownNode; ///
24
+
25
+ super.prependTo(parentNode, context);
26
+ }
27
+
16
28
  removeFromDivisionMarkdownNode(divisionMarkdownNode, context) {
17
29
  const removedNode = this.subDivisionMarkdownNode, ///
18
30
  parentNode = divisionMarkdownNode;
@@ -2,7 +2,19 @@
2
2
 
3
3
  import { arrayUtilities } from "necessary";
4
4
 
5
- import { removeNode, appendNode, removeTokens, appendTokens, replaceNode, replaceNodes, replaceTokens, addNodesAfter, addTokensAfter } from "./utilities/replacement";
5
+ import { appendNode,
6
+ prependNode,
7
+ removeNode,
8
+ replaceNode,
9
+ replaceNodes,
10
+ addNodesAfter,
11
+ appendTokens,
12
+ prependTokens,
13
+ removeTokens,
14
+ replaceTokens,
15
+ addTokensAfter,
16
+ overwriteClonedNodeTokens,
17
+ clonedTokensFromNodeAndTokens, } from "./utilities/replacement";
6
18
 
7
19
  const { push } = arrayUtilities;
8
20
 
@@ -68,6 +80,16 @@ export default class Replacement {
68
80
  appendTokens(appendedTokens, parentNode, tokens);
69
81
  }
70
82
 
83
+ prependTo(parentNode, context) {
84
+ const { tokens } = context,
85
+ prependedNode = this.node, ///
86
+ prependedTokens = this.tokens; ///
87
+
88
+ prependNode(prependedNode, parentNode);
89
+
90
+ prependTokens(prependedTokens, parentNode, tokens);
91
+ }
92
+
71
93
  addAfter(existingNode, parentNode, context) {
72
94
  const { tokens } = context,
73
95
  addedNodes = this.getChildNodes(), ///
@@ -108,12 +130,13 @@ export default class Replacement {
108
130
  }
109
131
 
110
132
  clone(...remainingArguments) {
111
- const node = this.node.clone(),
112
- clonedTokens = clonedTokensFromNodeAndTokens(node, this.tokens);
133
+ const clonedNode = this.node.clone(),
134
+ clonedTokens = clonedTokensFromNodeAndTokens(this.node, this.tokens);
113
135
 
114
- overwriteNodeTokens(node, clonedTokens, this.tokens);
136
+ overwriteClonedNodeTokens(clonedNode, clonedTokens, this.tokens);
115
137
 
116
138
  const Class = this.constructor, ///
139
+ node = clonedNode, ///
117
140
  tokens = clonedTokens, ///
118
141
  replacement = new Class(node, tokens, ...remainingArguments);
119
142
 
@@ -133,13 +156,22 @@ export default class Replacement {
133
156
 
134
157
  let { tokens } = context;
135
158
 
136
- const clonedTokens = clonedTokensFromNodeAndTokens(node, tokens),
137
- firstSignificantTokenIndex = node.getFirstSignificantTokenIndex(tokens),
138
- offset = firstSignificantTokenIndex; ///
159
+ const firstSignificantTokenIndex = node.getFirstSignificantTokenIndex(tokens),
160
+ clonedNode = node.clone();
139
161
 
140
- node = node.clone(); ///
162
+ let clonedTokens;
163
+
164
+ if (firstSignificantTokenIndex === null) {
165
+ clonedTokens = [];
166
+ } else {
167
+ const offset = firstSignificantTokenIndex; ///
168
+
169
+ clonedTokens = clonedTokensFromNodeAndTokens(node, tokens);
170
+
171
+ overwriteClonedNodeTokens(clonedNode, clonedTokens, tokens, offset);
172
+ }
141
173
 
142
- overwriteNodeTokens(node, clonedTokens, tokens, offset);
174
+ node = clonedNode; ///
143
175
 
144
176
  tokens = clonedTokens; ///
145
177
 
@@ -163,62 +195,3 @@ export default class Replacement {
163
195
  }
164
196
  }
165
197
 
166
- function overwriteNodeTokens(node, clonedTokens, tokens, offset = 0) {
167
- const nodeTerminalNode = node.isTerminalNode();
168
-
169
- if (nodeTerminalNode) {
170
- const terminalNode = node; ///
171
-
172
- overwriteTerminalNodeTokens(terminalNode, clonedTokens, tokens, offset);
173
- } else {
174
- const nonTerminalNode = node; ///
175
-
176
- overwriteNonTerminalNodeTokens(nonTerminalNode, clonedTokens, tokens, offset);
177
- }
178
- }
179
-
180
- function overwriteTerminalNodeTokens(terminalNode, clonedTokens, tokens, offset) {
181
- let index,
182
- significantToken;
183
-
184
- significantToken = terminalNode.getSignificantToken();
185
-
186
- if (significantToken !== null) {
187
- index = tokens.indexOf(significantToken);
188
-
189
- index -= offset;
190
-
191
- const clonedToken = clonedTokens[index];
192
-
193
- significantToken = clonedToken; ///
194
-
195
- terminalNode.setSignificantToken(significantToken);
196
- }
197
- }
198
-
199
- function overwriteNonTerminalNodeTokens(nonTerminalNode, clonedTokens, tokens, offset) {
200
- const childNodes = nonTerminalNode.getChildNodes();
201
-
202
- childNodes.forEach((childNode) => {
203
- const node = childNode; ///
204
-
205
- overwriteNodeTokens(node, clonedTokens, tokens, offset);
206
- });
207
- }
208
-
209
- function clonedTokensFromNodeAndTokens(node, tokens) {
210
- const firstSignificantTokenIndex = node.getFirstSignificantTokenIndex(tokens),
211
- lastSignificantTokenIndex = node.getLastSignificantTokenIndex(tokens),
212
- start = firstSignificantTokenIndex, ///
213
- end = lastSignificantTokenIndex + 1;
214
-
215
- tokens = tokens.slice(start, end); ///
216
-
217
- const clonedTokens = tokens.map((token) => { ///
218
- const clonedToken = token.clone();
219
-
220
- return clonedToken;
221
- });
222
-
223
- return clonedTokens;
224
- }
package/src/ruleNames.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  export const LINE_RULE_NAME = "line";
4
- export const LINK_RULE_NAME = "link";
4
+ export const COMMA_RULE_NAME = "comma";
5
5
  export const IMAGE_RULE_NAME = "image";
6
6
  export const TABLE_RULE_NAME = "table";
7
7
  export const ERROR_RULE_NAME = "error";
@@ -11,6 +11,9 @@ export const FOOTNOTE_RULE_NAME = "footnote";
11
11
  export const REFERENCE_RULE_NAME = "reference";
12
12
  export const PARAGRAPH_RULE_NAME = "paragraph";
13
13
  export const HYPERLINK_RULE_NAME = "hyperlink";
14
+ export const INDEX_LIST_RULE_NAME = "indexList";
15
+ export const INDEX_ITEM_RULE_NAME = "indexItem";
16
+ export const INDEX_LINK_RULE_NAME = "indexLink";
14
17
  export const TABLE_CELL_RULE_NAME = "tableCell";
15
18
  export const TABLE_HEAD_RULE_NAME = "tableHead";
16
19
  export const TABLE_BODY_RULE_NAME = "tableBody";
@@ -28,6 +31,7 @@ export const BLOCK_LISTING_RULE_NAME = "blockListing";
28
31
  export const CONTENTS_LINK_RULE_NAME = "contentsLink";
29
32
  export const CONTENTS_ITEM_RULE_NAME = "contentsItem";
30
33
  export const CONTENTS_LIST_RULE_NAME = "contentsList";
34
+ export const FOOTNOTE_LINK_RULE_NAME = "footnoteLink";
31
35
  export const FOOTNOTES_ITEM_RULE_NAME = "footnotesItem";
32
36
  export const TABLE_HEAD_ROW_RULE_NAME = "tableHeadRow";
33
37
  export const TABLE_BODY_ROW_RULE_NAME = "tableBodyRow";
@@ -39,6 +43,7 @@ export const TABLE_HEAD_CELL_RULE_NAME = "tableHeadCell";
39
43
  export const TABLE_BODY_CELL_RULE_NAME = "tableBodyCell";
40
44
  export const EMPHASISED_TEXT_RULE_NAME = "emphasisedText";
41
45
  export const PRIMARY_HEADING_RULE_NAME = "primaryHeading";
46
+ export const INDEX_DIRECTIVE_RULE_NAME = "indexDirective";
42
47
  export const EMBED_DIRECTIVE_RULE_NAME = "embedDirective";
43
48
  export const EMPTY_TABLE_CELL_RULE_NAME = "emptyTableCell";
44
49
  export const TERTIARY_HEADING_RULE_NAME = "tertiaryHeading";
@@ -57,7 +62,7 @@ export const STRONGLY_EMPHASISED_TEXT_RULE_NAME = "stronglyEmphasisedText";
57
62
 
58
63
  const ruleNames = {
59
64
  LINE_RULE_NAME,
60
- LINK_RULE_NAME,
65
+ COMMA_RULE_NAME,
61
66
  IMAGE_RULE_NAME,
62
67
  TABLE_RULE_NAME,
63
68
  ERROR_RULE_NAME,
@@ -67,6 +72,9 @@ const ruleNames = {
67
72
  REFERENCE_RULE_NAME,
68
73
  PARAGRAPH_RULE_NAME,
69
74
  HYPERLINK_RULE_NAME,
75
+ INDEX_LIST_RULE_NAME,
76
+ INDEX_ITEM_RULE_NAME,
77
+ INDEX_LINK_RULE_NAME,
70
78
  TABLE_CELL_RULE_NAME,
71
79
  TABLE_HEAD_RULE_NAME,
72
80
  TABLE_BODY_RULE_NAME,
@@ -84,6 +92,7 @@ const ruleNames = {
84
92
  CONTENTS_LINK_RULE_NAME,
85
93
  CONTENTS_ITEM_RULE_NAME,
86
94
  CONTENTS_LIST_RULE_NAME,
95
+ FOOTNOTE_LINK_RULE_NAME,
87
96
  FOOTNOTES_ITEM_RULE_NAME,
88
97
  TABLE_HEAD_ROW_RULE_NAME,
89
98
  TABLE_BODY_ROW_RULE_NAME,
@@ -95,6 +104,7 @@ const ruleNames = {
95
104
  TABLE_BODY_CELL_RULE_NAME,
96
105
  EMPHASISED_TEXT_RULE_NAME,
97
106
  PRIMARY_HEADING_RULE_NAME,
107
+ INDEX_DIRECTIVE_RULE_NAME,
98
108
  EMBED_DIRECTIVE_RULE_NAME,
99
109
  EMPTY_TABLE_CELL_RULE_NAME,
100
110
  TERTIARY_HEADING_RULE_NAME,
@@ -1,25 +1,25 @@
1
1
  "use strict";
2
2
 
3
- import { linkMarkdownNodesFromNode } from "../utilities/query";
3
+ import { footnoteLinkMarkdownNodesFromNode } from "../utilities/query";
4
4
 
5
- export function renumberLinkMarkdownNodes(divisionMarkdownNode, footnoteReplacementMap, callback, context) {
5
+ export function renumberFootnoteLinkMarkdownNodes(divisionMarkdownNode, footnoteReplacementMap, callback, context) {
6
6
  const node = divisionMarkdownNode, ///
7
- linkMarkdownNodes = linkMarkdownNodesFromNode(node);
7
+ footnoteLinkMarkdownNodes = footnoteLinkMarkdownNodesFromNode(node);
8
8
 
9
- linkMarkdownNodes.forEach((linkMarkdownNode) => {
10
- const identifier = linkMarkdownNode.identifier(context),
9
+ footnoteLinkMarkdownNodes.forEach((footnoteLinkMarkdownNode) => {
10
+ const identifier = footnoteLinkMarkdownNode.identifier(context),
11
11
  footnoteReplacement = footnoteReplacementMap[identifier] || null;
12
12
 
13
13
  if (footnoteReplacement !== null) {
14
14
  const number = footnoteReplacement.getNumber();
15
15
 
16
- linkMarkdownNode.setNumber(number);
16
+ footnoteLinkMarkdownNode.setNumber(number);
17
17
 
18
- callback(linkMarkdownNode);
18
+ callback(footnoteLinkMarkdownNode);
19
19
  }
20
20
  });
21
21
  }
22
22
 
23
23
  export default {
24
- renumberLinkMarkdownNodes
24
+ renumberFootnoteLinkMarkdownNodes
25
25
  };