@@ -77,6 +77,33 @@ function saveImage()
77
77
saveAllImages ( currentIndex - 1 ) ;
78
78
}
79
79
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
+
80
107
function saveAllImages ( index = false )
81
108
{
82
109
const images = reading . images ( ) ;
@@ -88,53 +115,76 @@ function saveAllImages(index = false)
88
115
index = ( reading . indexNum ( ) - index ) - 1 ;
89
116
}
90
117
91
- electronRemote . dialog . showOpenDialog ( { properties : [ 'openDirectory' , 'createDirectory' ] , buttonLabel : language . buttons . save } ) . then ( async function ( files ) {
118
+ const saveDialog = macosMAS ? saveDialogDirectory : saveDialogFile ;
92
119
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 )
94
126
{
95
- const saveTo = files . filePaths [ 0 ] ;
96
- const toSave = [ ] ;
127
+ const path = images [ key ] . path ;
97
128
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 } ) ;
101
131
102
- if ( index === false || index == imagesData [ key ] . position )
103
- toSave . push ( { path : path } ) ;
104
- }
132
+ if ( + key > highestPage )
133
+ highestPage = + key ;
134
+ }
105
135
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 ( ) ;
107
144
108
- if ( toSave . length )
145
+ for ( let i = 0 , len = toSave . length ; i < len ; i ++ )
109
146
{
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 ;
113
151
152
+ if ( ! fs . existsSync ( saveImageTo ) )
153
+ fs . copyFileSync ( realPath , saveImageTo ) ;
154
+ }
155
+ }
114
156
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 : [
116
162
{
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
+ } ) ;
120
168
121
- if ( ! fs . existsSync ( saveImageTo ) )
122
- fs . copyFileSync ( realPath , saveImageTo ) ;
123
- }
124
- }
169
+ } ) ;
170
+ }
125
171
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]' ) ;
138
188
139
189
} ) ;
140
190
}
0 commit comments