js/xfile/XReader.js
'use strict'
import ModelReader from '../base/ModelReader'
import TextReader from '../util/TextReader'
import XModel from './XModel'
import XParser from './XParser'
import ModelBank from '../base/ModelBank'
/**
* XReader class
* @access public
*/
export default class XReader extends ModelReader {
/**
* constructor
* @access public
* @constructor
*/
constructor() {
super()
/* @type {XModel} */
this._model = null
/* @type {string} */
this._parentDirName = null
/* @type {int} */
this._error = 0
/* @type {boolean} */
this._loaded = false
}
/**
* read X file data from given URL
* @access public
* @param {string} url - URL of X file
* @returns {Promise} - resolved when loading model is completed
*/
readModel(url) {
if(!XReader.canRead(url))
return false
const obj = this
const onload = () => { obj.readModelProcess(url) }
this._model = new XModel()
//this._textReader = new TextReader(url, 'sjis', onload)
const promise = TextReader.open(url, 'sjis')
.then((reader) => {
this._textReader = reader
return this.readModelProcess(url)
})
.catch((err) => {
console.error(`file (${url}) open error: ${err}`)
})
//return this._model
return promise
}
/**
* read X file data from File object
* @access public
* @param {File} file - X file
* @returns {boolean} - true: success, false: failure
*/
readModelFromFile(file) {
if(!XReader.canRead(file))
return false
//const obj = this
//const onload = () => { obj.readModelProcess(null) }
this._model = new XModel()
//this._textReader = new TextReader(file, 'sjis', onload)
const promise = TextReader.open(file, 'sjis')
.then((reader) => {
this._textReader = reader
return this.readModelProcess(null)
})
.catch((err) => {
console.error(`file (${file.name}) open error: ${err}`)
})
//return this._model
return promise
}
readModelProcess(url) {
const result = this.readModelSub(url)
/*
if(this._error){
if(this._model.onerror){
this._model.onerror()
}
}
if(this._loaded){
this._model.loaded = true
if(this._model.onload){
this._model.onload()
}
}
if(this._error || this._loaded){
if(this._model.onloadend){
this._model.onloadend()
}
}
*/
if(!result){
if(this._model.onerror){
this._model.onerror()
}
return Promise.reject('read model error')
}
this._model.loaded = true
if(this._model.onload){
this._model.onload()
}
if(this._model.onloadend){
this._model.onloadend()
}
return Promise.resolve(this._model)
}
readModelSub(url){
//this._parentDirName = (new String(url)).gsub(/\/[^\/]*$/, '/')
this._parentDirName = url.replace(/\/[^\/]*$/, '/')
if(url === this._parentDirName){
this._parentDirName = './'
}
const parser = new XParser()
parser.setParentDirName(this._parentDirName)
parser.setModel(this._model)
const model = parser.parse(this._textReader.getText())
if(model === null){
this._error = 1
}else{
this._loaded = true
}
return model
}
}
XReader.canRead = (file) => {
let ext = ''
if(file instanceof File){
ext = file.name.substr(-2)
}else if(typeof file === 'string' || file instanceof String){
ext = file.substr(-2)
}
if(ext === '.x'){
return true
}
return false
}
ModelBank.addModelReader(XReader)