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.
- package/example.js +1623 -919
- package/lib/defaultMarkdownStyle.js +2 -2
- package/lib/elementMap.js +4 -1
- package/lib/example/importer.js +2 -2
- package/lib/index/item.js +102 -0
- package/lib/index/list.js +88 -0
- package/lib/index/match.js +76 -0
- package/lib/letters.js +41 -0
- package/lib/markdown/bnf.js +2 -2
- package/lib/node/markdown/division.js +5 -5
- package/lib/node/markdown/footnotesList.js +5 -10
- package/lib/node/markdown/indexHeading.js +120 -0
- package/lib/node/markdown/indexItem.js +42 -2
- package/lib/node/markdown/indexLink.js +2 -3
- package/lib/node/markdown/indexList.js +5 -10
- package/lib/node/markdown/line.js +2 -2
- package/lib/nodeMap.js +3 -2
- package/lib/replacement/footnotesList.js +4 -4
- package/lib/replacement/index.js +176 -0
- package/lib/replacement/indexHeading.js +122 -0
- package/lib/replacement/indexItem.js +4 -4
- package/lib/replacement/indexList.js +9 -41
- package/lib/replacement.js +1 -9
- package/lib/ruleNames.js +6 -1
- package/lib/utilities/index.js +42 -42
- package/lib/utilities/object.js +8 -2
- package/package.json +1 -1
- package/src/defaultMarkdownStyle.js +18 -1
- package/src/elementMap.js +5 -0
- package/src/example/importer.js +7 -2
- package/src/index/item.js +43 -0
- package/src/index/list.js +62 -0
- package/src/index/{phraseMatcher.js → match.js} +6 -6
- package/src/letters.js +32 -0
- package/src/markdown/bnf.js +4 -1
- package/src/node/markdown/division.js +4 -4
- package/src/node/markdown/footnotesList.js +9 -16
- package/src/node/markdown/indexHeading.js +7 -0
- package/src/node/markdown/indexItem.js +20 -0
- package/src/node/markdown/indexLink.js +1 -4
- package/src/node/markdown/indexList.js +9 -16
- package/src/node/markdown/line.js +3 -2
- package/src/nodeMap.js +4 -1
- package/src/replacement/footnotesList.js +4 -3
- package/src/replacement/index.js +90 -0
- package/src/replacement/indexHeading.js +18 -0
- package/src/replacement/indexItem.js +4 -3
- package/src/replacement/indexList.js +7 -20
- package/src/replacement.js +0 -12
- package/src/ruleNames.js +2 -0
- package/src/utilities/index.js +46 -46
- package/src/utilities/object.js +12 -2
- 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
|
|
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(
|
|
26
|
-
|
|
25
|
+
static revert(wordOrPhrase) {
|
|
26
|
+
wordOrPhrase = wordOrPhrase.replace(/_/g, SINGLE_SPACE);
|
|
27
27
|
|
|
28
|
-
return
|
|
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
|
-
|
|
34
|
+
indexMatch = new IndexMatch(regularExpression, replacement);
|
|
35
35
|
|
|
36
|
-
return
|
|
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;
|
package/src/markdown/bnf.js
CHANGED
|
@@ -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
|
-
|
|
142
|
+
indexReplacement = IndexReplacement.fromDivisionMarkdownNodesAndDivisionMarkdownNode(divisionMarkdownNodes, divisionMarkdownNode, context);
|
|
143
143
|
|
|
144
|
-
if (
|
|
145
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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 = `${
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
47
|
+
const footnotesItemReplacementsLength = footnotesItemReplacements.length;
|
|
48
48
|
|
|
49
|
-
if (
|
|
50
|
-
const
|
|
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
|
|
16
|
+
static fromIndexItem(indexItem, context) {
|
|
17
17
|
const { nodeFromTokens, tokensFromContent } = context,
|
|
18
|
-
|
|
18
|
+
wordOrPhrase = indexItem.getWordOrPhrase(),
|
|
19
|
+
pageNumbers = indexItem.getPageNumbers(),
|
|
19
20
|
pageNumbersContent = pageNumbers.join(COMMA),
|
|
20
|
-
content = `${
|
|
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
|
-
|
|
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
|
|
23
|
-
|
|
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
|
-
|
|
16
|
+
indexItemReplacementsLength = indexItemReplacements.length;
|
|
31
17
|
|
|
32
|
-
if (
|
|
33
|
-
const
|
|
18
|
+
if (indexItemReplacementsLength > 0) {
|
|
19
|
+
const indexListMarkdownNode = IndexListMarkdownNode.fromIndexItemReplacements(indexItemReplacements),
|
|
20
|
+
node = indexListMarkdownNode, ///
|
|
34
21
|
tokens = [];
|
|
35
22
|
|
|
36
23
|
indexItemReplacements.forEach((indexItemReplacement) => {
|
package/src/replacement.js
CHANGED
|
@@ -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,
|