JSFiddle - React, Tailwind, and code Playground
by Eclair
HTML
<dl style="float:left;">
<dt style="float:left;">凡例</dt>
<dd class="capturable">捕獲可能</dd>
<dd class="buyable">購入可能</dd>
</dl>
<form name="config" style="position:relative; left:50px; top:15px;">
<input type="checkbox" id="showbuyable" name="showbuyable" value="showbuyable">購入可能な配合も表示</form>
<div style="clear:both;"></div> <textarea id="recipeList" style="display:none">
|No|誕生|基本|生贄|Lv|店|備考|h
|001|カミルドラゴン|アースドラゴン|恨みの地震剣||||
|002|アクアドラゴン|シードラゴン|恨みの氷結剣||||
|003|ケノルドラゴン|ファイアドラゴン|恨みの火炎剣||||
|004|ディオリキス|サンダードラゴン|恨みの電撃剣||||
|005|ディケイル|ドラゴントゥース|キマイラ|||歪竜。オルファンルート限定。<br>一つずつ配合していくイベント。|
|006|メルケラス|ディケイル|グルルフ|||~|
|007|ルン=フィアレス|メルケラス|アウエラガーゴイル|||~|
|008|ゼラウラス|ルン=フィアレス|凌恋の霊姫|||~|
|009|ペルソアティス|ゼラウラス|ディオリキス|||~|
|010|ハイゴブリン|ゴブリン|ゴブリン|1|||
|011|ゴブリン指揮官|ハイゴブリン|ハイゴブリン||○||
|012|ゴブリン大将軍|ゴブリン指揮官|ゴブリン指揮官||||
|013|ゴウモール|ゴブリン|オーク|1|||
|014|ハイゴウモール|ゴウモール|オーク指揮官|2|||
|015|オークメイジ|オーク|ゴブリン|1|||
|016|オーク指揮官|オークメイジ|オーク|2|○||
|017|オーク大将軍|オーク指揮官|オーク指揮官||||
|018|オークナイト|オーク指揮官|ゴブリン指揮官||||
|019|オークパラディン|ゴブリン大将軍|トリエスタル||||
|020|トトリス|トリャーユ|肉食アースマン|2|||
|021|トリエスタル|トトリス|アースエクス||||
|022|肉食アースマン|アースマン|アースマン|2|○||
|023|アースエクス|水流アースマン|肉食アースマン||○||
|024|水流アースマン|肉食アースマン|ティエネー|2|||
|025|強酸アースマン|肉食アースマン|シルフィ|2|||
|026|泡油アースマン|肉食アースマン|ファマ|2|||
|027|ウンディーネ|ティエネー|ティエネー|1|||
|028|セイレン|ウンディーネ|ジルニー|3|||
|029|モリガン・モルガナ|ニール|ザフィエル||||
|030|ヴィリニ|ティエネー|トリャーユ|2|||
|031|ヴュリテュン|ヴィリニ|トトリス||||
|032|レニア・ヌイ|ヴュリテュン|トリエスタル||||
|033|グルムンド|ファラム|ファマ|2|||
|034|グルルフ|グルムンド|ファラ・ヌイ||○||
|035|ネミルユイチリ|ユイチリ|トリャーユ|2|||
|036|ニルユイチリ|ユイチリ|ファクシー||||
|037|ジルニー|シルフィ|ハルピュア|2|○||
|038|ルファニー|ジルニー|ルトハルピュア||||
...
CSS
.capturable {
color:blue;
}
.buyable {
color:red;
}
.anything {
color:green;
}
html, body {
position:fixed;
overflow:hidden;
width:100%;
height:100%;
}
#list {
font-size:small;
column-width:110px;
-moz-column-width:110px;
-webkit-column-width:110px;
-o-column-width:110px;
-ms-column-width:110px;
}
#result {
position:relative;
overflow:auto;
top:10px;
left:10px;
height:100%;
}
JavaScript
var recipeListStr = jQuery('#recipeList').val();
var questListStr = jQuery('#questList').val();
var parseStr = function (str) {
var spl = str.split("\n");
var i, l;
var ret = [];
for (i = 0; i < spl.length; i++) {
if (spl[i]) {
l = spl[i].split('|');
if (l[l.length - 1] != 'h') {
l.shift();
l.pop();
ret.push(l);
}
}
}
return ret;
};
var recipe = function (s) {
var list = parseStr(s);
var ret = {};
for (var i = 0; i < list.length; i++) {
if (list[1]) {
// No|誕生|基本|生贄|Lv|店|備考|h
ret[list[i][1]] = {
no: list[i][0],
name: list[i][1],
left: list[i][2],
right: list[i][3],
lv: list[i][4],
shop: list[i][5],
other: list[i][6]
};
}
}
return ret;
}(recipeListStr);
var capture = function (s) {
var list = parseStr(s);
var ret = {};
for (var i = 0; i < list.length; i++) {
if (list[i]) {
// No|誕生|基本|生贄|Lv|店|備考|h
ret[list[i][2]] = true;
}
}
return ret;
}(questListStr);
var shop = function (s) {
var list = parseStr(s);
var ret = {};
for (var i = 0; i < list.length; i++) {
if (list[i] && list[i][5]) {
ret[list[i][1]] = true;
}
}
return ret;
}(recipeListStr);
function getRecipe(target, indent) {
var ret = [];
console.log(target);
var currentItem = {
"target": target,
"indent": indent
};
var space = {
"target": "",
"indent": -1
};
ret.push(currentItem);
ret.push(space);
var r0 = target.left.split("/");
for (var h = 0; h < r0.length; h++) {
if (recipe[r0[h]] && (document.getElementById('showbuyable').checked || shop[r0[h]] !== true)) {
var rl = getRecipe(recipe[r0[h]],...