Merge pull request #53 from misode/refactor

Restructure files
This commit is contained in:
Misode
2019-12-29 18:42:03 +01:00
committed by GitHub
14 changed files with 525 additions and 289 deletions

View File

@@ -1,21 +0,0 @@
name: Update Generators
on:
push:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Update predicate
uses: ad-m/github-push-action@master
with:
repository: misode/predicate
github_token: ${{ secrets.GENERATORS_TOKEN }}
- name: Update advancement
uses: ad-m/github-push-action@master
with:
repository: misode/advancement
github_token: ${{ secrets.GENERATORS_TOKEN }}

58
advancement/index.html Normal file
View File

@@ -0,0 +1,58 @@
<!doctype html>
<html>
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-73024255-2"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-73024255-2');
</script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
<link rel="stylesheet" href="../css/custom.css">
<title data-i18n="title.advancement">Advancement Generator Minecraft 1.15</title>
</head>
<body>
<nav class="navbar navbar-expand-md navbar-dark bg-dark">
<a id="descriptionSpan" class="navbar-brand mb-0 h1" href="../" data-i18n="description.advancement"></a>
<button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav mr-md-auto mb-2 mb-md-0">
<li class="nav-item dropdown">
<a id="versionLabel" class="nav-link dropdown-toggle mr-2" href="" role="button" data-toggle="dropdown"></a>
<div id="versionList" class="dropdown-menu"></div>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle mr-2" href="" role="button" data-toggle="dropdown">
🌎 Language
</a>
<div id="lngList" class="dropdown-menu"></div>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="" role="button" data-toggle="dropdown" data-i18n="theme"></a>
<div id="themeList" class="dropdown-menu"></div>
</li>
</ul>
<span class="ml-0 ml-md-2"><a href="https://github.com/misode/loot-table" style="color: #ddd;" data-i18n="credit"></a></span>
</div>
</nav>
<div class="container" data-generator="advancement"></div>
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/i18next/17.0.6/i18next.min.js" integrity="sha384-DYhccENVzcHrB30my+vk/NvcnUix2+CCUl8Qg7XEzTE1cFLf2IoN5B6c5C38vABH" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/i18next-browser-languagedetector/3.0.1/i18nextBrowserLanguageDetector.min.js" integrity="sha384-14ws1HmRivxp+u6W816e62Gs33Y19jhG4zSJb6pL0pB+gYc+CgFXXp4ZnGXcaOww" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/i18next-xhr-backend/3.0.0/i18nextXHRBackend.min.js" integrity="sha384-dK+VwLEvPDbpKM7G7D/LtbW6W2zlt99nuVTwoYIkMulAedST9Vj9OCRkv2xV8GjD" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-i18next/1.2.1/jquery-i18next.min.js" integrity="sha384-fLTSt6zHOb152KeFkj7kSiXdkyjKf6fjk5bdzWYLDPDo9evwd9PVs3TKoYYaaxdl" crossorigin="anonymous"></script>
<script src="../js/i18n.js" charset="utf-8"></script>
<script src="../js/model.js" charset="utf-8"></script>
<script src="../js/view.js" charset="utf-8"></script>
</body>
</html>

130
components.html Normal file
View File

@@ -0,0 +1,130 @@
<div id="components" class="d-none">
<div class="input-group mt-3" data-type="string">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<input type="text" class="form-control" onchange="updateField(this)" onfocus="this.select()">
</div>
<div class="input-group mt-3" data-type="enum">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<select class="form-control" onchange="updateField(this)">
</select>
</div>
<div class="input-group mt-3" data-type="random">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
<button type="button" class="btn btn-outline-secondary bg-light dropdown-toggle dropdown-toggle-split"
data-toggle="dropdown"></button>
<div class="dropdown-menu">
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)" data-i18n="range.exact"></a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)" data-i18n="range.uniform"></a>
<a class="dropdown-item" value="binomial" onclick="updateRangeType(this)"
data-i18n="range.binomial"></a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateField(this)"
onfocus="this.select()">
<span class="input-group-text rounded-0 range d-none" data-i18n="range.min"></span>
<input type="text" class="form-control range min d-none" value="1" onchange="updateField(this)"
onfocus="this.select()">
<span class="input-group-text rounded-0 range d-none" data-i18n="range.max"></span>
<input type="text" class="form-control range max d-none rounded-right" value="2" onchange="updateField(this)"
onfocus="this.select()">
<span class="input-group-text rounded-0 binomial d-none" data-i18n="range.n"></span>
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateField(this)"
onfocus="this.select()">
<span class="input-group-text rounded-0 binomial d-none" data-i18n="range.p"></span>
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateField(this)"
onfocus="this.select()">
</div>
<div class="input-group mt-3" data-type="range">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
<button type="button" class="btn btn-outline-secondary bg-light dropdown-toggle dropdown-toggle-split"
data-toggle="dropdown"></button>
<div class="dropdown-menu">
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)" data-i18n="range.exact"></a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)" data-i18n="range.range"></a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateField(this)"
onfocus="this.select()">
<span class="input-group-text rounded-0 range d-none" data-i18n="range.min"></span>
<input type="text" class="form-control range min d-none" value="1" onchange="updateField(this)"
onfocus="this.select()">
<span class="input-group-text rounded-0 range d-none" data-i18n="range.max"></span>
<input type="text" class="form-control range max d-none rounded-right" value="2" onchange="updateField(this)"
onfocus="this.select()">
</div>
<div class="input-group mt-3" data-type="boundary">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<span class="input-group-text rounded-0 range" data-i18n="range.min"></span>
<input type="text" class="form-control range min" onchange="updateField(this)" onfocus="this.select()">
<span class="input-group-text rounded-0 range" data-i18n="range.max"></span>
<input type="text" class="form-control range max rounded-right" onchange="updateField(this)"
onfocus="this.select()">
</div>
<div class="input-group mt-3" data-type="boolean">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<div class="btn-group">
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateField(this)"
data-i18n="false"></button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this)"
data-i18n="true"></button>
</div>
</div>
<div class="input-group mt-3" data-type="json">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<textarea type="text" class="form-control code" onchange="updateField(this)" onfocus="this.select()"
style="height: 38px"></textarea>
</div>
<div class="input-group mt-3" data-type="json-list">
<textarea class="form-control code" onchange="updateField(this)" rows=3></textarea>
</div>
<div class="input-group mt-3" data-type="nbt">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<textarea type="text" class="form-control code" onchange="updateField(this)" onfocus="this.select()"
style="height: 38px"></textarea>
</div>
<div class="input-group mt-3" data-type="error">
<div class="input-group-prepend">
<span class="input-group-text text-danger" data-i18n="error"></span>
</div>
<input type="text" class="form-control bg-light text-danger" data-name readonly></input>
</div>
<div class="mt-3" data-type="set">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<div class="input-group-append">
<button type="button"
class="btn btn-outline-secondary bg-light dropdown-toggle dropdown-toggle-split rounded-right"
data-toggle="dropdown"></button>
<div class="dropdown-menu scrollable-menu">
</div>
</div>
</div>
</div>
<div data-type="map">
<div class="input-group mt-3">
<div class="input-group-prepend">
<label class="input-group-text" data-name="1"></label>
</div>
<input type="text" class="form-control">
<div class="input-group-append">
<button class="btn btn-dark" type="button" onclick="addToMap(this)" data-name="2"></button>
</div>
</div>
</div>
</div>

View File

@@ -100,6 +100,15 @@ textarea.invalid:focus {
overflow-x: scroll; overflow-x: scroll;
} }
.card a {
color: #000 !important;
}
.card a:hover {
color: #333 !important;
text-decoration: none;
}
body[data-style="dark"] { body[data-style="dark"] {
background-color: #222529; background-color: #222529;
} }
@@ -208,3 +217,11 @@ body[data-style="dark"] .help-tooltip {
color: #fff; color: #fff;
border-color: #24282c; border-color: #24282c;
} }
body[data-style="dark"] .card a {
color: #fff !important;
}
body[data-style="dark"] .card a:hover {
color: #ccc !important;
}

27
i18n.js
View File

@@ -1,27 +0,0 @@
const lngs = [
['en', 'English'],
['ru', 'Русский'],
['zh-CN', '简体中文']
]
lngs.forEach(v => $('#lngList').append(`<a class="dropdown-item" onclick="changeLng('${v[0]}')">${v[1]}</a>`))
i18next
.use(i18nextBrowserLanguageDetector)
.use(i18nextXHRBackend)
.init({
backend: { loadPath: 'locales/{{lng}}.json' },
fallbackLng: 'en',
whitelist: lngs.map(v => v[0]),
keySeparator: false
})
.then(() => {
jqueryI18next.init(i18next, $, { parseDefaultValueFromContent: false })
updateView()
})
function changeLng(code) {
i18next.changeLanguage(code).then(() => {
updateView()
})
}

View File

@@ -11,196 +11,53 @@
</script> </script>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title data-i18n="title.loot-table"></title> <title data-i18n="title">Minecraft Generators 1.13 1.14 1.15</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
<link rel="stylesheet" href="custom.css"> <link rel="stylesheet" href="css/custom.css">
</head> </head>
<body> <body>
<nav class="navbar navbar-expand-md navbar-dark bg-dark"> <nav class="navbar navbar-expand-md navbar-dark bg-dark">
<span id="descriptionSpan" class="navbar-brand mb-0 h1" data-i18n="description.loot-table"></span> <span id="descriptionSpan" class="navbar-brand mb-0 h1" data-i18n="description"></span>
<button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#collapsibleNavbar"> <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="collapse navbar-collapse" id="collapsibleNavbar"> <div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav mr-md-auto mb-2 mb-md-0"> <ul class="navbar-nav mr-md-auto mb-2 mb-md-0">
<li class="nav-item dropdown">
<a id="versionLabel" class="nav-link dropdown-toggle mr-2" href="" role="button" data-toggle="dropdown"></a>
<div id="versionList" class="dropdown-menu"></div>
</li>
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link dropdown-toggle mr-2" href="" role="button" data-toggle="dropdown"> <a class="nav-link dropdown-toggle mr-2" href="" role="button" data-toggle="dropdown">
🌎 Language 🌎 Language
</a> </a>
<div id="lngList" class="dropdown-menu"></div> <div id="lngList" class="dropdown-menu"></div>
</li> </li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="" role="button" data-toggle="dropdown" data-i18n="theme"></a>
<div class="dropdown-menu">
<a class="dropdown-item" onclick="changeTheme('light')" data-i18n="theme.light"></a>
<a class="dropdown-item" onclick="changeTheme('dark')" data-i18n="theme.dark"></a>
</div>
</li>
</ul> </ul>
<span class="ml-0 ml-md-2"><a href="https://github.com/misode/loot-table" style="color: #ddd;" data-i18n="credit"></a></span> <span class="ml-0 ml-md-2"><a href="https://github.com/misode/loot-table" style="color: #ddd;" data-i18n="credit"></a></span>
</div> </div>
</nav> </nav>
<div class="container d-none"> <div class="container mt-4">
<div class="row my-4"> <div class="card-group">
<div class="col-12 col-lg-7 mb-3 structure-container" data-index="root"> <div class="card bg-success mb-3">
<div id="lootTableToolbar" class="input-group d-none mb-3"> <a href="loot-table">
<button type="button" class="btn btn-success d-block mr-3 float-left" onclick="addComponent(this, 'pools')" data-field="table" data-i18n="pool_add"></button> <div class="card-body">
<div class="input-group-prepend table-type"> <h5 class="card-title" data-i18n="title.loot-table"></h5>
<span class="input-group-text rounded-left" data-i18n="table.type"></span> <p class="card-subtitle">Minecraft 1.13, 1.14, 1.15</p>
</div> </div>
<select id="tableType" class="form-control mr-3 rounded-right table-type" style="max-width: 9em;" onchange="updateTableType(this)"></select> </a>
<div class="custom-control custom-checkbox mr-3" style="margin: auto 0"> </div>
<input type="checkbox" class="custom-control-input" id="luckBased" onchange="updateLuckBased(this)"> <div class="card bg-secondary mb-3">
<label class="custom-control-label" for="luckBased" data-i18n="luck_based"></label> <a href="advancement">
<div class="card-body">
<h5 class="card-title" data-i18n="title.advancement"></h5>
<p class="card-subtitle">Minecraft 1.15</p>
</div> </div>
<div id="showSourceButton" class="ml-auto d-none"> </a>
<button type="button" class="btn btn-secondary" onclick="showSource()" data-i18n="show_source"></button> </div>
<div class="card bg-info mb-3">
<a href="predicate">
<div class="card-body">
<h5 class="card-title" data-i18n="title.predicate"></h5>
<p class="card-subtitle">Minecraft 1.15</p>
</div> </div>
</div> </a>
<div id="structure" class="loot-table" data-index="root">
</div>
</div>
<div class="col-12 col-lg-5 source-container">
<div class="mb-3 float-lg-right source-menu">
<div class="input-group">
<div class="btn-group">
<button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" data-i18n="more"></button>
<div class="dropdown-menu">
<a class="dropdown-item" onclick="updateIndentation(2)" data-i18n="2_spaces"></a>
<a class="dropdown-item" onclick="updateIndentation(4)" data-i18n="4_spaces"></a>
<a class="dropdown-item" onclick="updateIndentation('\t')" data-i18n="tabs"></a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" onclick="hideSource()" data-i18n="hide_source"></a>
</div>
</div>
<button id="linkSource" type="button" class="btn btn-secondary ml-3" onclick="linkSource()" data-i18n="share"></button>
<button type="button" class="btn btn-secondary ml-3" onclick="copySource()" data-i18n="copy"></button>
</div>
</div>
<div id="copyContainer" class="mb-3 d-none">
<input id="copyTextarea" rows="1" class="form-control"></input>
<button id="copy" type="button" class="btn btn-block btn-secondary mt-2" onclick="copyLink()" data-i18n="copy"></button>
</div>
<textarea id="source" class="form-control code" onchange="updateSource()" rows="19" spellcheck="false"></textarea>
</div>
</div>
</div>
<div class="d-none">
<div id="components">
<div class="input-group mt-3" data-type="string">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<input type="text" class="form-control" onchange="updateField(this)" onfocus="this.select()">
</div>
<div class="input-group mt-3" data-type="enum">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<select class="form-control" onchange="updateField(this)">
</select>
</div>
<div class="input-group mt-3" data-type="random">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
<button type="button" class="btn btn-outline-secondary bg-light dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
<div class="dropdown-menu">
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)" data-i18n="range.exact"></a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)" data-i18n="range.uniform"></a>
<a class="dropdown-item" value="binomial" onclick="updateRangeType(this)" data-i18n="range.binomial"></a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateField(this)" onfocus="this.select()">
<span class="input-group-text rounded-0 range d-none" data-i18n="range.min"></span>
<input type="text" class="form-control range min d-none" value="1" onchange="updateField(this)" onfocus="this.select()">
<span class="input-group-text rounded-0 range d-none" data-i18n="range.max"></span>
<input type="text" class="form-control range max d-none rounded-right" value="2" onchange="updateField(this)" onfocus="this.select()">
<span class="input-group-text rounded-0 binomial d-none" data-i18n="range.n"></span>
<input type="text" class="form-control binomial n d-none" value="1" onchange="updateField(this)" onfocus="this.select()">
<span class="input-group-text rounded-0 binomial d-none" data-i18n="range.p"></span>
<input type="text" class="form-control binomial p d-none rounded-right" value="0.5" onchange="updateField(this)" onfocus="this.select()">
</div>
<div class="input-group mt-3" data-type="range">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
<button type="button" class="btn btn-outline-secondary bg-light dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
<div class="dropdown-menu">
<a class="dropdown-item" value="exact" onclick="updateRangeType(this)" data-i18n="range.exact"></a>
<a class="dropdown-item" value="range" onclick="updateRangeType(this)" data-i18n="range.range"></a>
</div>
</div>
<input type="text" class="form-control exact d-none rounded-right" value="1" onchange="updateField(this)" onfocus="this.select()">
<span class="input-group-text rounded-0 range d-none" data-i18n="range.min"></span>
<input type="text" class="form-control range min d-none" value="1" onchange="updateField(this)" onfocus="this.select()">
<span class="input-group-text rounded-0 range d-none" data-i18n="range.max"></span>
<input type="text" class="form-control range max d-none rounded-right" value="2" onchange="updateField(this)" onfocus="this.select()">
</div>
<div class="input-group mt-3" data-type="boundary">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<span class="input-group-text rounded-0 range" data-i18n="range.min"></span>
<input type="text" class="form-control range min" onchange="updateField(this)" onfocus="this.select()">
<span class="input-group-text rounded-0 range" data-i18n="range.max"></span>
<input type="text" class="form-control range max rounded-right" onchange="updateField(this)" onfocus="this.select()">
</div>
<div class="input-group mt-3" data-type="boolean">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<div class="btn-group">
<button type="button" value="false" class="btn btn-secondary rounded-0" onclick="updateField(this)" data-i18n="false"></button>
<button type="button" value="true" class="btn btn-secondary" onclick="updateField(this)" data-i18n="true"></button>
</div>
</div>
<div class="input-group mt-3" data-type="json">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<textarea type="text" class="form-control code" onchange="updateField(this)" onfocus="this.select()" style="height: 38px"></textarea>
</div>
<div class="input-group mt-3" data-type="json-list">
<textarea class="form-control code" onchange="updateField(this)" rows=3></textarea>
</div>
<div class="input-group mt-3" data-type="nbt">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<textarea type="text" class="form-control code" onchange="updateField(this)" onfocus="this.select()" style="height: 38px"></textarea>
</div>
<div class="input-group mt-3" data-type="error">
<div class="input-group-prepend">
<span class="input-group-text text-danger" data-i18n="error"></span>
</div>
<input type="text" class="form-control bg-light text-danger" data-name readonly></input>
</div>
<div class="mt-3" data-type="set">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text" data-name></span>
</div>
<div class="input-group-append">
<button type="button" class="btn btn-outline-secondary bg-light dropdown-toggle dropdown-toggle-split rounded-right" data-toggle="dropdown"></button>
<div class="dropdown-menu scrollable-menu">
</div>
</div>
</div>
</div>
<div data-type="map">
<div class="input-group mt-3">
<div class="input-group-prepend">
<label class="input-group-text" data-name="1"></label>
</div>
<input type="text" class="form-control">
<div class="input-group-append">
<button class="btn btn-dark" type="button" onclick="addToMap(this)" data-name="2"></button>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -212,8 +69,9 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/i18next-browser-languagedetector/3.0.1/i18nextBrowserLanguageDetector.min.js" integrity="sha384-14ws1HmRivxp+u6W816e62Gs33Y19jhG4zSJb6pL0pB+gYc+CgFXXp4ZnGXcaOww" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/i18next-browser-languagedetector/3.0.1/i18nextBrowserLanguageDetector.min.js" integrity="sha384-14ws1HmRivxp+u6W816e62Gs33Y19jhG4zSJb6pL0pB+gYc+CgFXXp4ZnGXcaOww" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/i18next-xhr-backend/3.0.0/i18nextXHRBackend.min.js" integrity="sha384-dK+VwLEvPDbpKM7G7D/LtbW6W2zlt99nuVTwoYIkMulAedST9Vj9OCRkv2xV8GjD" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/i18next-xhr-backend/3.0.0/i18nextXHRBackend.min.js" integrity="sha384-dK+VwLEvPDbpKM7G7D/LtbW6W2zlt99nuVTwoYIkMulAedST9Vj9OCRkv2xV8GjD" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-i18next/1.2.1/jquery-i18next.min.js" integrity="sha384-fLTSt6zHOb152KeFkj7kSiXdkyjKf6fjk5bdzWYLDPDo9evwd9PVs3TKoYYaaxdl" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-i18next/1.2.1/jquery-i18next.min.js" integrity="sha384-fLTSt6zHOb152KeFkj7kSiXdkyjKf6fjk5bdzWYLDPDo9evwd9PVs3TKoYYaaxdl" crossorigin="anonymous"></script>
<script src="i18n.js" charset="utf-8"></script> <script src="js/i18n.js" charset="utf-8"></script>
<script src="view.js" charset="utf-8"></script> <script src="js/model.js" charset="utf-8"></script>
<script src="model.js" charset="utf-8"></script> <script src="js/view.js" charset="utf-8"></script>
<script>initLng().then(() => { $('html').localize(); });</script>
</body> </body>
</html> </html>

32
js/i18n.js Normal file
View File

@@ -0,0 +1,32 @@
const lngs = [
['en', 'English'],
['ru', 'Русский'],
['zh-CN', '简体中文']
]
lngs.forEach(v => $('#lngList').append(`<a class="dropdown-item" onclick="changeLng('${v[0]}')">${v[1]}</a>`))
function initLng() {
return i18next
.use(i18nextBrowserLanguageDetector)
.use(i18nextXHRBackend)
.init({
backend: { loadPath: '../locales/{{lng}}.json' },
fallbackLng: 'en',
whitelist: lngs.map(v => v[0]),
keySeparator: false
})
.then(() => {
jqueryI18next.init(i18next, $, { parseDefaultValueFromContent: false });
});
}
function changeLng(code) {
i18next.changeLanguage(code).then(() => {
if ('listeners' in window) {
listeners.forEach(l => l());
} else {
$('html').localize();
}
})
}

View File

@@ -1,30 +1,67 @@
let indentation = 2;
let luckBased = false;
let historyBuffer = 100;
let history = ['{}'];
let historyIndex = 0;
let structure;
let components;
let collections;
let table = {};
let listeners = [];
const generators = {
'advancement': ['1.15'],
'loot-table': ['1.13', '1.14', '1.15'],
'predicate': ['1.15']
}
function addListener(listener) {
listeners.push(listener);
listener();
}
loadGenerator($('[data-generator]').attr('data-generator'));
function loadGenerator(generator) {
if (!generator) return;
const versions = generators[generator] || [];
versions.forEach(v => {
$('#versionList').append(`<a class="dropdown-item" onclick="changeVersion('${v}')">${v}</a>`)
});
const promises = [initShared(), initLng(), loadVersion(generator, '1.15')];
Promise.all(promises).then(() => {
invalidated()
});
}
function loadVersion(generator, version) {
return $.getJSON('../schemas/' + version + '.json', json => {
structure = json.roots.find(e => e.id === generator);
table = structure.default;
components = json.components;
collections = json.collections;
}).fail((jqXHR, textStatus, errorThrown) => {
let message = 'Failed loading ' + version + ' schema';
structure = {};
console.error(message + '\n' + errorThrown);
}).always(() => {
$('#versionLabel').text(version);
});
}
async function initShared() {
const components = await fetch('../components.html').then(r => r.text());
const shared = await fetch('../shared.html').then(r => r.text());
$('body').append(components);
$('div.container').append(shared);
}
$("#source").val(''); $("#source").val('');
$('#luckBased').prop('checked', false); $('#luckBased').prop('checked', false);
$('#tableType').val("minecraft:generic"); $('#tableType').val("minecraft:generic");
$('#indentationSelect').val("2"); $('#indentationSelect').val("2");
let indentation = 2;
let luckBased = false;
let table = {
type: "minecraft:generic",
pools: [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "minecraft:stone"
}
]
}
]
};
let historyBuffer = 100;
let history = ['{}'];
let historyIndex = 0;
invalidated();
const params = new URLSearchParams(window.location.search); const params = new URLSearchParams(window.location.search);
if (params.has('q')) { if (params.has('q')) {
$('#source').val(atob(params.get('q'))); $('#source').val(atob(params.get('q')));
@@ -49,7 +86,7 @@ function undo() {
if (historyIndex > 0) { if (historyIndex > 0) {
historyIndex -= 1; historyIndex -= 1;
table = JSON.parse(history[historyIndex]); table = JSON.parse(history[historyIndex]);
updateView(); listeners.forEach(l => l());
} }
} }
@@ -57,7 +94,7 @@ function redo() {
if (historyIndex < history.length - 1) { if (historyIndex < history.length - 1) {
historyIndex += 1; historyIndex += 1;
table = JSON.parse(history[historyIndex]); table = JSON.parse(history[historyIndex]);
updateView(); listeners.forEach(l => l());
} }
} }
@@ -73,7 +110,7 @@ function invalidated() {
history = history.slice(0, historyIndex); history = history.slice(0, historyIndex);
history.push(JSON.stringify(table)); history.push(JSON.stringify(table));
} }
updateView(); listeners.forEach(l => l());
} }
function updateTableType() { function updateTableType() {
@@ -219,10 +256,7 @@ function addToSet(el, array) {
function removeFromSet(el, array) { function removeFromSet(el, array) {
let parent = getParent(el); let parent = getParent(el);
console.warn(parent[array]);
console.log($(el).attr('value'));
let index = parent[array].indexOf($(el).attr('value')); let index = parent[array].indexOf($(el).attr('value'));
console.log(parent, index);
if (index > -1) { if (index > -1) {
parent[array].splice(index, 1); parent[array].splice(index, 1);
invalidated(); invalidated();

View File

@@ -1,48 +1,13 @@
let structure;
let components;
let collections;
const generators = { const themes = ["light", "dark"];
'advancement': ['1.15'],
'loot-table': ['1.13', '1.14', '1.15'],
'predicate': ['1.15']
}
const generator = window.location.pathname.replace(/\/$/, '').replace(/^\//, ''); themes.forEach(v => $('#themeList').append(`<a class="dropdown-item" onclick="changeTheme('${v}')" data-i18n="theme.${v}"></a>`));
generators[generator].forEach(v => {
$('#versionList').append(`<a class="dropdown-item" onclick="changeVersion('${v}')">${v}</a>`)
});
changeVersion('1.15'); addListener(updateView);
function changeVersion(version) {
$.getJSON('schemas/' + version + '.json', json => {
if (json.root) {
structure = json.root;
} else if (json.roots) {
structure = json.roots.find(e => e.id === generator) || json.roots[0] ;
}
components = json.components;
collections = json.collections;
}).fail((jqXHR, textStatus, errorThrown) => {
let message = 'Failed loading ' + version + ' schema';
structure = {
fields: [
{
id: 'pools',
type: 'error',
message: message
}
]
};
console.error(message + '\n' + errorThrown);
}).always(() => {
$('#versionLabel').text(version);
updateView();
});
}
changeTheme(localStorage.getItem('theme')) changeTheme(localStorage.getItem('theme'))
function changeTheme(theme) { function changeTheme(theme) {
console.log(theme);
if (theme === null) { if (theme === null) {
theme = 'light'; theme = 'light';
} }
@@ -65,7 +30,7 @@ function updateView() {
} }
function generateSourceAndView(data, struct) { function generateSourceAndView(data, struct) {
if (generator === 'loot-table') { if (struct.id === 'loot-table') {
$('#lootTableToolbar').removeClass('d-none'); $('#lootTableToolbar').removeClass('d-none');
$('#structure').attr('data-index', 'pools'); $('#structure').attr('data-index', 'pools');
return generateTable(data, struct); return generateTable(data, struct);

View File

@@ -128,6 +128,7 @@
"damage_source.is_magic": "Magic", "damage_source.is_magic": "Magic",
"damage_source.is_projectile": "Projectile", "damage_source.is_projectile": "Projectile",
"damage_source.source_entity": "Source Entity", "damage_source.source_entity": "Source Entity",
"description": "Minecraft Generators",
"description.loot-table": "Loot Table Generator for Minecraft", "description.loot-table": "Loot Table Generator for Minecraft",
"description.predicate": "Predicate Generator for Minecraft", "description.predicate": "Predicate Generator for Minecraft",
"description.advancement": "Advancement Generator for Minecraft", "description.advancement": "Advancement Generator for Minecraft",
@@ -421,6 +422,7 @@
"theme": "Theme", "theme": "Theme",
"theme.dark": "Dark", "theme.dark": "Dark",
"theme.light": "Light", "theme.light": "Light",
"title": "Minecraft Generators",
"title.loot-table": "Loot Table Generator", "title.loot-table": "Loot Table Generator",
"title.predicate": "Predicate Generator", "title.predicate": "Predicate Generator",
"title.advancement": "Advancement Generator", "title.advancement": "Advancement Generator",

58
loot-table/index.html Normal file
View File

@@ -0,0 +1,58 @@
<!doctype html>
<html>
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-73024255-2"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-73024255-2');
</script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
<link rel="stylesheet" href="../css/custom.css">
<title data-i18n="title.loot-table">Loot Table Generator Minecraft 1.15</title>
</head>
<body>
<nav class="navbar navbar-expand-md navbar-dark bg-dark">
<a id="descriptionSpan" class="navbar-brand mb-0 h1" href="../" data-i18n="description.loot-table"></a>
<button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav mr-md-auto mb-2 mb-md-0">
<li class="nav-item dropdown">
<a id="versionLabel" class="nav-link dropdown-toggle mr-2" href="" role="button" data-toggle="dropdown"></a>
<div id="versionList" class="dropdown-menu"></div>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle mr-2" href="" role="button" data-toggle="dropdown">
🌎 Language
</a>
<div id="lngList" class="dropdown-menu"></div>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="" role="button" data-toggle="dropdown" data-i18n="theme"></a>
<div id="themeList" class="dropdown-menu"></div>
</li>
</ul>
<span class="ml-0 ml-md-2"><a href="https://github.com/misode/loot-table" style="color: #ddd;" data-i18n="credit"></a></span>
</div>
</nav>
<div class="container" data-generator="loot-table"></div>
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/i18next/17.0.6/i18next.min.js" integrity="sha384-DYhccENVzcHrB30my+vk/NvcnUix2+CCUl8Qg7XEzTE1cFLf2IoN5B6c5C38vABH" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/i18next-browser-languagedetector/3.0.1/i18nextBrowserLanguageDetector.min.js" integrity="sha384-14ws1HmRivxp+u6W816e62Gs33Y19jhG4zSJb6pL0pB+gYc+CgFXXp4ZnGXcaOww" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/i18next-xhr-backend/3.0.0/i18nextXHRBackend.min.js" integrity="sha384-dK+VwLEvPDbpKM7G7D/LtbW6W2zlt99nuVTwoYIkMulAedST9Vj9OCRkv2xV8GjD" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-i18next/1.2.1/jquery-i18next.min.js" integrity="sha384-fLTSt6zHOb152KeFkj7kSiXdkyjKf6fjk5bdzWYLDPDo9evwd9PVs3TKoYYaaxdl" crossorigin="anonymous"></script>
<script src="../js/i18n.js" charset="utf-8"></script>
<script src="../js/model.js" charset="utf-8"></script>
<script src="../js/view.js" charset="utf-8"></script>
</body>
</html>

58
predicate/index.html Normal file
View File

@@ -0,0 +1,58 @@
<!doctype html>
<html>
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-73024255-2"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-73024255-2');
</script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
<link rel="stylesheet" href="../css/custom.css">
<title data-i18n="title.predicate">Predicate Generator Minecraft 1.15</title>
</head>
<body>
<nav class="navbar navbar-expand-md navbar-dark bg-dark">
<a id="descriptionSpan" class="navbar-brand mb-0 h1" href="../" data-i18n="description.predicate"></a>
<button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav mr-md-auto mb-2 mb-md-0">
<li class="nav-item dropdown">
<a id="versionLabel" class="nav-link dropdown-toggle mr-2" href="" role="button" data-toggle="dropdown"></a>
<div id="versionList" class="dropdown-menu"></div>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle mr-2" href="" role="button" data-toggle="dropdown">
🌎 Language
</a>
<div id="lngList" class="dropdown-menu"></div>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="" role="button" data-toggle="dropdown" data-i18n="theme"></a>
<div id="themeList" class="dropdown-menu"></div>
</li>
</ul>
<span class="ml-0 ml-md-2"><a href="https://github.com/misode/loot-table" style="color: #ddd;" data-i18n="credit"></a></span>
</div>
</nav>
<div class="container" data-generator="predicate"></div>
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/i18next/17.0.6/i18next.min.js" integrity="sha384-DYhccENVzcHrB30my+vk/NvcnUix2+CCUl8Qg7XEzTE1cFLf2IoN5B6c5C38vABH" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/i18next-browser-languagedetector/3.0.1/i18nextBrowserLanguageDetector.min.js" integrity="sha384-14ws1HmRivxp+u6W816e62Gs33Y19jhG4zSJb6pL0pB+gYc+CgFXXp4ZnGXcaOww" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/i18next-xhr-backend/3.0.0/i18nextXHRBackend.min.js" integrity="sha384-dK+VwLEvPDbpKM7G7D/LtbW6W2zlt99nuVTwoYIkMulAedST9Vj9OCRkv2xV8GjD" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-i18next/1.2.1/jquery-i18next.min.js" integrity="sha384-fLTSt6zHOb152KeFkj7kSiXdkyjKf6fjk5bdzWYLDPDo9evwd9PVs3TKoYYaaxdl" crossorigin="anonymous"></script>
<script src="../js/i18n.js" charset="utf-8"></script>
<script src="../js/model.js" charset="utf-8"></script>
<script src="../js/view.js" charset="utf-8"></script>
</body>
</html>

View File

@@ -26,14 +26,31 @@
"translate": "pool", "translate": "pool",
"values": "pool" "values": "pool"
} }
] ],
"default": {
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "minecraft:stone"
}
]
}
]
}
}, },
{ {
"id": "predicate", "id": "predicate",
"title": "title.predicate", "title": "title.predicate",
"description": "description.predicate", "description": "description.predicate",
"type": "object", "type": "object",
"value": "condition" "value": "condition",
"default": {
"condition": "minecraft:entity_properties",
"predicate": {}
}
}, },
{ {
"id": "advancement", "id": "advancement",
@@ -156,7 +173,15 @@
"value": "criterion" "value": "criterion"
} }
} }
] ],
"default": {
"criteria": {
"requirement": {
"trigger": "minecraft:location",
"conditions": {}
}
}
}
} }
], ],
"components": [ "components": [

47
shared.html Normal file
View File

@@ -0,0 +1,47 @@
<div class="row my-4">
<div class="col-12 col-lg-7 mb-3 structure-container" data-index="root">
<div id="lootTableToolbar" class="input-group d-none mb-3">
<button type="button" class="btn btn-success d-block mr-3 float-left" onclick="addComponent(this, 'pools')"data-field="table" data-i18n="pool_add"></button>
<div class="input-group-prepend table-type">
<span class="input-group-text rounded-left" data-i18n="table.type"></span>
</div>
<select id="tableType" class="form-control mr-3 rounded-right table-type" style="max-width: 9em;" onchange="updateTableType(this)"></select>
<div class="custom-control custom-checkbox mr-3" style="margin: auto 0">
<input type="checkbox" class="custom-control-input" id="luckBased" onchange="updateLuckBased(this)">
<label class="custom-control-label" for="luckBased" data-i18n="luck_based"></label>
</div>
<div id="showSourceButton" class="ml-auto d-none">
<button type="button" class="btn btn-secondary" onclick="showSource()" data-i18n="show_source"></button>
</div>
</div>
<div id="structure" class="loot-table" data-index="root">
</div>
</div>
<div class="col-12 col-lg-5 source-container">
<div class="mb-3 float-lg-right source-menu">
<div class="input-group">
<div class="btn-group">
<button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown"
data-i18n="more"></button>
<div class="dropdown-menu">
<a class="dropdown-item" onclick="updateIndentation(2)" data-i18n="2_spaces"></a>
<a class="dropdown-item" onclick="updateIndentation(4)" data-i18n="4_spaces"></a>
<a class="dropdown-item" onclick="updateIndentation('\t')" data-i18n="tabs"></a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" onclick="hideSource()" data-i18n="hide_source"></a>
</div>
</div>
<button id="linkSource" type="button" class="btn btn-secondary ml-3" onclick="linkSource()"
data-i18n="share"></button>
<button type="button" class="btn btn-secondary ml-3" onclick="copySource()" data-i18n="copy"></button>
</div>
</div>
<div id="copyContainer" class="mb-3 d-none">
<input id="copyTextarea" rows="1" class="form-control"></input>
<button id="copy" type="button" class="btn btn-block btn-secondary mt-2" onclick="copyLink()"
data-i18n="copy"></button>
</div>
<textarea id="source" class="form-control code" onchange="updateSource()" rows="19"
spellcheck="false"></textarea>
</div>
</div>