diff --git a/data/magic-cockatrice-cs-ech-2.0.mse-export-template/export-template b/data/magic-cockatrice-cs-ech-2.0.mse-export-template/export-template index 2da440543..2d7893109 100644 --- a/data/magic-cockatrice-cs-ech-2.0.mse-export-template/export-template +++ b/data/magic-cockatrice-cs-ech-2.0.mse-export-template/export-template @@ -20,28 +20,21 @@ file type: *.xml|*.xml|*.*|*.* option field: type: choice - name: version - choice: CS/ECH 2.0 -option field: - type:choice - name: Usage Guide - choice: https://tinyurl.com/csexporter + name: info + choice: CS/ECH 2.0, guide: https://tinyurl.com/ctexportv2 option field: type: text name: cockatrice Set Type description: The "set type" your set will appear as in Cockatrice. "Custom" should be the default. default: Custom -option field: - type: boolean - name: export Images - description: Whether or not to export images along with the XML. These images are recommended for Cockatrice use. - initial: yes option field: type: choice - name: images File Type - description: Which file extension you want the images exported as. JPG is lower quality but lower file size. + name: export Images + description: Export images along with the XML? Recommended for Cockatrice use. JPG is lower quality but lower file size. + choice: no choice: JPG choice: PNG + initial: no option field: type: boolean name: tokens In Separate XML @@ -57,49 +50,40 @@ option field: name: append String To Names description: Appended to the front of all card names and image names. option field: - type: boolean - name: include Common - description: Whether to include common cards or not. - initial: yes -option field: - type: boolean - name: include Uncommon - description: Whether to include uncommon cards or not. - initial: yes -option field: - type: boolean - name: include Rare - description: Whether to include rare cards or not. - initial: yes -option field: - type: boolean - name: include Mythic - description: Whether to include mythic rare cards or not. - initial: yes -option field: - type: boolean - name: include Basic Land - description: Whether to include basic land rarity cards or not. - initial: yes -option field: - type: boolean - name: include Tokens - description: Whether to include tokens or not. - initial: yes -option field: - type: boolean - name: include Special - description: Whether to include special rarity cards or not. - initial: yes - + type: multiple choice + name: rarities to export + choice: common + choice: uncommon + choice: rare + choice: mythic rare + choice: basic land + choice: special + choice: token + choice: masterpiece + initial: common, uncommon, rare, mythic rare, basic land, special, token, masterpiece +option style: + rarities to export: + render style: checklist + direction: vertical + export Images: + render style: both + choice images: + no: {built_in_image("bool_no")} + JPG: {built_in_image("bool_yes")} + PNG: {built_in_image("bool_yes")} script: splitter_name := {false} ## experimental future thing for splitting dfc images #determine if the card is a type that is a "token" i.e. it should be batched with tokens instead of with other cards is_token := {contains(card.shape, match:"token") or contains(card.shape, match:"emblem") or contains(card.shape, match:"rulestip") } is_double := {contains(card.shape, match:"double") } + + file_type := {if options.export_Images == "PNG" then "png" else "jpg"} #determine if the card is of a rarity that should be included included_rarity := { + (is_token() and chosen(options.rarities_to_export, choice:"token")) or chosen(options.rarities_to_export, choice:card.rarity) + } + included_rarity2 := { (is_token() and options.include_Tokens) or (card.rarity == "basic land" and options.include_Basic_Land) or (card.rarity == "common" and options.include_Common) @@ -114,6 +98,7 @@ script: replace@(match: "’",replace:"'") + #replace bad apostrophe with good apostrophe replace@(match:":", replace:"")+ #remove colons replace@(match:";", replace:"")+ #remove semicolons + replace@(match:"\n", replace:"")+ #remove linebreaks replace@(match:"\\.", replace:"") #remove periods # escape special xml characters @@ -132,9 +117,12 @@ script: #determining what name should be used for the card card_name := { if exporter_name_grabber(exporter_name_filter(card.notes)) != "" then exporter_name_grabber(exporter_name_filter(card.notes)) else card.name } + #surround mana symbols in curly brackets + format_mana := replace@(match:"(CHAOS|[1-9][0-9]+(?:\\/.)?|.\\/.\\/.|.\\/.|[+-]?[^.,: ])", replace:{"\{"+_1+"}"}, in_context:"", input) != "" then " attach=\"attach\"" else ""} + + #helpers to find if persistent is desired for this token relation, and generate the requisite XML + add_persistent := {if filter_text(match:"<(conjure|persistent)>", input) != "" then " persistent=\"persistent\"" else ""} #helper functions for converted_related later - related_entry_regex := "(.+?[^[:space:]]);" + related_entry_regex := "(.+?[^[:space:]])(?:;|\n|$)" #convert the !related command field to XML blocks convert_related := @@ -157,12 +148,25 @@ script: replace@(match:"!",replace: "") + #blank out the command ender #for every other card name, surround it with reverse-related tags and put in relevant attributes - {for each entry in (break_text(match:related_entry_regex, input)) do ("\" + xml_escape(strip_card_name(entry)) + "\\n")} + {for each entry in (break_text(match:related_entry_regex, input)) do ("\" + xml_escape(strip_card_name(entry)) + "\\n")} #remove accidentily created empty XML blocks - remove_empty := replace@(match:"\\", replace:"") + remove_empty := replace@(match:"\<(reverse-)?related>\", replace:"") + + #convert the !token command field to XML blocks + convert_token := + replace@(match: "!tokens? ?\n?", replace:"")+ #blank out the related command itself + replace@(match: "\<",replace:"<") + #replace junk Start of Header characters with proper "less than sign"s + replace@(match: "’",replace:"'") + #replace bad apostrophe with good apostrophe + replace@(match: "",replace:"") + #replace accidentily capital X with lowercase X + replace@(match:"!",replace: "") + #blank out the command ender + + #for every other card name, surround it with reverse-related tags and put in relevant attributes + {for each entry in (break_text(match:related_entry_regex, input)) do ("\" + xml_escape(strip_card_name(entry)) + "\\n")} + filter_related := filter_text@(match:"!relate ?[^!]+!?") + filter_token := filter_text@(match:"!tokens? ?[^!]+!?") #functions for the !tapped command contains_tapped := contains@(match:"!tapped") @@ -186,7 +190,7 @@ script: else if contains(card.type, match:"Instant") then "Instant" else if contains(card.type, match:"Artifact") then "Artifact" else if contains(card.type, match:"Enchantment") then "Enchantment" - else xml_escape(replace(match:"^.* ", replace:"", replace(match:" —.*$", replace:"", card.type))) + else xml_escape(replace(match:"^.* ", replace:"", replace(match:"()? —.*$", replace:"", card.type))) ) +"\" } @@ -254,6 +258,7 @@ script: + CIPT() # Rules Text +"\n "+"\"+xml_escape(card_rules_text())+"\" + + (if filter_token(card.notes) != "" then remove_empty("\n " + convert_token(filter_token(card.notes)))) +"\n "+"\" } write_token := { @@ -288,7 +293,7 @@ script: + "\n "+"\1\" # Reverse Related #if there is a !related block in the cards notes, set up the reverse-related XML elements - + (if filter_related(card.notes) != "" then remove_empty("\n" + convert_related(filter_related(card.notes)))) + + (if filter_related(card.notes) != "" then remove_empty("\n " + convert_related(filter_related(card.notes)))) +"\n "+"\" } write_flip := { @@ -360,6 +365,7 @@ script: +"\" # Rules Text +"\n "+"\"+xml_escape(card_rules_text()+"\n--- \n"+card_rules_text_2())+"\" + + (if filter_token(card.notes) != "" then remove_empty("\n " + convert_token(filter_token(card.notes)))) +"\n "+"\" } write_double := { @@ -375,7 +381,7 @@ script: else if contains(card.rarity,match:"mythic") then "\"mythic\"" else if contains(card.rarity,match:"rare") then "\"rare\"" else "\"\"") - + " splitterPath=\""+"/"+options.append_String_To_Names+strip_card_name(card_name())+"." + to_lower(options.images_File_Type) + "\" >"+setcode+"\" + + " splitterPath=\""+"/"+options.append_String_To_Names+strip_card_name(card_name())+"." + file_type() + "\" >"+setcode+"\" +"\n "+"\" # Color +"\n "+"\" @@ -403,6 +409,7 @@ script: +"\n---\n(Back): "+strip_card_name(card.name_2))+"\" # Name of the related card +"\n "+"\"+xml_escape(strip_card_name(card.name_2))+"\" + + (if filter_token(card.notes) != "" then remove_empty("\n " + convert_token(filter_token(card.notes)))) +"\n "+"\" +"\n "+"\" # Name II @@ -417,7 +424,7 @@ script: else if contains(card.rarity,match:"mythic") then "\"mythic\"" else if contains(card.rarity,match:"rare") then "\"rare\"" else "\"\"") - + " splitterPath=\""+"/"+strip_card_name(card.name_2)+"." + to_lower(options.images_File_Type) + "\" >"+setcode+"\" + + " splitterPath=\""+"/"+strip_card_name(card.name_2)+"." + file_type() + "\" >"+setcode+"\" +"\n "+"\" # Color II +"\n "+"\" @@ -442,6 +449,7 @@ script: # Rules Text II +"\n "+"\"+xml_escape(card_rules_text_2() +"\n---\n(Front): "+strip_card_name(card_name()))+"\" + + (if filter_token(card.notes) != "" then remove_empty("\n " + convert_token(filter_token(card.notes)))) +"\n "+"\" } @@ -499,6 +507,7 @@ script: +(if card.loyalty_cost_4 !="" then ": ") +(if contains(paragraph_count(card.rule_text), match:"•••") then split_text(match:"\n", card.rule_text).3))) +"\" + + (if filter_token(card.notes) != "" then remove_empty("\n " + convert_token(filter_token(card.notes)))) +"\n "+"\" } write_double_walker := { @@ -514,7 +523,7 @@ script: else if contains(card.rarity,match:"mythic") then "\"mythic\"" else if contains(card.rarity,match:"rare") then "\"rare\"" else "\"\"") - + " splitterPath=\""+"/"+options.append_String_To_Names+strip_card_name(card_name())+"." + to_lower(options.images_File_Type) + "\" >"+setcode+"\" + + " splitterPath=\""+"/"+options.append_String_To_Names+strip_card_name(card_name())+"." + file_type() + "\" >"+setcode+"\" +"\n "+"\" # Color +"\n "+"\" @@ -557,6 +566,7 @@ script: +"\n---\n(Back): "+strip_card_name(card.name_2))+"\" # Name of the related card +"\n "+"\"+xml_escape(strip_card_name(card.name_2))+"\" + + (if filter_token(card.notes) != "" then remove_empty("\n " + convert_token(filter_token(card.notes)))) +"\n "+"\" +"\n "+"\" # Name II @@ -570,7 +580,7 @@ script: else if contains(card.rarity,match:"mythic") then "\"mythic\"" else if contains(card.rarity,match:"rare") then "\"rare\"" else "\"\"") - + " splitterPath=\""+"/"+strip_card_name(card.name_2)+"." + to_lower(options.images_File_Type) + "\" >"+setcode+"\" + + " splitterPath=\""+"/"+strip_card_name(card.name_2)+"." + file_type() + "\" >"+setcode+"\" +"\n "+"\" # Color II +"\n "+"\" @@ -610,6 +620,7 @@ script: +(if contains(paragraph_count(card.rule_text_2), match:"••") then split_text(match:"\n", card.rule_text_2).2) +(if contains(paragraph_count(card.rule_text_2), match:"•••") then "\n")) +"\n---\n(Front): "+strip_card_name(card_name()))+"\" + + (if filter_token(card.notes) != "" then remove_empty("\n " + convert_token(filter_token(card.notes)))) +"\n "+"\" } write_sparker := { @@ -625,7 +636,7 @@ script: else if contains(card.rarity,match:"mythic") then "\"mythic\"" else if contains(card.rarity,match:"rare") then "\"rare\"" else "\"\"") - + " splitterPath=\""+"/"+options.append_String_To_Names+strip_card_name(card_name())+"." + to_lower(options.images_File_Type) + "\" >"+setcode+"\" + + " splitterPath=\""+"/"+options.append_String_To_Names+strip_card_name(card_name())+"." + file_type() + "\" >"+setcode+"\" +"\n "+"\" # Color +"\n "+"\" @@ -653,6 +664,7 @@ script: +"\n---\n(Back): "+strip_card_name(card.name_2))+"\" # Name of the related card +"\n "+"\"+xml_escape(strip_card_name(card.name_2))+"\" + + (if filter_token(card.notes) != "" then remove_empty("\n " + convert_token(filter_token(card.notes)))) +"\n "+"\" +"\n "+"\" # Name II @@ -666,7 +678,7 @@ script: else if contains(card.rarity,match:"mythic") then "\"mythic\"" else if contains(card.rarity,match:"rare") then "\"rare\"" else "\"\"") - + " splitterPath=\""+"/"+strip_card_name(card.name_2)+"." + to_lower(options.images_File_Type) + "\" >"+setcode+"\" + + " splitterPath=\""+"/"+strip_card_name(card.name_2)+"." + file_type() + "\" >"+setcode+"\" +"\n "+"\" # Color II +"\n "+"\" @@ -706,6 +718,7 @@ script: +(if contains(paragraph_count(card.rule_text_2), match:"••") then split_text(match:"\n", card.rule_text_2).2) +(if contains(paragraph_count(card.rule_text_2), match:"•••") then "\n")) +"\n---\n(Front): "+strip_card_name(card_name()))+"\" + + (if filter_token(card.notes) != "" then remove_empty("\n " + convert_token(filter_token(card.notes)))) +"\n "+"\" } write_sacrificer := { @@ -721,7 +734,7 @@ script: else if contains(card.rarity,match:"mythic") then "\"mythic\"" else if contains(card.rarity,match:"rare") then "\"rare\"" else "\"\"") - + " splitterPath=\""+"/"+options.append_String_To_Names+strip_card_name(card_name())+"." + to_lower(options.images_File_Type) + "\" >"+setcode+"\" + + " splitterPath=\""+"/"+options.append_String_To_Names+strip_card_name(card_name())+"." + file_type() + "\" >"+setcode+"\" +"\n "+"\" # Color +"\n "+"\" @@ -764,6 +777,7 @@ script: +"\n---\n(Back): "+strip_card_name(card.name_2))+"\" # Name of the related card +"\n "+"\"+xml_escape(strip_card_name(card.name_2))+"\" + + (if filter_token(card.notes) != "" then remove_empty("\n " + convert_token(filter_token(card.notes)))) +"\n "+"\" +"\n "+"\" # Name II @@ -778,7 +792,7 @@ script: else if contains(card.rarity,match:"mythic") then "\"mythic\"" else if contains(card.rarity,match:"rare") then "\"rare\"" else "\"\"") - + " splitterPath=\""+"/"+strip_card_name(card.name_2)+"." + to_lower(options.images_File_Type) + "\" >"+setcode+"\" + + " splitterPath=\""+"/"+strip_card_name(card.name_2)+"." + file_type() + "\" >"+setcode+"\" +"\n "+"\" # Color II +"\n "+"\" @@ -803,6 +817,7 @@ script: # Rules Text II +"\n "+"\"+xml_escape(card_rules_text_2() +"\n---\n(Front): "+strip_card_name(card_name()))+"\" + + (if filter_token(card.notes) != "" then remove_empty("\n " + convert_token(filter_token(card.notes)))) +"\n "+"\" } write_leveler := { @@ -854,6 +869,7 @@ script: +(if card.pt_3 != "" then "\n"+card.pt_3) +"\n"+card.rule_text_3) +"\" + + (if filter_token(card.notes) != "" then remove_empty("\n " + convert_token(filter_token(card.notes)))) +"\n "+"\" } @@ -878,14 +894,14 @@ script: write_image_file( card, directory: set.set_code, - file: (options.append_String_To_Names+strip_card_name(card_name())+(if is_token() and options.append_Set_Code_To_Tokens then " " + set.set_code else "")+if splitter_name() and is_double() then "_" + strip_card_name(card.name_2)) + "." + to_lower(options.images_File_Type), + file: (options.append_String_To_Names+strip_card_name(card_name())+(if is_token() and options.append_Set_Code_To_Tokens then " " + set.set_code else "")+if splitter_name() and is_double() then "_" + strip_card_name(card.name_2)) + "." + file_type(), width: (if contains(card.shape, match:"split") or contains(card.shape, match:"double") then 752 else 375), height: 523 ) } #if images are set to be rendered, render all images of rarities that have been selected - write_images := if options.export_Images then for each card in filter_list(cards,filter:{included_rarity(card:input)}) do write_image() else "" + write_images := if options.export_Images != "no" then for each card in filter_list(cards,filter:{included_rarity(card:input)}) do write_image() else "" write_cards := to_text(for each card in cards do write_card()) write_all_tokens := to_text(for each card in cards do write_token_if_token()) @@ -893,7 +909,7 @@ script: #Main export script #tokens in Separate XML - if (options.include_Tokens and options.tokens_In_Separate_XML) then write_text_file(file:set.set_code + " Tokens" + ".xml", to_string("\n\n \n"+write_all_tokens+"\n\n \n")) + if (chosen(options.rarities_to_export, choice:"token") and options.tokens_In_Separate_XML) then write_text_file(file:set.set_code + " Tokens" + ".xml", to_string("\n\n \n"+write_all_tokens+"\n\n \n")) #other cards - to_string("\n\n \n \n "+setcode+"\n "+xml_escape(set.title)+"\n "+xml_escape(options.cockatrice_Set_Type)+"\n \n \n \n"+write_cards+if (options.include_Tokens and not(options.tokens_In_Separate_XML)) then ("\n\n Tokens\n"+write_all_tokens)+"\n\n \n") + to_string("\n\n \n \n "+setcode+"\n "+xml_escape(set.title)+"\n "+xml_escape(options.cockatrice_Set_Type)+"\n \n \n \n"+write_cards+if (chosen(options.rarities_to_export, choice:"token") and not(options.tokens_In_Separate_XML)) then ("\n\n Tokens\n"+write_all_tokens)+"\n\n \n")