| 
						 | 
						/*
 * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr * Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com> * Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, you may find one here: * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * or you may search the http://www.gnu.org website for the version 2 license,
 * or you may write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA */
/**
 * @file wildcards_and_files_ext.cpp * Definition of file extensions used in Kicad. */#include <regex>
#include <wildcards_and_files_ext.h>
#include <wx/filedlg.h>
#include <wx/regex.h>
#include <wx/translation.h>
#include <regex>
bool compareFileExtensions( const std::string& aExtension,                            const std::vector<std::string>& aReference, bool aCaseSensitive ){    // Form the regular expression string by placing all possible extensions into it as alternatives
    std::string regexString = "(";    bool        first = true;
    for( const std::string& ext : aReference )    {        // The | separate goes between the extensions
        if( !first )            regexString += "|";        else            first = false;
        regexString += ext;    }
    regexString += ")";
    // Create the regex and see if it matches
    std::regex extRegex( regexString, aCaseSensitive ? std::regex::ECMAScript : std::regex::icase );    return std::regex_match( aExtension, extRegex );}
wxString formatWildcardExt( const wxString& aWildcard ){    wxString wc;#if defined( __WXGTK__ )
    for( const auto& ch : aWildcard )    {        if( wxIsalpha( ch ) )            wc += wxString::Format( "[%c%c]", wxTolower( ch ), wxToupper( ch ) );        else            wc += ch;    }
    return wc;#else
    wc = aWildcard;
    return wc;#endif
}
wxString AddFileExtListToFilter( const std::vector<std::string>& aExts ){    if( aExts.size() == 0 )    {        // The "all files" wildcard is different on different systems
        wxString filter;        filter << wxS( " (" ) << wxFileSelectorDefaultWildcardStr << wxS( ")|" )               << wxFileSelectorDefaultWildcardStr;        return filter;    }
    wxString files_filter = wxS( " (" );
    // Add extensions to the info message:
    for( const std::string& ext : aExts )    {        if( files_filter.length() > 2 )            files_filter << wxS( "; " );
        files_filter << "*." << ext;    }
    files_filter << wxS( ")|*." );
    // Add extensions to the filter list, using a formatted string (GTK specific):
    bool first = true;
    for( const std::string& ext : aExts )    {        if( !first )            files_filter << wxS( ";*." );
        first = false;
        files_filter << formatWildcardExt( ext );    }
    return files_filter;}
const std::string BackupFileSuffix( "-bak" );const std::string LockFilePrefix( "~" );const std::string LockFileExtension( "lck" );
const std::string KiCadSymbolLibFileExtension( "kicad_sym" );const std::string SchematicSymbolFileExtension( "sym" );const std::string LegacySymbolLibFileExtension( "lib" );const std::string LegacySymbolDocumentFileExtension( "dcm" );const std::string LtspiceSymbolExtension( "asy" );
const std::string VrmlFileExtension( "wrl" );
const std::string ProjectFileExtension( "kicad_pro" );const std::string LegacyProjectFileExtension( "pro" );const std::string ProjectLocalSettingsFileExtension( "kicad_prl" );const std::string LegacySchematicFileExtension( "sch" );const std::string EagleSchematicFileExtension( "sch" );const std::string CadstarSchematicFileExtension( "csa" );const std::string CadstarPartsLibraryFileExtension( "lib" );const std::string KiCadSchematicFileExtension( "kicad_sch" );const std::string SpiceFileExtension( "cir" );const std::string LtspiceSchematicExtension( "asc" );const std::string CadstarNetlistFileExtension( "frp" );const std::string OrCadPcb2NetlistFileExtension( "net" );const std::string NetlistFileExtension( "net" );const std::string AllegroNetlistFileExtension( "txt" );const std::string FootprintAssignmentFileExtension( "cmp" );const std::string GerberFileExtension( "gbr" );const std::string GerberJobFileExtension( "gbrjob" );const std::string HtmlFileExtension( "html" );const std::string EquFileExtension( "equ" );const std::string HotkeyFileExtension( "hotkeys" );const std::string DatabaseLibraryFileExtension( "kicad_dbl" );
const std::string ArchiveFileExtension( "zip" );
const std::string LegacyPcbFileExtension( "brd" );const std::string EaglePcbFileExtension( "brd" );const std::string CadstarPcbFileExtension( "cpa" );const std::string KiCadPcbFileExtension( "kicad_pcb" );const std::string DrawingSheetFileExtension( "kicad_wks" );const std::string DesignRulesFileExtension( "kicad_dru" );
const std::string PdfFileExtension( "pdf" );const std::string MacrosFileExtension( "mcr" );const std::string DrillFileExtension( "drl" );const std::string SVGFileExtension( "svg" );const std::string ReportFileExtension( "rpt" );const std::string FootprintPlaceFileExtension( "pos" );
const std::string KiCadFootprintLibPathExtension( "pretty" );   // this is a directory
const std::string LegacyFootprintLibPathExtension( "mod" );     // this is a file
const std::string AltiumFootprintLibPathExtension( "PcbLib" );  // this is a file
const std::string EagleFootprintLibPathExtension( "lbr" );      // this is a file
const std::string GedaPcbFootprintLibFileExtension( "fp" );     // this is a file
const std::string KiCadFootprintFileExtension( "kicad_mod" );const std::string SpecctraDsnFileExtension( "dsn" );const std::string SpecctraSessionFileExtension( "ses" );const std::string IpcD356FileExtension( "d356" );const std::string WorkbookFileExtension( "wbk" );
const std::string PngFileExtension( "png" );const std::string JpegFileExtension( "jpg" );const std::string TextFileExtension( "txt" );const std::string MarkdownFileExtension( "md" );const std::string CsvFileExtension( "csv" );const std::string XmlFileExtension( "xml" );const std::string JsonFileExtension( "json" );
const wxString GerberFileExtensionsRegex( "(gbr|gko|pho|(g[tb][alops])|(gm?\\d\\d*)|(gp[tb]))" );
bool IsGerberFileExtension( const wxString& ext ){    static wxRegEx gerberRE( GerberFileExtensionsRegex, wxRE_ICASE );
    return gerberRE.Matches( ext );}
wxString AllFilesWildcard(){    return _( "All files" ) + AddFileExtListToFilter( {} );}
wxString SchematicSymbolFileWildcard(){    return _( "KiCad drawing symbol files" ) + AddFileExtListToFilter( { "sym" } );}
wxString KiCadSymbolLibFileWildcard(){    return _( "KiCad symbol library files" )            + AddFileExtListToFilter( { KiCadSymbolLibFileExtension } );}
wxString LegacySymbolLibFileWildcard(){    return _( "KiCad legacy symbol library files" ) + AddFileExtListToFilter( { "lib" } );}
wxString DatabaseLibFileWildcard(){    return _( "KiCad database library files" )           + AddFileExtListToFilter( { DatabaseLibraryFileExtension } );}
wxString AllSymbolLibFilesWildcard(){    return _( "All KiCad symbol library files" )            + AddFileExtListToFilter( { KiCadSymbolLibFileExtension,                                        DatabaseLibraryFileExtension,                                        "lib" } );}
wxString ProjectFileWildcard(){    return _( "KiCad project files" ) + AddFileExtListToFilter( { ProjectFileExtension } );}
wxString LegacyProjectFileWildcard(){    return _( "KiCad legacy project files" )            + AddFileExtListToFilter( { LegacyProjectFileExtension } );}
wxString AllProjectFilesWildcard(){    return _( "All KiCad project files" )            + AddFileExtListToFilter( { ProjectFileExtension, LegacyProjectFileExtension } );}
wxString AllSchematicFilesWildcard(){    return _( "All KiCad schematic files" )            + AddFileExtListToFilter( { KiCadSchematicFileExtension, LegacySchematicFileExtension } );}
wxString LegacySchematicFileWildcard(){    return _( "KiCad legacy schematic files" )            + AddFileExtListToFilter( { LegacySchematicFileExtension } );}
wxString KiCadSchematicFileWildcard(){    return _( "KiCad s-expression schematic files" )            + AddFileExtListToFilter( { KiCadSchematicFileExtension } );}
wxString AltiumSchematicFileWildcard(){    return _( "Altium schematic files" ) + AddFileExtListToFilter( { "SchDoc" } );}
wxString CadstarSchematicArchiveFileWildcard(){    return _( "CADSTAR Schematic Archive files" ) + AddFileExtListToFilter( { "csa" } );}
wxString CadstarArchiveFilesWildcard(){    return _( "CADSTAR Archive files" ) + AddFileExtListToFilter( { "csa", "cpa" } );}
wxString EagleSchematicFileWildcard(){    return _( "Eagle XML schematic files" ) + AddFileExtListToFilter( { "sch" } );}
wxString LtspiceSchematicFileWildcard(){    return _( "LTspice schematic files" ) + AddFileExtListToFilter( { "asc" } );}
wxString EagleFilesWildcard(){    return _( "Eagle XML files" ) + AddFileExtListToFilter( { "sch", "brd" } );}
wxString OrCadPcb2NetlistFileWildcard(){    return _( "OrcadPCB2 netlist files" )            + AddFileExtListToFilter( { OrCadPcb2NetlistFileExtension } );}
wxString NetlistFileWildcard(){    return _( "KiCad netlist files" ) + AddFileExtListToFilter( { "net" } );}
wxString AllegroNetlistFileWildcard(){    return _( "Allegro netlist files" )            + AddFileExtListToFilter( { AllegroNetlistFileExtension } );}
wxString LegacyPcbFileWildcard(){    return _( "KiCad printed circuit board files" ) + AddFileExtListToFilter( { "brd" } );}
wxString EaglePcbFileWildcard(){    return _( "Eagle ver. 6.x XML PCB files" ) + AddFileExtListToFilter( { "brd" } );}
wxString CadstarPcbArchiveFileWildcard(){    return _( "CADSTAR PCB Archive files" ) + AddFileExtListToFilter( { "cpa" } );}
wxString PCadPcbFileWildcard(){    return _( "P-Cad 200x ASCII PCB files" ) + AddFileExtListToFilter( { "pcb" } );}
wxString AltiumDesignerPcbFileWildcard(){    return _( "Altium Designer PCB files" ) + AddFileExtListToFilter( { "PcbDoc" } );}
wxString AltiumCircuitStudioPcbFileWildcard(){    return _( "Altium Circuit Studio PCB files" ) + AddFileExtListToFilter( { "CSPcbDoc" } );}
wxString AltiumCircuitMakerPcbFileWildcard(){    return _( "Altium Circuit Maker PCB files" ) + AddFileExtListToFilter( { "CMPcbDoc" } );}
wxString SolidworksPcbFileWildcard(){    return _( "Solidworks PCB files" ) + AddFileExtListToFilter( { "SWPcbDoc" } );}
wxString FabmasterPcbFileWildcard(){    return _( "Fabmaster PCB files" ) + AddFileExtListToFilter( { "txt", "fab" } );}
wxString PcbFileWildcard(){    return _( "KiCad printed circuit board files" ) +           AddFileExtListToFilter( { KiCadPcbFileExtension } );}
wxString KiCadFootprintLibFileWildcard(){    return _( "KiCad footprint files" )            + AddFileExtListToFilter( { KiCadFootprintFileExtension } );}
wxString KiCadFootprintLibPathWildcard(){    return _( "KiCad footprint library paths" )            + AddFileExtListToFilter( { KiCadFootprintLibPathExtension } );}
wxString LegacyFootprintLibPathWildcard(){    return _( "Legacy footprint library files" ) + AddFileExtListToFilter( { "mod" } );}
wxString AltiumFootprintLibPathWildcard(){    return _( "Altium PCB footprint library files" ) + AddFileExtListToFilter( { "PcbLib" } );}
wxString EagleFootprintLibPathWildcard(){    return _( "Eagle ver. 6.x XML library files" ) + AddFileExtListToFilter( { "lbr" } );}
wxString GedaPcbFootprintLibFileWildcard(){    return _( "Geda PCB footprint library files" ) + AddFileExtListToFilter( { "fp" } );}
wxString DrawingSheetFileWildcard(){    return _( "Drawing sheet files" )            + AddFileExtListToFilter( { DrawingSheetFileExtension } );}
// Wildcard for cvpcb symbol to footprint link file
wxString FootprintAssignmentFileWildcard(){    return _( "KiCad symbol footprint link files" )            + AddFileExtListToFilter( { FootprintAssignmentFileExtension } );}
// Wildcard for reports and fabrication documents
wxString DrillFileWildcard(){    return _( "Drill files" )            + AddFileExtListToFilter( { DrillFileExtension, "nc", "xnc", "txt" } );}
wxString SVGFileWildcard(){    return _( "SVG files" ) + AddFileExtListToFilter( { SVGFileExtension } );}
wxString HtmlFileWildcard(){    return _( "HTML files" ) + AddFileExtListToFilter( { "htm", "html" } );}
wxString CsvFileWildcard(){    return _( "CSV Files" ) + AddFileExtListToFilter( { CsvFileExtension } );}
wxString PdfFileWildcard(){    return _( "Portable document format files" ) + AddFileExtListToFilter( { "pdf" } );}
wxString PSFileWildcard(){    return _( "PostScript files" ) + AddFileExtListToFilter( { "ps" } );}
wxString ReportFileWildcard(){    return _( "Report files" ) + AddFileExtListToFilter( { "rpt" } );}
wxString FootprintPlaceFileWildcard(){    return _( "Component placement files" ) + AddFileExtListToFilter( { "pos" } );}
wxString Shapes3DFileWildcard(){    return _( "VRML and X3D files" ) + AddFileExtListToFilter( { "wrl", "x3d" } );}
wxString IDF3DFileWildcard(){    return _( "IDFv3 footprint files" ) + AddFileExtListToFilter( { "idf" } );}
wxString TextFileWildcard(){    return _( "Text files" ) + AddFileExtListToFilter( { "txt" } );}
wxString ModLegacyExportFileWildcard(){    return _( "Legacy footprint export files" ) + AddFileExtListToFilter( { "emp" } );}
wxString ErcFileWildcard(){    return _( "Electrical rule check file" ) + AddFileExtListToFilter( { "erc" } );}
wxString SpiceLibraryFileWildcard(){    return _( "Spice library file" ) + AddFileExtListToFilter( { "lib", "mod" } );}
wxString SpiceNetlistFileWildcard(){    return _( "SPICE netlist file" ) + AddFileExtListToFilter( { "cir" } );}
wxString CadstarNetlistFileWildcard(){    return _( "CadStar netlist file" ) + AddFileExtListToFilter( { "frp" } );}
wxString EquFileWildcard(){    return _( "Symbol footprint association files" ) + AddFileExtListToFilter( { "equ" } );}
wxString ZipFileWildcard(){    return _( "Zip file" ) + AddFileExtListToFilter( { "zip" } );}
wxString GencadFileWildcard(){    return _( "GenCAD 1.4 board files" ) + AddFileExtListToFilter( { "cad" } );}
wxString DxfFileWildcard(){    return _( "DXF Files" ) + AddFileExtListToFilter( { "dxf" } );}
wxString GerberJobFileWildcard(){    return _( "Gerber job file" ) + AddFileExtListToFilter( { GerberJobFileExtension } );}
wxString SpecctraDsnFileWildcard(){    return _( "Specctra DSN file" )            + AddFileExtListToFilter( { SpecctraDsnFileExtension } );}
wxString SpecctraSessionFileWildcard(){    return _( "Specctra Session file" )            + AddFileExtListToFilter( { SpecctraSessionFileExtension } );}
wxString IpcD356FileWildcard(){    return _( "IPC-D-356 Test Files" )            + AddFileExtListToFilter( { IpcD356FileExtension } );}
wxString WorkbookFileWildcard(){    return _( "Workbook file" )            + AddFileExtListToFilter( { WorkbookFileExtension } );}
wxString PngFileWildcard(){    return _( "PNG file" ) + AddFileExtListToFilter( { "png" } );}
wxString JpegFileWildcard(){    return _( "Jpeg file" ) + AddFileExtListToFilter( { "jpg", "jpeg" } );}
wxString HotkeyFileWildcard(){    return _( "Hotkey file" ) + AddFileExtListToFilter( { HotkeyFileExtension } );}
  |