--- /dev/null
+class WordFinder extends WordQuiz {
+ add(parentitem, rows) {
+ const catitem = put(parentitem, 'ul');
+ rows.forEach(ref => {
+ const [title, level, imgid] = this.data[ref];
+ const worditem = put(catitem, 'li');
+ const figitem = put(worditem, 'figure');
+ if (imgid) {
+ put(figitem, 'img[src=$]', `/data/word/32/${imgid}.jpg`);
+ }
+ if (title) {
+ let html = title.replace(/\/(.*)/, ' <small>($1)</small>');
+ put(figitem, 'figcaption', {
+ innerHTML: html,
+ });
+ }
+ if (this.cats[ref]) {
+ // delve into subcategory
+ put(worditem, '.parent');
+ this.add(worditem, this.cats[ref]);
+ }
+ });
+ }
+
+ setup() {
+ this.gallery = document.getElementById('gallery');
+ put(this.gallery, '-p', 'Under construction.');
+ this.add(this.gallery, this.preset.cat ? [this.preset.cat] : this.cats[null]);
+ }
+
+ stop() {}
+};
--- /dev/null
+<(../common.inc.plp)><:
+
+our $wordlistbase;
+
+Html({
+ raw => <<'EOT',
+<script src="/word/put.min.js"></script>
+<script src="/word/quiz.js"></script>
+<script src="/word/finder.js"></script>
+EOT
+});
+
+say '<h1>Words</h1>';
+say '<section id="gallery" class="gallery"></section>';
+say "<script>new WordFinder('/$wordlistbase.json')</script>";
class WordQuiz {
dataselect(json) {
+ this.data = json;
+ this.cats = {}; // category lookup
+ for (let i in json) {
+ let cat = json[i][3];
+ if (this.cats[cat]) {
+ this.cats[cat].push(i);
+ }
+ else {
+ this.cats[cat] = [i];
+ }
+ }
+ return this.datafilter(json);
+ }
+
+ datafilter(json) {
// find viable rows from json data
let rows = Object.values(json);
- if (this.preset.cat !== undefined) {
- let cats = {}; // category lookup
- for (let i in json) {
- let cat = json[i][3];
- if (!cats[cat]) cats[cat] = [];
- cats[cat].push(i)
- }
+ if (this.preset.cat !== undefined) {
rows = [];
- let children = cats[this.preset.cat];
+ let children = this.cats[this.preset.cat];
for (let loop = 0; children.length && loop < 20; loop++) {
rows.push(...children);
- children = children.map(cat => cats[cat]).filter(is => is).flat();
+ children = children.map(cat => this.cats[cat]).filter(is => is).flat();
}
rows = rows.map(row => json[row]).filter(row => row[2]);
}