highmark-markdown 0.0.206 → 0.0.210

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 (80) hide show
  1. package/example.js +9011 -7223
  2. package/lib/constants.js +13 -1
  3. package/lib/defaultMarkdownStyle.js +14 -0
  4. package/lib/elementMap.js +6 -3
  5. package/lib/example/constants.js +5 -1
  6. package/lib/example/view/div/preview.js +5 -3
  7. package/lib/example/view/div/sizeable/left.js +2 -2
  8. package/lib/example/view/textarea/{bnf.js → css.js} +17 -17
  9. package/lib/example/view/textarea/{lexicalEntries.js → markdownStyle.js} +25 -19
  10. package/lib/example/view/xmp.js +2 -2
  11. package/lib/example/view.js +31 -22
  12. package/lib/example.js +9 -2
  13. package/lib/index.js +25 -1
  14. package/lib/markdown/bnf.js +2 -2
  15. package/lib/markdownStyle/bnf.js +14 -0
  16. package/lib/markdownStyle/entries.js +50 -0
  17. package/lib/markdownStyle/lexer.js +162 -0
  18. package/lib/{example/view/div/sizeable/right.js → markdownStyle/parser.js} +46 -34
  19. package/lib/node/markdown/division.js +14 -7
  20. package/lib/node/markdown/footnotes.js +135 -0
  21. package/lib/nodeMap.js +3 -2
  22. package/lib/ruleNames.js +8 -3
  23. package/lib/style/declaration.js +72 -0
  24. package/lib/style/declarations.js +89 -0
  25. package/lib/style/division.js +83 -0
  26. package/lib/style/ruleSet.js +85 -0
  27. package/lib/style/ruleSets.js +89 -0
  28. package/lib/style/selector.js +131 -0
  29. package/lib/style/selectors.js +134 -0
  30. package/lib/style/selectorsList.js +128 -0
  31. package/lib/styleElement/markdown/default.js +163 -0
  32. package/lib/styleElement/markdown.js +195 -0
  33. package/lib/styleElement.js +100 -0
  34. package/lib/utilities/content.js +29 -4
  35. package/lib/utilities/css.js +51 -0
  36. package/lib/utilities/entries.js +24 -0
  37. package/lib/utilities/footnotes.js +3 -3
  38. package/lib/utilities/query.js +39 -4
  39. package/package.json +1 -1
  40. package/src/constants.js +3 -0
  41. package/src/defaultMarkdownStyle.js +143 -0
  42. package/src/elementMap.js +8 -3
  43. package/src/example/constants.js +1 -0
  44. package/src/example/view/div/preview.js +5 -2
  45. package/src/example/view/div/sizeable/left.js +1 -1
  46. package/src/example/view/textarea/{bnf.js → css.js} +10 -10
  47. package/src/example/view/textarea/markdownStyle.js +41 -0
  48. package/src/example/view/xmp.js +0 -3
  49. package/src/example/view.js +55 -50
  50. package/src/example.js +10 -1
  51. package/src/index.js +6 -0
  52. package/src/markdown/bnf.js +5 -0
  53. package/src/markdownStyle/bnf.js +81 -0
  54. package/src/markdownStyle/entries.js +39 -0
  55. package/src/markdownStyle/lexer.js +43 -0
  56. package/src/markdownStyle/parser.js +15 -0
  57. package/src/node/markdown/division.js +25 -9
  58. package/src/node/markdown/footnotes.js +19 -0
  59. package/src/nodeMap.js +5 -2
  60. package/src/ruleNames.js +4 -2
  61. package/src/style/declaration.js +42 -0
  62. package/src/style/declarations.js +64 -0
  63. package/src/style/division.js +46 -0
  64. package/src/style/ruleSet.js +48 -0
  65. package/src/style/ruleSets.js +57 -0
  66. package/src/style/selector.js +126 -0
  67. package/src/style/selectors.js +121 -0
  68. package/src/style/selectorsList.js +95 -0
  69. package/src/styleElement/markdown/default.js +28 -0
  70. package/src/styleElement/markdown.js +48 -0
  71. package/src/styleElement.js +49 -0
  72. package/src/utilities/content.js +27 -0
  73. package/src/utilities/css.js +41 -0
  74. package/src/utilities/entries.js +23 -0
  75. package/src/utilities/footnotes.js +2 -2
  76. package/src/utilities/query.js +40 -3
  77. package/lib/example/view/textarea/parseTree.js +0 -183
  78. package/src/example/view/div/sizeable/right.js +0 -19
  79. package/src/example/view/textarea/lexicalEntries.js +0 -36
  80. package/src/example/view/textarea/parseTree.js +0 -50
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ const bnf = `
4
+
5
+ style ::= ( ruleSet | declaration | nonsense | error )+ ;
6
+
7
+
8
+ ruleSet.. ::= selectorsList "{" ( ruleSet | declaration | nonsense )* "}" ;
9
+
10
+
11
+ declaration ::= name ":" values ";" ;
12
+
13
+
14
+ nonsense. ::= [string-literal] | [escaped] | [rule-name] | [number] | [colour] | [unit] | [name] | [special] | [unassigned] ;
15
+
16
+
17
+ error. ::= . ;
18
+
19
+
20
+ selectorsList ::= selectors ( "," selectors )* ;
21
+
22
+
23
+ selectors ::= selector+ ;
24
+
25
+
26
+ selector ::= [rule-name] class* pseudoClass*
27
+
28
+ | class+ pseudoClass*
29
+
30
+ | pseudoClass+
31
+
32
+ ;
33
+
34
+
35
+ values ::= value+ ;
36
+
37
+
38
+ class ::= <NO_WHITESPACE>"."<NO_WHITESPACE>identifier ;
39
+
40
+
41
+ pseudoClass ::= <NO_WHITESPACE>":"<NO_WHITESPACE>identifier ;
42
+
43
+
44
+ name. ::= identifier ;
45
+
46
+
47
+ value. ::= identifier ( <NO_WHITESPACE>"(" arguments ")" )?
48
+
49
+ | [number]<NO_WHITESPACE>[unit]
50
+
51
+ | [string-literal]
52
+
53
+ | [number]
54
+
55
+ | [colour]
56
+
57
+ ;
58
+
59
+
60
+ arguments ::= argument ( "," argument )* ;
61
+
62
+
63
+ argument ::= identifier
64
+
65
+ | [number]<NO_WHITESPACE>[unit]
66
+
67
+ | [string-literal]
68
+
69
+ | [number]
70
+
71
+ | [colour]
72
+
73
+ ;
74
+
75
+
76
+ identifier ::= ( [rule-name] | [name] ) ( <NO_WHITESPACE>"-"<NO_WHITESPACE>( [rule-name] | [name] ) )* ;
77
+
78
+
79
+ `;
80
+
81
+ export default bnf;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ import elementMap from "../elementMap";
4
+
5
+ import { ruleNamesExpressionFromElementMap } from "../utilities/entries";
6
+
7
+ const ruleNamesExpression = ruleNamesExpressionFromElementMap(elementMap);
8
+
9
+ const entries = [
10
+ {
11
+ "escaped": "^\\\\[^\\s]"
12
+ },
13
+ {
14
+ "rule-name": `^(?:${ruleNamesExpression})`
15
+ },
16
+ {
17
+ "number": "^(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?"
18
+ },
19
+ {
20
+ "colour": "^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{3})"
21
+ },
22
+ {
23
+ "unit": "^(?:deg|%)"
24
+ },
25
+ {
26
+ "name": "^[_a-zA-Z0-9]+"
27
+ },
28
+ {
29
+ "bracket": "^(?:\\{|\\})"
30
+ },
31
+ {
32
+ "special": "^(?:,|:|;|-|\\.|\\(|\\)|\\[|\\])"
33
+ },
34
+ {
35
+ "unassigned": "^[^\\s]+"
36
+ }
37
+ ];
38
+
39
+ export default entries;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ import { CommonLexer } from "occam-lexers";
4
+ import { WhitespaceToken,
5
+ EndOfLineNonSignificantToken,
6
+ CStyleSingleLineCommentToken,
7
+ DoublyQuotedStringLiteralToken,
8
+ EndOfLineCommentSignificantToken,
9
+ CStyleEndOfMultiLineCommentToken,
10
+ CStyleStartOfMultiLineCommentToken,
11
+ CStyleMiddleOfMultiLineCommentToken } from "occam-lexers";
12
+
13
+ import entries from "./entries";
14
+
15
+ export default class MarkdownStyleLexer extends CommonLexer {
16
+ static entries = entries;
17
+
18
+ static EndOfLineToken = EndOfLineNonSignificantToken;
19
+
20
+ static WhitespaceToken = WhitespaceToken;
21
+
22
+ static EndOfLineCommentToken = EndOfLineCommentSignificantToken; ///
23
+
24
+ static SingleLineCommentToken = CStyleSingleLineCommentToken; ///
25
+
26
+ static RegularExpressionToken = null;
27
+
28
+ static EndOfMultiLineCommentToken = CStyleEndOfMultiLineCommentToken; ///
29
+
30
+ static StartOfMultiLineCommentToken = CStyleStartOfMultiLineCommentToken; ///
31
+
32
+ static MiddleOfMultiLineCommentToken = CStyleMiddleOfMultiLineCommentToken; ///
33
+
34
+ static SinglyQuotedStringLiteralToken = null;
35
+
36
+ static DoublyQuotedStringLiteralToken = DoublyQuotedStringLiteralToken;
37
+
38
+ static fromNothing() { return CommonLexer.fromNothing(MarkdownStyleLexer); }
39
+
40
+ static fromRules(rules) { return CommonLexer.fromRules(MarkdownStyleLexer, rules); }
41
+
42
+ static fromEntries(entries) { return CommonLexer.fromEntries(MarkdownStyleLexer, entries); }
43
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ import { CommonParser } from "occam-parsers";
4
+
5
+ import bnf from "./bnf";
6
+
7
+ export default class MarkdownStyleParser extends CommonParser {
8
+ static bnf = bnf;
9
+
10
+ static fromNothing() { return CommonParser.fromNothing(MarkdownStyleParser); }
11
+
12
+ static fromBNF(bnf) { return CommonParser.fromBNF(MarkdownStyleParser, bnf); }
13
+
14
+ static fromRules(rules) { return CommonParser.fromRules(MarkdownStyleParser, rules); }
15
+ }
@@ -9,7 +9,7 @@ import FootnotesListMarkdownNode from "../../node/markdown/footnotesList";
9
9
  import { nestNodes } from "../../utilities/contents";
10
10
  import { replaceTokens } from "../../utilities/tokens";
11
11
  import { renumberLinkMarkdownNodes } from "../../utilities/footnotes";
12
- import { contentsMarkdownNodeFromNode, headingMarkdownNodesFromNode } from "../../utilities/query";
12
+ import { headingMarkdownNodesFromNode, contentsMarkdownNodeFromNode, footnotesMarkdownNodesFromNode } from "../../utilities/query";
13
13
 
14
14
  const { filter } = arrayUtilities;
15
15
 
@@ -113,18 +113,34 @@ export default class DivisionMarkdownNode extends MarkdownNode {
113
113
  }
114
114
 
115
115
  createFootnotes(context) {
116
- const footnotesListMarkdownNode = this.createFootnotesListMarkdownNode(context);
116
+ const node = this, ///
117
+ footnotesMarkdownNodes = footnotesMarkdownNodesFromNode(node);
117
118
 
118
- if (footnotesListMarkdownNode !== null) {
119
- const childNode = footnotesListMarkdownNode, ///
120
- divisionMarkdownNode = this; ///
119
+ footnotesMarkdownNodes.forEach((footnotesMarkdownNode) => {
120
+ let childNode,
121
+ parentNode;
121
122
 
122
- this.addChildNode(childNode);
123
+ childNode = footnotesMarkdownNode; ///
123
124
 
124
- renumberLinkMarkdownNodes(divisionMarkdownNode, footnotesListMarkdownNode, context)
125
- }
125
+ parentNode = this.findParentNode(childNode);
126
126
 
127
- return footnotesListMarkdownNode;
127
+ const subDivisionMarkdownNode = parentNode; ///
128
+
129
+ childNode = subDivisionMarkdownNode; ///
130
+
131
+ parentNode = this.findParentNode(childNode);
132
+
133
+ const divisionMarkdownNode = parentNode, ///
134
+ footnotesListMarkdownNode = FootnotesListMarkdownNode.fromDivisionMarkdownNode(divisionMarkdownNode, context),
135
+ replacedChildNode = footnotesMarkdownNode, ///
136
+ replacementChildNode = footnotesListMarkdownNode; ///
137
+
138
+ parentNode = subDivisionMarkdownNode; ///
139
+
140
+ parentNode.replaceChildNode(replacedChildNode, replacementChildNode);
141
+
142
+ renumberLinkMarkdownNodes(divisionMarkdownNode, footnotesListMarkdownNode, context)
143
+ });
128
144
  }
129
145
 
130
146
  createFootnotesListMarkdownNode(context) {
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ import MarkdownNode from "../../node/markdown";
4
+
5
+ export default class FootnotesMarkdownNode extends MarkdownNode {
6
+ asHTML(indent, context) {
7
+ const html = null;
8
+
9
+ return html;
10
+ }
11
+
12
+ createDOMElement(context) {
13
+ const domElement = null;
14
+
15
+ return domElement;
16
+ }
17
+
18
+ static fromRuleNameChildNodesAndOpacity(ruleName, childNodes, opacity) { return MarkdownNode.fromRuleNameChildNodesAndOpacity(FootnotesMarkdownNode, ruleName, childNodes, opacity); }
19
+ }
package/src/nodeMap.js CHANGED
@@ -13,6 +13,7 @@ import ImportsMarkdownNode from "./node/markdown/imports";
13
13
  import ContentsMarkdownNode from "./node/markdown/contents";
14
14
  import DivisionMarkdownNode from "./node/markdown/division";
15
15
  import FootnoteMarkdownNode from "./node/markdown/footnote";
16
+ import FootnotesMarkdownNode from "./node/markdown/footnotes";
16
17
  import ReferenceMarkdownNode from "./node/markdown/reference";
17
18
  import ParagraphMarkdownNode from "./node/markdown/paragraph";
18
19
  import HyperlinkMarkdownNode from "./node/markdown/hyperlink";
@@ -63,8 +64,9 @@ import { LINK_RULE_NAME,
63
64
  IMPORT_RULE_NAME,
64
65
  IMPORTS_RULE_NAME,
65
66
  CONTENTS_RULE_NAME,
66
- FOOTNOTE_RULE_NAME,
67
67
  DIVISION_RULE_NAME,
68
+ FOOTNOTE_RULE_NAME,
69
+ FOOTNOTES_RULE_NAME,
68
70
  REFERENCE_RULE_NAME,
69
71
  PARAGRAPH_RULE_NAME,
70
72
  HYPERLINK_RULE_NAME,
@@ -116,8 +118,9 @@ const nodeMap = {
116
118
  [IMPORT_RULE_NAME]: ImportMarkdownNode,
117
119
  [IMPORTS_RULE_NAME]: ImportsMarkdownNode,
118
120
  [CONTENTS_RULE_NAME]: ContentsMarkdownNode,
119
- [FOOTNOTE_RULE_NAME]: FootnoteMarkdownNode,
120
121
  [DIVISION_RULE_NAME]: DivisionMarkdownNode,
122
+ [FOOTNOTE_RULE_NAME]: FootnoteMarkdownNode,
123
+ [FOOTNOTES_RULE_NAME]: FootnotesMarkdownNode,
121
124
  [REFERENCE_RULE_NAME]: ReferenceMarkdownNode,
122
125
  [PARAGRAPH_RULE_NAME]: ParagraphMarkdownNode,
123
126
  [HYPERLINK_RULE_NAME]: HyperlinkMarkdownNode,
package/src/ruleNames.js CHANGED
@@ -11,8 +11,9 @@ export const BULLET_RULE_NAME = "bullet";
11
11
  export const IMPORT_RULE_NAME = "import";
12
12
  export const IMPORTS_RULE_NAME = "imports";
13
13
  export const CONTENTS_RULE_NAME = "contents";
14
- export const FOOTNOTE_RULE_NAME = "footnote";
15
14
  export const DIVISION_RULE_NAME = "division";
15
+ export const FOOTNOTE_RULE_NAME = "footnote";
16
+ export const FOOTNOTES_RULE_NAME = "footnotes";
16
17
  export const REFERENCE_RULE_NAME = "reference";
17
18
  export const PARAGRAPH_RULE_NAME = "paragraph";
18
19
  export const HYPERLINK_RULE_NAME = "hyperlink";
@@ -67,8 +68,9 @@ const ruleNames = {
67
68
  IMPORT_RULE_NAME,
68
69
  IMPORTS_RULE_NAME,
69
70
  CONTENTS_RULE_NAME,
70
- FOOTNOTE_RULE_NAME,
71
71
  DIVISION_RULE_NAME,
72
+ FOOTNOTE_RULE_NAME,
73
+ FOOTNOTES_RULE_NAME,
72
74
  REFERENCE_RULE_NAME,
73
75
  PARAGRAPH_RULE_NAME,
74
76
  HYPERLINK_RULE_NAME,
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ import { COLOUR } from "../constants";
4
+ import { nodeQuery } from "../utilities/query";
5
+ import { contentFromNodeAndTokens } from "../utilities/content";
6
+
7
+ const nameNonTerminalNodeQuery = nodeQuery("/*/name"),
8
+ valuesNonTerminalNodeQuery = nodeQuery("/*/values");
9
+
10
+ export default class Declaration {
11
+ constructor(name, values) {
12
+ this.name = name;
13
+ this.values = values;
14
+ }
15
+
16
+ getName() {
17
+ return this.name;
18
+ }
19
+
20
+ getValues() {
21
+ return this.values;
22
+ }
23
+
24
+ asCSS() {
25
+ const name = this.name.replace(/colour/g, COLOUR),
26
+ css = ` ${name}: ${this.values};`;
27
+
28
+ return css;
29
+ }
30
+
31
+ static fromNodeAndTokens(node, tokens) {
32
+ const nameNonTerminalNode = nameNonTerminalNodeQuery(node),
33
+ valuesNonTerminalNode = valuesNonTerminalNodeQuery(node),
34
+ nameNonTerminalNodeContent = contentFromNodeAndTokens(nameNonTerminalNode, tokens),
35
+ valuesNonTerminalNodesContent = contentFromNodeAndTokens(valuesNonTerminalNode, tokens),
36
+ name = nameNonTerminalNodeContent, ///
37
+ values = valuesNonTerminalNodesContent, ///
38
+ declaration = new Declaration(name, values);
39
+
40
+ return declaration;
41
+ }
42
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ import Declaration from "./declaration";
4
+
5
+ import { nodesQuery } from "../utilities/query";
6
+ import { EMPTY_STRING } from "../constants";
7
+
8
+ const declarationNonTerminalNodesQuery = nodesQuery("/*/declaration");
9
+
10
+ export default class Declarations {
11
+ constructor(array) {
12
+ this.array = array;
13
+ }
14
+
15
+ getLength() { return this.array.length; }
16
+
17
+ asCSS(selectorsList) {
18
+ let css = EMPTY_STRING;
19
+
20
+ const length = this.getLength(),
21
+ selectorsListLength = selectorsList.getLength();
22
+
23
+ if ((length > 0) && (selectorsListLength > 0)) {
24
+ const declarationsCSS = this.array.reduce((declarationsCSS, declaration) => {
25
+ const declarationCSS = declaration.asCSS();
26
+
27
+ declarationsCSS = (declarationsCSS === null) ?
28
+ declarationCSS : ///
29
+ `${declarationsCSS}
30
+ ${declarationCSS}`;
31
+
32
+ return declarationsCSS;
33
+ }, null),
34
+ selectorsListCSS = selectorsList.asCSS();
35
+
36
+ css = `${selectorsListCSS} {
37
+ ${declarationsCSS}
38
+ }
39
+ `;
40
+ }
41
+
42
+ return css;
43
+ }
44
+
45
+ static fromNothing() {
46
+ const array = [],
47
+ declarations = new Declarations(array);
48
+
49
+ return declarations;
50
+ }
51
+
52
+ static fromNodeAndTokens(node, tokens) {
53
+ const declarationNonTerminalNodes = declarationNonTerminalNodesQuery(node),
54
+ array = declarationNonTerminalNodes.map((declarationNonTerminalNode) => {
55
+ const node = declarationNonTerminalNode, ///
56
+ declaration = Declaration.fromNodeAndTokens(node, tokens);
57
+
58
+ return declaration;
59
+ }),
60
+ declarations = new Declarations(array);
61
+
62
+ return declarations;
63
+ }
64
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ import RuleSets from "./ruleSets";
4
+ import Declarations from "./declarations";
5
+
6
+ import { EMPTY_STRING } from "../constants";
7
+
8
+ export default class Division {
9
+ constructor(ruleSets, declarations, selectorsList) {
10
+ this.ruleSets = ruleSets;
11
+ this.declarations = declarations;
12
+ this.selectorsList = selectorsList;
13
+ }
14
+
15
+ getRuleSets() {
16
+ return this.ruleSets;
17
+ }
18
+
19
+ getDeclarations() {
20
+ return this.declarations;
21
+ }
22
+
23
+ getSelectorsList() {
24
+ return this.selectorsList;
25
+ }
26
+
27
+ asCSS() {
28
+ const outermost = true,
29
+ ruleSetsCSS = this.ruleSets.asCSS(this.selectorsList, outermost),
30
+ declarationsCSS = this.declarations.asCSS(this.selectorsList, outermost),
31
+ css = (declarationsCSS === EMPTY_STRING) ?
32
+ ruleSetsCSS : ///
33
+ `${declarationsCSS}
34
+ ${ruleSetsCSS}`;
35
+
36
+ return css;
37
+ }
38
+
39
+ static fromNodeTokensAndSelectorsList(node, tokens, selectorsList) {
40
+ const ruleSets = RuleSets.fromNodeAndTokens(node, tokens),
41
+ declarations = Declarations.fromNodeAndTokens(node, tokens),
42
+ division = new Division(ruleSets, declarations, selectorsList);
43
+
44
+ return division;
45
+ }
46
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ import Declarations from "./declarations";
4
+ import SelectorsList from "./selectorsList";
5
+
6
+ import { EMPTY_STRING } from "../constants";
7
+
8
+ export default class RuleSet {
9
+ constructor(ruleSets, declarations, selectorsList) {
10
+ this.ruleSets = ruleSets;
11
+ this.declarations = declarations;
12
+ this.selectorsList = selectorsList;
13
+ }
14
+
15
+ getRuleSets() {
16
+ return this.ruleSets;
17
+ }
18
+
19
+ getDeclarations() {
20
+ return this.declarations;
21
+ }
22
+
23
+ getSelectorsList() {
24
+ return this.selectorsList;
25
+ }
26
+
27
+ asCSS(selectorsList, outermost = false) {
28
+ selectorsList = selectorsList.combine(this.selectorsList, outermost); ///
29
+
30
+ const declarationsCSS = this.declarations.asCSS(selectorsList),
31
+ ruleSetsCSS = this.ruleSets.asCSS(selectorsList),
32
+ css = (declarationsCSS === EMPTY_STRING) ?
33
+ ruleSetsCSS : ///
34
+ `${declarationsCSS}
35
+ ${ruleSetsCSS}`;
36
+
37
+ return css;
38
+ }
39
+
40
+ static fromRuleSetsNodeAndTokens(RuleSets, node, tokens) {
41
+ const ruleSets = RuleSets.fromNodeAndTokens(node, tokens),
42
+ declarations = Declarations.fromNodeAndTokens(node, tokens),
43
+ selectorsList = SelectorsList.fromNodeAndTokens(node, tokens),
44
+ ruleSet = new RuleSet(ruleSets, declarations, selectorsList);
45
+
46
+ return ruleSet;
47
+ }
48
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ import RuleSet from "./ruleSet";
4
+
5
+ import { nodesQuery } from "../utilities/query";
6
+ import { EMPTY_STRING } from "../constants";
7
+
8
+ const ruleSetNonTerminalNodesQuery = nodesQuery("/*/ruleSet");
9
+
10
+ export default class RuleSets {
11
+ constructor(array) {
12
+ this.array = array;
13
+ }
14
+
15
+ getLength() { return this.array.length; }
16
+
17
+ asCSS(selectorsList, outermost = false) {
18
+ let css = EMPTY_STRING;
19
+
20
+ const length = this.getLength(),
21
+ selectorsListLength = selectorsList.getLength();
22
+
23
+ if ((length > 0) && (selectorsListLength > 0)) {
24
+ css = this.array.reduce((css, ruleSet) => {
25
+ const ruleSetCSS = ruleSet.asCSS(selectorsList, outermost);
26
+
27
+ css = (css === null) ?
28
+ ruleSetCSS : ///
29
+ `${css}${ruleSetCSS}`;
30
+
31
+ return css;
32
+ }, null);
33
+ }
34
+
35
+ return css;
36
+ }
37
+
38
+ static fromNothing() {
39
+ const array = [],
40
+ ruleSets = new RuleSets(array);
41
+
42
+ return ruleSets;
43
+ }
44
+
45
+ static fromNodeAndTokens(node, tokens) {
46
+ const ruleSetNonTerminalNodes = ruleSetNonTerminalNodesQuery(node),
47
+ array = ruleSetNonTerminalNodes.map((ruleSetNonTerminalNode) => {
48
+ const node = ruleSetNonTerminalNode, ///
49
+ ruleSet = RuleSet.fromRuleSetsNodeAndTokens(RuleSets, node, tokens);
50
+
51
+ return ruleSet;
52
+ }),
53
+ ruleSets = new RuleSets(array);
54
+
55
+ return ruleSets;
56
+ }
57
+ }
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+
3
+ import ruleNames from "../ruleNames";
4
+ import elementMap from "../elementMap";
5
+
6
+ import { nodeQuery } from "../utilities/query";
7
+ import { EMPTY_STRING } from "../constants";
8
+ import { remainingContentFromNodeTokensAndOffset } from "../utilities/content";
9
+
10
+ const { DIVISION_RULE_NAME,
11
+ STRONG_TEXT_RULE_NAME,
12
+ ORDERED_LIST_RULE_NAME,
13
+ UNORDERED_LIST_RULE_NAME,
14
+ ORDERED_LIST_ITEM_RULE_NAME,
15
+ UNORDERED_LIST_ITEM_RULE_NAME,
16
+ STRONGLY_EMPHASISED_TEXT_RULE_NAME } = ruleNames,
17
+ { tagName: strongTextTagName } = elementMap[STRONG_TEXT_RULE_NAME],
18
+ { tagName: orderedListTagName } = elementMap[ORDERED_LIST_RULE_NAME],
19
+ { tagName: unorderedListTagName } = elementMap[UNORDERED_LIST_RULE_NAME];
20
+
21
+ const ruleNameValues = Object.values(ruleNames),
22
+ ruleNameTerminalNodeQuery = nodeQuery("/selector/@rule-name");
23
+
24
+ export default class Selector {
25
+ constructor(content, whitespace) {
26
+ this.content = content;
27
+ this.whitespace = whitespace;
28
+ }
29
+
30
+ getContent() {
31
+ return this.content;
32
+ }
33
+
34
+ hasWhitespace() {
35
+ return this.whitespace;
36
+ }
37
+
38
+ static fromNodeAndTokens(node, tokens) {
39
+ let selector = null;
40
+
41
+ const content = contentFromNodeAndTokens(node, tokens);
42
+
43
+ if (content !== null) {
44
+ const whitespace = whitespaceFromNode(node);
45
+
46
+ selector = new Selector(content, whitespace);
47
+ }
48
+
49
+ return selector;
50
+ }
51
+ }
52
+
53
+ function whitespaceFromNode(node) {
54
+ const ruleNameTerminalNode = ruleNameTerminalNodeQuery(node),
55
+ whitespace = (ruleNameTerminalNode !== null);
56
+
57
+ return whitespace;
58
+ }
59
+
60
+ function contentFromNodeAndTokens(node, tokens) {
61
+ let content;
62
+
63
+ const ruleNameTerminalNode = ruleNameTerminalNodeQuery(node);
64
+
65
+ if (ruleNameTerminalNode !== null) {
66
+ content = EMPTY_STRING;
67
+
68
+ const ruleNameTerminalNodeContent = ruleNameTerminalNode.getContent(),
69
+ ruleName = ruleNameTerminalNodeContent, ///
70
+ ruleNameValuesIncludesRuleName = ruleNameValues.includes(ruleName);
71
+
72
+ if (ruleNameValuesIncludesRuleName) {
73
+ const { tagName, className } = elementMap[ruleName];
74
+
75
+ if (tagName !== null) {
76
+ content = `${content}${tagName}`;
77
+ }
78
+
79
+ switch (ruleName) {
80
+ case DIVISION_RULE_NAME: {
81
+ content = null;
82
+
83
+ break;
84
+ }
85
+
86
+ case ORDERED_LIST_ITEM_RULE_NAME: {
87
+ content = `${orderedListTagName} > ${content}`;
88
+
89
+ break;
90
+ }
91
+
92
+ case UNORDERED_LIST_ITEM_RULE_NAME: {
93
+ content = `${unorderedListTagName} > ${content}`;
94
+
95
+ break;
96
+ }
97
+
98
+ case STRONGLY_EMPHASISED_TEXT_RULE_NAME: {
99
+ content = `${content} > ${strongTextTagName}`;
100
+
101
+ break;
102
+ }
103
+ }
104
+
105
+ if (className !== null) {
106
+ content = `${content}.${className}`;
107
+ }
108
+
109
+ if (ruleName === DIVISION_RULE_NAME) {
110
+ content = null;
111
+ } else {
112
+ const offset = 1,
113
+ remainingContent = remainingContentFromNodeTokensAndOffset(node, tokens, offset);
114
+
115
+ content = `${content}${remainingContent}`;
116
+ }
117
+ }
118
+ } else {
119
+ const offset = 0,
120
+ remainingContent = remainingContentFromNodeTokensAndOffset(node, tokens, offset);
121
+
122
+ content = remainingContent; ///
123
+ }
124
+
125
+ return content;
126
+ }