highmark-markdown 0.0.434 → 0.0.436

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 (53) hide show
  1. package/example.js +1623 -919
  2. package/lib/defaultMarkdownStyle.js +2 -2
  3. package/lib/elementMap.js +4 -1
  4. package/lib/example/importer.js +2 -2
  5. package/lib/index/item.js +102 -0
  6. package/lib/index/list.js +88 -0
  7. package/lib/index/match.js +76 -0
  8. package/lib/letters.js +41 -0
  9. package/lib/markdown/bnf.js +2 -2
  10. package/lib/node/markdown/division.js +5 -5
  11. package/lib/node/markdown/footnotesList.js +5 -10
  12. package/lib/node/markdown/indexHeading.js +120 -0
  13. package/lib/node/markdown/indexItem.js +42 -2
  14. package/lib/node/markdown/indexLink.js +2 -3
  15. package/lib/node/markdown/indexList.js +5 -10
  16. package/lib/node/markdown/line.js +2 -2
  17. package/lib/nodeMap.js +3 -2
  18. package/lib/replacement/footnotesList.js +4 -4
  19. package/lib/replacement/index.js +176 -0
  20. package/lib/replacement/indexHeading.js +122 -0
  21. package/lib/replacement/indexItem.js +4 -4
  22. package/lib/replacement/indexList.js +9 -41
  23. package/lib/replacement.js +1 -9
  24. package/lib/ruleNames.js +6 -1
  25. package/lib/utilities/index.js +42 -42
  26. package/lib/utilities/object.js +8 -2
  27. package/package.json +1 -1
  28. package/src/defaultMarkdownStyle.js +18 -1
  29. package/src/elementMap.js +5 -0
  30. package/src/example/importer.js +7 -2
  31. package/src/index/item.js +43 -0
  32. package/src/index/list.js +62 -0
  33. package/src/index/{phraseMatcher.js → match.js} +6 -6
  34. package/src/letters.js +32 -0
  35. package/src/markdown/bnf.js +4 -1
  36. package/src/node/markdown/division.js +4 -4
  37. package/src/node/markdown/footnotesList.js +9 -16
  38. package/src/node/markdown/indexHeading.js +7 -0
  39. package/src/node/markdown/indexItem.js +20 -0
  40. package/src/node/markdown/indexLink.js +1 -4
  41. package/src/node/markdown/indexList.js +9 -16
  42. package/src/node/markdown/line.js +3 -2
  43. package/src/nodeMap.js +4 -1
  44. package/src/replacement/footnotesList.js +4 -3
  45. package/src/replacement/index.js +90 -0
  46. package/src/replacement/indexHeading.js +18 -0
  47. package/src/replacement/indexItem.js +4 -3
  48. package/src/replacement/indexList.js +7 -20
  49. package/src/replacement.js +0 -12
  50. package/src/ruleNames.js +2 -0
  51. package/src/utilities/index.js +46 -46
  52. package/src/utilities/object.js +12 -2
  53. package/lib/index/phraseMatcher.js +0 -76
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ import { stringUtilities } from "necessary";
4
+
5
+ import IndexItem from "../index/item";
6
+
7
+ import { indexMapFromDivisionMarkdownNodes } from "../utilities/index";
8
+
9
+ const { strcmp } = stringUtilities;
10
+
11
+ export default class IndexList {
12
+ constructor(indexItems) {
13
+ this.indexItems = indexItems;
14
+ }
15
+
16
+ getIndexItems() {
17
+ return this.indexItems;
18
+ }
19
+
20
+ reduceIndexItemByLetter(letter, callback) {
21
+ const indexItems = this.indexItems.filter((indexItem) => {
22
+ const indexItemMatchesLetter = indexItem.matchLetter(letter);
23
+
24
+ if (indexItemMatchesLetter) {
25
+ return true;
26
+ }
27
+ });
28
+
29
+ const result = indexItems.map(callback);
30
+
31
+ return result;
32
+ }
33
+
34
+ static fromDivisionMarkdownNodes(divisionMarkdownNodes, context) {
35
+ const indexMap = indexMapFromDivisionMarkdownNodes(divisionMarkdownNodes, context),
36
+ indexItems = indexItemsFromIndexMap(indexMap),
37
+ indexList = new IndexList(indexItems);
38
+
39
+ return indexList;
40
+ }
41
+ }
42
+
43
+ function indexItemsFromIndexMap(indexMap) {
44
+ const wordsOrPhrases = Object.keys(indexMap); ///
45
+
46
+ wordsOrPhrases.sort((wordOrPhraseA, wordOrPhraseB) => {
47
+ const lowerCaseWordOrPhraseA = wordOrPhraseA.toLowerCase(),
48
+ lowerCaseWordOrPhraseB = wordOrPhraseB.toLowerCase(),
49
+ difference = strcmp(lowerCaseWordOrPhraseB, lowerCaseWordOrPhraseA);
50
+
51
+ return difference;
52
+ });
53
+
54
+ const indexItems = wordsOrPhrases.map((wordOrPhrase, index) => {
55
+ const pageNumbers = indexMap[wordOrPhrase],
56
+ indexItem = IndexItem.fromWordOrPhraseAndPageNumbers(wordOrPhrase, pageNumbers);
57
+
58
+ return indexItem;
59
+ })
60
+
61
+ return indexItems;
62
+ }
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { UNDERSCORE, GLOBAL_FLAG, SINGLE_SPACE } from "../constants";
4
4
 
5
- export default class PhraseMatcher {
5
+ export default class IndexMatch {
6
6
  constructor(regularExpression, replacement) {
7
7
  this.regularExpression = regularExpression;
8
8
  this.replacement = replacement;
@@ -22,17 +22,17 @@ export default class PhraseMatcher {
22
22
  return plainText;
23
23
  }
24
24
 
25
- static revert(entry) {
26
- entry = entry.replace(/_/g, SINGLE_SPACE);
25
+ static revert(wordOrPhrase) {
26
+ wordOrPhrase = wordOrPhrase.replace(/_/g, SINGLE_SPACE);
27
27
 
28
- return entry;
28
+ return wordOrPhrase;
29
29
  }
30
30
 
31
31
  static fromPhrase(phrase) {
32
32
  const regularExpression = new RegExp(phrase, GLOBAL_FLAG),
33
33
  replacement = phrase.replace(/\s/g, UNDERSCORE),
34
- phraseMatcher = new PhraseMatcher(regularExpression, replacement);
34
+ indexMatch = new IndexMatch(regularExpression, replacement);
35
35
 
36
- return phraseMatcher;
36
+ return indexMatch;
37
37
  }
38
38
  }
package/src/letters.js ADDED
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ const letters = [
4
+ "a",
5
+ "b",
6
+ "c",
7
+ "d",
8
+ "e",
9
+ "f",
10
+ "g",
11
+ "h",
12
+ "i",
13
+ "j",
14
+ "k",
15
+ "l",
16
+ "m",
17
+ "n",
18
+ "o",
19
+ "p",
20
+ "q",
21
+ "r",
22
+ "s",
23
+ "t",
24
+ "u",
25
+ "v",
26
+ "w",
27
+ "x",
28
+ "y",
29
+ "z"
30
+ ];
31
+
32
+ export default letters;
@@ -260,10 +260,13 @@ const bnf = `
260
260
  footnotesItem ::= anchor paragraph ;
261
261
 
262
262
 
263
+ indexHeading ::= line ;
264
+
265
+
263
266
  indexList ::= indexItem+ ;
264
267
 
265
268
 
266
- indexItem ::= line... indexLink ( comma indexLink )* ;
269
+ indexItem ::= line... comma indexLink ( comma indexLink )* ;
267
270
 
268
271
 
269
272
  indexLink ::= [number] ;
@@ -3,8 +3,8 @@
3
3
  import { arrayUtilities } from "necessary";
4
4
 
5
5
  import MarkdownNode from "../../node/markdown";
6
+ import IndexReplacement from "../../replacement/index";
6
7
  import FootnoteReplacement from "../../replacement/footnote";
7
- import IndexListReplacement from "../../replacement/indexList";
8
8
  import ContentsListReplacement from "../../replacement/contentsList";
9
9
  import FootnotesListReplacement from "../../replacement/footnotesList";
10
10
  import FootnoteSubDivisionReplacement from "../../replacement/subDivision/footnote";
@@ -139,10 +139,10 @@ export default class DivisionMarkdownNode extends MarkdownNode {
139
139
 
140
140
  if (indexDirectiveSubDivisionReplacement !== null) {
141
141
  const divisionMarkdownNode = this, ///
142
- indexListReplacement = IndexListReplacement.fromDivisionMarkdownNodesAndDivisionMarkdownNode(divisionMarkdownNodes, divisionMarkdownNode, context);
142
+ indexReplacement = IndexReplacement.fromDivisionMarkdownNodesAndDivisionMarkdownNode(divisionMarkdownNodes, divisionMarkdownNode, context);
143
143
 
144
- if (indexListReplacement !== null) {
145
- indexListReplacement.replaceIndexDirectiveSubdivisionReplacement(indexDirectiveSubDivisionReplacement, divisionMarkdownNode, context);
144
+ if (indexReplacement !== null) {
145
+ indexReplacement.replaceIndexDirectiveSubdivisionReplacement(indexDirectiveSubDivisionReplacement, divisionMarkdownNode, context);
146
146
 
147
147
  indexCreated = true;
148
148
  }
@@ -31,22 +31,15 @@ export default class FootnotesListMarkdownNode extends MarkdownNode {
31
31
  clone() { return super.clone(this.start); }
32
32
 
33
33
  static fromFootnotesItemReplacementsAndStart(footnotesItemReplacements, start) {
34
- let footnotesListMarkdownNode = null;
35
-
36
- const footnotesItemReplacementsLength = footnotesItemReplacements.length;
37
-
38
- if (footnotesItemReplacementsLength > 0) {
39
- const ruleName = FOOTNOTES_LIST_RULE_NAME,
40
- childNodes = footnotesItemReplacements.map((footnotesItemReplacement) => {
41
- const footnotesItemReplacementMode = footnotesItemReplacement.getFootnotesItemMarkdownNode(),
42
- childNode = footnotesItemReplacementMode; ///
43
-
44
- return childNode;
45
- }),
46
- opacity = null;
47
-
48
- footnotesListMarkdownNode = MarkdownNode.fromRuleNameChildNodesAndOpacity(FootnotesListMarkdownNode, ruleName, childNodes, opacity, start);
49
- }
34
+ const ruleName = FOOTNOTES_LIST_RULE_NAME,
35
+ childNodes = footnotesItemReplacements.map((footnotesItemReplacement) => {
36
+ const footnotesItemReplacementMode = footnotesItemReplacement.getFootnotesItemMarkdownNode(),
37
+ childNode = footnotesItemReplacementMode; ///
38
+
39
+ return childNode;
40
+ }),
41
+ opacity = null,
42
+ footnotesListMarkdownNode = MarkdownNode.fromRuleNameChildNodesAndOpacity(FootnotesListMarkdownNode, ruleName, childNodes, opacity, start);
50
43
 
51
44
  return footnotesListMarkdownNode;
52
45
  }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+
3
+ import MarkdownNode from "../../node/markdown";
4
+
5
+ export default class IndexHeadingMarkdownNode extends MarkdownNode {
6
+ static fromRuleNameChildNodesAndOpacity(ruleName, childNodes, opacity) { return MarkdownNode.fromRuleNameChildNodesAndOpacity(IndexHeadingMarkdownNode, ruleName, childNodes, opacity); }
7
+ }
@@ -3,5 +3,25 @@
3
3
  import MarkdownNode from "../../node/markdown";
4
4
 
5
5
  export default class IndexItemMarkdownNode extends MarkdownNode {
6
+ asHTML(indent, context) {
7
+ indent = this.adjustIndent(indent);
8
+
9
+ const childNodesHTML = this.childNodesAsHTML(indent, context),
10
+ startingTag = this.startingTag(context),
11
+ closingTag = this.closingTag(context),
12
+ html = `${indent}${startingTag}${childNodesHTML}${closingTag}
13
+ `;
14
+
15
+ return html;
16
+ }
17
+
18
+ childNodesAsHTML(indent, context) {
19
+ indent = null;
20
+
21
+ const childNodesHTML = super.childNodesAsHTML(indent, context);
22
+
23
+ return childNodesHTML;
24
+ }
25
+
6
26
  static fromRuleNameChildNodesAndOpacity(ruleName, childNodes, opacity) { return MarkdownNode.fromRuleNameChildNodesAndOpacity(IndexItemMarkdownNode, ruleName, childNodes, opacity); }
7
27
  }
@@ -24,13 +24,10 @@ export default class IndexLinkMarkdownNode extends MarkdownNode {
24
24
  }
25
25
 
26
26
  asHTML(indent, context) {
27
- indent = this.adjustIndent(indent);
28
-
29
27
  const childNodesHTML = this.childNodesAsHTML(indent, context),
30
28
  startingTag = this.startingTag(context),
31
29
  closingTag = this.closingTag(context),
32
- html = `${indent}${startingTag}${childNodesHTML}${closingTag}
33
- `;
30
+ html = `${startingTag}${childNodesHTML}${closingTag}`;
34
31
 
35
32
  return html;
36
33
  }
@@ -12,22 +12,15 @@ export default class IndexListMarkdownNode extends MarkdownNode {
12
12
  }
13
13
 
14
14
  static fromIndexItemReplacements(indexItemReplacements) {
15
- let indexListMarkdownNode = null;
16
-
17
- const indexItemReplacementsLength = indexItemReplacements.length;
18
-
19
- if (indexItemReplacementsLength > 0) {
20
- const ruleName = INDEX_LIST_RULE_NAME,
21
- childNodes = indexItemReplacements.map((indexItemReplacement) => {
22
- const indexItemReplacementNode = indexItemReplacement.getIndexItemMarkdownNode(),
23
- childNode = indexItemReplacementNode; ///
24
-
25
- return childNode;
26
- }),
27
- opacity = null;
28
-
29
- indexListMarkdownNode = MarkdownNode.fromRuleNameChildNodesAndOpacity(IndexListMarkdownNode, ruleName, childNodes, opacity);
30
- }
15
+ const ruleName = INDEX_LIST_RULE_NAME,
16
+ childNodes = indexItemReplacements.map((indexItemReplacement) => {
17
+ const indexItemReplacementNode = indexItemReplacement.getIndexItemMarkdownNode(),
18
+ childNode = indexItemReplacementNode; ///
19
+
20
+ return childNode;
21
+ }),
22
+ opacity = null,
23
+ indexListMarkdownNode = MarkdownNode.fromRuleNameChildNodesAndOpacity(IndexListMarkdownNode, ruleName, childNodes, opacity);
31
24
 
32
25
  return indexListMarkdownNode;
33
26
  }
@@ -21,8 +21,9 @@ export default class LineMarkdownNode extends MarkdownNode {
21
21
  const childNodesHTML = this.childNodesAsHTML(indent, context),
22
22
  startingTag = this.startingTag(context),
23
23
  closingTag = this.closingTag(context),
24
- html = `${indent}${startingTag}${childNodesHTML}${closingTag}
25
- `;
24
+ html = (indent !== null) ?
25
+ `${indent}${startingTag}${childNodesHTML}${closingTag}
26
+ `: `${startingTag}${childNodesHTML}${closingTag}`;
26
27
 
27
28
  return html;
28
29
  }
package/src/nodeMap.js CHANGED
@@ -27,6 +27,7 @@ import InlineTextMarkdownNode from "./node/markdown/inlineText";
27
27
  import StrongTextMarkdownNode from "./node/markdown/strongText";
28
28
  import SubDivisionMarkdownNode from "./node/markdown/subDivision";
29
29
  import OrderedListMarkdownNode from "./node/markdown/orderedList";
30
+ import IndexHeadingMarkdownNode from "./node/markdown/indexHeading";
30
31
  import BlockListingMarkdownNode from "./node/markdown/blockListing";
31
32
  import TableHeadRowMarkdownNode from "./node/markdown/tableHeadRow";
32
33
  import TableBodyRowMarkdownNode from "./node/markdown/tableBodyRow";
@@ -87,11 +88,12 @@ import { LINE_RULE_NAME,
87
88
  STRONG_TEXT_RULE_NAME,
88
89
  SUB_DIVISION_RULE_NAME,
89
90
  ORDERED_LIST_RULE_NAME,
90
- FOOTNOTE_LINK_RULE_NAME,
91
+ INDEX_HEADING_RULE_NAME,
91
92
  BLOCK_LISTING_RULE_NAME,
92
93
  CONTENTS_LINK_RULE_NAME,
93
94
  CONTENTS_ITEM_RULE_NAME,
94
95
  CONTENTS_LIST_RULE_NAME,
96
+ FOOTNOTE_LINK_RULE_NAME,
95
97
  TABLE_HEAD_ROW_RULE_NAME,
96
98
  TABLE_BODY_ROW_RULE_NAME,
97
99
  INLINE_LISTING_RULE_NAME,
@@ -148,6 +150,7 @@ const nodeMap = {
148
150
  [STRONG_TEXT_RULE_NAME]: StrongTextMarkdownNode,
149
151
  [SUB_DIVISION_RULE_NAME]: SubDivisionMarkdownNode,
150
152
  [ORDERED_LIST_RULE_NAME]: OrderedListMarkdownNode,
153
+ [INDEX_HEADING_RULE_NAME]: IndexHeadingMarkdownNode,
151
154
  [BLOCK_LISTING_RULE_NAME]: BlockListingMarkdownNode,
152
155
  [CONTENTS_LINK_RULE_NAME]: ContentsLinkMarkdownNode,
153
156
  [CONTENTS_ITEM_RULE_NAME]: ContentsItemMarkdownNode,
@@ -44,10 +44,11 @@ export default class FootnotesListReplacement extends Replacement {
44
44
  }
45
45
  });
46
46
 
47
- const footnotesListMarkdownNode = FootnotesListMarkdownNode.fromFootnotesItemReplacementsAndStart(footnotesItemReplacements, start);
47
+ const footnotesItemReplacementsLength = footnotesItemReplacements.length;
48
48
 
49
- if (footnotesListMarkdownNode !== null) {
50
- const node = footnotesListMarkdownNode, ///
49
+ if (footnotesItemReplacementsLength > 0) {
50
+ const footnotesListMarkdownNode = FootnotesListMarkdownNode.fromFootnotesItemReplacementsAndStart(footnotesItemReplacements, start),
51
+ node = footnotesListMarkdownNode, ///
51
52
  tokens = [];
52
53
 
53
54
  footnotesItemReplacements.forEach((footnotesItemReplacement) => {
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ import Replacement from "../replacement";
4
+
5
+ import letters from "../letters";
6
+ import IndexList from "../index/list";
7
+ import IndexListReplacement from "../replacement/indexList";
8
+ import IndexHeadingReplacement from "./indexHeading";
9
+
10
+ import { replaceNodes, replaceTokens } from "../utilities/replacement";
11
+
12
+ export default class IndexReplacement extends Replacement {
13
+ constructor(node, tokens, nodes) {
14
+ super(node, tokens);
15
+
16
+ this.nodes = nodes;
17
+ }
18
+
19
+ getNodes() {
20
+ return this.nodes;
21
+ }
22
+
23
+ replace(replacedNode, parentNode, context) {
24
+ let tokens;
25
+
26
+ tokens = this.getTokens();
27
+
28
+ const replacementNodes = this.nodes, ///
29
+ replacementTokens = tokens; ///
30
+
31
+ ({ tokens } = context);
32
+
33
+ replaceNodes(replacementNodes, replacedNode, parentNode);
34
+
35
+ replaceTokens(replacementTokens, replacedNode, tokens);
36
+ }
37
+
38
+ replaceIndexDirectiveSubdivisionReplacement(indexDirectiveSubDivisionReplacement, divisionMarkdownNode, context) {
39
+ const subDivisionMarkdownNode = indexDirectiveSubDivisionReplacement.getSubDivisionMarkdownNode(),
40
+ replacedNode = subDivisionMarkdownNode, ///
41
+ parentNode = divisionMarkdownNode; ///
42
+
43
+ this.replace(replacedNode, parentNode, context)
44
+ }
45
+
46
+ static fromDivisionMarkdownNodesAndDivisionMarkdownNode(divisionMarkdownNodes, divisionMarkdownNode, context) {
47
+ let indexReplacement = null;
48
+
49
+ const indexList = IndexList.fromDivisionMarkdownNodes(divisionMarkdownNodes, context),
50
+ indexReplacements = [];
51
+
52
+ letters.forEach((letter) => {
53
+ const indexListReplacement = IndexListReplacement.fromIndexListAndLetter(indexList, letter, context);
54
+
55
+ if (indexListReplacement !== null) {
56
+ let indexReplacement;
57
+
58
+ const indexHeadingReplacement = IndexHeadingReplacement.fromLetter(letter, context);
59
+
60
+ indexReplacement = indexHeadingReplacement; ///
61
+
62
+ indexReplacements.push(indexReplacement);
63
+
64
+ indexReplacement = indexListReplacement; ///
65
+
66
+ indexReplacements.push(indexReplacement);
67
+ }
68
+ });
69
+
70
+ const indexListReplacementsLength = indexReplacements.length;
71
+
72
+ if (indexListReplacementsLength > 0) {
73
+ const node = null,
74
+ nodes = [],
75
+ tokens = [];
76
+
77
+ indexReplacements.forEach((indexReplacement) => {
78
+ const node = indexReplacement.getNode();
79
+
80
+ indexReplacement.getTokens(tokens);
81
+
82
+ nodes.push(node);
83
+ });
84
+
85
+ indexReplacement = Replacement.fromNodeAndTokens(IndexReplacement, node, tokens, nodes);
86
+ }
87
+
88
+ return indexReplacement;
89
+ }
90
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ import Replacement from "../replacement";
4
+
5
+ import { INDEX_HEADING_RULE_NAME } from "../ruleNames";
6
+
7
+ export default class IndexHeadingReplacement extends Replacement {
8
+ static fromLetter(letter, context) {
9
+ const { nodeFromTokens, tokensFromContent } = context, ///
10
+ startRuleName = INDEX_HEADING_RULE_NAME,
11
+ content = `${letter}`,
12
+ tokens = tokensFromContent(content),
13
+ node = nodeFromTokens(tokens, startRuleName),
14
+ indexHeadingReplacement = Replacement.fromNodeAndTokens(IndexHeadingReplacement, node, tokens);
15
+
16
+ return indexHeadingReplacement;
17
+ }
18
+ }
@@ -13,11 +13,12 @@ export default class IndexItemReplacement extends Replacement {
13
13
  return indexItemMarkdownNode;
14
14
  }
15
15
 
16
- static fromEntryAndPageNumbers(entry, pageNumbers, context) {
16
+ static fromIndexItem(indexItem, context) {
17
17
  const { nodeFromTokens, tokensFromContent } = context,
18
- entryContent = entry, ///
18
+ wordOrPhrase = indexItem.getWordOrPhrase(),
19
+ pageNumbers = indexItem.getPageNumbers(),
19
20
  pageNumbersContent = pageNumbers.join(COMMA),
20
- content = `${entryContent} ${pageNumbersContent}`,
21
+ content = `${wordOrPhrase},${pageNumbersContent}`,
21
22
  startRuleName = INDEX_ITEM_RULE_NAME,
22
23
  tokens = tokensFromContent(content),
23
24
  node = nodeFromTokens(tokens, startRuleName),
@@ -1,36 +1,23 @@
1
1
  "use strict";
2
2
 
3
3
  import Replacement from "../replacement";
4
-
5
4
  import IndexItemReplacement from "../replacement/indexItem";
6
5
  import IndexListMarkdownNode from "../node/markdown/indexList";
7
6
 
8
- import { indexMapFromDivisionMarkdownNodes } from "../utilities/index";
9
-
10
7
  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) {
8
+ static fromIndexListAndLetter(indexList, letter, context) {
20
9
  let indexListReplacement = null;
21
10
 
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);
11
+ const indexItemReplacements = indexList.reduceIndexItemByLetter(letter, (indexItem) => {
12
+ const indexItemReplacement = IndexItemReplacement.fromIndexItem(indexItem, context);
27
13
 
28
14
  return indexItemReplacement;
29
15
  }),
30
- indexListMarkdownNode = IndexListMarkdownNode.fromIndexItemReplacements(indexItemReplacements);
16
+ indexItemReplacementsLength = indexItemReplacements.length;
31
17
 
32
- if (indexListMarkdownNode !== null) {
33
- const node = indexListMarkdownNode, ///
18
+ if (indexItemReplacementsLength > 0) {
19
+ const indexListMarkdownNode = IndexListMarkdownNode.fromIndexItemReplacements(indexItemReplacements),
20
+ node = indexListMarkdownNode, ///
34
21
  tokens = [];
35
22
 
36
23
  indexItemReplacements.forEach((indexItemReplacement) => {
@@ -6,7 +6,6 @@ import { appendNode,
6
6
  prependNode,
7
7
  removeNode,
8
8
  replaceNode,
9
- replaceNodes,
10
9
  addNodesAfter,
11
10
  appendTokens,
12
11
  prependTokens,
@@ -110,17 +109,6 @@ export default class Replacement {
110
109
  replaceTokens(replacementTokens, replacedNode, tokens);
111
110
  }
112
111
 
113
- replaceEx(replacedNode, parentNode, context) {
114
- const { tokens } = context,
115
- replacementChildNodes = this.getChildNodes(), ///
116
- replacementTokens = this.tokens, ///
117
- replacementNodes = replacementChildNodes; ///
118
-
119
- replaceNodes(replacementNodes, replacedNode, parentNode);
120
-
121
- replaceTokens(replacementTokens, replacedNode, tokens);
122
- }
123
-
124
112
  removeFrom(removedNode, parentNode, context) {
125
113
  const { tokens } = context;
126
114
 
package/src/ruleNames.js CHANGED
@@ -27,6 +27,7 @@ export const INLINE_TEXT_RULE_NAME = "inlineText";
27
27
  export const STRONG_TEXT_RULE_NAME = "strongText";
28
28
  export const SUB_DIVISION_RULE_NAME = "subDivision";
29
29
  export const ORDERED_LIST_RULE_NAME = "orderedList";
30
+ export const INDEX_HEADING_RULE_NAME = "indexHeading";
30
31
  export const BLOCK_LISTING_RULE_NAME = "blockListing";
31
32
  export const CONTENTS_LINK_RULE_NAME = "contentsLink";
32
33
  export const CONTENTS_ITEM_RULE_NAME = "contentsItem";
@@ -88,6 +89,7 @@ const ruleNames = {
88
89
  STRONG_TEXT_RULE_NAME,
89
90
  SUB_DIVISION_RULE_NAME,
90
91
  ORDERED_LIST_RULE_NAME,
92
+ INDEX_HEADING_RULE_NAME,
91
93
  BLOCK_LISTING_RULE_NAME,
92
94
  CONTENTS_LINK_RULE_NAME,
93
95
  CONTENTS_ITEM_RULE_NAME,