KiCad PCB EDA Suite
Loading...
Searching...
No Matches
generate_footprint_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
22#include <string_utils.h>
23#include <footprint.h>
24#include <fp_lib_table.h>
25#include <wx/log.h>
26
27
28static const wxString DescriptionFormat = wxT(
29 "<b>__NAME__</b>"
30 "<br>__DESC__"
31 "<hr><table border=0>"
32 "__FIELDS__"
33 "</table>" );
34
35static const wxString KeywordsFormat = wxT(
36 "<tr>"
37 " <td><b>" + _( "Keywords" ) + "</b></td>"
38 " <td>__KEYWORDS__</td>"
39 "</tr>" );
40
41static const wxString DocFormat = wxT(
42 "<tr>"
43 " <td><b>" + _( "Documentation" ) + "</b></td>"
44 " <td><a href=\"__HREF__\">__TEXT__</a></td>"
45 "</tr>" );
46
47
48std::optional<wxString> GetFootprintDocumentationURL( const FOOTPRINT& aFootprint )
49{
50 wxString desc = aFootprint.GetLibDescription();
51
52 wxString url;
53
54 // It is currently common practice to store a documentation link in the description.
55 size_t idx = desc.find( wxT( "http:" ) );
56
57 if( idx == wxString::npos )
58 idx = desc.find( wxT( "https:" ) );
59
60 if( idx == wxString::npos )
61 return std::nullopt;
62
63 int nesting = 0;
64
65 for( auto chit = desc.begin() + idx; chit != desc.end(); ++chit )
66 {
67 int ch = *chit;
68
69 // Break on invalid URI characters
70 if( ch <= 0x20 || ch >= 0x7F || ch == '"' )
71 break;
72
73 // Check for nesting parentheses, e.g. (Body style from: https://this.url/part.pdf)
74 if( ch == '(' )
75 ++nesting;
76 else if( ch == ')' && --nesting < 0 )
77 break;
78
79 url += ch;
80 }
81
82 // Trim trailing punctuation
83 static wxString punct = wxS( ".,:;" );
84
85 if( punct.find( url.Last() ) != wxString::npos )
86 url = url.Left( url.Length() - 1 );
87
88 if( url.IsEmpty() )
89 return std::nullopt;
90 return url;
91}
92
93
95{
96 wxString m_html;
98 LIB_ID const m_lib_id;
99
101
102public:
103 FOOTPRINT_INFO_GENERATOR( FP_LIB_TABLE* aFpLibTable, LIB_ID const& aLibId )
105 m_fp_lib_table( aFpLibTable ),
106 m_lib_id( aLibId ),
107 m_footprint( nullptr )
108 { }
109
114 {
115 wxCHECK_RET( m_fp_lib_table, wxT( "Footprint library table pointer is not valid" ) );
116
117 if( !m_lib_id.IsValid() )
118 return;
119
120 try
121 {
124 }
125 catch( const IO_ERROR& ioe )
126 {
127 wxLogError( _( "Error loading footprint %s from library '%s'." ) + wxS( "\n%s" ),
130 ioe.What() );
131 return;
132 }
133
134 if( m_footprint )
135 {
136 wxString name = m_lib_id.GetLibItemName();
137 wxString desc = m_footprint->GetLibDescription();
138 wxString keywords = m_footprint->GetKeywords();
139 wxString doc;
140
141 if( std::optional<wxString> url = GetFootprintDocumentationURL( *m_footprint ) )
142 doc = *url;
143
144 wxString esc_desc = EscapeHTML( UnescapeString( desc ) );
145
146 // Add line breaks
147 esc_desc.Replace( wxS( "\n" ), wxS( "<br>" ) );
148
149 // Add links
150 esc_desc = LinkifyHTML( esc_desc );
151
152 m_html.Replace( "__DESC__", esc_desc );
153 m_html.Replace( "__NAME__", EscapeHTML( name ) );
154
155 wxString keywordsHtml = KeywordsFormat;
156 keywordsHtml.Replace( "__KEYWORDS__", EscapeHTML( keywords ) );
157
158 wxString docHtml = DocFormat;
159 docHtml.Replace( "__HREF__", EscapeHTML( doc ) );
160
161 if( doc.Length() > 75 )
162 doc = doc.Left( 72 ) + wxT( "..." );
163
164 docHtml.Replace( "__TEXT__", EscapeHTML( doc ) );
165
166 m_html.Replace( "__FIELDS__", keywordsHtml + docHtml );
167 }
168 }
169
173 wxString GetHtml()
174 {
175 return m_html;
176 }
177
178};
179
180
181wxString GenerateFootprintInfo( FP_LIB_TABLE* aFpLibTable, LIB_ID const& aLibId )
182{
183 FOOTPRINT_INFO_GENERATOR gen( aFpLibTable, aLibId );
184 gen.GenerateHtml();
185 return gen.GetHtml();
186}
const char * name
Definition: DXF_plotter.cpp:57
FOOTPRINT_INFO_GENERATOR(FP_LIB_TABLE *aFpLibTable, LIB_ID const &aLibId)
void GenerateHtml()
Generate the HTML internally.
wxString GetHtml() const
Return the generated HTML.
wxString GetHtml()
Return the generated HTML.
wxString GetLibDescription() const
Definition: footprint.h:257
wxString GetKeywords() const
Definition: footprint.h:260
const FOOTPRINT * GetEnumeratedFootprint(const wxString &aNickname, const wxString &aFootprintName)
A version of FootprintLoad() for use after FootprintEnumerate() for more efficient cache management.
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
wxString wx_str() const
Definition: utf8.cpp:45
#define _(s)
static const wxString KeywordsFormat
wxString GenerateFootprintInfo(FP_LIB_TABLE *aFpLibTable, LIB_ID const &aLibId)
Return an HTML page describing a LIB_ID in a FP_LIB_TABLE.
static const wxString DescriptionFormat
static const wxString DocFormat
std::optional< wxString > GetFootprintDocumentationURL(const FOOTPRINT &aFootprint)
Get a URL to the documentation for a LIB_ID in a FP_LIB_TABLE.
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.