better decklist parser + validator
This commit is contained in:
parent
94a8f69cfd
commit
4f5522ff77
3 changed files with 29 additions and 97 deletions
|
@ -98,7 +98,7 @@ export default {
|
||||||
lines.push(this.deck.note)
|
lines.push(this.deck.note)
|
||||||
lines.push('')
|
lines.push('')
|
||||||
|
|
||||||
// list forwards
|
// list each deck part
|
||||||
this.deck_parts.forEach(part => {
|
this.deck_parts.forEach(part => {
|
||||||
lines.push(`${part.heading} (${part.count}):`)
|
lines.push(`${part.heading} (${part.count}):`)
|
||||||
|
|
||||||
|
|
|
@ -3,12 +3,15 @@
|
||||||
<v-alert v-model="deck.count !== 50" type="warning">
|
<v-alert v-model="deck.count !== 50" type="warning">
|
||||||
{{ deck.count }} cards detected! (Decks should have 50)
|
{{ deck.count }} cards detected! (Decks should have 50)
|
||||||
</v-alert>
|
</v-alert>
|
||||||
|
<v-alert v-model="deck.maximum > 3" type="warning">
|
||||||
|
Card with {{ deck.maximum }} copies detected! (Cards should not have more than 3 copies)
|
||||||
|
</v-alert>
|
||||||
|
|
||||||
<v-textarea
|
<v-textarea
|
||||||
ref="textarea"
|
ref="textarea"
|
||||||
label="Edit Deck"
|
label="Edit Deck"
|
||||||
:value="deck_list"
|
:value="deck_list"
|
||||||
rows="40"
|
rows="35"
|
||||||
hint="Change card counts and/or serial numbers. Names will be updated automatically."
|
hint="Change card counts and/or serial numbers. Names will be updated automatically."
|
||||||
style="font-family: monospace"
|
style="font-family: monospace"
|
||||||
>
|
>
|
||||||
|
@ -31,7 +34,8 @@ export default {
|
||||||
|
|
||||||
data: () => ({
|
data: () => ({
|
||||||
deck: {
|
deck: {
|
||||||
count: 50
|
count: 50,
|
||||||
|
maximum: 0
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
@ -47,6 +51,7 @@ export default {
|
||||||
// select all lines containing card serial numbers
|
// select all lines containing card serial numbers
|
||||||
let cardLinesRE = /^.*\b\d-\d{3}[A-Z]?\b.*$/gm
|
let cardLinesRE = /^.*\b\d-\d{3}[A-Z]?\b.*$/gm
|
||||||
let cardLines = deck_string.match(cardLinesRE)
|
let cardLines = deck_string.match(cardLinesRE)
|
||||||
|
let cardCounts = {}
|
||||||
|
|
||||||
cardLines.forEach(cardLine => {
|
cardLines.forEach(cardLine => {
|
||||||
// extract serial (guaranteed to be in here!)
|
// extract serial (guaranteed to be in here!)
|
||||||
|
@ -79,12 +84,21 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// push card data into deck
|
// count copies
|
||||||
|
if (!cardCounts[serial]) {
|
||||||
|
cardCounts[serial] = 0
|
||||||
|
}
|
||||||
|
cardCounts[serial] += count
|
||||||
|
|
||||||
|
retval.count += count
|
||||||
|
})
|
||||||
|
|
||||||
|
// push card data into deck
|
||||||
|
Object.keys(cardCounts).forEach(serial => {
|
||||||
retval.cards.push({
|
retval.cards.push({
|
||||||
serial: serial,
|
serial: serial,
|
||||||
count: count
|
count: cardCounts[serial]
|
||||||
})
|
})
|
||||||
retval.count += count
|
|
||||||
})
|
})
|
||||||
|
|
||||||
// strip out lines with serial numbers
|
// strip out lines with serial numbers
|
||||||
|
@ -120,7 +134,16 @@ export default {
|
||||||
|
|
||||||
check() {
|
check() {
|
||||||
let new_deck = this.parse_deck(this.$refs.textarea.lazyValue)
|
let new_deck = this.parse_deck(this.$refs.textarea.lazyValue)
|
||||||
|
|
||||||
|
// count number of cards
|
||||||
this.deck.count = new_deck.count
|
this.deck.count = new_deck.count
|
||||||
|
|
||||||
|
// find most frequent card
|
||||||
|
this.deck.maximum = 0
|
||||||
|
new_deck.cards.forEach(card => {
|
||||||
|
if(card.count > this.deck.maximum)
|
||||||
|
this.deck.maximum = card.count
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,97 +77,6 @@ export default {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
|
||||||
|
|
||||||
mounted() {
|
|
||||||
let fileContent = `--Generated By FF Decks (www.ffdecks.com)--
|
|
||||||
Deck Name: Ashe turbo
|
|
||||||
Created by: hawks1997
|
|
||||||
|
|
||||||
|
|
||||||
Forward(26):
|
|
||||||
3 Garland (6-002)
|
|
||||||
3 Rain (8-134)
|
|
||||||
3 Garnet (3-129)
|
|
||||||
2 Zidane (8-115)
|
|
||||||
3 Ashe (2-121)
|
|
||||||
3 Basch (2-014)
|
|
||||||
3 Steiner (4-129)
|
|
||||||
3 Vivi (3-017)
|
|
||||||
3 Cecil (2-129)
|
|
||||||
|
|
||||||
Summon(8):
|
|
||||||
2 Cuchulainn, the Impure (2-133)
|
|
||||||
2 Bahamut (4-016)
|
|
||||||
1 Phoenix (5-019)
|
|
||||||
3 Leviathan (6-125)
|
|
||||||
|
|
||||||
Backup(16):
|
|
||||||
2 Sage (2-005)
|
|
||||||
2 Vermilion Bird l'Cie Caetuna (6-010)
|
|
||||||
2 Yotsuyu (8-020)
|
|
||||||
2 Rasler (5-166)
|
|
||||||
2 Red Mage (1-003)
|
|
||||||
3 Hilda (6-122)
|
|
||||||
3 Astrologian (2-130)
|
|
||||||
|
|
||||||
Monster(0):`
|
|
||||||
|
|
||||||
// select the line containing 'deck name:'
|
|
||||||
// and its successor
|
|
||||||
let metaRE = /^deck name: (.+)$[\s]*?^(.+)$/im
|
|
||||||
let metaData = metaRE.exec(fileContent)
|
|
||||||
|
|
||||||
// extract matches
|
|
||||||
let deckData = {
|
|
||||||
name: metaData[1],
|
|
||||||
note: metaData[2],
|
|
||||||
cards: []
|
|
||||||
}
|
|
||||||
|
|
||||||
// select all lines containing card serial numbers
|
|
||||||
let cardLinesRE = /^.*\b\d-\d{3}[A-Z]?\b.*$/gm
|
|
||||||
let cardLines = fileContent.match(cardLinesRE)
|
|
||||||
|
|
||||||
cardLines.forEach(cardLine => {
|
|
||||||
// extract serial (guaranteed to be in here!)
|
|
||||||
let serialRE = /\b(\d-\d{3})[A-Z]?\b/i
|
|
||||||
let serial = serialRE.exec(cardLine)[1]
|
|
||||||
|
|
||||||
// strip out serial number
|
|
||||||
cardLine = cardLine.replace(serialRE, '')
|
|
||||||
|
|
||||||
let countREs = [
|
|
||||||
// prioritize a count with "times" symbol *, x, ×
|
|
||||||
/\b([1-3])(?:[*×]|[x]\b)/,
|
|
||||||
/(?:[*×]|\b[x])([1-3])\b/,
|
|
||||||
// next priority: with whitespace
|
|
||||||
/\s+([1-3])\s+/,
|
|
||||||
/\s+([1-3])\b/,
|
|
||||||
/\b([1-3])\s+/,
|
|
||||||
// least priority: any single digit
|
|
||||||
/\b([1-3])\b/
|
|
||||||
]
|
|
||||||
|
|
||||||
// fallback value
|
|
||||||
let count = '0'
|
|
||||||
for (let i = 0; i < countREs.length; i++) {
|
|
||||||
let data = countREs[i].exec(cardLine)
|
|
||||||
|
|
||||||
if (data) {
|
|
||||||
count = data[1]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// push card data into deck
|
|
||||||
deckData.cards.push({
|
|
||||||
serial: serial,
|
|
||||||
count: count
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
console.log(deckData)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
Reference in a new issue