oop DeckEditor (codebase join for /decks/add)

This commit is contained in:
Jörn-Michael Miehe 2019-05-23 15:00:01 +02:00
parent db4677d751
commit f363ead51a
2 changed files with 103 additions and 104 deletions

View file

@ -0,0 +1,96 @@
'use strict'
export default class {
constructor(str) {
// select all lines containing card serial numbers
let cardLinesRE = /^.*\b\d-\d{3}[A-Z]?\b.*$/gm
let cardLines = str.match(cardLinesRE)
let cardCounts = {}
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
}
}
// count copies
if (!cardCounts[serial]) {
cardCounts[serial] = 0
}
cardCounts[serial] += count
})
// push card data into deck
this.cards = []
Object.keys(cardCounts).forEach(serial => {
this.cards.push({
serial: serial,
count: cardCounts[serial]
})
})
// strip out lines with serial numbers
str = str.replace(cardLinesRE, '')
// then strip out anything after the first empty line
str = str.replace(/^[\s]*$[^]*/m, '')
// select the line containing 'deck name:'
// and its successor (ffdecks format)
let metaRE = /^Deck Name: (.+)$[\s]*?^(.+)$/m
let metaData = metaRE.exec(str)
// fallback
this.name = 'Unnamed Deck'
this.note = ''
if (!metaData) {
// use lax format: <anything>:[deck name][newline][note]
metaRE = /[^]*?:(.+)$[\s]*?^([^]*)/m
metaData = metaRE.exec(str)
}
// look again, I am not an else!
if (metaData) {
// extract matches
this.name = metaData[1].trim()
this.note = metaData[2].trim()
}
}
count() {
return this.cards.reduce((total, card) => total + card.count, 0)
}
plainObject() {
return {
name: this.name,
note: this.note,
cards: this.cards
}
}
}

View file

@ -49,6 +49,7 @@
<script> <script>
import * as Cookies from 'js-cookie' import * as Cookies from 'js-cookie'
import axios from '@/plugins/axios' import axios from '@/plugins/axios'
import Deck from '@/classes/Deck'
export default { export default {
name: 'DeckEditor', name: 'DeckEditor',
@ -72,123 +73,25 @@ export default {
session: () => Cookies.get('session'), session: () => Cookies.get('session'),
new_deck() { new_deck() {
let deck
try { try {
return this.parse_deck(this.new_decklist) deck = new Deck(this.new_decklist)
} catch (e) { } catch (e) {
return this.parse_deck(this.value) deck = new Deck(this.value)
} }
return deck
} }
}, },
methods: { 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)
let cardCounts = {}
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
}
}
// 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({
serial: serial,
count: cardCounts[serial]
})
})
// 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
},
close() { close() {
this.checked = false this.checked = false
this.$emit('close') this.$emit('close')
}, },
update_deck(text) {
try {
this.new_deck = this.parse_deck(text)
} catch (e) {
this.new_deck = this.parse_deck(this.value)
}
},
check_deck() { check_deck() {
// count number of cards // count number of cards
this.check.count = this.new_deck.count this.check.count = this.new_deck.count()
// find most frequent card // find most frequent card
this.check.maximum = 0 this.check.maximum = 0
@ -205,7 +108,7 @@ export default {
.post('/decks/modify', { .post('/decks/modify', {
session: this.session, session: this.session,
deckID: this.id, deckID: this.id,
deckCards: this.new_deck deckCards: this.new_deck.plainObject()
}) })
.then(response => { .then(response => {
if (response.data.success) { if (response.data.success) {