DeckEditor component

This commit is contained in:
Jörn-Michael Miehe 2019-05-16 17:47:58 +02:00
parent 323d6d2f35
commit 94a8f69cfd
2 changed files with 152 additions and 8 deletions

View file

@ -29,19 +29,14 @@
<v-icon>edit</v-icon>
</v-btn>
</v-layout>
<v-form v-if="editing" lazy-validation>
<v-textarea
label="Edit Deck"
value="The Woodman set to work at once, and so sharp was his axe that the tree was soon chopped nearly through."
hint="Paste a deck list"
></v-textarea>
</v-form>
<DeckEditor v-if="editing" :deck_list="deck_list" />
</v-container>
</v-expansion-panel-content>
</template>
<script>
import Card from './Card.vue'
import DeckEditor from './forms/DeckEditor.vue'
export default {
name: 'Deck',
@ -51,7 +46,8 @@ export default {
},
components: {
Card
Card,
DeckEditor
},
data: () => ({
@ -92,6 +88,27 @@ export default {
)
return retval
},
deck_list() {
let lines = []
// begin with deck name and note
lines.push('Deck Name: ' + this.deck.name)
lines.push(this.deck.note)
lines.push('')
// list forwards
this.deck_parts.forEach(part => {
lines.push(`${part.heading} (${part.count}):`)
part.cards.forEach(card =>
lines.push(`${card.count}x ${card.serial} "${card.dbentry.name}"`)
)
lines.push('')
})
return lines.join('\n')
}
}
}

View file

@ -0,0 +1,127 @@
<template>
<v-form lazy-validation>
<v-alert v-model="deck.count !== 50" type="warning">
{{ deck.count }} cards detected! (Decks should have 50)
</v-alert>
<v-textarea
ref="textarea"
label="Edit Deck"
:value="deck_list"
rows="40"
hint="Change card counts and/or serial numbers. Names will be updated automatically."
style="font-family: monospace"
>
</v-textarea>
<v-spacer></v-spacer>
<v-btn color="success" @click.native="check">
Check Deck
</v-btn>
</v-form>
</template>
<script>
export default {
name: 'DeckEditor',
props: {
deck_list: String
},
data: () => ({
deck: {
count: 50
}
}),
methods: {
parse_deck(deck_string) {
let retval = {
name: '',
note: '',
cards: [],
count: 0
}
// select all lines containing card serial numbers
let cardLinesRE = /^.*\b\d-\d{3}[A-Z]?\b.*$/gm
let cardLines = deck_string.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([0-9]+)(?:[*×]|[x]\b)/,
/(?:[*×]|\b[x])([0-9]+)\b/,
// next priority: count with whitespace
/\s+([0-9]+)\s+/,
/\s+([0-9]+)\b/,
/\b([0-9]+)\s+/,
// least priority: any simple number
/\b([0-9]+)\b/
]
// fallback value
let count = 1
for (let i = 0; i < countREs.length; i++) {
let data = countREs[i].exec(cardLine)
if (data) {
count = Number(data[1])
break
}
}
// push card data into deck
retval.cards.push({
serial: serial,
count: count
})
retval.count += count
})
// strip out lines with serial numbers
deck_string = deck_string.replace(cardLinesRE, '')
// select the line containing 'deck name:'
// and its successor (ffdecks format)
let metaRE = /^Deck Name: (.+)$[\s]*?^(.+)$/m
let metaData = metaRE.exec(deck_string)
// fallback
retval.name = 'Unnamed Deck'
retval.note = ''
if (!metaData) {
// no ffdecks format found: strip out anything after the first empty line
deck_string = deck_string.replace(/^[\s]*$[^]*/m, '')
// use lax format: <anything>:[deck name][newline][note]
metaRE = /[^]*?:(.+)$[\s]*?^([^]*)/m
metaData = metaRE.exec(deck_string)
}
// look again, I am not an else!
if (metaData) {
// extract matches
retval.name = metaData[1].trim()
retval.note = metaData[2].trim()
}
return retval
},
check() {
let new_deck = this.parse_deck(this.$refs.textarea.lazyValue)
this.deck.count = new_deck.count
}
}
}
</script>