80 lines
2.2 KiB
Plaintext
80 lines
2.2 KiB
Plaintext
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @providesModule getTextContentFromFiles
|
|
* @format
|
|
* @flow
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const invariant = require('fbjs/lib/invariant');
|
|
|
|
var TEXT_CLIPPING_REGEX = /\.textClipping$/;
|
|
|
|
var TEXT_TYPES = {
|
|
'text/plain': true,
|
|
'text/html': true,
|
|
'text/rtf': true
|
|
};
|
|
|
|
// Somewhat arbitrary upper bound on text size. Let's not lock up the browser.
|
|
var TEXT_SIZE_UPPER_BOUND = 5000;
|
|
|
|
/**
|
|
* Extract the text content from a file list.
|
|
*/
|
|
function getTextContentFromFiles(files: Array<File>, callback: (contents: string) => void): void {
|
|
var readCount = 0;
|
|
var results = [];
|
|
files.forEach(function ( /*blob*/file) {
|
|
readFile(file, function ( /*string*/text) {
|
|
readCount++;
|
|
text && results.push(text.slice(0, TEXT_SIZE_UPPER_BOUND));
|
|
if (readCount == files.length) {
|
|
callback(results.join('\r'));
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* todo isaac: Do work to turn html/rtf into a content fragment.
|
|
*/
|
|
function readFile(file: File, callback: (contents: string) => void): void {
|
|
if (!global.FileReader || file.type && !(file.type in TEXT_TYPES)) {
|
|
callback('');
|
|
return;
|
|
}
|
|
|
|
if (file.type === '') {
|
|
var contents = '';
|
|
// Special-case text clippings, which have an empty type but include
|
|
// `.textClipping` in the file name. `readAsText` results in an empty
|
|
// string for text clippings, so we force the file name to serve
|
|
// as the text value for the file.
|
|
if (TEXT_CLIPPING_REGEX.test(file.name)) {
|
|
contents = file.name.replace(TEXT_CLIPPING_REGEX, '');
|
|
}
|
|
callback(contents);
|
|
return;
|
|
}
|
|
|
|
var reader = new FileReader();
|
|
reader.onload = function () {
|
|
const result = reader.result;
|
|
invariant(typeof result === 'string', 'We should be calling "FileReader.readAsText" which returns a string');
|
|
callback(result);
|
|
};
|
|
reader.onerror = function () {
|
|
callback('');
|
|
};
|
|
reader.readAsText(file);
|
|
}
|
|
|
|
module.exports = getTextContentFromFiles; |