Merge branch 'master' of https://github.com/reimannsum/mtgencode into reimannsum-master

Conflicts:
	decode.py
	lib/cardlib.py
	lib/utils.py

Moved massive html header string into a separate file.
This commit is contained in:
Bill Zorn 2015-11-09 14:10:56 -08:00
commit ccb112021e
7 changed files with 131 additions and 27 deletions

View file

@ -17,7 +17,7 @@ def exclude_sets(cardset):
def main(fname, oname = None, verbose = True, encoding = 'std', def main(fname, oname = None, verbose = True, encoding = 'std',
gatherer = False, for_forum = False, for_mse = False, gatherer = False, for_forum = False, for_mse = False,
creativity = False, vdump = False): creativity = False, vdump = False, for_html = False):
fmt_ordered = cardlib.fmt_ordered_default fmt_ordered = cardlib.fmt_ordered_default
@ -53,6 +53,11 @@ def main(fname, oname = None, verbose = True, encoding = 'std',
if for_mse: if for_mse:
# have to prepend a massive chunk of formatting info # have to prepend a massive chunk of formatting info
writer.write(utils.mse_prepend) writer.write(utils.mse_prepend)
if for_html:
# have to preapend html info
writer.write(utils.html_prepend)
for card in cards: for card in cards:
if for_mse: if for_mse:
writer.write(card.to_mse().encode('utf-8')) writer.write(card.to_mse().encode('utf-8'))
@ -68,7 +73,7 @@ def main(fname, oname = None, verbose = True, encoding = 'std',
writer.write(('\n' + fstring[:-1]).replace('\n', '\n\t\t')) writer.write(('\n' + fstring[:-1]).replace('\n', '\n\t\t'))
else: else:
writer.write(card.format(gatherer = gatherer, for_forum = for_forum, writer.write(card.format(gatherer = gatherer, for_forum = for_forum,
vdump = vdump).encode('utf-8')) vdump = vdump, for_html = for_html).encode('utf-8'))
if creativity: if creativity:
cstring = '~~ closest cards ~~\n' cstring = '~~ closest cards ~~\n'
@ -95,8 +100,15 @@ def main(fname, oname = None, verbose = True, encoding = 'std',
if for_mse: if for_mse:
# more formatting info # more formatting info
writer.write('version control:\n\ttype: none\napprentice code: ') writer.write('version control:\n\ttype: none\napprentice code: ')
if for_html:
# closing the html file
writer.write(utils.html_append)
if oname: if oname:
if for_html:
print oname
# if ('.html' != oname[-])
# oname += '.html'
if verbose: if verbose:
print 'Writing output to: ' + oname print 'Writing output to: ' + oname
with open(oname, 'w') as ofile: with open(oname, 'w') as ofile:
@ -144,10 +156,14 @@ if __name__ == '__main__':
help='dump out lots of information about invalid cards') help='dump out lots of information about invalid cards')
parser.add_argument('-v', '--verbose', action='store_true', parser.add_argument('-v', '--verbose', action='store_true',
help='verbose output') help='verbose output')
parser.add_argument('-mse', '--mse', action='store_true', help='use Magic Set Editor 2 encoding; will output as .mse-set file') parser.add_argument('-mse', '--mse', action='store_true',
help='use Magic Set Editor 2 encoding; will output as .mse-set file')
parser.add_argument('-html', '--html', action='store_true', help='create a .html file with pretty forum formatting')
args = parser.parse_args() args = parser.parse_args()
main(args.infile, args.outfile, verbose = args.verbose, encoding = args.encoding, main(args.infile, args.outfile, verbose = args.verbose, encoding = args.encoding,
gatherer = args.gatherer, for_forum = args.forum, for_mse = args.mse, gatherer = args.gatherer, for_forum = args.forum, for_mse = args.mse,
creativity = args.creativity, vdump = args.dump) creativity = args.creativity, vdump = args.dump, for_html = args.html)
exit(0) exit(0)

View file

@ -392,6 +392,7 @@ class Card:
def __init__(self, src, fmt_ordered = fmt_ordered_default, def __init__(self, src, fmt_ordered = fmt_ordered_default,
fmt_labeled = fmt_labeled_default, fmt_labeled = fmt_labeled_default,
fieldsep = utils.fieldsep, linetrans = True): fieldsep = utils.fieldsep, linetrans = True):
# source fields, exactly one will be set # source fields, exactly one will be set
self.json = None self.json = None
self.raw = None self.raw = None
@ -554,10 +555,7 @@ class Card:
# the NN representation, use str() or format() for output intended for human # the NN representation, use str() or format() for output intended for human
# readers. # readers.
def encode(self, fmt_ordered = fmt_ordered_default, def encode(self, fmt_ordered = fmt_ordered_default, fmt_labeled = None, fieldsep = utils.fieldsep, randomize_fields = False, randomize_mana = False, initial_sep = True, final_sep = True):
fmt_labeled = None, fieldsep = utils.fieldsep,
randomize_fields = False, randomize_mana = False,
initial_sep = True, final_sep = True):
outfields = [] outfields = []
for field in fmt_ordered: for field in fmt_ordered:
@ -604,7 +602,7 @@ class Card:
return outstr return outstr
def format(self, gatherer = False, for_forum = False, for_mse = False, vdump = False): def format(self, gatherer = False, for_forum = False, for_mse = False, vdump = False, for_html = False):
outstr = '' outstr = ''
if gatherer: if gatherer:
cardname = titlecase(transforms.name_unpass_1_dashes(self.__dict__[field_name])) cardname = titlecase(transforms.name_unpass_1_dashes(self.__dict__[field_name]))
@ -659,7 +657,7 @@ class Card:
mtext = transforms.text_unpass_2_counters(mtext) mtext = transforms.text_unpass_2_counters(mtext)
#mtext = transforms.text_unpass_3_uncast(mtext) #mtext = transforms.text_unpass_3_uncast(mtext)
mtext = transforms.text_unpass_4_unary(mtext) mtext = transforms.text_unpass_4_unary(mtext)
mtext = transforms.text_unpass_5_symbols(mtext, for_forum) mtext = transforms.text_unpass_5_symbols(mtext, for_forum, for_html)
mtext = sentencecase(mtext) mtext = sentencecase(mtext)
mtext = transforms.text_unpass_6_cardname(mtext, cardname) mtext = transforms.text_unpass_6_cardname(mtext, cardname)
mtext = transforms.text_unpass_7_newlines(mtext) mtext = transforms.text_unpass_7_newlines(mtext)
@ -685,6 +683,61 @@ class Card:
outstr += '[/i]' outstr += '[/i]'
outstr += '\n' outstr += '\n'
elif for_html:
outstr += '<div class="card-text">'
cardname = self.__dict__[field_name]
#cardname = transforms.name_unpass_1_dashes(self.__dict__[field_name])
if vdump and not cardname:
cardname = '_NONAME_'
outstr += cardname + ' '
coststr = self.__dict__[field_cost].format(for_html = for_html)
if vdump or not coststr == '_NOCOST_':
outstr += coststr
outstr += '<br>'
if self.__dict__[field_rarity]:
if self.__dict__[field_rarity] in utils.json_rarity_unmap:
rarity = utils.json_rarity_unmap[self.__dict__[field_rarity]]
else:
rarity = self.__dict__[field_rarity]
outstr += ' (' + rarity.lower() + ') '
outstr += '\n<hr><b>'
outstr += ' '.join(self.__dict__[field_supertypes] + self.__dict__[field_types])
if self.__dict__[field_subtypes]:
outstr += ' ' + utils.dash_marker + ' ' + ' '.join(self.__dict__[field_subtypes])
outstr += '</b><hr>\n'
if self.__dict__[field_text].text:
mtext = self.__dict__[field_text].text
mtext = transforms.text_unpass_1_choice(mtext, delimit = True)
#mtext = transforms.text_unpass_2_counters(mtext)
#mtext = transforms.text_unpass_3_uncast(mtext)
mtext = transforms.text_unpass_4_unary(mtext)
mtext = transforms.text_unpass_5_symbols(mtext,for_forum, for_html)
#mtext = transforms.text_unpass_6_cardname(mtext, cardname)
mtext = transforms.text_unpass_7_newlines(mtext).replace("\n", "<br>")
#mtext = transforms.text_unpass_8_unicode(mtext)
newtext = Manatext('')
newtext.text = mtext
newtext.costs = self.__dict__[field_text].costs
outstr += newtext.format(for_html = for_html) + '\n'
if self.__dict__[field_pt]:
outstr += '<br>(' + utils.from_unary(self.__dict__[field_pt]) + ')<br>'
outstr += '\n'
if self.__dict__[field_loyalty]:
outstr += '((' + utils.from_unary(self.__dict__[field_loyalty]) + '))'
outstr += '\n'
if vdump and self.__dict__[field_other]:
outstr += utils.dash_marker * 2
outstr += '\n'
for idx, value in self.__dict__[field_other]:
outstr += '<' + str(idx) + '> ' + str(value)
outstr += '\n'
else: else:
cardname = self.__dict__[field_name] cardname = self.__dict__[field_name]
#cardname = transforms.name_unpass_1_dashes(self.__dict__[field_name]) #cardname = transforms.name_unpass_1_dashes(self.__dict__[field_name])
@ -720,7 +773,7 @@ class Card:
#mtext = transforms.text_unpass_2_counters(mtext) #mtext = transforms.text_unpass_2_counters(mtext)
#mtext = transforms.text_unpass_3_uncast(mtext) #mtext = transforms.text_unpass_3_uncast(mtext)
mtext = transforms.text_unpass_4_unary(mtext) mtext = transforms.text_unpass_4_unary(mtext)
mtext = transforms.text_unpass_5_symbols(mtext, for_forum) mtext = transforms.text_unpass_5_symbols(mtext, for_forum, for_html)
#mtext = transforms.text_unpass_6_cardname(mtext, cardname) #mtext = transforms.text_unpass_6_cardname(mtext, cardname)
mtext = transforms.text_unpass_7_newlines(mtext) mtext = transforms.text_unpass_7_newlines(mtext)
#mtext = transforms.text_unpass_8_unicode(mtext) #mtext = transforms.text_unpass_8_unicode(mtext)
@ -745,9 +798,13 @@ class Card:
outstr += '\n' outstr += '\n'
if self.bside: if self.bside:
if for_html:
outstr += "<hr><hr>\n"
else:
outstr += utils.dash_marker * 8 + '\n' outstr += utils.dash_marker * 8 + '\n'
outstr += self.bside.format(gatherer = gatherer, for_forum = for_forum) outstr += self.bside.format(gatherer = gatherer, for_forum = for_forum, for_html = for_html)
if for_html:
outstr += "</div>"
return outstr return outstr
def to_mse(self, print_raw = False, vdump = False): def to_mse(self, print_raw = False, vdump = False):
@ -788,7 +845,7 @@ class Card:
mtext = transforms.text_unpass_2_counters(mtext) mtext = transforms.text_unpass_2_counters(mtext)
mtext = transforms.text_unpass_3_uncast(mtext) mtext = transforms.text_unpass_3_uncast(mtext)
mtext = transforms.text_unpass_4_unary(mtext) mtext = transforms.text_unpass_4_unary(mtext)
mtext = transforms.text_unpass_5_symbols(mtext, False) mtext = transforms.text_unpass_5_symbols(mtext, False, False)
mtext = sentencecase(mtext) mtext = sentencecase(mtext)
# I don't really want these MSE specific passes in transforms, # I don't really want these MSE specific passes in transforms,
# but they could be pulled out separately somewhere else in here. # but they could be pulled out separately somewhere else in here.
@ -855,7 +912,7 @@ class Card:
mtext2 = transforms.text_unpass_2_counters(mtext2) mtext2 = transforms.text_unpass_2_counters(mtext2)
mtext2 = transforms.text_unpass_3_uncast(mtext2) mtext2 = transforms.text_unpass_3_uncast(mtext2)
mtext2 = transforms.text_unpass_4_unary(mtext2) mtext2 = transforms.text_unpass_4_unary(mtext2)
mtext2 = transforms.text_unpass_5_symbols(mtext2, False) mtext2 = transforms.text_unpass_5_symbols(mtext2, False, False)
mtext2 = sentencecase(mtext2) mtext2 = sentencecase(mtext2)
mtext2 = mtext2.replace(utils.this_marker, '<atom-cardname><nospellcheck>' mtext2 = mtext2.replace(utils.this_marker, '<atom-cardname><nospellcheck>'
+ utils.this_marker + '</nospellcheck></atom-cardname>') + utils.this_marker + '</nospellcheck></atom-cardname>')

1
lib/html_extra_data.py Normal file

File diff suppressed because one or more lines are too long

View file

@ -108,12 +108,13 @@ class Manacost:
return utils.mana_untranslate(utils.mana_open_delimiter + ''.join(self.sequence) return utils.mana_untranslate(utils.mana_open_delimiter + ''.join(self.sequence)
+ utils.mana_close_delimiter) + utils.mana_close_delimiter)
def format(self, for_forum = False): def format(self, for_forum = False, for_html = False):
if self.none: if self.none:
return '_NOCOST_' return '_NOCOST_'
else: else:
return utils.mana_untranslate(utils.mana_open_delimiter + ''.join(self.sequence) return utils.mana_untranslate(utils.mana_open_delimiter + ''.join(self.sequence)
+ utils.mana_close_delimiter, for_forum) + utils.mana_close_delimiter, for_forum, for_html)
def encode(self, randomize = False): def encode(self, randomize = False):
if self.none: if self.none:
@ -177,10 +178,10 @@ class Manatext:
text = text.replace(utils.reserved_mana_marker, str(cost), 1) text = text.replace(utils.reserved_mana_marker, str(cost), 1)
return text return text
def format(self, for_forum = False): def format(self, for_forum = False, for_html = False):
text = self.text text = self.text
for cost in self.costs: for cost in self.costs:
text = text.replace(utils.reserved_mana_marker, cost.format(for_forum = for_forum), 1) text = text.replace(utils.reserved_mana_marker, cost.format(for_forum = for_forum, for_html = for_html), 1)
return text return text
def encode(self, randomize = False): def encode(self, randomize = False):

View file

@ -515,8 +515,8 @@ def text_unpass_4_unary(s):
return utils.from_unary(s) return utils.from_unary(s)
def text_unpass_5_symbols(s, for_forum): def text_unpass_5_symbols(s, for_forum, for_html):
return utils.from_symbols(s, for_forum = for_forum) return utils.from_symbols(s, for_forum = for_forum, for_html = for_html)
def text_unpass_6_cardname(s, name): def text_unpass_6_cardname(s, name):

View file

@ -9,6 +9,12 @@ import config
# special chunk of text that Magic Set Editor 2 requires at the start of all set files. # special chunk of text that Magic Set Editor 2 requires at the start of all set files.
mse_prepend = 'mse version: 0.3.8\ngame: magic\nstylesheet: m15\nset info:\n\tsymbol:\nstyling:\n\tmagic-m15:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay:\n\tmagic-m15-clear:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-extra-improved:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\tpt box symbols: magic-pt-symbols-extra.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-planeswalker:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-planeswalker-promo-black:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-promo-dka:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-token-clear:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-new-planeswalker:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-new-planeswalker-4abil:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-new-planeswalker-clear:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-new-planeswalker-promo-black:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n' mse_prepend = 'mse version: 0.3.8\ngame: magic\nstylesheet: m15\nset info:\n\tsymbol:\nstyling:\n\tmagic-m15:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay:\n\tmagic-m15-clear:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-extra-improved:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\tpt box symbols: magic-pt-symbols-extra.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-planeswalker:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-planeswalker-promo-black:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-promo-dka:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-m15-token-clear:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-new-planeswalker:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-new-planeswalker-4abil:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-new-planeswalker-clear:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n\tmagic-new-planeswalker-promo-black:\n\t\ttext box mana symbols: magic-mana-small.mse-symbol-font\n\t\toverlay: \n'
# special chunk of text to start an HTML document.
box_height = 350
import html_extra_data
html_prepend = html_extra_data.html_prepend
html_append = "\n/body>\n</html>"
# encoding formats we know about # encoding formats we know about
formats = [ formats = [
'std', 'std',
@ -136,6 +142,9 @@ mana_json_close_delimiter = mana_close_delimiter
mana_json_hybrid_delimiter = '/' mana_json_hybrid_delimiter = '/'
mana_forum_open_delimiter = '[mana]' mana_forum_open_delimiter = '[mana]'
mana_forum_close_delimiter = '[/mana]' mana_forum_close_delimiter = '[/mana]'
mana_html_open_delimiter = "<img class='mana-"
mana_html_close_delimiter = "'>"
mana_html_hybrid_delimiter = '-'
mana_unary_marker = '' # if the same as unary_marker, from_unary WILL replace numbers in mana costs mana_unary_marker = '' # if the same as unary_marker, from_unary WILL replace numbers in mana costs
mana_unary_counter = unary_counter mana_unary_counter = unary_counter
@ -386,7 +395,7 @@ def mana_translate(jmanastr):
# convert an encoded mana string back to json # convert an encoded mana string back to json
mana_symlen_min = min([len(sym) for sym in mana_symall_decode]) mana_symlen_min = min([len(sym) for sym in mana_symall_decode])
mana_symlen_max = max([len(sym) for sym in mana_symall_decode]) mana_symlen_max = max([len(sym) for sym in mana_symall_decode])
def mana_untranslate(manastr, for_forum = False): def mana_untranslate(manastr, for_forum = False, for_html = False):
inner = manastr[1:-1] inner = manastr[1:-1]
jmanastr = '' jmanastr = ''
colorless_total = 0 colorless_total = 0
@ -406,6 +415,12 @@ def mana_untranslate(manastr, for_forum = False):
idx += symlen idx += symlen
if for_forum: if for_forum:
jmanastr = jmanastr + mana_decode_direct_forum(sym) jmanastr = jmanastr + mana_decode_direct_forum(sym)
if for_html:
jmanastr = jmanastr + mana_decode_direct(sym)
jmanastr = jmanastr.replace(mana_open_delimiter, mana_html_open_delimiter)
jmanastr = jmanastr.replace(mana_close_delimiter, mana_html_close_delimiter)
jmanastr = jmanastr.replace(mana_open_delimiter, mana_html_open_delimiter)
jmanastr = jmanastr.replace(mana_json_hybrid_delimiter, mana_html_hybrid_delimiter)
else: else:
jmanastr = jmanastr + mana_decode_direct(sym) jmanastr = jmanastr + mana_decode_direct(sym)
break break
@ -419,6 +434,13 @@ def mana_untranslate(manastr, for_forum = False):
return (mana_forum_open_delimiter + ('' if colorless_total == 0 return (mana_forum_open_delimiter + ('' if colorless_total == 0
else str(colorless_total)) else str(colorless_total))
+ jmanastr + mana_forum_close_delimiter) + jmanastr + mana_forum_close_delimiter)
if for_html:
if jmanastr == '':
return mana_html_open_delimiter + str(colorless_total) + mana_html_close_delimiter
else:
return (mana_html_open_delimiter + ('' if colorless_total == 0
else str(colorless_total))
+ mana_html_close_delimiter + jmanastr)
else: else:
if jmanastr == '': if jmanastr == '':
return mana_json_open_delimiter + str(colorless_total) + mana_json_close_delimiter return mana_json_open_delimiter + str(colorless_total) + mana_json_close_delimiter
@ -464,6 +486,11 @@ symbol_forum_trans = {
tap_marker : mana_forum_open_delimiter + json_symbol_tap + mana_forum_close_delimiter, tap_marker : mana_forum_open_delimiter + json_symbol_tap + mana_forum_close_delimiter,
untap_marker : mana_forum_open_delimiter + json_symbol_untap + mana_forum_close_delimiter, untap_marker : mana_forum_open_delimiter + json_symbol_untap + mana_forum_close_delimiter,
} }
symbol_html_trans = {
tap_marker : mana_html_open_delimiter + json_symbol_tap + mana_html_close_delimiter,
untap_marker : mana_html_open_delimiter + json_symbol_untap + mana_html_close_delimiter,
}
json_symbol_regex = (re.escape(mana_json_open_delimiter) + '[' json_symbol_regex = (re.escape(mana_json_open_delimiter) + '['
+ json_symbol_tap + json_symbol_tap.lower() + json_symbol_tap + json_symbol_tap.lower()
+ json_symbol_untap + json_symbol_untap.lower() + json_symbol_untap + json_symbol_untap.lower()
@ -476,7 +503,7 @@ def to_symbols(s):
s = s.replace(jsymstr, json_symbol_trans[jsymstr]) s = s.replace(jsymstr, json_symbol_trans[jsymstr])
return s return s
def from_symbols(s, for_forum = False): def from_symbols(s, for_forum = False, for_html = False):
symstrs = re.findall(symbol_regex, s) symstrs = re.findall(symbol_regex, s)
#for symstr in sorted(symstrs, lambda x,y: cmp(len(x), len(y)), reverse = True): #for symstr in sorted(symstrs, lambda x,y: cmp(len(x), len(y)), reverse = True):
# We have to do the right thing here, because the thing we replace exists in the thing # We have to do the right thing here, because the thing we replace exists in the thing
@ -484,6 +511,8 @@ def from_symbols(s, for_forum = False):
for symstr in set(symstrs): for symstr in set(symstrs):
if for_forum: if for_forum:
s = s.replace(symstr, symbol_forum_trans[symstr]) s = s.replace(symstr, symbol_forum_trans[symstr])
elif for_html:
s = s.replace(symstr, symbol_html_trans[symstr])
else: else:
s = s.replace(symstr, symbol_trans[symstr]) s = s.replace(symstr, symbol_trans[symstr])
return s return s

View file

@ -91,10 +91,10 @@ def sortcards(cards):
# color classes need to find the mana cost # color classes need to find the mana cost
fields = card.split('|') fields = card.split('|')
if len(fields) != 10: if len(fields) != 11:
classes['unknown color'] += [card] classes['unknown color'] += [card]
else: else:
cost = fields[7] cost = fields[8]
color_count = 0 color_count = 0
if 'W' in cost or 'U' in cost or 'B' in cost or 'R' in cost or 'G' in cost: if 'W' in cost or 'U' in cost or 'B' in cost or 'R' in cost or 'G' in cost:
if 'W' in cost: if 'W' in cost: