Home Reference Source Repository

js/xfile/XReader.js

  1. 'use strict'
  2.  
  3. import ModelReader from '../base/ModelReader'
  4. import TextReader from '../util/TextReader'
  5. import XModel from './XModel'
  6. import XParser from './XParser'
  7. import ModelBank from '../base/ModelBank'
  8.  
  9. /**
  10. * XReader class
  11. * @access public
  12. */
  13. export default class XReader extends ModelReader {
  14. /**
  15. * constructor
  16. * @access public
  17. * @constructor
  18. */
  19. constructor() {
  20. super()
  21.  
  22. /* @type {XModel} */
  23. this._model = null
  24. /* @type {string} */
  25. this._parentDirName = null
  26.  
  27. /* @type {int} */
  28. this._error = 0
  29.  
  30. /* @type {boolean} */
  31. this._loaded = false
  32. }
  33.  
  34. /**
  35. * read X file data from given URL
  36. * @access public
  37. * @param {string} url - URL of X file
  38. * @returns {Promise} - resolved when loading model is completed
  39. */
  40. readModel(url) {
  41. if(!XReader.canRead(url))
  42. return false
  43.  
  44. const obj = this
  45. const onload = () => { obj.readModelProcess(url) }
  46.  
  47. this._model = new XModel()
  48. //this._textReader = new TextReader(url, 'sjis', onload)
  49.  
  50. const promise = TextReader.open(url, 'sjis')
  51. .then((reader) => {
  52. this._textReader = reader
  53. return this.readModelProcess(url)
  54. })
  55. .catch((err) => {
  56. console.error(`file (${url}) open error: ${err}`)
  57. })
  58.  
  59. //return this._model
  60. return promise
  61. }
  62.  
  63. /**
  64. * read X file data from File object
  65. * @access public
  66. * @param {File} file - X file
  67. * @returns {boolean} - true: success, false: failure
  68. */
  69. readModelFromFile(file) {
  70. if(!XReader.canRead(file))
  71. return false
  72. //const obj = this
  73. //const onload = () => { obj.readModelProcess(null) }
  74.  
  75. this._model = new XModel()
  76. //this._textReader = new TextReader(file, 'sjis', onload)
  77.  
  78. const promise = TextReader.open(file, 'sjis')
  79. .then((reader) => {
  80. this._textReader = reader
  81. return this.readModelProcess(null)
  82. })
  83. .catch((err) => {
  84. console.error(`file (${file.name}) open error: ${err}`)
  85. })
  86.  
  87. //return this._model
  88. return promise
  89. }
  90.  
  91. readModelProcess(url) {
  92. const result = this.readModelSub(url)
  93.  
  94. /*
  95. if(this._error){
  96. if(this._model.onerror){
  97. this._model.onerror()
  98. }
  99. }
  100.  
  101. if(this._loaded){
  102. this._model.loaded = true
  103. if(this._model.onload){
  104. this._model.onload()
  105. }
  106. }
  107.  
  108. if(this._error || this._loaded){
  109. if(this._model.onloadend){
  110. this._model.onloadend()
  111. }
  112. }
  113. */
  114. if(!result){
  115. if(this._model.onerror){
  116. this._model.onerror()
  117. }
  118. return Promise.reject('read model error')
  119. }
  120.  
  121. this._model.loaded = true
  122. if(this._model.onload){
  123. this._model.onload()
  124. }
  125.  
  126. if(this._model.onloadend){
  127. this._model.onloadend()
  128. }
  129. return Promise.resolve(this._model)
  130. }
  131.  
  132. readModelSub(url){
  133. //this._parentDirName = (new String(url)).gsub(/\/[^\/]*$/, '/')
  134. this._parentDirName = url.replace(/\/[^\/]*$/, '/')
  135. if(url === this._parentDirName){
  136. this._parentDirName = './'
  137. }
  138.  
  139. const parser = new XParser()
  140. parser.setParentDirName(this._parentDirName)
  141. parser.setModel(this._model)
  142. const model = parser.parse(this._textReader.getText())
  143.  
  144. if(model === null){
  145. this._error = 1
  146. }else{
  147. this._loaded = true
  148. }
  149.  
  150. return model
  151. }
  152. }
  153.  
  154. XReader.canRead = (file) => {
  155. let ext = ''
  156. if(file instanceof File){
  157. ext = file.name.substr(-2)
  158. }else if(typeof file === 'string' || file instanceof String){
  159. ext = file.substr(-2)
  160. }
  161.  
  162. if(ext === '.x'){
  163. return true
  164. }
  165.  
  166. return false
  167. }
  168.  
  169. ModelBank.addModelReader(XReader)
  170.