@@ -77,6 +77,33 @@ function saveImage()
7777 saveAllImages ( currentIndex - 1 ) ;
7878}
7979
80+ function generateFileName ( path , page , leadingZeros , fileName )
81+ {
82+ // Parent folder name
83+ let parentFolderName = p . dirname ( p . dirname ( path ) ) ;
84+ let ext1 = p . extname ( parentFolderName ) ;
85+ parentFolderName = p . basename ( parentFolderName , ( ext1 && ext1 . length < 6 ? ext1 : '' ) ) ;
86+
87+ // Current file/folder name
88+ let folderName = p . dirname ( path ) ;
89+ let ext2 = p . extname ( folderName ) ;
90+ folderName = p . basename ( folderName , ( ext2 && ext2 . length < 6 ? ext2 : '' ) ) ;
91+
92+ const extension = p . extname ( path ) ;
93+ const imageName = p . basename ( path , extension ) ;
94+
95+ fileName = fileName . replace ( / \[ p a r e n t F o l d e r (?: N a m e ) ? \] / , parentFolderName ) ;
96+ fileName = fileName . replace ( / \[ f o l d e r (?: N a m e ) ? \] / , folderName ) ;
97+ fileName = fileName . replace ( / \[ i m a g e (?: N a m e ) ? \] / , imageName ) ;
98+ fileName = fileName . replace ( / \[ p a g e \] / , String ( page ) . padStart ( leadingZeros , '0' ) ) ;
99+ fileName = fileName . replace ( / \[ p a g e I n t \] / , page ) ;
100+
101+ let ext3 = p . extname ( fileName ) ;
102+ if ( ! ext3 || ext3 . length >= 6 ) fileName += extension ;
103+
104+ return fileName ;
105+ }
106+
80107function saveAllImages ( index = false )
81108{
82109 const images = reading . images ( ) ;
@@ -88,53 +115,76 @@ function saveAllImages(index = false)
88115 index = ( reading . indexNum ( ) - index ) - 1 ;
89116 }
90117
91- electronRemote . dialog . showOpenDialog ( { properties : [ 'openDirectory' , 'createDirectory' ] , buttonLabel : language . buttons . save } ) . then ( async function ( files ) {
118+ const saveDialog = macosMAS ? saveDialogDirectory : saveDialogFile ;
92119
93- if ( files . filePaths && files . filePaths [ 0 ] && fs . statSync ( files . filePaths [ 0 ] ) . isDirectory ( ) )
120+ saveDialog ( async function ( saveTo , fileName ) {
121+
122+ const toSave = [ ] ;
123+ let highestPage = 0 ;
124+
125+ for ( let key in images )
94126 {
95- const saveTo = files . filePaths [ 0 ] ;
96- const toSave = [ ] ;
127+ const path = images [ key ] . path ;
97128
98- for ( let key in images )
99- {
100- const path = images [ key ] . path ;
129+ if ( index === false || index == imagesData [ key ] . position )
130+ toSave . push ( { path : path , page : key } ) ;
101131
102- if ( index === false || index == imagesData [ key ] . position )
103- toSave . push ( { path : path } ) ;
104- }
132+ if ( + key > highestPage )
133+ highestPage = + key ;
134+ }
105135
106- let first = '' ;
136+ const leadingZeros = String ( highestPage ) . length ;
137+ let first = '' ;
138+
139+ if ( toSave . length )
140+ {
141+ let file = fileManager . file ( p . dirname ( toSave [ 0 ] . path ) ) ;
142+ await file . makeAvailable ( toSave ) ;
143+ file . destroy ( ) ;
107144
108- if ( toSave . length )
145+ for ( let i = 0 , len = toSave . length ; i < len ; i ++ )
109146 {
110- let file = fileManager . file ( p . dirname ( toSave [ 0 ] . path ) ) ;
111- await file . makeAvailable ( toSave ) ;
112- file . destroy ( ) ;
147+ const image = toSave [ i ] ;
148+ const realPath = fileManager . realPath ( image . path ) ;
149+ const saveImageTo = p . join ( saveTo , generateFileName ( image . path , image . page , leadingZeros , fileName ) ) ;
150+ if ( first === '' ) first = saveImageTo ;
113151
152+ if ( ! fs . existsSync ( saveImageTo ) )
153+ fs . copyFileSync ( realPath , saveImageTo ) ;
154+ }
155+ }
114156
115- for ( let i = 0 , len = toSave . length ; i < len ; i ++ )
157+ events . snackbar ( {
158+ key : 'saveAllImages' ,
159+ text : language . global . contextMenu . saveImagesMessage ,
160+ duration : 6 ,
161+ buttons : [
116162 {
117- const realPath = fileManager . realPath ( toSave [ i ] . path ) ;
118- const saveImageTo = p . join ( saveTo , p . basename ( realPath ) ) ;
119- if ( first === '' ) first = p . basename ( realPath ) ;
163+ text : language . global . open ,
164+ function : 'electron.shell.showItemInFolder(\'' + escapeQuotes ( escapeBackSlash ( first ) , 'simples' ) + '\');' ,
165+ } ,
166+ ] ,
167+ } ) ;
120168
121- if ( ! fs . existsSync ( saveImageTo ) )
122- fs . copyFileSync ( realPath , saveImageTo ) ;
123- }
124- }
169+ } ) ;
170+ }
125171
126- events . snackbar ( {
127- key : 'saveAllImages' ,
128- text : language . global . contextMenu . saveImagesMessage ,
129- duration : 6 ,
130- buttons : [
131- {
132- text : language . global . open ,
133- function : 'electron.shell.showItemInFolder(\'' + escapeQuotes ( escapeBackSlash ( p . join ( saveTo , first ) ) , 'simples' ) + '\');' ,
134- } ,
135- ] ,
136- } ) ;
137- }
172+ function saveDialogFile ( callback )
173+ {
174+ electronRemote . dialog . showSaveDialog ( { properties : [ 'openDirectory' , 'createDirectory' ] , buttonLabel : language . buttons . save , defaultPath : '[parentFolder] - [folder] - [image] - [page]' } ) . then ( function ( result ) {
175+
176+ if ( ! result . canceled && result . filePath )
177+ callback ( p . dirname ( result . filePath ) , p . basename ( result . filePath ) ) ;
178+
179+ } ) ;
180+ }
181+
182+ function saveDialogDirectory ( callback )
183+ {
184+ electronRemote . dialog . showOpenDialog ( { properties : [ 'openDirectory' , 'createDirectory' ] , buttonLabel : language . buttons . save } ) . then ( function ( files ) {
185+
186+ if ( files . filePaths && files . filePaths [ 0 ] && fs . statSync ( files . filePaths [ 0 ] ) . isDirectory ( ) )
187+ callback ( files . filePaths [ 0 ] , '[folder] - [image] - [page]' ) ;
138188
139189 } ) ;
140190}
0 commit comments