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;
}
.card a {
color: #000 !important;
}
.card a:hover {
color: #333 !important;
text-decoration: none;
}
body[data-style="dark"] {
background-color: #222529;
}
@@ -208,3 +217,11 @@ body[data-style="dark"] .help-tooltip {
color: #fff;
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>
<meta charset="utf-8">
<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="custom.css">
<link rel="stylesheet" href="css/custom.css">
</head>
<body>
<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">
<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 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>
<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 d-none">
<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 class="container mt-4">
<div class="card-group">
<div class="card bg-success mb-3">
<a href="loot-table">
<div class="card-body">
<h5 class="card-title" data-i18n="title.loot-table"></h5>
<p class="card-subtitle">Minecraft 1.13, 1.14, 1.15</p>
</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>
</a>
</div>
<div class="card bg-secondary mb-3">
<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 id="showSourceButton" class="ml-auto d-none">
<button type="button" class="btn btn-secondary" onclick="showSource()" data-i18n="show_source"></button>
</a>
</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 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>
</a>
</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-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="i18n.js" charset="utf-8"></script>
<script src="view.js" charset="utf-8"></script>
<script src="model.js" charset="utf-8"></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>
<script>initLng().then(() => { $('html').localize(); });</script>
</body>
</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('');
$('#luckBased').prop('checked', false);
$('#tableType').val("minecraft:generic");
$('#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);
if (params.has('q')) {
$('#source').val(atob(params.get('q')));
@@ -49,7 +86,7 @@ function undo() {
if (historyIndex > 0) {
historyIndex -= 1;
table = JSON.parse(history[historyIndex]);
updateView();
listeners.forEach(l => l());
}
}
@@ -57,7 +94,7 @@ function redo() {
if (historyIndex < history.length - 1) {
historyIndex += 1;
table = JSON.parse(history[historyIndex]);
updateView();
listeners.forEach(l => l());
}
}
@@ -73,7 +110,7 @@ function invalidated() {
history = history.slice(0, historyIndex);
history.push(JSON.stringify(table));
}
updateView();
listeners.forEach(l => l());
}
function updateTableType() {
@@ -219,10 +256,7 @@ function addToSet(el, array) {
function removeFromSet(el, array) {
let parent = getParent(el);
console.warn(parent[array]);
console.log($(el).attr('value'));
let index = parent[array].indexOf($(el).attr('value'));
console.log(parent, index);
if (index > -1) {
parent[array].splice(index, 1);
invalidated();

View File

@@ -1,48 +1,13 @@
let structure;
let components;
let collections;
const generators = {
'advancement': ['1.15'],
'loot-table': ['1.13', '1.14', '1.15'],
'predicate': ['1.15']
}
const themes = ["light", "dark"];
const generator = window.location.pathname.replace(/\/$/, '').replace(/^\//, '');
generators[generator].forEach(v => {
$('#versionList').append(`<a class="dropdown-item" onclick="changeVersion('${v}')">${v}</a>`)
});
themes.forEach(v => $('#themeList').append(`<a class="dropdown-item" onclick="changeTheme('${v}')" data-i18n="theme.${v}"></a>`));
changeVersion('1.15');
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();
});
}
addListener(updateView);
changeTheme(localStorage.getItem('theme'))
function changeTheme(theme) {
console.log(theme);
if (theme === null) {
theme = 'light';
}
@@ -65,7 +30,7 @@ function updateView() {
}
function generateSourceAndView(data, struct) {
if (generator === 'loot-table') {
if (struct.id === 'loot-table') {
$('#lootTableToolbar').removeClass('d-none');
$('#structure').attr('data-index', 'pools');
return generateTable(data, struct);

View File

@@ -128,6 +128,7 @@
"damage_source.is_magic": "Magic",
"damage_source.is_projectile": "Projectile",
"damage_source.source_entity": "Source Entity",
"description": "Minecraft Generators",
"description.loot-table": "Loot Table Generator for Minecraft",
"description.predicate": "Predicate Generator for Minecraft",
"description.advancement": "Advancement Generator for Minecraft",
@@ -421,6 +422,7 @@
"theme": "Theme",
"theme.dark": "Dark",
"theme.light": "Light",
"title": "Minecraft Generators",
"title.loot-table": "Loot Table Generator",
"title.predicate": "Predicate 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",
"values": "pool"
}
]
],
"default": {
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "minecraft:stone"
}
]
}
]
}
},
{
"id": "predicate",
"title": "title.predicate",
"description": "description.predicate",
"type": "object",
"value": "condition"
"value": "condition",
"default": {
"condition": "minecraft:entity_properties",
"predicate": {}
}
},
{
"id": "advancement",
@@ -156,7 +173,15 @@
"value": "criterion"
}
}
]
],
"default": {
"criteria": {
"requirement": {
"trigger": "minecraft:location",
"conditions": {}
}
}
}
}
],
"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>