2017-02-19 14:00:02 +00:00
|
|
|
/*
|
|
|
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2017 Chris Pavlina <pavlina.chris@gmail.com>
|
2021-02-24 13:48:02 +00:00
|
|
|
* Copyright (C) 2017-2021 KiCad Developers, see AUTHORS.txt for contributors.
|
2017-02-19 14:00:02 +00:00
|
|
|
*
|
|
|
|
* 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 3 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, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <generate_alias_info.h>
|
|
|
|
#include <kicad_string.h>
|
|
|
|
#include <template_fieldnames.h>
|
2021-02-24 13:48:02 +00:00
|
|
|
#include <lib_symbol.h>
|
2017-09-15 14:17:44 +00:00
|
|
|
#include <symbol_lib_table.h>
|
2021-06-01 05:17:57 +00:00
|
|
|
#include <wx/log.h>
|
2017-02-19 14:00:02 +00:00
|
|
|
|
|
|
|
static const wxString DescriptionFormat =
|
|
|
|
"<b>__NAME__</b>"
|
|
|
|
"__ALIASOF__"
|
|
|
|
"__DESC__"
|
|
|
|
"__KEY__"
|
|
|
|
"<hr><table border=0>"
|
|
|
|
"__FIELDS__"
|
|
|
|
"</table>";
|
|
|
|
|
2018-03-08 04:23:16 +00:00
|
|
|
static const wxString AliasOfFormat = "<br><i>" + _( "Alias of" ) + " %s (%s)</i>";
|
2017-02-19 14:00:02 +00:00
|
|
|
static const wxString DescFormat = "<br>%s";
|
2020-10-20 20:18:48 +00:00
|
|
|
static const wxString KeywordsFormat = "<br>" + _( "Keywords" ) + ": %s";
|
2017-02-19 14:00:02 +00:00
|
|
|
static const wxString FieldFormat =
|
|
|
|
"<tr>"
|
|
|
|
" <td><b>__NAME__</b></td>"
|
|
|
|
" <td>__VALUE__</td>"
|
|
|
|
"</tr>";
|
2018-02-15 20:15:37 +00:00
|
|
|
static const wxString DatasheetLinkFormat = "<a href=\"__HREF__\">__TEXT__</a>";
|
2017-02-19 14:00:02 +00:00
|
|
|
|
|
|
|
|
2018-07-27 20:47:51 +00:00
|
|
|
class FOOTPRINT_INFO_GENERATOR
|
2017-02-19 14:00:02 +00:00
|
|
|
{
|
|
|
|
wxString m_html;
|
2017-09-15 14:17:44 +00:00
|
|
|
SYMBOL_LIB_TABLE* m_sym_lib_table;
|
|
|
|
LIB_ID const m_lib_id;
|
2021-06-10 18:51:46 +00:00
|
|
|
LIB_SYMBOL* m_symbol;
|
2017-02-19 20:11:35 +00:00
|
|
|
int m_unit;
|
2017-02-19 14:00:02 +00:00
|
|
|
|
|
|
|
public:
|
2018-07-27 20:47:51 +00:00
|
|
|
FOOTPRINT_INFO_GENERATOR( SYMBOL_LIB_TABLE* aSymbolLibTable, LIB_ID const& aLibId, int aUnit )
|
2017-02-19 14:00:02 +00:00
|
|
|
: m_html( DescriptionFormat ),
|
2017-09-15 14:17:44 +00:00
|
|
|
m_sym_lib_table( aSymbolLibTable ),
|
|
|
|
m_lib_id( aLibId ),
|
2019-11-06 19:15:42 +00:00
|
|
|
m_symbol( nullptr ),
|
2017-02-19 20:11:35 +00:00
|
|
|
m_unit( aUnit )
|
2017-02-19 14:00:02 +00:00
|
|
|
{ }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Generate the HTML internally.
|
|
|
|
*/
|
|
|
|
void GenerateHtml()
|
|
|
|
{
|
2017-09-15 14:17:44 +00:00
|
|
|
wxCHECK_RET( m_sym_lib_table, "Symbol library table pointer is not valid" );
|
|
|
|
|
|
|
|
if( !m_lib_id.IsValid() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
2020-12-20 18:59:07 +00:00
|
|
|
m_symbol = m_sym_lib_table->LoadSymbol( m_lib_id );
|
2017-09-15 14:17:44 +00:00
|
|
|
}
|
|
|
|
catch( const IO_ERROR& ioe )
|
|
|
|
{
|
2021-06-26 19:21:30 +00:00
|
|
|
wxLogError( _( "Error loading symbol %s from library '%s'." ) + wxS( "\n%s" ),
|
|
|
|
m_lib_id.GetLibItemName().wx_str(),
|
|
|
|
m_lib_id.GetLibNickname().wx_str(),
|
|
|
|
ioe.What() );
|
2017-09-15 14:17:44 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-11-06 19:15:42 +00:00
|
|
|
if( m_symbol )
|
2017-09-15 14:17:44 +00:00
|
|
|
{
|
|
|
|
SetHtmlName();
|
|
|
|
SetHtmlAliasOf();
|
|
|
|
SetHtmlDesc();
|
|
|
|
SetHtmlKeywords();
|
|
|
|
SetHtmlFieldTable();
|
|
|
|
}
|
2017-02-19 14:00:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return the generated HTML.
|
|
|
|
*/
|
2020-12-20 18:44:13 +00:00
|
|
|
wxString GetHtml() const
|
2017-02-19 14:00:02 +00:00
|
|
|
{
|
|
|
|
return m_html;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
void SetHtmlName()
|
|
|
|
{
|
2021-06-30 10:53:04 +00:00
|
|
|
m_html.Replace( "__NAME__", EscapeHTML( UnescapeString( m_symbol->GetName() ) ) );
|
2017-02-19 14:00:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SetHtmlAliasOf()
|
|
|
|
{
|
2019-11-06 19:15:42 +00:00
|
|
|
if( m_symbol->IsRoot() )
|
2017-02-19 14:00:02 +00:00
|
|
|
{
|
|
|
|
m_html.Replace( "__ALIASOF__", wxEmptyString );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-03-27 11:54:51 +00:00
|
|
|
wxString root_name = _( "Unknown" );
|
|
|
|
wxString root_desc = "";
|
|
|
|
|
2021-06-10 18:51:46 +00:00
|
|
|
std::shared_ptr< LIB_SYMBOL > parent = m_symbol->GetParent().lock();
|
2019-12-31 13:05:52 +00:00
|
|
|
|
|
|
|
if( parent )
|
|
|
|
{
|
|
|
|
root_name = parent->GetName();
|
|
|
|
root_desc = parent->GetDescription();
|
|
|
|
}
|
2017-03-27 11:54:51 +00:00
|
|
|
|
2020-11-30 12:14:22 +00:00
|
|
|
m_html.Replace( "__ALIASOF__", wxString::Format( AliasOfFormat,
|
2021-06-30 10:53:04 +00:00
|
|
|
EscapeHTML( UnescapeString( root_name ) ),
|
2020-11-30 12:14:22 +00:00
|
|
|
EscapeHTML( root_desc ) ) );
|
2017-02-19 14:00:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SetHtmlDesc()
|
|
|
|
{
|
2019-11-06 19:15:42 +00:00
|
|
|
wxString raw_desc = m_symbol->GetDescription();
|
2017-02-19 14:00:02 +00:00
|
|
|
|
2020-11-30 12:14:22 +00:00
|
|
|
m_html.Replace( "__DESC__", wxString::Format( DescFormat, EscapeHTML( raw_desc ) ) );
|
2017-02-19 14:00:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SetHtmlKeywords()
|
|
|
|
{
|
2019-11-06 19:15:42 +00:00
|
|
|
wxString keywords = m_symbol->GetKeyWords();
|
2017-02-19 14:00:02 +00:00
|
|
|
|
|
|
|
if( keywords.empty() )
|
|
|
|
m_html.Replace( "__KEY__", wxEmptyString );
|
|
|
|
else
|
2020-11-30 12:14:22 +00:00
|
|
|
m_html.Replace( "__KEY__", wxString::Format( KeywordsFormat, EscapeHTML( keywords ) ) );
|
2017-02-19 14:00:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-12-20 18:44:13 +00:00
|
|
|
wxString GetHtmlFieldRow( const LIB_FIELD& aField ) const
|
2017-02-19 14:00:02 +00:00
|
|
|
{
|
2020-03-26 11:02:59 +00:00
|
|
|
wxString name = aField.GetCanonicalName();
|
2017-02-19 20:11:35 +00:00
|
|
|
wxString text = aField.GetFullText( m_unit > 0 ? m_unit : 1 );
|
2017-02-19 14:00:02 +00:00
|
|
|
wxString fieldhtml = FieldFormat;
|
|
|
|
|
2020-11-30 12:14:22 +00:00
|
|
|
fieldhtml.Replace( "__NAME__", EscapeHTML( name ) );
|
2017-02-19 14:00:02 +00:00
|
|
|
|
2017-02-19 20:11:35 +00:00
|
|
|
switch( aField.GetId() )
|
2017-02-19 14:00:02 +00:00
|
|
|
{
|
2020-11-12 21:31:41 +00:00
|
|
|
case DATASHEET_FIELD:
|
2020-06-01 13:13:32 +00:00
|
|
|
text = m_symbol->GetDatasheetField().GetText();
|
2018-02-15 20:15:37 +00:00
|
|
|
|
2019-11-06 19:15:42 +00:00
|
|
|
if( text.IsEmpty() || text == wxT( "~" ) )
|
|
|
|
{
|
|
|
|
fieldhtml.Replace( "__VALUE__", text );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
wxString datasheetlink = DatasheetLinkFormat;
|
2020-11-30 12:14:22 +00:00
|
|
|
datasheetlink.Replace( "__HREF__", EscapeHTML( text ) );
|
2018-02-15 20:15:37 +00:00
|
|
|
|
2019-11-06 19:15:42 +00:00
|
|
|
if( text.Length() > 75 )
|
|
|
|
text = text.Left( 72 ) + wxT( "..." );
|
2018-02-15 20:15:37 +00:00
|
|
|
|
2020-11-30 12:14:22 +00:00
|
|
|
datasheetlink.Replace( "__TEXT__", EscapeHTML( text ) );
|
2018-02-15 20:15:37 +00:00
|
|
|
|
2019-11-06 19:15:42 +00:00
|
|
|
fieldhtml.Replace( "__VALUE__", datasheetlink );
|
2017-02-19 20:11:35 +00:00
|
|
|
}
|
2019-11-06 19:15:42 +00:00
|
|
|
|
2017-02-19 20:11:35 +00:00
|
|
|
break;
|
|
|
|
|
2020-11-12 21:31:41 +00:00
|
|
|
case VALUE_FIELD:
|
2018-08-13 22:27:54 +00:00
|
|
|
// showing the value just repeats the name, so that's not much use...
|
|
|
|
return wxEmptyString;
|
|
|
|
|
2017-02-19 20:11:35 +00:00
|
|
|
default:
|
2020-11-30 12:14:22 +00:00
|
|
|
fieldhtml.Replace( "__VALUE__", EscapeHTML( text ) );
|
2017-02-19 14:00:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return fieldhtml;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void SetHtmlFieldTable()
|
|
|
|
{
|
2020-12-15 15:06:19 +00:00
|
|
|
wxString fieldtable;
|
|
|
|
std::vector<LIB_FIELD*> fields;
|
|
|
|
|
2019-11-06 19:15:42 +00:00
|
|
|
m_symbol->GetFields( fields );
|
2017-02-19 14:00:02 +00:00
|
|
|
|
2020-12-15 15:06:19 +00:00
|
|
|
for( const LIB_FIELD* field: fields )
|
|
|
|
fieldtable += GetHtmlFieldRow( *field );
|
2017-02-19 14:00:02 +00:00
|
|
|
|
2019-11-06 19:15:42 +00:00
|
|
|
if( m_symbol->IsAlias() )
|
|
|
|
{
|
2021-06-10 18:51:46 +00:00
|
|
|
std::shared_ptr<LIB_SYMBOL> parent = m_symbol->GetParent().lock();
|
2019-11-06 19:15:42 +00:00
|
|
|
|
|
|
|
// Append all of the unique parent fields if this is an alias.
|
|
|
|
if( parent )
|
|
|
|
{
|
2020-12-15 15:06:19 +00:00
|
|
|
std::vector<LIB_FIELD*> parentFields;
|
2019-11-06 19:15:42 +00:00
|
|
|
|
|
|
|
parent->GetFields( parentFields );
|
|
|
|
|
2020-12-15 15:06:19 +00:00
|
|
|
for( const LIB_FIELD* parentField : parentFields )
|
2019-11-06 19:15:42 +00:00
|
|
|
{
|
2020-12-15 15:06:19 +00:00
|
|
|
if( m_symbol->FindField( parentField->GetCanonicalName() ) )
|
2019-11-06 19:15:42 +00:00
|
|
|
continue;
|
|
|
|
|
2020-12-15 15:06:19 +00:00
|
|
|
fieldtable += GetHtmlFieldRow( *parentField );
|
2019-11-06 19:15:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-19 14:00:02 +00:00
|
|
|
m_html.Replace( "__FIELDS__", fieldtable );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2017-09-15 14:17:44 +00:00
|
|
|
wxString GenerateAliasInfo( SYMBOL_LIB_TABLE* aSymLibTable, LIB_ID const& aLibId, int aUnit )
|
2017-02-19 14:00:02 +00:00
|
|
|
{
|
2018-07-27 20:47:51 +00:00
|
|
|
FOOTPRINT_INFO_GENERATOR gen( aSymLibTable, aLibId, aUnit );
|
2017-02-19 14:00:02 +00:00
|
|
|
gen.GenerateHtml();
|
|
|
|
return gen.GetHtml();
|
|
|
|
}
|