local.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /**
  2. * @fileOverview
  3. *
  4. * 支持从本地打开文件
  5. *
  6. * @author: techird
  7. * @copyright: Baidu FEX, 2014
  8. */
  9. KityMinder.registerUI('menu/open/local', function(minder) {
  10. var $menu = minder.getUI('menu/menu');
  11. var $open = minder.getUI('menu/open/open');
  12. var $doc = minder.getUI('doc');
  13. var notice = minder.getUI('widget/notice');
  14. /* extension => protocol */
  15. var supports = {};
  16. var accepts = [];
  17. minder.getSupportedProtocols().forEach(function(protocol) {
  18. if (protocol.decode) {
  19. supports[protocol.fileExtension] = protocol;
  20. accepts.push(protocol.fileExtension);
  21. }
  22. });
  23. /* 网盘面板 */
  24. var $panel = $($open.createSub('local')).addClass('local-file-open-panel');
  25. /* 标题 */
  26. $('<h2>本地文件</h2>')
  27. .appendTo($panel);
  28. /* 选择文件 */
  29. var $pick = $('<div class="pick-file"></div>')
  30. .appendTo($panel);
  31. var $pickButton = $('<a></a>')
  32. .text(minder.getLang('ui.pickfile'))
  33. .appendTo($pick);
  34. $('<span></span>')
  35. .text(minder.getLang('ui.acceptfile', accepts.map(function(ext) {
  36. var protocol = supports[ext];
  37. return protocol.fileDescription + '(' + ext + ')';
  38. }).join(', '))).appendTo($pick);
  39. /* 拖放提示 */
  40. var $drop = $('<div class="drop-file"></div>')
  41. .append($('<span></span>').html(minder.getLang('ui.dropfile')))
  42. .appendTo($panel);
  43. /* 交互事件 */
  44. $pickButton.click(function() {
  45. if (!$doc.checkSaved()) return;
  46. $('<input type="file" />')
  47. .attr('accept', accepts.join())
  48. .on('change', function(e) {
  49. read(this.files[0]);
  50. $menu.hide();
  51. }).click();
  52. });
  53. var cwrapper = $('#content-wrapper')[0];
  54. cwrapper.addEventListener('dragover', function(e) {
  55. e.preventDefault();
  56. e.stopPropagation();
  57. }, false);
  58. cwrapper.addEventListener('drop', function(e) {
  59. if (e.dataTransfer.files.length) {
  60. e.preventDefault();
  61. if (!$doc.checkSaved()) return;
  62. read(e.dataTransfer.files[0]);
  63. $menu.hide();
  64. }
  65. }, false);
  66. function read(domfile) {
  67. if (!domfile) return;
  68. var info = new fio.file.anlysisPath(domfile.name);
  69. var protocol = supports[info.extension];
  70. if (!protocol || !protocol.decode) {
  71. notice.warn(minder.getLang('ui.unsupportedfile'));
  72. return Promise.reject();
  73. }
  74. function loadFile(file, protocol) {
  75. return new Promise(function(resolve, reject) {
  76. var reader;
  77. if (protocol.dataType == 'blob') {
  78. resolve(new fio.file.Data(domfile));
  79. } else {
  80. reader = new FileReader();
  81. reader.onload = function() {
  82. resolve(new fio.file.Data(this.result));
  83. };
  84. reader.onerror = reject;
  85. reader.readAsText(domfile, 'utf-8');
  86. }
  87. });
  88. }
  89. function loadFileError() {
  90. var notice = minder.getUI('widget/notice');
  91. notice.error('err_localfile_read');
  92. }
  93. function loadDoc(data) {
  94. var doc = {
  95. content: data.content,
  96. protocol: protocol.name,
  97. title: info.filename,
  98. source: 'local'
  99. };
  100. return $doc.load(doc);
  101. }
  102. $(minder.getRenderTarget()).addClass('loading');
  103. return loadFile(domfile, protocol).then(loadDoc, loadFileError).then(function() {
  104. $(minder.getRenderTarget()).removeClass('loading');
  105. });
  106. }
  107. return {
  108. read: read
  109. };
  110. });