@sigil-sifter/magic 1.0.0

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 (97) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +95 -0
  3. package/package.json +30 -0
  4. package/src/core/MagicCard.js +250 -0
  5. package/src/core/helpers.js +6 -0
  6. package/src/core/index.js +3 -0
  7. package/src/data/abilityWords.js +66 -0
  8. package/src/data/colors.js +15 -0
  9. package/src/data/gameFormats.js +25 -0
  10. package/src/data/games.js +5 -0
  11. package/src/data/guilds.js +33 -0
  12. package/src/data/languages.js +30 -0
  13. package/src/data/rarities.js +25 -0
  14. package/src/expressions/ArrayLengthExpression.js +15 -0
  15. package/src/expressions/ColorExpression.js +40 -0
  16. package/src/expressions/DevotionExpression.js +56 -0
  17. package/src/expressions/EvenOddExpression.js +43 -0
  18. package/src/expressions/ExactStringExpression.js +11 -0
  19. package/src/expressions/FormatExpression.js +19 -0
  20. package/src/expressions/GameExpression.js +19 -0
  21. package/src/expressions/KeywordAbilityExpression.js +33 -0
  22. package/src/expressions/LanguageExpression.js +34 -0
  23. package/src/expressions/ManaExpression.js +36 -0
  24. package/src/expressions/PowTouExpression.js +41 -0
  25. package/src/expressions/ProducesExpression.js +35 -0
  26. package/src/expressions/RarityExpression.js +30 -0
  27. package/src/expressions/has/IndicatorExpression.js +11 -0
  28. package/src/expressions/has/WatermarkExpression.js +11 -0
  29. package/src/expressions/is/BoosterExpression.js +11 -0
  30. package/src/expressions/is/DFCExpression.js +11 -0
  31. package/src/expressions/is/EtchedExpression.js +11 -0
  32. package/src/expressions/is/FlipExpression.js +11 -0
  33. package/src/expressions/is/FoilExpression.js +11 -0
  34. package/src/expressions/is/FrenchVanillaExpression.js +11 -0
  35. package/src/expressions/is/FullArtExpression.js +11 -0
  36. package/src/expressions/is/GlossyExpression.js +11 -0
  37. package/src/expressions/is/HistoricExpression.js +11 -0
  38. package/src/expressions/is/HybridExpression.js +11 -0
  39. package/src/expressions/is/LevelerExpression.js +11 -0
  40. package/src/expressions/is/MDFCExpression.js +11 -0
  41. package/src/expressions/is/MeldExpression.js +11 -0
  42. package/src/expressions/is/ModalExpression.js +11 -0
  43. package/src/expressions/is/NonFoilExpression.js +11 -0
  44. package/src/expressions/is/PartyExpression.js +11 -0
  45. package/src/expressions/is/PermanentExpression.js +11 -0
  46. package/src/expressions/is/PhyrexianExpression.js +11 -0
  47. package/src/expressions/is/PromoExpression.js +11 -0
  48. package/src/expressions/is/ReprintExpression.js +11 -0
  49. package/src/expressions/is/ReservedExpression.js +11 -0
  50. package/src/expressions/is/SpellExpression.js +11 -0
  51. package/src/expressions/is/SplitExpression.js +11 -0
  52. package/src/expressions/is/SpotlightExpression.js +11 -0
  53. package/src/expressions/is/TextlessExpression.js +11 -0
  54. package/src/expressions/is/TransformExpression.js +11 -0
  55. package/src/expressions/is/UniversesBeyondExpression.js +11 -0
  56. package/src/expressions/is/VanillaExpression.js +11 -0
  57. package/src/expressions/is/index.js +59 -0
  58. package/src/extensions/ColorExtension.js +22 -0
  59. package/src/extensions/FormatExtension.js +15 -0
  60. package/src/extensions/GameExtension.js +15 -0
  61. package/src/extensions/KeywordExtension.js +11 -0
  62. package/src/extensions/LanguageExtension.js +15 -0
  63. package/src/extensions/RarityExtension.js +20 -0
  64. package/src/extensions/SetExtension.js +13 -0
  65. package/src/index.js +36 -0
  66. package/src/keywords/AbilityKeyword.js +16 -0
  67. package/src/keywords/ArtistKeyword.js +11 -0
  68. package/src/keywords/BannedKeyword.js +21 -0
  69. package/src/keywords/BorderKeyword.js +21 -0
  70. package/src/keywords/CardTypeKeyword.js +11 -0
  71. package/src/keywords/CollectorNumberKeyword.js +16 -0
  72. package/src/keywords/ColorIdentityKeyword.js +11 -0
  73. package/src/keywords/ColorKeyword.js +17 -0
  74. package/src/keywords/DevotionKeyword.js +21 -0
  75. package/src/keywords/FlavorTextKeyword.js +11 -0
  76. package/src/keywords/FormatKeyword.js +21 -0
  77. package/src/keywords/FrameKeyword.js +22 -0
  78. package/src/keywords/GameKeyword.js +21 -0
  79. package/src/keywords/HasKeyword.js +13 -0
  80. package/src/keywords/IsKeyword.js +17 -0
  81. package/src/keywords/LanguageKeyword.js +16 -0
  82. package/src/keywords/LoyaltyKeyword.js +16 -0
  83. package/src/keywords/ManaCostKeyword.js +20 -0
  84. package/src/keywords/ManaValueKeyword.js +17 -0
  85. package/src/keywords/NameKeyword.js +11 -0
  86. package/src/keywords/NotKeyword.js +21 -0
  87. package/src/keywords/PowerKeyword.js +29 -0
  88. package/src/keywords/ProducesKeyword.js +16 -0
  89. package/src/keywords/RarityKeyword.js +16 -0
  90. package/src/keywords/RestrictedKeyword.js +21 -0
  91. package/src/keywords/RulesTextKeyword.js +11 -0
  92. package/src/keywords/SetKeyword.js +21 -0
  93. package/src/keywords/SetTypeKeyword.js +21 -0
  94. package/src/keywords/StampKeyword.js +21 -0
  95. package/src/keywords/ToughnessKeyword.js +29 -0
  96. package/src/keywords/WatermarkKeyword.js +16 -0
  97. package/src/keywords/index.js +65 -0
@@ -0,0 +1,11 @@
1
+ import { Expression } from 'sigil-sifter/expressions';
2
+
3
+ export default class SplitExpression extends Expression {
4
+ static match(sifter, str) {
5
+ return str.match(/^split/i);
6
+ }
7
+
8
+ includes(card) {
9
+ return card.isSplit;
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ import { Expression } from 'sigil-sifter/expressions';
2
+
3
+ export default class SpotlightExpression extends Expression {
4
+ static match(sifter, str) {
5
+ return str.match(/^spotlight/i);
6
+ }
7
+
8
+ includes(card) {
9
+ return card.isSpotlight;
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ import { Expression } from 'sigil-sifter/expressions';
2
+
3
+ export default class TextlessExpression extends Expression {
4
+ static match(sifter, str) {
5
+ return str.match(/^textless/i);
6
+ }
7
+
8
+ includes(card) {
9
+ return card.isTextless;
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ import { Expression } from 'sigil-sifter/expressions';
2
+
3
+ export default class TransformExpression extends Expression {
4
+ static match(sifter, str) {
5
+ return str.match(/^transform/i);
6
+ }
7
+
8
+ includes(card) {
9
+ return card.isTransform;
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ import { Expression } from 'sigil-sifter/expressions';
2
+
3
+ export default class UniversesBeyondExpression extends Expression {
4
+ static match(sifter, str) {
5
+ return str.match(/^(ub|universesbeyond)/i);
6
+ }
7
+
8
+ includes(card) {
9
+ return card.isUniversesBeyond;
10
+ }
11
+ }
@@ -0,0 +1,11 @@
1
+ import { Expression } from 'sigil-sifter/expressions';
2
+
3
+ export default class VanillaExpression extends Expression {
4
+ static match(sifter, str) {
5
+ return str.match(/^vanilla/i);
6
+ }
7
+
8
+ includes(card) {
9
+ return card.isVanilla;
10
+ }
11
+ }
@@ -0,0 +1,59 @@
1
+ import BoosterExpression from './BoosterExpression.js';
2
+ import DFCExpression from './DFCExpression.js';
3
+ import EtchedExpression from './EtchedExpression.js';
4
+ import FlipExpression from './FlipExpression.js';
5
+ import FoilExpression from './FoilExpression.js';
6
+ import FullArtExpression from './FullArtExpression.js';
7
+ import FrenchVanillaExpression from './FrenchVanillaExpression.js';
8
+ import GlossyExpression from './GlossyExpression.js';
9
+ import HistoricExpression from './HistoricExpression.js';
10
+ import HybridExpression from './HybridExpression.js';
11
+ import LevelerExpression from './LevelerExpression.js';
12
+ import MDFCExpression from './MDFCExpression.js';
13
+ import MeldExpression from './MeldExpression.js';
14
+ import ModalExpression from './ModalExpression.js';
15
+ import NonFoilExpression from './NonFoilExpression.js';
16
+ import PartyExpression from './PartyExpression.js';
17
+ import PermanentExpression from './PermanentExpression.js';
18
+ import PhyrexianExpression from './PhyrexianExpression.js';
19
+ import PromoExpression from './PromoExpression.js';
20
+ import ReprintExpression from './ReprintExpression.js';
21
+ import ReservedExpression from './ReservedExpression.js';
22
+ import SpellExpression from './SpellExpression.js';
23
+ import SplitExpression from './SplitExpression.js';
24
+ import SpotlightExpression from './SpotlightExpression.js';
25
+ import TextlessExpression from './TextlessExpression.js';
26
+ import TransformExpression from './TransformExpression.js';
27
+ import UniversesBeyondExpression from './UniversesBeyondExpression.js';
28
+ import VanillaExpression from './VanillaExpression.js';
29
+
30
+ export {
31
+ BoosterExpression,
32
+ DFCExpression,
33
+ EtchedExpression,
34
+ FlipExpression,
35
+ FoilExpression,
36
+ FrenchVanillaExpression,
37
+ FullArtExpression,
38
+ GlossyExpression,
39
+ HistoricExpression,
40
+ HybridExpression,
41
+ LevelerExpression,
42
+ MDFCExpression,
43
+ MeldExpression,
44
+ ModalExpression,
45
+ NonFoilExpression,
46
+ PartyExpression,
47
+ PermanentExpression,
48
+ PhyrexianExpression,
49
+ PromoExpression,
50
+ ReprintExpression,
51
+ ReservedExpression,
52
+ SpellExpression,
53
+ SplitExpression,
54
+ SpotlightExpression,
55
+ TextlessExpression,
56
+ TransformExpression,
57
+ UniversesBeyondExpression,
58
+ VanillaExpression,
59
+ }
@@ -0,0 +1,22 @@
1
+ import defaultColors from '../data/colors.js';
2
+ import defaultGuilds from '../data/guilds.js';
3
+
4
+ export default class ColorExtension {
5
+ constructor(data) {
6
+ this.colors = data.colors || defaultColors;
7
+ this.guilds = data.guilds || defaultGuilds;
8
+ }
9
+
10
+ resolveColors(str) {
11
+ const allOptions = this.colors.concat(this.guilds);
12
+ const colorByName = allOptions.find(c => c.expr.test(str));
13
+ return colorByName
14
+ ? colorByName.colorChars
15
+ : [...new Set(str.toUpperCase().split(''))];
16
+ }
17
+
18
+ get colorNamesExpr() {
19
+ const colorNames = this.colors.concat(this.guilds).map(c => c.name);
20
+ return new RegExp(`^(${colorNames.join('|')})`, 'i');
21
+ }
22
+ }
@@ -0,0 +1,15 @@
1
+ import defaultGameFormats from '../data/gameFormats.js';
2
+
3
+ export default class FormatExtension {
4
+ constructor(data) {
5
+ this.gameFormats = data.gameFormats || defaultGameFormats;
6
+ this.gameFormats.forEach(format => {
7
+ if (format.expr) return;
8
+ format.expr = new RegExp(`^${format.name}$`, 'i')
9
+ });
10
+ }
11
+
12
+ resolveFormat(value) {
13
+ return this.gameFormats.find(g => g.expr.test(value));
14
+ }
15
+ }
@@ -0,0 +1,15 @@
1
+ import defaultGames from '../data/games.js';
2
+
3
+ export default class GameExtension {
4
+ constructor(data) {
5
+ this.games = data.games || defaultGames;
6
+ this.games.forEach(g => {
7
+ if (g.expr) return;
8
+ g.expr = new RegExp(`^${g.name}$`, 'i')
9
+ });
10
+ }
11
+
12
+ resolveGame(value) {
13
+ return this.games.find(g => g.expr.test(value));
14
+ }
15
+ }
@@ -0,0 +1,11 @@
1
+ import defaultAbilityWords from '../data/abilityWords.js';
2
+
3
+ export default class KeywordExtension {
4
+ constructor(data) {
5
+ this.abilityWords = data.abilityWords || defaultAbilityWords;
6
+ }
7
+
8
+ isAbilityWord(str) {
9
+ return this.abilityWords.includes(str);
10
+ }
11
+ }
@@ -0,0 +1,15 @@
1
+ import defaultLanguages from '../data/languages.js';
2
+
3
+ export default class LanguageExtension {
4
+ constructor(data) {
5
+ this.languages = data.languages || defaultLanguages;
6
+ }
7
+
8
+ resolveLanguage(str) {
9
+ const lcStr = str.toLowerCase();
10
+ return this.languages.find(lang => {
11
+ return lang.acronyms.includes(lcStr)
12
+ || lang.expr.test(str);
13
+ });
14
+ }
15
+ }
@@ -0,0 +1,20 @@
1
+ import defaultRarities from '../data/rarities.js';
2
+
3
+ export default class RarityExtension {
4
+ constructor(data) {
5
+ this.rarities = data.rarities || defaultRarities;
6
+ this.rarities.forEach(r => {
7
+ if (r.expr) return;
8
+ r.expr = new RegExp(`^(${r.char}|${r.name})$`, 'i')
9
+ });
10
+ }
11
+
12
+ resolveRarity(value) {
13
+ return this.rarities.find(r => r.expr.test(value));
14
+ }
15
+
16
+ get rarityExpr() {
17
+ const namesAndChars = this.rarities.flatMap(r => [r.char, r.name]);
18
+ return new RegExp(`^(${namesAndChars.join('|')})$`, 'i');
19
+ }
20
+ }
@@ -0,0 +1,13 @@
1
+ export default class SetExtension {
2
+ constructor(data) {
3
+ this.sets = data.sets || [];
4
+ this.sets.forEach(set => {
5
+ if (set.expr) return;
6
+ set.expr = new RegExp(`^(${set.name}|${set.code})$`, 'i');
7
+ });
8
+ }
9
+
10
+ resolveSet(str) {
11
+ return this.sets.find(set => set.expr.test(str));
12
+ }
13
+ }
package/src/index.js ADDED
@@ -0,0 +1,36 @@
1
+ import MagicCard from './core/MagicCard.js';
2
+ import ColorExtension from './extensions/ColorExtension.js';
3
+ import FormatExtension from './extensions/FormatExtension.js';
4
+ import GameExtension from './extensions/GameExtension.js';
5
+ import KeywordExtension from './extensions/KeywordExtension.js';
6
+ import LanguageExtension from './extensions/LanguageExtension.js';
7
+ import RarityExtension from './extensions/RarityExtension.js';
8
+ import SetExtension from './extensions/SetExtension.js';
9
+ import * as keywords from './keywords/index.js';
10
+
11
+ export default function register(sifter, Card, data = {}) {
12
+ if (!Card)
13
+ throw new Error('A valid Card class must be provided.');
14
+ if (!(Card.prototype instanceof MagicCard))
15
+ throw new Error('Card class must inherit from MagicCard');
16
+
17
+ sifter.addKeywords(Object.values(keywords));
18
+
19
+ sifter.setBaseStringParser((sifter, operator, expression) => {
20
+ const keyword = new keywords.NameKeyword(sifter);
21
+ keyword.operator = operator;
22
+ keyword.expression = expression;
23
+ keyword.remainingStr = expression.remainingStr;
24
+ return keyword;
25
+ });
26
+
27
+ sifter.setInputAdapter(Card);
28
+
29
+ sifter.extend(ColorExtension, data);
30
+ sifter.extend(FormatExtension, data);
31
+ sifter.extend(GameExtension, data);
32
+ sifter.extend(KeywordExtension, data);
33
+ sifter.extend(LanguageExtension, data);
34
+ sifter.extend(SetExtension, data);
35
+ sifter.extend(RarityExtension, data);
36
+ };
@@ -0,0 +1,16 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import KeywordAbilityExpression from '../expressions/KeywordAbilityExpression.js';
3
+
4
+ export default class AbilityKeyword extends Keyword {
5
+ static get keys() {
6
+ return ['keyword', 'kw'];
7
+ }
8
+
9
+ static get supportedExpressions() {
10
+ return [KeywordAbilityExpression];
11
+ }
12
+
13
+ test(card) {
14
+ return this.operator.testValue(card.keywords, this.expression);
15
+ }
16
+ }
@@ -0,0 +1,11 @@
1
+ import { StringKeyword } from 'sigil-sifter/keywords';
2
+
3
+ export default class ArtistKeyword extends StringKeyword {
4
+ static get keys() {
5
+ return ['artist', 'a'];
6
+ }
7
+
8
+ test(card) {
9
+ return card.artists.some(a => super.test(a));
10
+ }
11
+ }
@@ -0,0 +1,21 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import FormatExpression from '../expressions/FormatExpression.js';
3
+ import { EqualsOperator, IncludesOperator } from 'sigil-sifter/operators';
4
+
5
+ export default class BannedKeyword extends Keyword {
6
+ static get keys() {
7
+ return ['banned'];
8
+ }
9
+
10
+ static get supportedOperators() {
11
+ return [IncludesOperator, EqualsOperator];
12
+ }
13
+
14
+ static get supportedExpressions() {
15
+ return [FormatExpression];
16
+ }
17
+
18
+ test(card) {
19
+ return card.banned.some(formatName => super.test(formatName));
20
+ }
21
+ }
@@ -0,0 +1,21 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import ExactStringExpression from '../expressions/ExactStringExpression.js';
3
+ import { EqualsOperator, IncludesOperator } from 'sigil-sifter/operators';
4
+
5
+ export default class BorderKeyword extends Keyword {
6
+ static get keys() {
7
+ return ['border'];
8
+ }
9
+
10
+ static get supportedOperators() {
11
+ return [IncludesOperator, EqualsOperator];
12
+ }
13
+
14
+ static get supportedExpressions() {
15
+ return [ExactStringExpression];
16
+ }
17
+
18
+ test(card) {
19
+ return super.test(card.border);
20
+ }
21
+ }
@@ -0,0 +1,11 @@
1
+ import { StringKeyword } from 'sigil-sifter/keywords';
2
+
3
+ export default class CardTypeKeyword extends StringKeyword {
4
+ static get keys() {
5
+ return ['type', 't'];
6
+ }
7
+
8
+ test(card) {
9
+ return card.typeLines.some(t => super.test(t));
10
+ }
11
+ }
@@ -0,0 +1,16 @@
1
+ import { NumericExpression } from 'sigil-sifter/expressions';
2
+ import { Keyword } from 'sigil-sifter/keywords';
3
+
4
+ export default class CollectorNumberKeyword extends Keyword {
5
+ static get keys() {
6
+ return ['number', 'cn'];
7
+ }
8
+
9
+ static get supportedExpressions() {
10
+ return [NumericExpression];
11
+ }
12
+
13
+ test(card) {
14
+ return super.test(card.collectorNumber);
15
+ }
16
+ }
@@ -0,0 +1,11 @@
1
+ import ColorKeyword from './ColorKeyword.js';
2
+
3
+ export default class ColorIdentityKeyword extends ColorKeyword {
4
+ static get keys() {
5
+ return ['identity', 'id'];
6
+ }
7
+
8
+ test(card) {
9
+ return this.operator.testValue(card.colorIdentity, this.expression);
10
+ }
11
+ }
@@ -0,0 +1,17 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import ColorExpression from '../expressions/ColorExpression.js';
3
+ import ArrayLengthExpression from '../expressions/ArrayLengthExpression.js';
4
+
5
+ export default class ColorKeyword extends Keyword {
6
+ static get keys() {
7
+ return ['colors', 'color', 'c'];
8
+ }
9
+
10
+ static get supportedExpressions() {
11
+ return [ColorExpression, ArrayLengthExpression];
12
+ }
13
+
14
+ test(card) {
15
+ return this.operator.testValue(card.colors, this.expression);
16
+ }
17
+ }
@@ -0,0 +1,21 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import { ManaCost } from 'mana-scribe';
3
+ import DevotionExpression from '../expressions/DevotionExpression.js';
4
+
5
+ export default class DevotionKeyword extends Keyword {
6
+ static get keys() {
7
+ return ['devotion'];
8
+ }
9
+
10
+ static get supportedExpressions() {
11
+ return [DevotionExpression];
12
+ }
13
+
14
+ test(card) {
15
+ if (!card.isPermanent) return false;
16
+ const manaCosts = card.cache('manaCosts', () => {
17
+ return card.manaCosts.map(costStr => ManaCost.parse(costStr));
18
+ });
19
+ return manaCosts.some(manaCost => super.test(manaCost));
20
+ }
21
+ }
@@ -0,0 +1,11 @@
1
+ import { StringKeyword } from 'sigil-sifter/keywords';
2
+
3
+ export default class FlavorTextKeyword extends StringKeyword {
4
+ static get keys() {
5
+ return ['flavor', 'ft'];
6
+ }
7
+
8
+ test(card) {
9
+ return card.flavorTexts.some(flavorText => super.test(flavorText));
10
+ }
11
+ }
@@ -0,0 +1,21 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import FormatExpression from '../expressions/FormatExpression.js';
3
+ import { EqualsOperator, IncludesOperator } from 'sigil-sifter/operators';
4
+
5
+ export default class FormatKeyword extends Keyword {
6
+ static get keys() {
7
+ return ['format', 'f'];
8
+ }
9
+
10
+ static get supportedOperators() {
11
+ return [IncludesOperator, EqualsOperator];
12
+ }
13
+
14
+ static get supportedExpressions() {
15
+ return [FormatExpression];
16
+ }
17
+
18
+ test(card) {
19
+ return card.formats.some(formatName => super.test(formatName));
20
+ }
21
+ }
@@ -0,0 +1,22 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import ExactStringExpression from '../expressions/ExactStringExpression.js';
3
+ import { EqualsOperator, IncludesOperator } from 'sigil-sifter/operators';
4
+
5
+ export default class FrameKeyword extends Keyword {
6
+ static get keys() {
7
+ return ['frame'];
8
+ }
9
+
10
+ static get supportedOperators() {
11
+ return [IncludesOperator, EqualsOperator];
12
+ }
13
+
14
+ static get supportedExpressions() {
15
+ return [ExactStringExpression];
16
+ }
17
+
18
+ test(card) {
19
+ return super.test(card.frame)
20
+ || card.frameEffects.some(fe => super.test(fe));
21
+ }
22
+ }
@@ -0,0 +1,21 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import GameExpression from '../expressions/GameExpression.js';
3
+ import { EqualsOperator, IncludesOperator } from 'sigil-sifter/operators';
4
+
5
+ export default class GameKeyword extends Keyword {
6
+ static get keys() {
7
+ return ['game'];
8
+ }
9
+
10
+ static get supportedOperators() {
11
+ return [IncludesOperator, EqualsOperator];
12
+ }
13
+
14
+ static get supportedExpressions() {
15
+ return [GameExpression];
16
+ }
17
+
18
+ test(card) {
19
+ return super.test(card.games);
20
+ }
21
+ }
@@ -0,0 +1,13 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import IndicatorExpression from '../expressions/has/IndicatorExpression.js';
3
+ import WatermarkExpression from '../expressions/has/WatermarkExpression.js';
4
+
5
+ export default class HasKeyword extends Keyword {
6
+ static get keys() {
7
+ return ['has'];
8
+ }
9
+
10
+ static get supportedExpressions() {
11
+ return [IndicatorExpression, WatermarkExpression];
12
+ }
13
+ }
@@ -0,0 +1,17 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import { IncludesOperator } from 'sigil-sifter/operators';
3
+ import * as booleanExpressions from '../expressions/is/index.js';
4
+
5
+ export default class IsKeyword extends Keyword {
6
+ static get keys() {
7
+ return ['is'];
8
+ }
9
+
10
+ static get supportedOperators() {
11
+ return [IncludesOperator];
12
+ }
13
+
14
+ static get supportedExpressions() {
15
+ return Object.values(booleanExpressions);
16
+ }
17
+ }
@@ -0,0 +1,16 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import LanguageExpression from '../expressions/LanguageExpression.js';
3
+
4
+ export default class LanguageKeyword extends Keyword {
5
+ static get keys() {
6
+ return ['language', 'lang'];
7
+ }
8
+
9
+ static get supportedExpressions() {
10
+ return [LanguageExpression];
11
+ }
12
+
13
+ test(card) {
14
+ return super.test(card.language);
15
+ }
16
+ }
@@ -0,0 +1,16 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import { NumericExpression } from 'sigil-sifter/expressions';
3
+
4
+ export default class LoyaltyKeyword extends Keyword {
5
+ static get keys() {
6
+ return ['loyalty', 'loy'];
7
+ }
8
+
9
+ static get supportedExpressions() {
10
+ return [NumericExpression];
11
+ }
12
+
13
+ test(card) {
14
+ return super.test(card.loyalty);
15
+ }
16
+ }
@@ -0,0 +1,20 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import { ManaCost } from 'mana-scribe';
3
+ import ManaExpression from '../expressions/ManaExpression.js';
4
+
5
+ export default class ManaCostKeyword extends Keyword {
6
+ static get keys() {
7
+ return ['mana', 'm'];
8
+ }
9
+
10
+ static get supportedExpressions() {
11
+ return [ManaExpression];
12
+ }
13
+
14
+ test(card) {
15
+ const manaCosts = card.cache('manaCosts', () => {
16
+ return card.manaCosts.map(costStr => ManaCost.parse(costStr));
17
+ });
18
+ return manaCosts.some(manaCost => super.test(manaCost));
19
+ }
20
+ }
@@ -0,0 +1,17 @@
1
+ import { Keyword } from 'sigil-sifter/keywords';
2
+ import { NumericExpression } from 'sigil-sifter/expressions';
3
+ import EvenOddExpression from '../expressions/EvenOddExpression.js';
4
+
5
+ export default class ManaValueKeyword extends Keyword {
6
+ static get keys() {
7
+ return ['manavalue', 'mv', 'cmc'];
8
+ }
9
+
10
+ static get supportedExpressions() {
11
+ return [NumericExpression, EvenOddExpression];
12
+ }
13
+
14
+ test(card) {
15
+ return card.manaValues.some(mv => super.test(mv));
16
+ }
17
+ }
@@ -0,0 +1,11 @@
1
+ import { StringKeyword } from 'sigil-sifter/keywords';
2
+
3
+ export default class NameKeyword extends StringKeyword {
4
+ static get keys() {
5
+ return ['name'];
6
+ }
7
+
8
+ test(card) {
9
+ return card.names.some(name => super.test(name));
10
+ }
11
+ }