better decklist parser + validator

This commit is contained in:
Jörn-Michael Miehe 2019-05-17 01:16:22 +02:00
parent 94a8f69cfd
commit 4f5522ff77
3 changed files with 29 additions and 97 deletions

View file

@ -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}):`)

View file

@ -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 {
} }
} }
// count copies
if (!cardCounts[serial]) {
cardCounts[serial] = 0
}
cardCounts[serial] += count
retval.count += count
})
// push card data into deck // 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
})
} }
} }
} }

View file

@ -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>