@sigil-sifter/magic 1.0.1 → 1.1.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.
- package/LICENSE +7 -7
- package/README.md +95 -95
- package/package.json +1 -1
- package/src/core/MagicCard.js +254 -250
- package/src/core/helpers.js +6 -6
- package/src/core/index.js +3 -3
- package/src/data/abilityWords.js +66 -66
- package/src/data/colors.js +15 -15
- package/src/data/gameFormats.js +25 -25
- package/src/data/games.js +5 -5
- package/src/data/guilds.js +33 -33
- package/src/data/languages.js +30 -30
- package/src/data/rarities.js +25 -25
- package/src/expressions/ArrayLengthExpression.js +15 -15
- package/src/expressions/ColorExpression.js +40 -40
- package/src/expressions/DevotionExpression.js +56 -56
- package/src/expressions/EvenOddExpression.js +43 -43
- package/src/expressions/ExactStringExpression.js +11 -11
- package/src/expressions/FormatExpression.js +19 -19
- package/src/expressions/GameExpression.js +19 -19
- package/src/expressions/KeywordAbilityExpression.js +33 -33
- package/src/expressions/LanguageExpression.js +34 -34
- package/src/expressions/ManaExpression.js +36 -36
- package/src/expressions/PowTouExpression.js +41 -41
- package/src/expressions/ProducesExpression.js +35 -35
- package/src/expressions/RarityExpression.js +30 -30
- package/src/expressions/has/IndicatorExpression.js +11 -11
- package/src/expressions/has/WatermarkExpression.js +11 -11
- package/src/expressions/is/BoosterExpression.js +11 -11
- package/src/expressions/is/DFCExpression.js +11 -11
- package/src/expressions/is/EtchedExpression.js +11 -11
- package/src/expressions/is/FlipExpression.js +11 -11
- package/src/expressions/is/FoilExpression.js +11 -11
- package/src/expressions/is/FrenchVanillaExpression.js +11 -11
- package/src/expressions/is/FullArtExpression.js +11 -11
- package/src/expressions/is/GlossyExpression.js +11 -11
- package/src/expressions/is/HistoricExpression.js +11 -11
- package/src/expressions/is/HybridExpression.js +11 -11
- package/src/expressions/is/LevelerExpression.js +11 -11
- package/src/expressions/is/MDFCExpression.js +11 -11
- package/src/expressions/is/MeldExpression.js +11 -11
- package/src/expressions/is/ModalExpression.js +11 -11
- package/src/expressions/is/NonFoilExpression.js +11 -11
- package/src/expressions/is/PartyExpression.js +11 -11
- package/src/expressions/is/PermanentExpression.js +11 -11
- package/src/expressions/is/PhyrexianExpression.js +11 -11
- package/src/expressions/is/PromoExpression.js +11 -11
- package/src/expressions/is/ReprintExpression.js +11 -11
- package/src/expressions/is/ReservedExpression.js +11 -11
- package/src/expressions/is/SpellExpression.js +11 -11
- package/src/expressions/is/SplitExpression.js +11 -11
- package/src/expressions/is/SpotlightExpression.js +11 -11
- package/src/expressions/is/TextlessExpression.js +11 -11
- package/src/expressions/is/TransformExpression.js +11 -11
- package/src/expressions/is/UniversesBeyondExpression.js +11 -11
- package/src/expressions/is/VanillaExpression.js +11 -11
- package/src/expressions/is/index.js +59 -59
- package/src/extensions/ColorExtension.js +22 -22
- package/src/extensions/FormatExtension.js +15 -15
- package/src/extensions/GameExtension.js +15 -15
- package/src/extensions/KeywordExtension.js +11 -11
- package/src/extensions/LanguageExtension.js +15 -15
- package/src/extensions/RarityExtension.js +20 -20
- package/src/extensions/SetExtension.js +13 -13
- package/src/index.js +30 -30
- package/src/keywords/AbilityKeyword.js +16 -16
- package/src/keywords/ArtistKeyword.js +11 -11
- package/src/keywords/BannedKeyword.js +21 -21
- package/src/keywords/BorderKeyword.js +21 -21
- package/src/keywords/CardTypeKeyword.js +11 -11
- package/src/keywords/CollectorNumberKeyword.js +16 -16
- package/src/keywords/ColorIdentityKeyword.js +11 -11
- package/src/keywords/ColorKeyword.js +17 -17
- package/src/keywords/DevotionKeyword.js +21 -21
- package/src/keywords/FlavorTextKeyword.js +11 -11
- package/src/keywords/FormatKeyword.js +21 -21
- package/src/keywords/FrameKeyword.js +22 -22
- package/src/keywords/GameKeyword.js +21 -21
- package/src/keywords/HasKeyword.js +13 -13
- package/src/keywords/IsKeyword.js +17 -17
- package/src/keywords/LanguageKeyword.js +16 -16
- package/src/keywords/LoyaltyKeyword.js +16 -16
- package/src/keywords/ManaCostKeyword.js +20 -20
- package/src/keywords/ManaValueKeyword.js +17 -17
- package/src/keywords/NameKeyword.js +11 -11
- package/src/keywords/NotKeyword.js +21 -21
- package/src/keywords/PowerKeyword.js +29 -29
- package/src/keywords/ProducesKeyword.js +16 -16
- package/src/keywords/RarityKeyword.js +16 -16
- package/src/keywords/RestrictedKeyword.js +21 -21
- package/src/keywords/RulesTextKeyword.js +11 -11
- package/src/keywords/SetKeyword.js +21 -21
- package/src/keywords/SetTypeKeyword.js +21 -21
- package/src/keywords/StampKeyword.js +21 -21
- package/src/keywords/TagKeyword.js +11 -0
- package/src/keywords/ToughnessKeyword.js +29 -29
- package/src/keywords/WatermarkKeyword.js +16 -16
- package/src/keywords/index.js +67 -65
package/src/data/gameFormats.js
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
const format = (name) => ({ name });
|
|
2
|
-
|
|
3
|
-
export default [
|
|
4
|
-
format('standard'),
|
|
5
|
-
format('future'),
|
|
6
|
-
format('historic'),
|
|
7
|
-
format('timeless'),
|
|
8
|
-
format('gladiator'),
|
|
9
|
-
format('pioneer'),
|
|
10
|
-
format('modern'),
|
|
11
|
-
format('legacy'),
|
|
12
|
-
format('pauper'),
|
|
13
|
-
format('vintage'),
|
|
14
|
-
format('penny'),
|
|
15
|
-
format('commander'),
|
|
16
|
-
format('oathbreaker'),
|
|
17
|
-
format('standardbrawl'),
|
|
18
|
-
format('brawl'),
|
|
19
|
-
format('alchemy'),
|
|
20
|
-
format('paupercommander'),
|
|
21
|
-
format('duel'),
|
|
22
|
-
format('oldschool'),
|
|
23
|
-
format('premodern'),
|
|
24
|
-
format('predh'),
|
|
25
|
-
];
|
|
1
|
+
const format = (name) => ({ name });
|
|
2
|
+
|
|
3
|
+
export default [
|
|
4
|
+
format('standard'),
|
|
5
|
+
format('future'),
|
|
6
|
+
format('historic'),
|
|
7
|
+
format('timeless'),
|
|
8
|
+
format('gladiator'),
|
|
9
|
+
format('pioneer'),
|
|
10
|
+
format('modern'),
|
|
11
|
+
format('legacy'),
|
|
12
|
+
format('pauper'),
|
|
13
|
+
format('vintage'),
|
|
14
|
+
format('penny'),
|
|
15
|
+
format('commander'),
|
|
16
|
+
format('oathbreaker'),
|
|
17
|
+
format('standardbrawl'),
|
|
18
|
+
format('brawl'),
|
|
19
|
+
format('alchemy'),
|
|
20
|
+
format('paupercommander'),
|
|
21
|
+
format('duel'),
|
|
22
|
+
format('oldschool'),
|
|
23
|
+
format('premodern'),
|
|
24
|
+
format('predh'),
|
|
25
|
+
];
|
package/src/data/games.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export default [
|
|
2
|
-
{ name: 'Paper' },
|
|
3
|
-
{ name: 'MTGO' },
|
|
4
|
-
{ name: 'Arena' },
|
|
5
|
-
];
|
|
1
|
+
export default [
|
|
2
|
+
{ name: 'Paper' },
|
|
3
|
+
{ name: 'MTGO' },
|
|
4
|
+
{ name: 'Arena' },
|
|
5
|
+
];
|
package/src/data/guilds.js
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
const colorCombo = (name, colors) => ({
|
|
2
|
-
name,
|
|
3
|
-
expr: new RegExp('^' + name + '$', 'i'),
|
|
4
|
-
colorChars: colors.split('')
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
export default [
|
|
8
|
-
colorCombo('Azorius', 'WU'),
|
|
9
|
-
colorCombo('Dimir', 'UB'),
|
|
10
|
-
colorCombo('Rakdos', 'BR'),
|
|
11
|
-
colorCombo('Gruul', 'RG'),
|
|
12
|
-
colorCombo('Selesnya', 'WG'),
|
|
13
|
-
colorCombo('Orzhov', 'WB'),
|
|
14
|
-
colorCombo('Izzet', 'UR'),
|
|
15
|
-
colorCombo('Golgari', 'BG'),
|
|
16
|
-
colorCombo('Boros', 'WR'),
|
|
17
|
-
colorCombo('Simic', 'UG'),
|
|
18
|
-
colorCombo('Bant', 'WUG'),
|
|
19
|
-
colorCombo('Esper', 'WUB'),
|
|
20
|
-
colorCombo('Grixis', 'UBR'),
|
|
21
|
-
colorCombo('Jund', 'BRG'),
|
|
22
|
-
colorCombo('Naya', 'WRG'),
|
|
23
|
-
colorCombo('Abzan', 'WBG'),
|
|
24
|
-
colorCombo('Jeskai', 'WUR'),
|
|
25
|
-
colorCombo('Sultai', 'UBG'),
|
|
26
|
-
colorCombo('Mardu', 'WBR'),
|
|
27
|
-
colorCombo('Temur', 'URG'),
|
|
28
|
-
colorCombo('Chaos', 'UBRG'),
|
|
29
|
-
colorCombo('Aggression', 'WBRG'),
|
|
30
|
-
colorCombo('Altruism', 'WURG'),
|
|
31
|
-
colorCombo('Growth', 'WUBG'),
|
|
32
|
-
colorCombo('Artifice', 'WUBR'),
|
|
33
|
-
];
|
|
1
|
+
const colorCombo = (name, colors) => ({
|
|
2
|
+
name,
|
|
3
|
+
expr: new RegExp('^' + name + '$', 'i'),
|
|
4
|
+
colorChars: colors.split('')
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
export default [
|
|
8
|
+
colorCombo('Azorius', 'WU'),
|
|
9
|
+
colorCombo('Dimir', 'UB'),
|
|
10
|
+
colorCombo('Rakdos', 'BR'),
|
|
11
|
+
colorCombo('Gruul', 'RG'),
|
|
12
|
+
colorCombo('Selesnya', 'WG'),
|
|
13
|
+
colorCombo('Orzhov', 'WB'),
|
|
14
|
+
colorCombo('Izzet', 'UR'),
|
|
15
|
+
colorCombo('Golgari', 'BG'),
|
|
16
|
+
colorCombo('Boros', 'WR'),
|
|
17
|
+
colorCombo('Simic', 'UG'),
|
|
18
|
+
colorCombo('Bant', 'WUG'),
|
|
19
|
+
colorCombo('Esper', 'WUB'),
|
|
20
|
+
colorCombo('Grixis', 'UBR'),
|
|
21
|
+
colorCombo('Jund', 'BRG'),
|
|
22
|
+
colorCombo('Naya', 'WRG'),
|
|
23
|
+
colorCombo('Abzan', 'WBG'),
|
|
24
|
+
colorCombo('Jeskai', 'WUR'),
|
|
25
|
+
colorCombo('Sultai', 'UBG'),
|
|
26
|
+
colorCombo('Mardu', 'WBR'),
|
|
27
|
+
colorCombo('Temur', 'URG'),
|
|
28
|
+
colorCombo('Chaos', 'UBRG'),
|
|
29
|
+
colorCombo('Aggression', 'WBRG'),
|
|
30
|
+
colorCombo('Altruism', 'WURG'),
|
|
31
|
+
colorCombo('Growth', 'WUBG'),
|
|
32
|
+
colorCombo('Artifice', 'WUBR'),
|
|
33
|
+
];
|
package/src/data/languages.js
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
const language = (acronym, name, expr) => ({
|
|
2
|
-
acronyms: Array.isArray(acronym) ? acronym : [acronym],
|
|
3
|
-
name,
|
|
4
|
-
expr: expr || new RegExp('^' + name + '$', 'i')
|
|
5
|
-
});
|
|
6
|
-
|
|
7
|
-
// https://cran.r-project.org/web/packages/scryr/vignettes/languages.html
|
|
8
|
-
export default [
|
|
9
|
-
language('en', 'English'),
|
|
10
|
-
language('es', 'Spanish'),
|
|
11
|
-
language('fr', 'French'),
|
|
12
|
-
language('de', 'German'),
|
|
13
|
-
language('it', 'Italian'),
|
|
14
|
-
language('pt', 'Portuguese'),
|
|
15
|
-
language(['ja', 'jp'], 'Japanese'),
|
|
16
|
-
language(['ko', 'kr'], 'Korean'),
|
|
17
|
-
language('ru', 'Russian'),
|
|
18
|
-
language(['zhs', 'cs'], 'Chinese (Simplified)',
|
|
19
|
-
/^(Chinese \(Simplified\)|Simplified Chinese)$/i
|
|
20
|
-
),
|
|
21
|
-
language(['zht', 'ct'], 'Chinese (Traditional)',
|
|
22
|
-
/^(Chinese \(Traditional\)|Traditional Chinese)$/i
|
|
23
|
-
),
|
|
24
|
-
language('he', 'Hebrew'),
|
|
25
|
-
language('la', 'Latin'),
|
|
26
|
-
language('grc', 'Ancient Greek'),
|
|
27
|
-
language('ar', 'Arabic'),
|
|
28
|
-
language('sa', 'Sanskrit'),
|
|
29
|
-
language('ph', 'Phyrexian')
|
|
30
|
-
];
|
|
1
|
+
const language = (acronym, name, expr) => ({
|
|
2
|
+
acronyms: Array.isArray(acronym) ? acronym : [acronym],
|
|
3
|
+
name,
|
|
4
|
+
expr: expr || new RegExp('^' + name + '$', 'i')
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
// https://cran.r-project.org/web/packages/scryr/vignettes/languages.html
|
|
8
|
+
export default [
|
|
9
|
+
language('en', 'English'),
|
|
10
|
+
language('es', 'Spanish'),
|
|
11
|
+
language('fr', 'French'),
|
|
12
|
+
language('de', 'German'),
|
|
13
|
+
language('it', 'Italian'),
|
|
14
|
+
language('pt', 'Portuguese'),
|
|
15
|
+
language(['ja', 'jp'], 'Japanese'),
|
|
16
|
+
language(['ko', 'kr'], 'Korean'),
|
|
17
|
+
language('ru', 'Russian'),
|
|
18
|
+
language(['zhs', 'cs'], 'Chinese (Simplified)',
|
|
19
|
+
/^(Chinese \(Simplified\)|Simplified Chinese)$/i
|
|
20
|
+
),
|
|
21
|
+
language(['zht', 'ct'], 'Chinese (Traditional)',
|
|
22
|
+
/^(Chinese \(Traditional\)|Traditional Chinese)$/i
|
|
23
|
+
),
|
|
24
|
+
language('he', 'Hebrew'),
|
|
25
|
+
language('la', 'Latin'),
|
|
26
|
+
language('grc', 'Ancient Greek'),
|
|
27
|
+
language('ar', 'Arabic'),
|
|
28
|
+
language('sa', 'Sanskrit'),
|
|
29
|
+
language('ph', 'Phyrexian')
|
|
30
|
+
];
|
package/src/data/rarities.js
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
export default [{
|
|
2
|
-
index: 0,
|
|
3
|
-
char: 'C',
|
|
4
|
-
name: 'Common',
|
|
5
|
-
}, {
|
|
6
|
-
index: 1,
|
|
7
|
-
char: 'U',
|
|
8
|
-
name: 'Uncommon',
|
|
9
|
-
}, {
|
|
10
|
-
index: 2,
|
|
11
|
-
char: 'R',
|
|
12
|
-
name: 'Rare'
|
|
13
|
-
}, {
|
|
14
|
-
index: 3,
|
|
15
|
-
char: 'M',
|
|
16
|
-
name: 'Mythic'
|
|
17
|
-
}, {
|
|
18
|
-
index: 3,
|
|
19
|
-
char: 'S',
|
|
20
|
-
name: 'Special'
|
|
21
|
-
}, {
|
|
22
|
-
index: 4,
|
|
23
|
-
char: 'B',
|
|
24
|
-
name: 'Bonus'
|
|
25
|
-
}];
|
|
1
|
+
export default [{
|
|
2
|
+
index: 0,
|
|
3
|
+
char: 'C',
|
|
4
|
+
name: 'Common',
|
|
5
|
+
}, {
|
|
6
|
+
index: 1,
|
|
7
|
+
char: 'U',
|
|
8
|
+
name: 'Uncommon',
|
|
9
|
+
}, {
|
|
10
|
+
index: 2,
|
|
11
|
+
char: 'R',
|
|
12
|
+
name: 'Rare'
|
|
13
|
+
}, {
|
|
14
|
+
index: 3,
|
|
15
|
+
char: 'M',
|
|
16
|
+
name: 'Mythic'
|
|
17
|
+
}, {
|
|
18
|
+
index: 3,
|
|
19
|
+
char: 'S',
|
|
20
|
+
name: 'Special'
|
|
21
|
+
}, {
|
|
22
|
+
index: 4,
|
|
23
|
+
char: 'B',
|
|
24
|
+
name: 'Bonus'
|
|
25
|
+
}];
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { NumericExpression } from 'sigil-sifter/expressions';
|
|
2
|
-
|
|
3
|
-
export default class ArrayLengthExpression extends NumericExpression {
|
|
4
|
-
equals(val) {
|
|
5
|
-
return val.length === this.value;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
greaterThan(val) {
|
|
9
|
-
return val.length > this.value;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
lessThan(val) {
|
|
13
|
-
return val.length < this.value;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
1
|
+
import { NumericExpression } from 'sigil-sifter/expressions';
|
|
2
|
+
|
|
3
|
+
export default class ArrayLengthExpression extends NumericExpression {
|
|
4
|
+
equals(val) {
|
|
5
|
+
return val.length === this.value;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
greaterThan(val) {
|
|
9
|
+
return val.length > this.value;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
lessThan(val) {
|
|
13
|
+
return val.length < this.value;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import { Expression } from 'sigil-sifter/expressions';
|
|
2
|
-
|
|
3
|
-
export default class ColorExpression extends Expression {
|
|
4
|
-
static match(sifter, str) {
|
|
5
|
-
return str.match(sifter.ColorExtension.colorNamesExpr)
|
|
6
|
-
|| str.match(/^([wubrgc]+)/i);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
constructor(sifter, match, str) {
|
|
10
|
-
super(sifter, match, str);
|
|
11
|
-
this.value = match[0];
|
|
12
|
-
this.colors = sifter.ColorExtension.resolveColors(this.value);
|
|
13
|
-
this.colorless = this.colors.includes('C');
|
|
14
|
-
if (this.colorless && this.colors.length > 1)
|
|
15
|
-
throw new Error('A card cannot be both colorless and colored.');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
includes(val) {
|
|
19
|
-
if (this.colorless) return val.length === 0;
|
|
20
|
-
return this.colors.every(c => val.includes(c));
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
equals(val) {
|
|
24
|
-
if (this.colorless) return val.length === 0;
|
|
25
|
-
return val.length === this.colors.length
|
|
26
|
-
&& val.every(c => this.colors.includes(c));
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
greaterThan(val) {
|
|
30
|
-
if (this.colorless) return val.length > 0;
|
|
31
|
-
return val.length > this.colors.length
|
|
32
|
-
&& this.colors.every(c => val.includes(c));
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
lessThan(val) {
|
|
36
|
-
if (this.colorless) return false;
|
|
37
|
-
return val.length < this.colors.length
|
|
38
|
-
&& val.every(c => this.colors.includes(c));
|
|
39
|
-
}
|
|
40
|
-
}
|
|
1
|
+
import { Expression } from 'sigil-sifter/expressions';
|
|
2
|
+
|
|
3
|
+
export default class ColorExpression extends Expression {
|
|
4
|
+
static match(sifter, str) {
|
|
5
|
+
return str.match(sifter.ColorExtension.colorNamesExpr)
|
|
6
|
+
|| str.match(/^([wubrgc]+)/i);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
constructor(sifter, match, str) {
|
|
10
|
+
super(sifter, match, str);
|
|
11
|
+
this.value = match[0];
|
|
12
|
+
this.colors = sifter.ColorExtension.resolveColors(this.value);
|
|
13
|
+
this.colorless = this.colors.includes('C');
|
|
14
|
+
if (this.colorless && this.colors.length > 1)
|
|
15
|
+
throw new Error('A card cannot be both colorless and colored.');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
includes(val) {
|
|
19
|
+
if (this.colorless) return val.length === 0;
|
|
20
|
+
return this.colors.every(c => val.includes(c));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
equals(val) {
|
|
24
|
+
if (this.colorless) return val.length === 0;
|
|
25
|
+
return val.length === this.colors.length
|
|
26
|
+
&& val.every(c => this.colors.includes(c));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
greaterThan(val) {
|
|
30
|
+
if (this.colorless) return val.length > 0;
|
|
31
|
+
return val.length > this.colors.length
|
|
32
|
+
&& this.colors.every(c => val.includes(c));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
lessThan(val) {
|
|
36
|
+
if (this.colorless) return false;
|
|
37
|
+
return val.length < this.colors.length
|
|
38
|
+
&& val.every(c => this.colors.includes(c));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
import {SearchSyntaxError} from 'sigil-sifter/core';
|
|
2
|
-
import ManaExpression from './ManaExpression.js';
|
|
3
|
-
|
|
4
|
-
const allowedSymbolTypes = [
|
|
5
|
-
'coloredMana',
|
|
6
|
-
'twoColorHybridMana',
|
|
7
|
-
'threeColorHybridMana',
|
|
8
|
-
'fourColorHybridMana',
|
|
9
|
-
'fiveColorHybridMana'
|
|
10
|
-
];
|
|
11
|
-
|
|
12
|
-
function isAllowedColor(prevSymbol, sym) {
|
|
13
|
-
const inputValue = sym.colors.sort().join('/');
|
|
14
|
-
if (prevSymbol.length)
|
|
15
|
-
return prevSymbol[0] === inputValue;
|
|
16
|
-
prevSymbol.push(inputValue);
|
|
17
|
-
return true;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export default class DevotionExpression extends ManaExpression {
|
|
21
|
-
constructor(sifter, match, str) {
|
|
22
|
-
super(sifter, match, str);
|
|
23
|
-
let prevSymbol = [];
|
|
24
|
-
const invalidInput = this.searchManaCost.symbols.some(sym => {
|
|
25
|
-
return !allowedSymbolTypes.includes(sym.type)
|
|
26
|
-
|| !isAllowedColor(prevSymbol, sym);
|
|
27
|
-
});
|
|
28
|
-
if (invalidInput)
|
|
29
|
-
throw new SearchSyntaxError(
|
|
30
|
-
'Devotion can only match single color and hybrid mana',
|
|
31
|
-
match[0]
|
|
32
|
-
);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
includes(val) {
|
|
36
|
-
return this.greaterThan(val) || this.equals(val);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
equals(val) {
|
|
40
|
-
return this.searchManaCost.colors.some(c => {
|
|
41
|
-
return val.getDevotionTo(c) === this.searchManaCost.getDevotionTo(c);
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
greaterThan(val) {
|
|
46
|
-
return this.searchManaCost.colors.some(c => {
|
|
47
|
-
return val.getDevotionTo(c) > this.searchManaCost.getDevotionTo(c);
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
lessThan(val) {
|
|
52
|
-
return this.searchManaCost.colors.every(c => {
|
|
53
|
-
return val.getDevotionTo(c) < this.searchManaCost.getDevotionTo(c);
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
}
|
|
1
|
+
import {SearchSyntaxError} from 'sigil-sifter/core';
|
|
2
|
+
import ManaExpression from './ManaExpression.js';
|
|
3
|
+
|
|
4
|
+
const allowedSymbolTypes = [
|
|
5
|
+
'coloredMana',
|
|
6
|
+
'twoColorHybridMana',
|
|
7
|
+
'threeColorHybridMana',
|
|
8
|
+
'fourColorHybridMana',
|
|
9
|
+
'fiveColorHybridMana'
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
function isAllowedColor(prevSymbol, sym) {
|
|
13
|
+
const inputValue = sym.colors.sort().join('/');
|
|
14
|
+
if (prevSymbol.length)
|
|
15
|
+
return prevSymbol[0] === inputValue;
|
|
16
|
+
prevSymbol.push(inputValue);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export default class DevotionExpression extends ManaExpression {
|
|
21
|
+
constructor(sifter, match, str) {
|
|
22
|
+
super(sifter, match, str);
|
|
23
|
+
let prevSymbol = [];
|
|
24
|
+
const invalidInput = this.searchManaCost.symbols.some(sym => {
|
|
25
|
+
return !allowedSymbolTypes.includes(sym.type)
|
|
26
|
+
|| !isAllowedColor(prevSymbol, sym);
|
|
27
|
+
});
|
|
28
|
+
if (invalidInput)
|
|
29
|
+
throw new SearchSyntaxError(
|
|
30
|
+
'Devotion can only match single color and hybrid mana',
|
|
31
|
+
match[0]
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
includes(val) {
|
|
36
|
+
return this.greaterThan(val) || this.equals(val);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
equals(val) {
|
|
40
|
+
return this.searchManaCost.colors.some(c => {
|
|
41
|
+
return val.getDevotionTo(c) === this.searchManaCost.getDevotionTo(c);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
greaterThan(val) {
|
|
46
|
+
return this.searchManaCost.colors.some(c => {
|
|
47
|
+
return val.getDevotionTo(c) > this.searchManaCost.getDevotionTo(c);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
lessThan(val) {
|
|
52
|
+
return this.searchManaCost.colors.every(c => {
|
|
53
|
+
return val.getDevotionTo(c) < this.searchManaCost.getDevotionTo(c);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
import { SearchSyntaxError } from 'sigil-sifter/core';
|
|
2
|
-
import { Expression } from 'sigil-sifter/expressions';
|
|
3
|
-
|
|
4
|
-
export default class EvenOddExpression extends Expression {
|
|
5
|
-
static match(sifter, str) {
|
|
6
|
-
return str.match(/^(even|odd)/i);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
static parse(sifter, match, str) {
|
|
10
|
-
return new EvenOddExpression(sifter, match, str);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
constructor(sifter, match, str) {
|
|
14
|
-
super(sifter, match, str);
|
|
15
|
-
const isOdd = match[1].toLowerCase() === 'odd';
|
|
16
|
-
this.expectedRemainder = isOdd ? 1 : 0;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
includes(val) {
|
|
20
|
-
return (val % 2) === this.expectedRemainder;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
equals(val) {
|
|
24
|
-
throw new SearchSyntaxError(
|
|
25
|
-
'Equality operators are not supported for even/odd ' +
|
|
26
|
-
'expressions, use the includes operator (\':\') instead.'
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
greaterThan(val) {
|
|
31
|
-
throw new SearchSyntaxError(
|
|
32
|
-
'Comparison operators are not supported for even/odd ' +
|
|
33
|
-
'expressions, use the includes operator (\':\') instead.'
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
lessThan(val) {
|
|
38
|
-
throw new SearchSyntaxError(
|
|
39
|
-
'Comparison operators are not supported for even/odd ' +
|
|
40
|
-
'expressions, use the includes operator (\':\') instead.'
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
1
|
+
import { SearchSyntaxError } from 'sigil-sifter/core';
|
|
2
|
+
import { Expression } from 'sigil-sifter/expressions';
|
|
3
|
+
|
|
4
|
+
export default class EvenOddExpression extends Expression {
|
|
5
|
+
static match(sifter, str) {
|
|
6
|
+
return str.match(/^(even|odd)/i);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
static parse(sifter, match, str) {
|
|
10
|
+
return new EvenOddExpression(sifter, match, str);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
constructor(sifter, match, str) {
|
|
14
|
+
super(sifter, match, str);
|
|
15
|
+
const isOdd = match[1].toLowerCase() === 'odd';
|
|
16
|
+
this.expectedRemainder = isOdd ? 1 : 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
includes(val) {
|
|
20
|
+
return (val % 2) === this.expectedRemainder;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
equals(val) {
|
|
24
|
+
throw new SearchSyntaxError(
|
|
25
|
+
'Equality operators are not supported for even/odd ' +
|
|
26
|
+
'expressions, use the includes operator (\':\') instead.'
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
greaterThan(val) {
|
|
31
|
+
throw new SearchSyntaxError(
|
|
32
|
+
'Comparison operators are not supported for even/odd ' +
|
|
33
|
+
'expressions, use the includes operator (\':\') instead.'
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
lessThan(val) {
|
|
38
|
+
throw new SearchSyntaxError(
|
|
39
|
+
'Comparison operators are not supported for even/odd ' +
|
|
40
|
+
'expressions, use the includes operator (\':\') instead.'
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { StringExpression } from 'sigil-sifter/expressions';
|
|
2
|
-
|
|
3
|
-
export default class ExactStringExpression extends StringExpression {
|
|
4
|
-
includes(value) {
|
|
5
|
-
return this.equals(value);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
equals(value) {
|
|
9
|
-
return value.toLowerCase() === this.value;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
1
|
+
import { StringExpression } from 'sigil-sifter/expressions';
|
|
2
|
+
|
|
3
|
+
export default class ExactStringExpression extends StringExpression {
|
|
4
|
+
includes(value) {
|
|
5
|
+
return this.equals(value);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
equals(value) {
|
|
9
|
+
return value.toLowerCase() === this.value;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { SearchSyntaxError } from 'sigil-sifter/core';
|
|
2
|
-
import { StringExpression } from 'sigil-sifter/expressions';
|
|
3
|
-
|
|
4
|
-
export default class FormatExpression extends StringExpression {
|
|
5
|
-
constructor(sifter, match, str) {
|
|
6
|
-
super(sifter, match, str);
|
|
7
|
-
this.format = sifter.FormatExtension.resolveFormat(this.value);
|
|
8
|
-
if (!this.format)
|
|
9
|
-
throw new SearchSyntaxError('Unknown game format', match[0]);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
includes(val) {
|
|
13
|
-
return this.equals(val);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
equals(val) {
|
|
17
|
-
return this.format.expr.test(val);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
1
|
+
import { SearchSyntaxError } from 'sigil-sifter/core';
|
|
2
|
+
import { StringExpression } from 'sigil-sifter/expressions';
|
|
3
|
+
|
|
4
|
+
export default class FormatExpression extends StringExpression {
|
|
5
|
+
constructor(sifter, match, str) {
|
|
6
|
+
super(sifter, match, str);
|
|
7
|
+
this.format = sifter.FormatExtension.resolveFormat(this.value);
|
|
8
|
+
if (!this.format)
|
|
9
|
+
throw new SearchSyntaxError('Unknown game format', match[0]);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
includes(val) {
|
|
13
|
+
return this.equals(val);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
equals(val) {
|
|
17
|
+
return this.format.expr.test(val);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { SearchSyntaxError } from 'sigil-sifter/core';
|
|
2
|
-
import { StringExpression } from 'sigil-sifter/expressions';
|
|
3
|
-
|
|
4
|
-
export default class GameExpression extends StringExpression {
|
|
5
|
-
constructor(sifter, match, str) {
|
|
6
|
-
super(sifter, match, str);
|
|
7
|
-
this.game = sifter.GameExtension.resolveGame(this.value);
|
|
8
|
-
if (!this.game)
|
|
9
|
-
throw new SearchSyntaxError('Unknown game', match[0]);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
includes(val) {
|
|
13
|
-
return val.some(g => this.game.expr.test(g));
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
equals(val) {
|
|
17
|
-
return this.includes(val);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
1
|
+
import { SearchSyntaxError } from 'sigil-sifter/core';
|
|
2
|
+
import { StringExpression } from 'sigil-sifter/expressions';
|
|
3
|
+
|
|
4
|
+
export default class GameExpression extends StringExpression {
|
|
5
|
+
constructor(sifter, match, str) {
|
|
6
|
+
super(sifter, match, str);
|
|
7
|
+
this.game = sifter.GameExtension.resolveGame(this.value);
|
|
8
|
+
if (!this.game)
|
|
9
|
+
throw new SearchSyntaxError('Unknown game', match[0]);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
includes(val) {
|
|
13
|
+
return val.some(g => this.game.expr.test(g));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
equals(val) {
|
|
17
|
+
return this.includes(val);
|
|
18
|
+
}
|
|
19
|
+
}
|