Skip to content

Commit 4e99118

Browse files
authored
Separate utility functions from data classes (#811)
1 parent d816d66 commit 4e99118

20 files changed

+311
-355
lines changed

js/data/camera.js

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import ImageData from './image.js'
1+
import { BaseData } from './base.js'
2+
import ImageLoader from './loader/image.js'
3+
import ImageRenderer from '../renderer/image.js'
24

3-
export default class CameraData extends ImageData {
5+
export default class CameraData extends BaseData {
46
constructor(manager) {
57
super(manager)
68

@@ -19,7 +21,7 @@ export default class CameraData extends ImageData {
1921
this._slctImg.onchange = () => {
2022
this._manager.platform.render()
2123
this._thumbnail.replaceChildren()
22-
this._thumbnail.appendChild(this._createCanvas(this.x[0]))
24+
this._thumbnail.appendChild(ImageLoader.createCanvas(this.x[0]))
2325
}
2426
this._mngelm.appendChild(this._slctImg)
2527

@@ -31,6 +33,9 @@ export default class CameraData extends ImageData {
3133

3234
this._x = []
3335
this._y = []
36+
37+
this._manager.platform._renderer.push(new ImageRenderer(manager))
38+
this._manager.setting.render.selectItem('image')
3439
}
3540

3641
get availTask() {
@@ -63,15 +68,15 @@ export default class CameraData extends ImageData {
6368
this._video.height = this._size[0]
6469
this._video.autoplay = true
6570
this._video.onclick = () => {
66-
this.readImage(this._video).then(image => {
71+
ImageLoader.load(this._video).then(image => {
6772
this._x.push(image)
6873
this._y.push(0)
6974
const opt = document.createElement('option')
7075
opt.value = opt.innerText = this._x.length
7176
this._slctImg.appendChild(opt)
7277
this._slctImg.value = this._x.length
7378
this._thumbnail.replaceChildren()
74-
this._thumbnail.appendChild(this._createCanvas(image))
79+
this._thumbnail.appendChild(ImageLoader.createCanvas(image))
7580

7681
this.stopVideo()
7782
this._mngelm.style.display = null

js/data/capture.js

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import ImageData from './image.js'
1+
import { BaseData } from './base.js'
2+
import ImageLoader from './loader/image.js'
3+
import ImageRenderer from '../renderer/image.js'
24

3-
export default class CaptureData extends ImageData {
5+
export default class CaptureData extends BaseData {
46
constructor(manager) {
57
super(manager)
68

@@ -19,7 +21,7 @@ export default class CaptureData extends ImageData {
1921
this._slctImg.onchange = () => {
2022
this._manager.platform.render()
2123
this._thumbnail.replaceChildren()
22-
this._thumbnail.appendChild(this._createCanvas(this.x[0]))
24+
this._thumbnail.appendChild(ImageLoader.createCanvas(this.x[0]))
2325
}
2426
this._mngelm.appendChild(this._slctImg)
2527

@@ -31,6 +33,9 @@ export default class CaptureData extends ImageData {
3133

3234
this._x = []
3335
this._y = []
36+
37+
this._manager.platform._renderer.push(new ImageRenderer(manager))
38+
this._manager.setting.render.selectItem('image')
3439
}
3540

3641
get availTask() {
@@ -57,15 +62,15 @@ export default class CaptureData extends ImageData {
5762
this._video.height = this._size[0]
5863
this._video.autoplay = true
5964
this._video.onclick = () => {
60-
this.readImage(this._video).then(image => {
65+
ImageLoader.load(this._video).then(image => {
6166
this._x.push(image)
6267
this._y.push(0)
6368
const opt = document.createElement('option')
6469
opt.value = opt.innerText = this._x.length
6570
this._slctImg.appendChild(opt)
6671
this._slctImg.value = this._x.length
6772
this._thumbnail.replaceChildren()
68-
this._thumbnail.appendChild(this._createCanvas(image))
73+
this._thumbnail.appendChild(ImageLoader.createCanvas(image))
6974

7075
this.stopVideo()
7176
this._mngelm.style.display = null

js/data/dashboard_estat.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import BaseDB from './db/base.js'
2-
import JSONData from './json.js'
2+
import { FixData } from './base.js'
3+
import JSONLoader from './loader/json.js'
34

45
const BASE_URL = 'https://dashboard.e-stat.go.jp/api/1.0'
56
const ExpiredTime = 1000 * 60 * 60 * 24 * 30
@@ -56,7 +57,7 @@ const presetInfos = {
5657

5758
const lockKeys = {}
5859

59-
export default class EStatData extends JSONData {
60+
export default class EStatData extends FixData {
6061
constructor(manager) {
6162
super(manager)
6263
this._name = 'Nikkei Indexes'
@@ -614,10 +615,12 @@ export default class EStatData extends JSONData {
614615
const minyear = date.reduce((y, d) => Math.min(y, d.year), Infinity)
615616
this._datetime = date.map(d => (d.year - minyear) * 12 + d.month - 1)
616617

617-
this.setJSON(
618+
const info = columns.map(c => ({ name: c, nan: 0 }))
619+
const json = new JSONLoader(
618620
keys.map(k => seldata[k]),
619-
columns.map(c => ({ name: c, nan: 0 }))
621+
{ columnInfos: info }
620622
)
623+
this.setArray(json.data, info)
621624
this._readySelector()
622625
this.setting.ml.refresh()
623626
this.setting.$forceUpdate()

js/data/esl.js

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import CSVData from './csv.js'
1+
import { FixData } from './base.js'
2+
import CSV from './loader/csv.js'
23

34
// https://web.stanford.edu/~hastie/ElemStatLearn/
45
const datasetInfos = {
@@ -150,7 +151,7 @@ const datasetInfos = {
150151
},
151152
}
152153

153-
export default class MarketingData extends CSVData {
154+
export default class MarketingData extends FixData {
154155
constructor(manager) {
155156
super(manager)
156157
this._name = 'marketing'
@@ -207,11 +208,9 @@ export default class MarketingData extends CSVData {
207208
_readyData() {
208209
const name = this._name
209210
const info = datasetInfos[name]
210-
this.readCSV(info.file, {
211-
delimiter: ' ',
212-
}).then(data => {
211+
CSV.load(info.file, { delimiter: ' ' }).then(csv => {
213212
if (name === this._name) {
214-
this.setCSV(data, info.info)
213+
this.setArray(csv.data, info.info)
215214
this._manager.onReady(() => {
216215
this._manager.platform.render()
217216
})

js/data/json.js

-94
This file was deleted.

js/data/audio.js renamed to js/data/loader/audio.js

+2-16
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,5 @@
1-
import { BaseData } from './base.js'
2-
3-
export default class AudioData extends BaseData {
4-
constructor(manager) {
5-
super(manager)
6-
}
7-
8-
get availTask() {
9-
return ['SM']
10-
}
11-
12-
get domain() {
13-
return [[-1, 1]]
14-
}
15-
16-
async readAudio(data) {
1+
export default class AudioLoader {
2+
static load(data) {
173
return new Promise(resolve => {
184
const reader = new FileReader()
195
reader.readAsArrayBuffer(data)

js/data/csv.js renamed to js/data/loader/csv.js

+41-47
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,53 @@
11
import 'https://cdnjs.cloudflare.com/ajax/libs/pako/2.1.0/pako.min.js'
22

3-
import { FixData } from './base.js'
4-
5-
class CSV {
6-
constructor(data) {
3+
export default class CSV {
4+
constructor(data, { header = 0 } = {}) {
75
this._data = data
6+
this._header = header
87
}
98

109
/**
11-
* @type {Array<Array<string>>}
10+
* @type {Array<Array<*>>}
1211
*/
1312
get data() {
13+
if (this._header > 0) {
14+
return this._data.slice(this._header)
15+
}
1416
return this._data
1517
}
1618

19+
/**
20+
* @type {string[]}
21+
*/
22+
get columns() {
23+
if (this._header > 0) {
24+
return this._data[0]
25+
}
26+
return Array.from(this._data[0], (_, i) => i)
27+
}
28+
29+
/**
30+
* @type {string[]}
31+
*/
32+
get type() {
33+
const data = this.data
34+
return data[0].map((_, i) => {
35+
const cat = data.some(d => isNaN(d[i]))
36+
return cat ? 'category' : 'numeric'
37+
})
38+
}
39+
40+
get info() {
41+
const names = this.columns
42+
const types = this.type
43+
const info = []
44+
for (let i = 0; i < names.length; i++) {
45+
info[i] = { name: names[i], type: types[i] }
46+
}
47+
info[info.length - 1].out = true
48+
return info
49+
}
50+
1751
/**
1852
*
1953
* @param {string} str
@@ -59,14 +93,14 @@ class CSV {
5993
record.push(curValue)
6094
data.push(record)
6195
}
62-
return new CSV(data)
96+
return new CSV(data, config)
6397
}
6498

6599
/**
66100
*
67101
* @param {string | File} value
68102
* @param {*} [config]
69-
* @returns {CSV}
103+
* @returns {Promise<CSV>}
70104
*/
71105
static async load(value, config = {}) {
72106
if (typeof value === 'string') {
@@ -89,43 +123,3 @@ class CSV {
89123
}
90124
}
91125
}
92-
93-
export default class CSVData extends FixData {
94-
constructor(manager, data, columnInfos) {
95-
super(manager)
96-
97-
if (data && columnInfos) {
98-
this.setCSV(data, columnInfos)
99-
}
100-
}
101-
102-
async readCSV(data, config) {
103-
const csv = await CSV.load(data, config)
104-
return csv.data
105-
}
106-
107-
setCSV(data, infos, header = false) {
108-
if (!Array.isArray(data)) {
109-
this.readCSV(data).then(d => {
110-
this.setCSV(d, infos, header)
111-
})
112-
return
113-
}
114-
if (header) {
115-
const cols = data[0]
116-
data = data.slice(1)
117-
if (!infos) {
118-
infos = cols.map((c, i) => {
119-
const cat = data.some(d => isNaN(d[i]))
120-
return {
121-
name: c,
122-
type: cat ? 'category' : 'numeric',
123-
}
124-
})
125-
infos[infos.length - 1].out = true
126-
}
127-
}
128-
129-
this.setArray(data, infos)
130-
}
131-
}

0 commit comments

Comments
 (0)