KiCad PCB EDA Suite
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-2022 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 =
29 "<b>__NAME__</b>"
30 "__ALIASOF__"
31 "__DESC__"
32 "__KEY__"
33 "<hr><table border=0>"
34 "__FIELDS__"
35 "</table>";
36
37static const wxString AliasOfFormat = "<br><i>" + _( "Derived from" ) + " %s (%s)</i>";
38static const wxString DescFormat = "<br>%s";
39static const wxString KeywordsFormat = "<br>" + _( "Keywords" ) + ": %s";
40static const wxString FieldFormat =
41 "<tr>"
42 " <td><b>__NAME__</b></td>"
43 " <td>__VALUE__</td>"
44 "</tr>";
45static const wxString DatasheetLinkFormat = "<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( "__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 = "";
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( "__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( "__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( "__KEY__", wxEmptyString );
153 else
154 m_html.Replace( "__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 = aField.GetFullText( m_unit > 0 ? m_unit : 1 );
162 wxString fieldhtml = FieldFormat;
163
164 fieldhtml.Replace( "__NAME__", EscapeHTML( name ) );
165
166 switch( aField.GetId() )
167 {
168 case DATASHEET_FIELD:
170
171 if( text.IsEmpty() || text == wxT( "~" ) )
172 {
173 fieldhtml.Replace( "__VALUE__", text );
174 }
175 else
176 {
177 wxString datasheetlink = DatasheetLinkFormat;
178 datasheetlink.Replace( "__HREF__", EscapeHTML( text ) );
179
180 if( text.Length() > 75 )
181 text = text.Left( 72 ) + wxT( "..." );
182
183 datasheetlink.Replace( "__TEXT__", EscapeHTML( text ) );
184
185 fieldhtml.Replace( "__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 default:
195 fieldhtml.Replace( "__VALUE__", EscapeHTML( text ) );
196 }
197
198 return fieldhtml;
199 }
200
201
203 {
204 wxString fieldtable;
205 std::vector<LIB_FIELD*> fields;
206
207 m_symbol->GetFields( fields );
208
209 for( const LIB_FIELD* field: fields )
210 fieldtable += GetHtmlFieldRow( *field );
211
212 if( m_symbol->IsAlias() )
213 {
214 std::shared_ptr<LIB_SYMBOL> parent = m_symbol->GetParent().lock();
215
216 // Append all of the unique parent fields if this is an alias.
217 if( parent )
218 {
219 std::vector<LIB_FIELD*> parentFields;
220
221 parent->GetFields( parentFields );
222
223 for( const LIB_FIELD* parentField : parentFields )
224 {
225 if( m_symbol->FindField( parentField->GetCanonicalName() ) )
226 continue;
227
228 fieldtable += GetHtmlFieldRow( *parentField );
229 }
230 }
231 }
232
233 m_html.Replace( "__FIELDS__", fieldtable );
234 }
235};
236
237
238wxString GenerateAliasInfo( SYMBOL_LIB_TABLE* aSymLibTable, LIB_ID const& aLibId, int aUnit )
239{
240 FOOTPRINT_INFO_GENERATOR gen( aSymLibTable, aLibId, aUnit );
241 gen.GenerateHtml();
242 return gen.GetHtml();
243}
const char * name
Definition: DXF_plotter.cpp:56
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:87
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:60
wxString GetFullText(int unit=1) const
Return the text of a field.
Definition: lib_field.cpp:391
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:479
int GetId() const
Definition: lib_field.h:115
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:165
const UTF8 & GetLibItemName() const
Definition: lib_id.h:101
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:98
wxString GetKeyWords() const
Definition: lib_symbol.h:159
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
Definition: lib_symbol.h:182
bool IsAlias() const
Definition: lib_symbol.h:183
wxString GetName() const override
Definition: lib_symbol.h:136
void GetFields(std::vector< LIB_FIELD * > &aList)
Return a list of fields within this symbol.
LIB_FIELD * FindField(const wxString &aFieldName)
Find a field within this symbol matching aFieldName and returns it or NULL if not found.
wxString GetDescription() override
Definition: lib_symbol.h:146
LIB_FIELD & GetDatasheetField()
Return reference to the datasheet field.
LIB_SYMBOL_REF & GetParent()
Definition: lib_symbol.h:125
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:46
#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
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
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".