▶ 実 行
▶ 実行
クリア
MTGカードまとめて検索
by TKI
!インデント構文 //----------------- //2022/08/20 ", "を含むカード名の処理を間違っていたので修正 //----------------- //・2022年7月現在 判明している不具合および仕様外としたもの // ・《メイス+2/+2 Mace》は仕様の対象外です。 (フォーゴトン・レルム探訪) // プログラムの改修時、運が良ければ検索でヒットするでしょう // ・同名で複数種類あるカードは一番上しかでません // ・《流し台の騎士/Knight of the Kitchen Sink》 (銀枠) // ・《とても謎めいた命令/Very Cryptic Command》 (銀枠) // ・《ずるいスパイ/Sly Spy》 (銀枠) // ・《ゴミの精霊/Garbage Elemental》 (銀枠) // ・《言い知れない祝福/Ineffable Blessing》 (銀枠) // ・《なんでもかんとか/Everythingamajig》(銀枠) //----------------- //・MTGの検索API //基本の書式 //API = "https://api.magicthegathering.io/v1/cards?name={カード名} //複数の検索語の場合 name=a|b ただし日本語の場合どうするのか不明 //jsonが返ってくる。 //{"cards":[検索でヒットしたカードの配列]} //----------------- //・検索カード名について //・カード名が英語の場合、半角スペースや「'」はそのままでよい //API = "https://api.magicthegathering.io/v1/cards?&name=Eladamri's Call" //API = "https://api.magicthegathering.io/v1/cards?&name=Yorion, Sky Nomad" // //・日本語カード名で検索するときはlanguage=japaneseを付け、&をつけてカード名をURLエンコード //カード名 = "世界を目覚めさせる者、ニッサ"をURLエンコード //API = "https://api.magicthegathering.io/v1/cards?language=japanese&name={カード名}" //分割カードはカード名を2つもつ。 オラクルでは多面カードは「 // 」を含むようだ //《反応+反正》の場合は『反応』と『反正』の面が別のカードとしてヒットする // オラクルは{"name":"Response // Resurgence","layout":"split", // 日本語版は"foreignNames":[{"name":"反応 // 反正","text":"ターン終了時まで、あなたがコントロールしているクリーチャーは先制攻撃と警戒を得る。このメイン・フェイズの後に追加の戦闘フェイズ1つと、それの後に追加のメイン・フェイズを1つ加える。","type":"ソーサリー","flavor":null,"faceName":"反正"}] //オラクル上ではどちらの面の名前か判断がつきにくい(nameが"Response // Resurgence"でtextは片面のみ、が2枚ある) //・日本語名に半角数字が入っているものがある。 日本語だからと安易に全角変換しない。 // 10が半角数字 →"第10管区の軍団兵" // ※1桁の数値は全角 →"第1管区の勇士" "第6管区のワイト" //・紙で存在していてもオラクルに日本語訳が載っていないことがある // ・日本語訳がない場合は日本語カード名を検索したときヒットしない // ・ある程度古いカードは日本語訳がない。 // ・フォーゴトン・レルム探訪の《メイス+2/+2 Mace》のオラクルには日本語版がない // //・Jumpstartのカードはオラクルに日本語訳がない? // アロサウルス飼い/Allosaurus Shepherdなど(再録されたら載るかもしれない) // //----------------- //・カードテキストについて //・モードを持つ両面カードはカードの端に逆面の情報が軽く触れられているが、日本語版テキストに含まれる。 // ・この部分はオラクルテキスト(英語)には含まれない。 ゲーム上でもフレーバーテキスト扱い。 //例) // "name": "アクームの戦士 // アクームの歯", // "text": "アクームの歯はタップ状態で戦場に出る。\n{T}:{R}を加える。\n戦士\n{5}{R}" //「"アクームの歯はタップ状態で戦場に出る。\n{T}:{R}を加える。」がアクームの歯 //「\n戦士\n{5}{R}"」の部分は逆面アクームの戦士の簡易情報 //----------------- 検索リスト = [] 検索キャッシュ = {} //検索キャッシュ@オラクル名 = [第1面,第2面] 英訳キャッシュ = {} //英訳キャッシュ@日本語名 = オラクル名 結果キャッシュ = {} //カード名とオブジェクトの関数名が被る可能性があるので「辞書キー存在」は使わないこと //もし検索キャッシュにカード名が辞書キー存在感あるならば ●辞書キー存在感ある(Aの|Aに,Bが) (Aの辞書キー列挙)からBを配列検索 (それ>=0)を戻す ●多バイト文字含む(txtに|txtが) txtを文字列分解して反復 もし255<ASC(対象)ならば、1を戻す 0を戻す ●改行区切(Sを) S=SのCR&LFを改行に置換 Sを改行で区切る ●行揃え(SをAで) 結果 = "" Sを改行区切りして反復 txt=対象 (txt<>"")の間 txtの1からAを文字抜出 結果=結果にそれを一行追加 txt=txtの1からAだけ文字削除 結果を戻す ●標準カード判定(cardを) card["layout"]が"normal"と等しい ●分割カード判定(cardを) card["layout"]が"split"と等しい ●反転カード判定(cardを) card["layout"]が"flip"と等しい ●当事者カード判定(cardを) card["layout"]が"adventure"と等しい ●英雄譚カード判定(cardを) card["layout"]が"saga"と等しい ●Lvアップカード判定(cardを) card["layout"]が"leveler"と等しい ●合体カード判定(cardを) card["layout"]が"meld"と等しい ●変身カード判定(cardを) //両面? card["layout"]が"transform"と等しい ●モード両面カード判定(cardを) card["layout"]が "modal_dfc"と等しい 0回 //テスト用 0.5秒後には name = "Urza's Power Plant" オラクル問い合わせ(name) 0を戻す ●オラクル問い合わせ(cardnameを) もし英訳キャッシュにcardnameが辞書キー存在感あるならば、戻る カード名=cardnameをトリム //言語 ざっくり! もしカード名が多バイト文字含むならば lang="japanese" API = "https://api.magicthegathering.io/v1/cards?language={lang}&" //name=... 違えば API = "https://api.magicthegathering.io/v1/cards?" //name=... //うしろにurlパラメータを足していく //分割カード "反応+反正" → "name={反応をURLエンコード}" 片面のみ //それ以外jp "灰色熊" → "name={灰色熊をURLエンコード}" //それ以外 "Giant Growth" → "name=Giant Growth" urlパラメータ = [] //カード名 分割カードa+bはaで検索 names = カード名を「+」で区切る //メイス+2は知らない namesを反復 name = 対象 もし対象が空ならば続ける もし対象が多バイト文字含むならば urlパラメータに「name={nameをURLエンコード}」を配列追加 違えば urlパラメータに「name={name}」を配列追加 抜ける //片面で十分 //色とか //urlパラメータに「xxx=xxxxxxx」を配列追加//未実装 //結合してくっつける urlパラメータを「&」で配列結合 API = API & それ obj=APIからAJAX_JSON取得 //同期 時間がかかる //↑エラー処理はどうやるの? 「{カード名} API="{API}"」をコンソール表示 objをコンソール表示 obj["cards"]を反復 オラクル = 対象 オラクルキャッシュ登録(オラクル) もし(obj["cards"]の配列要素数)=0ならば 検索キャッシュ@カード名=「《{カード名}》が見つかりません」 //検索用のキーを整形して検索キャッシュに保存する //引数オラクルはJSONデコードしたobjectの各カード ●オラクルキャッシュ登録(オラクル) //オラクル上のカード名(英語) オラクル名 = オラクル["name"] 日本語版 = オラクルから日本語版取得 //キャッシュに日本語版がなく、今回処理するデータに日本語があるなら、キャッシュを破棄 もし検索キャッシュにオラクル名が辞書キー存在感あるならば もしオラクルに日本語版テキスト存在するならば temp =検索キャッシュ@オラクル名 もし(temp[0]に日本語版テキスト存在する)でなければ 検索キャッシュのオラクル名を辞書キー削除 「キー削除:{オラクル名}」をコンソール表示 //処理済みカット 両面カード、分割カード、当事者カード、反転カードはそれぞれの面を配列に入れる もし検索キャッシュにオラクル名が辞書キー存在感あるならば 面数 = (オラクル名で「 // 」の出現回数)+1 登録済個数=(検索キャッシュ@オラクル名)の配列要素数 もし登録済個数>=面数ならば、0を戻す 検索キャッシュ@オラクル名にオラクルを配列追加 違えば 検索キャッシュ@オラクル名 = [] 検索キャッシュ@オラクル名にオラクルを配列追加 //オラクル名をハッシュに登録する 日本語名 = 空 もし日本語版に"name"が辞書キー存在するならば 日本語名 = 日本語版["name"] //両面を登録する //「aaa // bbb」 → 「aaa+bbb」も登録する もし日本語名が空でなければ 日本語名の「 // 」を「+」に置換 英訳キャッシュ@それ = オラクル名 日本語名を「 // 」で区切って反復 英訳キャッシュ@対象 = オラクル名 オラクル名の「 // 」を「+」に置換 英訳キャッシュ@それ = オラクル名 オラクル名を「 // 」で区切って反復 英訳キャッシュ@対象 = オラクル名 1を戻す ●日本語版取得(オラクルから) 日本語版 = {} もしオラクルに"foreignNames"が辞書キー存在するならば 各国語版 = オラクル["foreignNames"] 各国語版を反復 もし対象["language"] = "Japanese"ならば 日本語版 = 対象 抜ける 日本語版を戻す ●日本語版テキスト存在する(オラクルに) もしオラクルに"foreignNames"が辞書キー存在するならば 各国語版 = オラクル["foreignNames"] 各国語版を反復 もし対象["language"] = "Japanese"ならば もし対象に"text"が辞書キー存在するならば 1を戻す 0を戻す ●結果整形(カード名の) card=カード名をトリム //分割カード aaa+bbb → aaa // bbb card=cardの「+」を「+」に置換 //メイス+2は知らない もし英訳キャッシュにcardが辞書キー存在感あるならば オラクル名 = 英訳キャッシュ@card 違えば カード名を戻す もし結果キャッシュにcardが辞書キー存在感あるならば 結果キャッシュ@cardを戻す //《カード名+カード名》 フルカード名 //・第1面カード名 カード名[0] //マナコスト //カードタイプ //ほか // + + + + + + + + //・第2面カード名 カード名[1] //1面のみか多面か 面数 = (オラクル名で「 // 」の出現回数)+1 英語名 = "" 日本語名="" 結果 = 空 検索キャッシュ@オラクル名を反復 オラクル = 対象 英語名 = オラクル["name"] 日本語名="" 日本語版 = オラクルから日本語版取得 もし日本語版に"name"が辞書キー存在するならば 日本語名 = 日本語版["name"] //《{日本語名}/{英語名}》 1回 もし日本語名が空でなければ フルカード名 = 「《{日本語名}/{英語名}》」 違えば フルカード名 = 「《{英語名}》」 フルカード名 = フルカード名の「 // 」を「+」に置換 結果 = フルカード名を結果に一行追加 カード名 = [] もし日本語名が空でなければ カード名 = 日本語名を「 // 」で区切る 違えば カード名 = 英語名を「 // 」で区切る 検索キャッシュ@オラクル名を反復 面 = 対象キー オラクル = 対象 もし面>0ならば 結果 = 結果に「 + + + + + + 」を一行追加 もし面数>1ならば 結果 = 結果に「《{カード名[面]}》」を一行追加 //日本語版があれば取得 日本語版 = オラクルから日本語版取得 //マナコスト・カードタイプ・カードテキスト ["manaCost","type","text"]を反復 もし日本語版に対象が辞書キー存在するならば 結果=日本語版[対象]を結果に一行追加 違えばもしオラクルに対象が辞書キー存在するならば 結果=オラクル[対象]を結果に一行追加 パラメータ = [] //パワー タフネス 初期忠誠度 ["power","toughness","loyalty"]を反復 もしオラクルに対象が辞書キー存在するならば オラクル[対象]をパラメータに配列追加 もし(パラメータの配列要素数)>0ならば パラメータを「/」で配列結合 結果=結果にそれを一行追加 結果キャッシュ@card = 結果 結果を戻す //--------------------------------------↓部品 1回 //つかいかた DOM部品オプション["自動改行"]はオン 「<MTGカードまとめて検索> デッキリストや解説などの文章に含まれる《カード名》を抜きだしてMTGカード検索API(https://api.magicthegathering.io/v1/)に問い合わせするプログラムです。 《カード名》は日本語、英語、または《日本語カード名/英語カード名》の形式です。 単に改行区切りのカード名羅列でも検索できます。 <使いかた> 入力欄に ・カード名を改行区切りのテキスト ・《 》記号を含む文章(《 》の外側は無視されます) を入れてください。 入力欄の下にあるボタンを押すと検索がはじまります。 ※ 検索するカード名は完全一致のみ。 」を改行区切り 反復 対象のラベル作成。 1回 //サンプル挿入ボタン DOM部品オプション["自動改行"]はオフ 「↓入力例のボタンで書式のサンプルを挿入」のラベル作成 改行作成 「入力例1」のボタン作成 それをクリック時には 入力サンプル挿入(1) 「入力例2」のボタン作成 それをクリック時には 入力サンプル挿入(2) 「入力例3」のボタン作成 それをクリック時には 入力サンプル挿入(3) 「入力例4」のボタン作成 それをクリック時には 入力サンプル挿入(4) 改行作成 1回 //入力欄 DOM部品オプション["自動改行"]はオン 「<入力欄>」のラベル作成。 入力欄=「」のテキストエリア作成 入力欄の「幅」に「100%」をDOMスタイル設定 入力欄の「高」に「150px」をDOMスタイル設定 「入力欄の《カード名》を検索開始」のボタン作成 それをクリック時には dom=対象 domの「disabled」にオンをDOM属性設定 検索開始 domの「disabled」にオフをDOM属性設定 状態ラベル=「」のラベル作成 1回 //結果エリア DOM部品オプション["自動改行"]はオン //「--ここに検索中のカード名を表示--」のラベル作成 //検索語エリア=「」のラベル作成 //検索語エリアの「幅」に「90%」をDOMスタイル設定 //検索語エリアの「rows」に「3」をDOM属性設定 「--ここに検索結果を表示--」のラベル作成 結果エリア=「」のテキストエリア作成 結果エリアの「幅」に「100%」をDOMスタイル設定 //結果エリアの「rows」に「30」をDOM属性設定 //効かない? 結果エリアの「高」に「400px」をDOMスタイル設定 DOM部品オプション["自動改行"]はオフ //--------------------------------------↑部品ここまで ●入力サンプル挿入(no) txt="" noで条件分岐 1ならば、 txt=『夢の巣のルールス,王冠泥棒、オーコ,自然の怒りのタイタン、ウーロ』の『,』を改行に置換 2ならば、 txt=『(サンプルテキスト),「Jumpstart」 天使 / Angels (2) カードリスト,,7 《平地》,1 《興隆する荒野》 ,-土地(8)-,,1 《選定された聖歌員》,1 《天使の従者》,1 《天界の処罰者》,1 《解放の天使》,1 《静寂の守り手、リンヴァーラ》,1 《セラの天使》,1 《天使の調停者》 ,-クリーチャー(7)- ,1 《アヴァシンの巻物》,1 《奨励》,1 《天使への昇天》,1 《守護像》,1 《天使の布告》 ,-呪文(5)- 』の『,』を改行に置換 3ならば、 txt=『(サンプルテキスト),2022年1月25日改定,以下のカードはスタンダード・フォーマットにおいて禁止されています。,・《アールンドの天啓》,・《ゼロ除算》,・《不詳の安息地》,・《創造の座、オムナス》』の『,』を改行に置換 4ならば、 txt=『(サンプルテキスト),(https://mtg-jp.com/reading/iwashowdeck/0036189/ より),パイオニアおよびエクスプローラー環境では《湧き出る源、ジェガンサ》を相棒としているデッキを目にする機会が少なくない。, これを相棒に据えているデッキの多くは《魔女のかまど》《大釜の使い魔》などの食物&生け贄エンジンを備えたフードデッキ、あるいは軽量のカードで固められた赤単のバーン、そして《ニヴ=ミゼット再誕》5色デッキなど。』の『,』を改行に置換 違えば txt=『』 入力欄にtxtをテキスト設定 //文章に含まれるカード名を取り出し、配列で戻す ●カード名抽出(txtから) 戻値 = [] txt = txtの『’』を『'』に置換 txt = txtの『,』を『,』に置換 txt = txtの『 』を『 』に置換 txt = txtの『+』を『+』に置換 //メイス+2は知らない もし(txtで「》」の出現回数)>0ならば ex=「.*《(.*)》」を(txtで「》」の出現回数)でリフレイン //exを表示 txt = txtの改行を「」に置換 txtが「/{ex}/」に正規表現マッチ 戻値 = 抽出文字列を配列複製 違えば もし(txtでCR&LFの出現回数)>0ならば 戻値 = txtをCR&LFで区切る 違えば 戻値 = txtを改行で区切る //《日本語/英語》の日本語を取り出す 戻値2 = [] 戻値を反復 もし(対象で「/」の出現回数)>0ならば 対象から「/」まで切り取る 戻値2にそれを配列追加 違えば 戻値2に対象を配列追加 戻値 = 戻値2 戻値を戻す 検索インデックス=0 //没案 ●検索開始 入力欄からテキスト取得 検索リスト = それからカード名抽出 //グローバル変数 //検索語エリアに検索リストをテキスト設定 検索結果更新 状態ラベルに「検索中...」をテキスト設定 0回 //没案 エラーが返ってくることが多い 検索インデックスは0 //グローバル変数 (検索リストの配列要素数)回 0秒後には 検索リスト問い合わせ_不採用 0.5秒待つ 検索リストを反復 カード名 = 対象 状態ラベルに「《{カード名}》を検索中...」をテキスト設定 カード名をオラクル問い合わせ//1件ごと時間がかかる 検索結果更新 状態ラベルに「検索終了」をテキスト設定 //没案 ●検索リスト問い合わせ_不採用 カード名=検索リスト[検索インデックス] 検索インデックス=検索インデックス+1 //グローバル変数 カード名をオラクル問い合わせ //時間がかかる 検索結果更新 ●検索結果更新 //一行文字数 = 36 txt=空 txt=txtに「--------------------」を一行追加 カード名で検索リストを反復 カード名の結果整形 txt=txtにそれを一行追加 txt=txtに「--------------------」を一行追加 //txt=txtを一行文字数で行揃え 結果エリアにtxtをテキスト設定