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 The 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" ) +
38 wxS( " %s (%s)</i>" );
39static const wxString DescFormat = wxS( "<br>%s" );
40static const wxString KeywordsFormat = wxS( "<br>" ) + _( "Keywords" ) + wxS( ": %s" );
41static const wxString FieldFormat = wxS(
42 "<tr>"
43 " <td><b>__NAME__</b></td>"
44 " <td>__VALUE__</td>"
45 "</tr>" );
46static const wxString DatasheetLinkFormat = wxS( "<a href=\"__HREF__\">__TEXT__</a>" );
47
48
50{
51 wxString m_html;
55 int m_unit;
56
57public:
58 FOOTPRINT_INFO_GENERATOR( SYMBOL_LIB_TABLE* aSymbolLibTable, LIB_ID const& aLibId, int aUnit )
60 m_sym_lib_table( aSymbolLibTable ),
61 m_lib_id( aLibId ),
62 m_symbol( nullptr ),
63 m_unit( aUnit )
64 { }
65
70 {
71 wxCHECK_RET( m_sym_lib_table, "Symbol library table pointer is not valid" );
72
73 if( !m_lib_id.IsValid() )
74 return;
75
76 try
77 {
79 }
80 catch( const IO_ERROR& ioe )
81 {
82 wxLogError( _( "Error loading symbol %s from library '%s'." ) + wxS( "\n%s" ),
85 ioe.What() );
86 return;
87 }
88
89 if( m_symbol )
90 {
96 }
97 }
98
102 wxString GetHtml() const
103 {
104 return m_html;
105 }
106
107protected:
109 {
110 m_html.Replace( wxS( "__NAME__" ), EscapeHTML( UnescapeString( m_symbol->GetName() ) ) );
111 }
112
113
115 {
116 if( m_symbol->IsRoot() )
117 {
118 m_html.Replace( "__ALIASOF__", wxEmptyString );
119 }
120 else
121 {
122 wxString root_name = _( "Unknown" );
123 wxString root_desc = wxS( "" );
124
125 std::shared_ptr< LIB_SYMBOL > parent = m_symbol->GetParent().lock();
126
127 if( parent )
128 {
129 root_name = parent->GetName();
130 root_desc = parent->GetDesc();
131 }
132
133 m_html.Replace( wxS( "__ALIASOF__" ),
134 wxString::Format( AliasOfFormat,
135 EscapeHTML( UnescapeString( root_name ) ),
136 EscapeHTML( root_desc ) ) );
137 }
138 }
139
140
142 {
143 wxString esc_desc = EscapeHTML( UnescapeString( m_symbol->GetDescription() ) );
144
145 // Add line breaks
146 esc_desc.Replace( wxS( "\n" ), wxS( "<br>" ) );
147
148 // Add links
149 esc_desc = LinkifyHTML( esc_desc );
150
151 m_html.Replace( wxS( "__DESC__" ), wxString::Format( DescFormat, esc_desc ) );
152 }
153
154
156 {
157 wxString keywords = m_symbol->GetKeyWords();
158
159 if( keywords.empty() )
160 m_html.Replace( wxS( "__KEY__" ), wxEmptyString );
161 else
162 m_html.Replace( wxS( "__KEY__" ),
163 wxString::Format( KeywordsFormat, EscapeHTML( keywords ) ) );
164 }
165
166
167 wxString GetHtmlFieldRow( const SCH_FIELD& aField ) const
168 {
169 wxString name = aField.GetCanonicalName();
170 wxString text;
171 wxString fieldhtml = FieldFormat;
172
173 fieldhtml.Replace( wxS( "__NAME__" ), EscapeHTML( name ) );
174
175 switch( aField.GetId() )
176 {
177 case DATASHEET_FIELD:
179
180 if( text.IsEmpty() || text == wxT( "~" ) )
181 {
182 fieldhtml.Replace( wxS( "__VALUE__" ), text );
183 }
184 else
185 {
186 wxString datasheetlink = DatasheetLinkFormat;
187 datasheetlink.Replace( wxS( "__HREF__" ), EscapeHTML( text ) );
188
189 if( text.Length() > 75 )
190 text = text.Left( 72 ) + wxT( "..." );
191
192 datasheetlink.Replace( wxS( "__TEXT__" ), EscapeHTML( text ) );
193
194 fieldhtml.Replace( wxS( "__VALUE__" ), datasheetlink );
195 }
196
197 break;
198
199 case VALUE_FIELD:
200 // showing the value just repeats the name, so that's not much use...
201 return wxEmptyString;
202
203 case REFERENCE_FIELD:
204 text = aField.GetFullText( m_unit > 0 ? m_unit : 1 );
205 fieldhtml.Replace( wxS( "__VALUE__" ), EscapeHTML( text ) );
206 break;
207
208 default:
209 text = aField.GetShownText( false );
210 fieldhtml.Replace( wxS( "__VALUE__" ), EscapeHTML( text ) );
211 }
212
213 return fieldhtml;
214 }
215
216
218 {
219 wxString fieldtable;
220 std::vector<SCH_FIELD*> fields;
221
222 m_symbol->GetFields( fields );
223
224 for( const SCH_FIELD* field: fields )
225 fieldtable += GetHtmlFieldRow( *field );
226
227 if( m_symbol->IsAlias() )
228 {
229 std::shared_ptr<LIB_SYMBOL> parent = m_symbol->GetParent().lock();
230
231 // Append all of the unique parent fields if this is an alias.
232 if( parent )
233 {
234 std::vector<SCH_FIELD*> parentFields;
235
236 parent->GetFields( parentFields );
237
238 for( const SCH_FIELD* parentField : parentFields )
239 {
240 if( m_symbol->FindField( parentField->GetCanonicalName() ) )
241 continue;
242
243 fieldtable += GetHtmlFieldRow( *parentField );
244 }
245 }
246 }
247
248 m_html.Replace( wxS( "__FIELDS__" ), fieldtable );
249 }
250};
251
252
253wxString GenerateAliasInfo( SYMBOL_LIB_TABLE* aSymLibTable, LIB_ID const& aLibId, int aUnit )
254{
255 FOOTPRINT_INFO_GENERATOR gen( aSymLibTable, aLibId, aUnit );
256 gen.GenerateHtml();
257 return gen.GetHtml();
258}
const char * name
Definition: DXF_plotter.cpp:59
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.
wxString GetHtmlFieldRow(const SCH_FIELD &aField) const
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:77
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
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:84
wxString GetDescription() const override
Definition: lib_symbol.h:169
wxString GetKeyWords() const override
Definition: lib_symbol.h:182
bool IsRoot() const override
For symbols derived from other symbols, IsRoot() indicates no derivation.
Definition: lib_symbol.h:205
bool IsAlias() const
Definition: lib_symbol.h:206
SCH_FIELD & GetDatasheetField() const
Return reference to the datasheet field.
wxString GetName() const override
Definition: lib_symbol.h:148
void GetFields(std::vector< SCH_FIELD * > &aList, bool aVisibleOnly=false) override
Return a list of fields within this symbol.
SCH_FIELD * FindField(const wxString &aFieldName, bool aCaseInsensitive=false)
Find a field within this symbol matching aFieldName and returns it or NULL if not found.
LIB_SYMBOL_REF & GetParent()
Definition: lib_symbol.h:117
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Definition: sch_field.h:53
wxString GetFullText(int unit=1) const
Return the text of a field.
Definition: sch_field.cpp:334
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
Definition: sch_field.cpp:1254
int GetId() const
Definition: sch_field.h:141
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
Definition: sch_field.cpp:209
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)
wxString LinkifyHTML(wxString aStr)
Wraps links in HTML tags.
@ DATASHEET_FIELD
name of datasheet
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".