22
33var nifti = require ( 'nifti-js' ) ;
44var Issue = require ( './issues' ) . Issue ;
5+ var type = require ( './type' ) ;
56
67/**
78 * If the current environment is server side
@@ -21,8 +22,7 @@ var fileUtils = {
2122 newFile : newFile ,
2223 readFile : readFile ,
2324 readDir : readDir ,
24- readNiftiHeader : readNiftiHeader ,
25- relativePath : relativePath
25+ readNiftiHeader : readNiftiHeader
2626} ;
2727
2828// implementations ----------------------------------------------------------------
@@ -65,6 +65,8 @@ function readFile (file, callback) {
6565 }
6666}
6767
68+
69+
6870/**
6971 * Read Directory
7072 *
@@ -76,33 +78,77 @@ function readFile (file, callback) {
7678 * object to the callback.
7779 */
7880function readDir ( dir , callback ) {
81+ var filesObj = { } ;
82+ var filesList = [ ] ;
7983 if ( fs ) {
80- var files = getFiles ( dir ) ;
81- var filesObj = { } ;
82- var str = dir . substr ( dir . lastIndexOf ( '/' ) + 1 ) + '$' ;
83- var subpath = dir . replace ( new RegExp ( str ) , '' ) ;
84- for ( var i = 0 ; i < files . length ; i ++ ) {
85- filesObj [ i ] = {
86- name : files [ i ] . substr ( files [ i ] . lastIndexOf ( '/' ) + 1 ) ,
87- path : files [ i ] ,
88- relativePath : files [ i ] . replace ( subpath , '' )
89- } ;
90- }
91- callback ( filesObj ) ;
84+ filesList = preprocessNode ( dir ) ;
9285 } else {
93- callback ( dir ) ;
86+ filesList = preprocessBrowser ( dir ) ;
87+ }
88+ // converting array to object
89+ for ( var j = 0 ; j < filesList . length ; j ++ ) {
90+ filesObj [ j ] = filesList [ j ] ;
91+ }
92+ callback ( filesObj ) ;
93+ }
94+
95+ /**
96+ * Preprocess file objects from a browser
97+ *
98+ * 1. Filters out ignored files and folder.
99+ * 2. Adds 'relativePath' field of each file object.
100+ */
101+ function preprocessBrowser ( filesObj ) {
102+ var filesList = [ ] ;
103+ for ( var i = 0 ; i < filesObj . length ; i ++ ) {
104+ var fileObj = filesObj [ i ] ;
105+ fileObj . relativePath = harmonizeRelativePath ( fileObj . webkitRelativePath ) ;
106+ if ( type . isIgnoredPath ( fileObj . relativePath ) ) {
107+ continue ;
108+ }
109+ filesList . push ( fileObj ) ;
94110 }
111+ return filesList ;
95112}
96113
97- function getFiles ( dir , files_ ) {
114+ /**
115+ * Preprocess directory path from a Node CLI
116+ *
117+ * 1. Recursively travers the directory tree
118+ * 2. Filters out ignored files and folder.
119+ * 3. Harmonizes the 'relativePath' field
120+ */
121+ function preprocessNode ( dir ) {
122+ var str = dir . substr ( dir . lastIndexOf ( '/' ) + 1 ) + '$' ;
123+ var rootpath = dir . replace ( new RegExp ( str ) , '' ) ;
124+ return getFiles ( dir , [ ] , rootpath ) ;
125+ }
126+
127+ /**
128+ * Recursive helper function for 'preprocessNode'
129+ */
130+ function getFiles ( dir , files_ , rootpath ) {
98131 files_ = files_ || [ ] ;
99132 var files = fs . readdirSync ( dir ) ;
100133 for ( var i = 0 ; i < files . length ; i ++ ) {
101- var name = dir + '/' + files [ i ] ;
102- if ( fs . lstatSync ( name ) . isDirectory ( ) ) {
103- getFiles ( name , files_ ) ;
134+ var fullPath = dir + '/' + files [ i ] ;
135+ var relativePath = fullPath . replace ( rootpath , '' ) ;
136+ relativePath = harmonizeRelativePath ( relativePath ) ;
137+ if ( type . isIgnoredPath ( relativePath ) ) {
138+ continue ;
139+ }
140+ var fileName = files [ i ] ;
141+
142+ var fileObj = {
143+ name : fileName ,
144+ path : fullPath ,
145+ relativePath : relativePath
146+ } ;
147+
148+ if ( fs . lstatSync ( fullPath ) . isDirectory ( ) ) {
149+ getFiles ( fullPath , files_ , rootpath ) ;
104150 } else {
105- files_ . push ( name ) ;
151+ files_ . push ( fileObj ) ;
106152 }
107153 }
108154 return files_ ;
@@ -233,15 +279,14 @@ function parseNIfTIHeader (buffer, file) {
233279 * Takes a file and returns the correct relative path property
234280 * base on the environment.
235281 */
236- function relativePath ( file ) {
237- var relPath = ( typeof window != 'undefined' ? file . webkitRelativePath : file . relativePath ) ;
282+ function harmonizeRelativePath ( path ) {
238283
239284 // This hack uniforms relative paths for command line calls to 'BIDS-examples/ds001/' and 'BIDS-examples/ds001'
240- if ( relPath [ 0 ] !== '/' ) {
241- var pathParts = relPath . split ( '/' ) ;
242- relPath = '/' + pathParts . slice ( 1 ) . join ( '/' ) ;
285+ if ( path [ 0 ] !== '/' ) {
286+ var pathParts = path . split ( '/' ) ;
287+ path = '/' + pathParts . slice ( 1 ) . join ( '/' ) ;
243288 }
244- return relPath ;
289+ return path ;
245290}
246291
247292/**
0 commit comments