KiCad PCB EDA Suite
Loading...
Searching...
No Matches
generate_alias_info.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2017 Chris Pavlina <[email protected]>
5 * Copyright (C) 2017-2023 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21#include <generate_alias_info.h>
22#include <string_utils.h>
23#include <template_fieldnames.h>
24#include <lib_symbol.h>
25#include <symbol_lib_table.h>
26#include <wx/log.h>
27
28static const wxString DescriptionFormat = wxS(
29 "<b>__NAME__</b>"
30 "__ALIASOF__"
31 "__DESC__"
32 "__KEY__"
33 "<hr><table border=0>"
34 "__FIELDS__"
35 "</table>" );
36
37static const wxString AliasOfFormat = wxS( "<br><i>" ) + _( "Derived from" ) + wxS( " %s (%s)</i>" );
38static const wxString DescFormat = wxS( "<br>%s" );
39static const wxString KeywordsFormat = wxS( "<br>" ) + _( "Keywords" ) + wxS( ": %s" );
40static const wxString FieldFormat = wxS(
41 "<tr>"
42 " <td><b>__NAME__</b></td>"
43 " <td>__VALUE__</td>"
44 "</tr>" );
45static const wxString DatasheetLinkFormat = wxS( "<a href=\"__HREF__\">__TEXT__</a>" );
46
47
49{
50 wxString m_html;
54 int m_unit;
55
56public:
57 FOOTPRINT_INFO_GENERATOR( SYMBOL_LIB_TABLE* aSymbolLibTable, LIB_ID const& aLibId, int aUnit )
59 m_sym_lib_table( aSymbolLibTable ),
60 m_lib_id( aLibId ),
61 m_symbol( nullptr ),
62 m_unit( aUnit )
63 { }
64
69 {
70 wxCHECK_RET( m_sym_lib_table, "Symbol library table pointer is not valid" );
71
72 if( !m_lib_id.IsValid() )
73 return;
74
75 try
76 {
78 }
79 catch( const IO_ERROR& ioe )
80 {
81 wxLogError( _( "Error loading symbol %s from library '%s'." ) + wxS( "\n%s" ),
84 ioe.What() );
85 return;
86 }
87
88 if( m_symbol )
89 {
95 }
96 }
97
101 wxString GetHtml() const
102 {
103 return m_html;
104 }
105
106protected:
108 {
109 m_html.Replace( wxS( "__NAME__" ), EscapeHTML( UnescapeString( m_symbol->GetName() ) ) );
110 }
111
112
114 {
115 if( m_symbol->IsRoot() )
116 {
117 m_html.Replace( "__ALIASOF__", wxEmptyString );
118 }
119 else
120 {
121 wxString root_name = _( "Unknown" );
122 wxString root_desc = wxS( "" );
123
124 std::shared_ptr< LIB_SYMBOL > parent = m_symbol->GetParent().lock();
125
126 if( parent )
127 {
128 root_name = parent->GetName();
129 root_desc = parent->GetDescription();
130 }
131
132 m_html.Replace( wxS( "__ALIASOF__" ), wxString::Format( AliasOfFormat,
133 EscapeHTML( UnescapeString( root_name ) ),
134 EscapeHTML( root_desc ) ) );
135 }
136 }
137
138
140 {
141 wxString raw_desc = m_symbol->GetDescription();
142
143 m_html.Replace( wxS( "__DESC__" ), wxString::Format( DescFormat, EscapeHTML( raw_desc ) ) );
144 }
145
146
148 {
149 wxString keywords = m_symbol->GetKeyWords();
150
151 if( keywords.empty() )
152 m_html.Replace( wxS( "__KEY__" ), wxEmptyString );
153 else
154 m_html.Replace( wxS( "__KEY__" ), wxString::Format( KeywordsFormat, EscapeHTML( keywords ) ) );
155 }
156
157
158 wxString GetHtmlFieldRow( const LIB_FIELD& aField ) const
159 {
160 wxString name = aField.GetCanonicalName();
161 wxString text;
162 wxString fieldhtml = FieldFormat;
163
164 fieldhtml.Replace( wxS( "__NAME__" ), EscapeHTML( name ) );
165
166 switch( aField.GetId() )
167 {
168 case DATASHEET_FIELD:
170
171 if( text.IsEmpty() || text == wxT( "~" ) )
172 {
173 fieldhtml.Replace( wxS( "__VALUE__" ), text );
174 }
175 else
176 {
177 wxString datasheetlink = DatasheetLinkFormat;
178 datasheetlink.Replace( wxS( "__HREF__" ), EscapeHTML( text ) );
179
180 if( text.Length() > 75 )
181 text = text.Left( 72 ) + wxT( "..." );
182
183 datasheetlink.Replace( wxS( "__TEXT__" ), EscapeHTML( text ) );
184
185 fieldhtml.Replace( wxS( "__VALUE__" ), datasheetlink );
186 }
187
188 break;
189
190 case VALUE_FIELD:
191 // showing the value just repeats the name, so that's not much use...
192 return wxEmptyString;
193
194 case REFERENCE_FIELD:
195 text = aField.GetFullText( m_unit > 0 ? m_unit : 1 );
196 fieldhtml.Replace( wxS( "__VALUE__" ), EscapeHTML( text ) );
197 break;
198
199 default:
200 text = aField.GetShownText( false );
201 fieldhtml.Replace( wxS( "__VALUE__" ), EscapeHTML( text ) );
202 }
203
204 return fieldhtml;
205 }
206
207
209 {
210 wxString fieldtable;
211 std::vector<LIB_FIELD*> fields;
212
213 m_symbol->GetFields( fields );
214
215 for( const LIB_FIELD* field: fields )
216 fieldtable += GetHtmlFieldRow( *field );
217
218 if( m_symbol->IsAlias() )
219 {
220 std::shared_ptr<LIB_SYMBOL> parent = m_symbol->GetParent().lock();
221
222 // Append all of the unique parent fields if this is an alias.
223 if( parent )
224 {
225 std::vector<LIB_FIELD*> parentFields;
226
227 parent->GetFields( parentFields );
228
229 for( const LIB_FIELD* parentField : parentFields )
230 {
231 if( m_symbol->FindField( parentField->GetCanonicalName() ) )
232 continue;
233
234 fieldtable += GetHtmlFieldRow( *parentField );
235 }
236 }
237 }
238
239 m_html.Replace( wxS( "__FIELDS__" ), fieldtable );
240 }
241};
242
243
244wxString GenerateAliasInfo( SYMBOL_LIB_TABLE* aSymLibTable, LIB_ID const& aLibId, int aUnit )
245{
246 FOOTPRINT_INFO_GENERATOR gen( aSymLibTable, aLibId, aUnit );
247 gen.GenerateHtml();
248 return gen.GetHtml();
249}
const char * name
Definition: DXF_plotter.cpp:57
wxString GetHtmlFieldRow(const LIB_FIELD &aField) const
SYMBOL_LIB_TABLE * m_sym_lib_table
FOOTPRINT_INFO_GENERATOR(SYMBOL_LIB_TABLE *aSymbolLibTable, LIB_ID const &aLibId, int aUnit)
void GenerateHtml()
Generate the HTML internally.
wxString GetHtml() const
Return the generated HTML.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:76
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
Field object used in symbol libraries.
Definition: lib_field.h:62
wxString GetFullText(int unit=1) const
Return the text of a field.
Definition: lib_field.cpp:410
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
Definition: lib_field.cpp:498
wxString GetShownText(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
Definition: lib_field.cpp:427
int GetId() const
Definition: lib_field.h:120
A logical library item identifier and consists of various portions much like a URI.
Definition: lib_id.h:49
bool IsValid() const
Check if this LID_ID is valid.
Definition: lib_id.h:172
const UTF8 & GetLibItemName() const
Definition: lib_id.h:102
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition: lib_id.h:87
Define a library symbol object.
Definition: lib_symbol.h:99
wxString GetKeyWords() const
Definition: lib_symbol.h:191
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
Definition: lib_symbol.h:214
bool IsAlias() const
Definition: lib_symbol.h:215
wxString GetName() const override
Definition: lib_symbol.h:160
LIB_FIELD * FindField(const wxString &aFieldName, bool aCaseInsensitive=false)
Find a field within this symbol matching aFieldName and returns it or NULL if not found.
void GetFields(std::vector< LIB_FIELD * > &aList)
Return a list of fields within this symbol.
wxString GetDescription() override
Definition: lib_symbol.h:178
LIB_FIELD & GetDatasheetField()
Return reference to the datasheet field.
LIB_SYMBOL_REF & GetParent()
Definition: lib_symbol.h:127
LIB_SYMBOL * LoadSymbol(const wxString &aNickname, const wxString &aName)
Load a LIB_SYMBOL having aName from the library given by aNickname.
wxString wx_str() const
Definition: utf8.cpp:45
#define _(s)
static const wxString KeywordsFormat
static const wxString DatasheetLinkFormat
static const wxString DescriptionFormat
static const wxString DescFormat
wxString GenerateAliasInfo(SYMBOL_LIB_TABLE *aSymLibTable, LIB_ID const &aLibId, int aUnit)
Return an HTML page describing a LIB_ID in a SYMBOL_LIB_TABLE.
static const wxString AliasOfFormat
static const wxString FieldFormat
static const wxString KeywordsFormat
static const wxString DescriptionFormat
wxString EscapeHTML(const wxString &aString)
Return a new wxString escaped for embedding in HTML.
wxString UnescapeString(const wxString &aSource)
@ DATASHEET_FIELD
name of datasheet
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".