1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
5  * Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
6  * Copyright (C) 1992-2021 KiCad Developers, see AUTHORS.txt for contributors.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, you may find one here:
20  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21  * or you may search the http://www.gnu.org website for the version 2 license,
22  * or you may write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
24  */
25 
26 /**
27  * @file wildcards_and_files_ext.cpp
28  * Definition of file extensions used in Kicad.
29  */
30 #include <regex>
31 #include <wildcards_and_files_ext.h>
32 #include <wx/filedlg.h>
33 #include <wx/regex.h>
34 #include <wx/translation.h>
35 
compareFileExtensions(const std::string & aExtension,const std::vector<std::string> & aReference,bool aCaseSensitive)36 bool compareFileExtensions( const std::string& aExtension,
37         const std::vector<std::string>& aReference, bool aCaseSensitive )
38 {
39     // Form the regular expression string by placing all possible extensions into it as alternatives
40     std::string regexString = "(";
41     bool        first = true;
42     for( const auto& ext : aReference )
43     {
44         // The | separate goes between the extensions
45         if( !first )
46             regexString += "|";
47         else
48             first = false;
49 
50         regexString += ext;
51     }
52     regexString += ")";
53 
54     // Create the regex and see if it matches
55     std::regex extRegex( regexString, aCaseSensitive ? std::regex::ECMAScript : std::regex::icase );
56     return std::regex_match( aExtension, extRegex );
57 }
58 
59 
formatWildcardExt(const wxString & aWildcard)60 wxString formatWildcardExt( const wxString& aWildcard )
61 {
62     wxString wc;
63 #if defined( __WXGTK__ )
64 
65     for( auto ch : aWildcard )
66     {
67         if( wxIsalpha( ch ) )
68             wc += wxString::Format( "[%c%c]", wxTolower( ch ), wxToupper( ch ) );
69         else
70             wc += ch;
71     }
72 
73     return wc;
74 #else
75     wc = aWildcard;
76 
77     return wc;
78 #endif
79 }
80 
81 
AddFileExtListToFilter(const std::vector<std::string> & aExts)82 wxString AddFileExtListToFilter( const std::vector<std::string>& aExts )
83 {
84     if( aExts.size() == 0 )
85     {
86         // The "all files" wildcard is different on different systems
87         wxString filter;
88         filter << " (" << wxFileSelectorDefaultWildcardStr << ")|"
89                << wxFileSelectorDefaultWildcardStr;
90         return filter;
91     }
92 
93     wxString files_filter = " (";
94 
95     // Add extensions to the info message:
96     for( const std::string& ext : aExts )
97     {
98         if( files_filter.length() > 2 )
99             files_filter << "; ";
100 
101         files_filter << "*." << ext;
102     }
103 
104     files_filter << ")|*.";
105 
106     // Add extensions to the filter list, using a formatted string (GTK specific):
107     bool first = true;
108     for( const auto& ext : aExts )
109     {
110         if( !first )
111             files_filter << ";*.";
112 
113         first = false;
114 
115         files_filter << formatWildcardExt( ext );
116     }
117 
118     return files_filter;
119 }
120 
121 const std::string BackupFileSuffix( "-bak" );
122 
123 const std::string KiCadSymbolLibFileExtension( "kicad_sym" );
124 const std::string SchematicSymbolFileExtension( "sym" );
125 const std::string LegacySymbolLibFileExtension( "lib" );
126 const std::string LegacySymbolDocumentFileExtension( "dcm" );
127 
128 const std::string VrmlFileExtension( "wrl" );
129 
130 const std::string ProjectFileExtension( "kicad_pro" );
131 const std::string LegacyProjectFileExtension( "pro" );
132 const std::string ProjectLocalSettingsFileExtension( "kicad_prl" );
133 const std::string LegacySchematicFileExtension( "sch" );
134 const std::string KiCadSchematicFileExtension( "kicad_sch" );
135 const std::string NetlistFileExtension( "net" );
136 const std::string FootprintAssignmentFileExtension( "cmp" );
137 const std::string GerberFileExtension( "gbr" );
138 const std::string GerberJobFileExtension( "gbrjob" );
139 const std::string HtmlFileExtension( "html" );
140 const std::string EquFileExtension( "equ" );
141 const std::string HotkeyFileExtension( "hotkeys" );
142 
143 const std::string ArchiveFileExtension( "zip" );
144 
145 const std::string LegacyPcbFileExtension( "brd" );
146 const std::string KiCadPcbFileExtension( "kicad_pcb" );
147 const std::string DrawingSheetFileExtension( "kicad_wks" );
148 const std::string DesignRulesFileExtension( "kicad_dru" );
149 
150 const std::string PdfFileExtension( "pdf" );
151 const std::string MacrosFileExtension( "mcr" );
152 const std::string DrillFileExtension( "drl" );
153 const std::string SVGFileExtension( "svg" );
154 const std::string ReportFileExtension( "rpt" );
155 const std::string FootprintPlaceFileExtension( "pos" );
156 
157 const std::string KiCadFootprintLibPathExtension( "pretty" );   // this is a directory
158 const std::string LegacyFootprintLibPathExtension( "mod" );     // this is a file
159 const std::string EagleFootprintLibPathExtension( "lbr" );      // this is a file
160 const std::string GedaPcbFootprintLibFileExtension( "fp" );     // this is a file
161 
162 const std::string KiCadFootprintFileExtension( "kicad_mod" );
163 const std::string SpecctraDsnFileExtension( "dsn" );
164 const std::string SpecctraSessionFileExtension( "ses" );
165 const std::string IpcD356FileExtension( "d356" );
166 const std::string WorkbookFileExtension( "wbk" );
167 
168 const std::string PngFileExtension( "png" );
169 const std::string JpegFileExtension( "jpg" );
170 const std::string TextFileExtension( "txt" );
171 
172 
IsProtelExtension(const wxString & ext)173 bool IsProtelExtension( const wxString& ext )
174 {
175     static wxRegEx protelRE( wxT( "(gm1)|(g[tb][lapos])|(g\\d\\d*)" ), wxRE_ICASE );
176 
177     return protelRE.Matches( ext );
178 }
179 
180 
AllFilesWildcard()181 wxString AllFilesWildcard()
182 {
183     return _( "All files" ) + AddFileExtListToFilter( {} );
184 }
185 
186 
SchematicSymbolFileWildcard()187 wxString SchematicSymbolFileWildcard()
188 {
189     return _( "KiCad drawing symbol files" ) + AddFileExtListToFilter( { "sym" } );
190 }
191 
192 
KiCadSymbolLibFileWildcard()193 wxString KiCadSymbolLibFileWildcard()
194 {
195     return _( "KiCad symbol library files" )
196             + AddFileExtListToFilter( { KiCadSymbolLibFileExtension } );
197 }
198 
199 
LegacySymbolLibFileWildcard()200 wxString LegacySymbolLibFileWildcard()
201 {
202     return _( "KiCad legacy symbol library files" ) + AddFileExtListToFilter( { "lib" } );
203 }
204 
205 
AllSymbolLibFilesWildcard()206 wxString AllSymbolLibFilesWildcard()
207 {
208     return _( "All KiCad symbol library files" )
209             + AddFileExtListToFilter( { KiCadSymbolLibFileExtension, "lib" } );
210 }
211 
212 
ProjectFileWildcard()213 wxString ProjectFileWildcard()
214 {
215     return _( "KiCad project files" ) + AddFileExtListToFilter( { ProjectFileExtension } );
216 }
217 
218 
LegacyProjectFileWildcard()219 wxString LegacyProjectFileWildcard()
220 {
221     return _( "KiCad legacy project files" )
222             + AddFileExtListToFilter( { LegacyProjectFileExtension } );
223 }
224 
225 
AllProjectFilesWildcard()226 wxString AllProjectFilesWildcard()
227 {
228     return _( "All KiCad project files" )
229             + AddFileExtListToFilter( { ProjectFileExtension, LegacyProjectFileExtension } );
230 }
231 
232 
AllSchematicFilesWildcard()233 wxString AllSchematicFilesWildcard()
234 {
235     return _( "All KiCad schematic files" )
236             + AddFileExtListToFilter( { KiCadSchematicFileExtension, LegacySchematicFileExtension } );
237 }
238 
239 
LegacySchematicFileWildcard()240 wxString LegacySchematicFileWildcard()
241 {
242     return _( "KiCad legacy schematic files" )
243             + AddFileExtListToFilter( { LegacySchematicFileExtension } );
244 }
245 
246 
KiCadSchematicFileWildcard()247 wxString KiCadSchematicFileWildcard()
248 {
249     return _( "KiCad s-expression schematic files" )
250             + AddFileExtListToFilter( { KiCadSchematicFileExtension } );
251 }
252 
253 
AltiumSchematicFileWildcard()254 wxString AltiumSchematicFileWildcard()
255 {
256     return _( "Altium schematic files" ) + AddFileExtListToFilter( { "SchDoc" } );
257 }
258 
259 
CadstarSchematicArchiveFileWildcard()260 wxString CadstarSchematicArchiveFileWildcard()
261 {
262     return _( "CADSTAR Schematic Archive files" ) + AddFileExtListToFilter( { "csa" } );
263 }
264 
265 
CadstarArchiveFilesWildcard()266 wxString CadstarArchiveFilesWildcard()
267 {
268     return _( "CADSTAR Archive files" ) + AddFileExtListToFilter( { "csa", "cpa" } );
269 }
270 
271 
EagleSchematicFileWildcard()272 wxString EagleSchematicFileWildcard()
273 {
274     return _( "Eagle XML schematic files" ) + AddFileExtListToFilter( { "sch" } );
275 }
276 
277 
EagleFilesWildcard()278 wxString EagleFilesWildcard()
279 {
280     return _( "Eagle XML files" ) + AddFileExtListToFilter( { "sch", "brd" } );
281 }
282 
283 
NetlistFileWildcard()284 wxString NetlistFileWildcard()
285 {
286     return _( "KiCad netlist files" ) + AddFileExtListToFilter( { "net" } );
287 }
288 
289 
GerberFileWildcard()290 wxString GerberFileWildcard()
291 {
292     return _( "Gerber files" ) + AddFileExtListToFilter( { "pho" } );
293 }
294 
295 
LegacyPcbFileWildcard()296 wxString LegacyPcbFileWildcard()
297 {
298     return _( "KiCad printed circuit board files" ) + AddFileExtListToFilter( { "brd" } );
299 }
300 
301 
EaglePcbFileWildcard()302 wxString EaglePcbFileWildcard()
303 {
304     return _( "Eagle ver. 6.x XML PCB files" ) + AddFileExtListToFilter( { "brd" } );
305 }
306 
CadstarPcbArchiveFileWildcard()307 wxString CadstarPcbArchiveFileWildcard()
308 {
309     return _( "CADSTAR PCB Archive files" ) + AddFileExtListToFilter( { "cpa" } );
310 }
311 
PCadPcbFileWildcard()312 wxString PCadPcbFileWildcard()
313 {
314     return _( "P-Cad 200x ASCII PCB files" ) + AddFileExtListToFilter( { "pcb" } );
315 }
316 
AltiumDesignerPcbFileWildcard()317 wxString AltiumDesignerPcbFileWildcard()
318 {
319     return _( "Altium Designer PCB files" ) + AddFileExtListToFilter( { "PcbDoc" } );
320 }
321 
AltiumCircuitStudioPcbFileWildcard()322 wxString AltiumCircuitStudioPcbFileWildcard()
323 {
324     return _( "Altium Circuit Studio PCB files" ) + AddFileExtListToFilter( { "CSPcbDoc" } );
325 }
326 
AltiumCircuitMakerPcbFileWildcard()327 wxString AltiumCircuitMakerPcbFileWildcard()
328 {
329     return _( "Altium Circuit Maker PCB files" ) + AddFileExtListToFilter( { "CMPcbDoc" } );
330 }
331 
FabmasterPcbFileWildcard()332 wxString FabmasterPcbFileWildcard()
333 {
334     return _( "Fabmaster PCB files" ) + AddFileExtListToFilter( { "txt", "fab" } );
335 }
336 
PcbFileWildcard()337 wxString PcbFileWildcard()
338 {
339     return _( "KiCad printed circuit board files" ) +
340            AddFileExtListToFilter( { KiCadPcbFileExtension } );
341 }
342 
343 
KiCadFootprintLibFileWildcard()344 wxString KiCadFootprintLibFileWildcard()
345 {
346     return _( "KiCad footprint files" )
347             + AddFileExtListToFilter( { KiCadFootprintFileExtension } );
348 }
349 
350 
KiCadFootprintLibPathWildcard()351 wxString KiCadFootprintLibPathWildcard()
352 {
353     return _( "KiCad footprint library paths" )
354             + AddFileExtListToFilter( { KiCadFootprintLibPathExtension } );
355 }
356 
357 
LegacyFootprintLibPathWildcard()358 wxString LegacyFootprintLibPathWildcard()
359 {
360     return _( "Legacy footprint library files" ) + AddFileExtListToFilter( { "mod" } );
361 }
362 
363 
EagleFootprintLibPathWildcard()364 wxString EagleFootprintLibPathWildcard()
365 {
366     return _( "Eagle ver. 6.x XML library files" ) + AddFileExtListToFilter( { "lbr" } );
367 }
368 
369 
GedaPcbFootprintLibFileWildcard()370 wxString GedaPcbFootprintLibFileWildcard()
371 {
372     return _( "Geda PCB footprint library files" ) + AddFileExtListToFilter( { "fp" } );
373 }
374 
375 
DrawingSheetFileWildcard()376 wxString DrawingSheetFileWildcard()
377 {
378     return _( "Drawing sheet files" )
379             + AddFileExtListToFilter( { DrawingSheetFileExtension } );
380 }
381 
382 
383 // Wildcard for cvpcb symbol to footprint link file
FootprintAssignmentFileWildcard()384 wxString FootprintAssignmentFileWildcard()
385 {
386     return _( "KiCad symbol footprint link files" )
387             + AddFileExtListToFilter( { FootprintAssignmentFileExtension } );
388 }
389 
390 
391 // Wildcard for reports and fabrication documents
DrillFileWildcard()392 wxString DrillFileWildcard()
393 {
394     return _( "Drill files" )
395             + AddFileExtListToFilter( { DrillFileExtension, "nc", "xnc", "txt" } );
396 }
397 
398 
SVGFileWildcard()399 wxString SVGFileWildcard()
400 {
401     return _( "SVG files" ) + AddFileExtListToFilter( { SVGFileExtension } );
402 }
403 
404 
HtmlFileWildcard()405 wxString HtmlFileWildcard()
406 {
407     return _( "HTML files" ) + AddFileExtListToFilter( { "htm", "html" } );
408 }
409 
410 
CsvFileWildcard()411 wxString CsvFileWildcard()
412 {
413     return _( "CSV Files" ) + AddFileExtListToFilter( { "csv" } );
414 }
415 
416 
PdfFileWildcard()417 wxString PdfFileWildcard()
418 {
419     return _( "Portable document format files" ) + AddFileExtListToFilter( { "pdf" } );
420 }
421 
422 
PSFileWildcard()423 wxString PSFileWildcard()
424 {
425     return _( "PostScript files" ) + AddFileExtListToFilter( { "ps" } );
426 }
427 
428 
ReportFileWildcard()429 wxString ReportFileWildcard()
430 {
431     return _( "Report files" ) + AddFileExtListToFilter( { "rpt" } );
432 }
433 
434 
FootprintPlaceFileWildcard()435 wxString FootprintPlaceFileWildcard()
436 {
437     return _( "Component placement files" ) + AddFileExtListToFilter( { "pos" } );
438 }
439 
440 
Shapes3DFileWildcard()441 wxString Shapes3DFileWildcard()
442 {
443     return _( "VRML and X3D files" ) + AddFileExtListToFilter( { "wrl", "x3d" } );
444 }
445 
446 
IDF3DFileWildcard()447 wxString IDF3DFileWildcard()
448 {
449     return _( "IDFv3 footprint files" ) + AddFileExtListToFilter( { "idf" } );
450 }
451 
452 
TextFileWildcard()453 wxString TextFileWildcard()
454 {
455     return _( "Text files" ) + AddFileExtListToFilter( { "txt" } );
456 }
457 
458 
ModLegacyExportFileWildcard()459 wxString ModLegacyExportFileWildcard()
460 {
461     return _( "Legacy footprint export files" ) + AddFileExtListToFilter( { "emp" } );
462 }
463 
464 
ErcFileWildcard()465 wxString ErcFileWildcard()
466 {
467     return _( "Electrical rule check file" ) + AddFileExtListToFilter( { "erc" } );
468 }
469 
470 
SpiceLibraryFileWildcard()471 wxString SpiceLibraryFileWildcard()
472 {
473     return _( "Spice library file" ) + AddFileExtListToFilter( { "lib", "mod" } );
474 }
475 
476 
SpiceNetlistFileWildcard()477 wxString SpiceNetlistFileWildcard()
478 {
479     return _( "SPICE netlist file" ) + AddFileExtListToFilter( { "cir" } );
480 }
481 
482 
CadstarNetlistFileWildcard()483 wxString CadstarNetlistFileWildcard()
484 {
485     return _( "CadStar netlist file" ) + AddFileExtListToFilter( { "frp" } );
486 }
487 
488 
EquFileWildcard()489 wxString EquFileWildcard()
490 {
491     return _( "Symbol footprint association files" ) + AddFileExtListToFilter( { "equ" } );
492 }
493 
494 
ZipFileWildcard()495 wxString ZipFileWildcard()
496 {
497     return _( "Zip file" ) + AddFileExtListToFilter( { "zip" } );
498 }
499 
500 
GencadFileWildcard()501 wxString GencadFileWildcard()
502 {
503     return _( "GenCAD 1.4 board files" ) + AddFileExtListToFilter( { "cad" } );
504 }
505 
506 
DxfFileWildcard()507 wxString DxfFileWildcard()
508 {
509     return _( "DXF Files" ) + AddFileExtListToFilter( { "dxf" } );
510 }
511 
512 
GerberJobFileWildcard()513 wxString GerberJobFileWildcard()
514 {
515     return _( "Gerber job file" ) + AddFileExtListToFilter( { GerberJobFileExtension } );
516 }
517 
518 
SpecctraDsnFileWildcard()519 wxString SpecctraDsnFileWildcard()
520 {
521     return _( "Specctra DSN file" )
522             + AddFileExtListToFilter( { SpecctraDsnFileExtension } );
523 }
524 
525 
SpecctraSessionFileWildcard()526 wxString SpecctraSessionFileWildcard()
527 {
528     return _( "Specctra Session file" )
529             + AddFileExtListToFilter( { SpecctraSessionFileExtension } );
530 }
531 
532 
IpcD356FileWildcard()533 wxString IpcD356FileWildcard()
534 {
535     return _( "IPC-D-356 Test Files" )
536             + AddFileExtListToFilter( { IpcD356FileExtension } );
537 }
538 
539 
WorkbookFileWildcard()540 wxString WorkbookFileWildcard()
541 {
542     return _( "Workbook file" )
543             + AddFileExtListToFilter( { WorkbookFileExtension } );
544 }
545 
546 
PngFileWildcard()547 wxString PngFileWildcard()
548 {
549     return _( "PNG file" ) + AddFileExtListToFilter( { "png" } );
550 }
551 
552 
JpegFileWildcard()553 wxString JpegFileWildcard()
554 {
555     return _( "Jpeg file" ) + AddFileExtListToFilter( { "jpg", "jpeg" } );
556 }
557 
558 
HotkeyFileWildcard()559 wxString HotkeyFileWildcard()
560 {
561     return _( "Hotkey file" ) + AddFileExtListToFilter( { HotkeyFileExtension } );
562 }
563