smalruby/smalruby-editor

View on GitHub
app/assets/javascripts/models/source_code.js

Summary

Maintainability
A
1 hr
Test Coverage
/**
 * ソースコードを表現するモデル
 */
Smalruby.SourceCode = Backbone.Model.extend({
  defaults: {
    filename: null,
    data: null
  },

  initialize: function() {
    if (!this.get('filename')) {
      var filename = Smalruby.Views.MainMenuView.getFilename();
      if (filename.length == 0) {
        filename = Smalruby.SourceCode.defaultFilename();
      }
      this.set('filename', filename);
    }

    if (!this.get('data')) {
      if (this.get('filename').match(/\.xml$/)) {
        var data = Smalruby.dumpXml();
      }
      else {
        if (window.blockMode) {
          var data = Blockly.Ruby.workspaceToCode(Blockly.getMainWorkspace());
        }
        else {
          var data = window.textEditor.getSession().getDocument().getValue();
        }
      }
      this.set('data', data);
    }
  },

  getRbxmlFilename: function() {
    var filename = this.get('filename');
    if (filename.match(/\.rb\.xml$/)) {
      return filename;
    }
    else {
      if (filename.match(/\.rb$/)) {
        return filename + '.xml';
      }
      else if (filename.match(/\.xml$/)) {
        return filename.replace(/\.xml$/, '.rb.xml');
      }
      else {
        return filename + '.rb.xml';
      }
    }
  },

  run: function() {
    return this.post_('run');
  },

  check: function() {
    return this.post_('check');
  },

  save2: function() {
    return this.post_('');
  },

  write: function(force) {
    if (force == null) {
      force = false;
    }
    var action = 'write';
    if (force) {
      action += '?force=1';
    }
    return this.delete_(action);
  },

  toBlocks: function() {
    return this.post_('to_blocks', 'html');
  },

  post_:  function(action, dataType) {
    if (dataType == null) {
      dataType = 'json';
    }
    dfr = $.Deferred();
    $.ajax({
      url: '/source_codes/' + action,
      type: 'POST',
      data: {
        source_code: {
          filename: this.get('filename'),
          data: this.get('data')
        }
      },
      dataType: dataType,
      success: function(data, textStatus, jqXHR) {
        return dfr.resolve(data);
      },
      error: dfr.reject
    });
    return dfr.promise();
  },

  delete_: function(action) {
    dfr = $.Deferred();
    $.ajax({
      url: '/source_codes/' + action,
      type: 'DELETE',
      dataType: 'json',
      success: function(data, textStatus, jqXHR) {
        return dfr.resolve(data);
      },
      error: dfr.reject
    });
    return dfr.promise();
  }
}, {
  defaultFilename: function(now) {
    if (now == null) {
      now = new Date();
    }
    return strftime('program_%y%m%d_%H%M%S.rb', now);
  }
});