7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-21 00:21:25 +00:00

Fix PDF plotter URI issues.

Add 'file:' URI JavaScript handlers.

Properly convert Windows file paths to valid URI syntax.

Use expanded variables for URI menu names.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/14250
This commit is contained in:
Wayne Stambaugh 2024-11-04 20:05:42 -05:00
parent 1a86982a2a
commit 930407fac8
3 changed files with 65 additions and 8 deletions

View File

@ -1340,7 +1340,7 @@ bool PDF_PLOTTER::EndPlot()
href = ResolveUriByEnvVars( href, m_project );
js += wxString::Format( wxT( "[\"%s\", \"%s\"],\n" ),
EscapeString( property, CTX_JS_STR ),
EscapeString( href, CTX_JS_STR ),
EscapeString( href, CTX_JS_STR ) );
}
else if( property.Find( "https:" ) >= 0 )
@ -1351,7 +1351,7 @@ bool PDF_PLOTTER::EndPlot()
href = ResolveUriByEnvVars( href, m_project );
js += wxString::Format( wxT( "[\"%s\", \"%s\"],\n" ),
EscapeString( property, CTX_JS_STR ),
EscapeString( href, CTX_JS_STR ),
EscapeString( href, CTX_JS_STR ) );
}
else if( property.Find( "file:" ) >= 0 )
@ -1361,8 +1361,10 @@ bool PDF_PLOTTER::EndPlot()
if( m_project )
href = ResolveUriByEnvVars( href, m_project );
href = NormalizeFileUri( href );
js += wxString::Format( wxT( "[\"%s\", \"%s\"],\n" ),
EscapeString( property, CTX_JS_STR ),
EscapeString( href, CTX_JS_STR ),
EscapeString( href, CTX_JS_STR ) );
}
else
@ -1388,13 +1390,22 @@ bool PDF_PLOTTER::EndPlot()
}
}
}
else if( url.StartsWith( "http:" ) || url.StartsWith( "https:" ) )
else if( url.StartsWith( "http:" ) || url.StartsWith( "https:" )
|| url.StartsWith( "file:" ) )
{
wxString menuText = wxString::Format( _( "Open %s" ), url );
wxString href = url;
if( m_project )
href = ResolveUriByEnvVars( url, m_project );
if( url.StartsWith( "file:" ) )
href = NormalizeFileUri( href );
wxString menuText = wxString::Format( _( "Open %s" ), href );
js += wxString::Format( wxT( "[\"%s\", \"%s\"],\n" ),
EscapeString( menuText, CTX_JS_STR ),
EscapeString( url, CTX_JS_STR ) );
EscapeString( href, CTX_JS_STR ),
EscapeString( href, CTX_JS_STR ) );
}
}
@ -1434,6 +1445,7 @@ function ShM(aEntries) {
var cChoice = app.popUpMenuEx.apply(app, aParams);
if (cChoice != null && cChoice.substring(0, 1) == '#') this.pageNum = parseInt(cChoice.slice(1));
else if (cChoice != null && cChoice.substring(0, 4) == 'http') app.launchURL(cChoice);
else if (cChoice != null && cChoice.substring(0, 4) == 'file') app.openDoc(cChoice.substring(7));
}
)JS";

View File

@ -34,7 +34,9 @@
#include <macros.h>
#include <richio.h> // StrPrintf
#include <string_utils.h>
#include <wx_filename.h>
#include <fmt/chrono.h>
#include <wx/log.h>
#include <wx/regex.h>
#include "locale_io.h"
@ -1457,3 +1459,29 @@ wxString From_UTF8( const std::string& aString )
return line;
}
wxString NormalizeFileUri( const wxString& aFileUri )
{
wxString uriPathAndFileName;
wxCHECK( aFileUri.StartsWith( wxS( "file://" ), &uriPathAndFileName ), aFileUri );
wxString tmp;
wxString retv = wxS( "file://" );
wxFileName fn = uriPathAndFileName;
tmp = fn.GetPathWithSep( wxPATH_UNIX );
tmp.Replace( wxS( "\\" ), wxS( "/" ) );
tmp.Replace( wxS( ":" ), wxS( "" ) );
if( !tmp.IsEmpty() && tmp[0] != '/' )
tmp = wxS( "/" ) + tmp;
retv += tmp;
retv += fn.GetFullName();
wxLogDebug( wxS( "Normalize file: '%s'." ), retv );
return retv;
}

View File

@ -1,7 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004-2021 KiCad Developers, see change_log.txt for contributors.
* Copyright (C) 2004-2021, 2024 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -405,4 +405,21 @@ KICOMMON_API std::string FormatDouble2Str( double aValue );
KICOMMON_API wxString From_UTF8( const std::string& aString );
KICOMMON_API wxString From_UTF8( const char* cstring );
/**
* Normalize file path \a aFileUri to URI convention.
*
* Unfortunately none of the wxWidgets objects results in acceptable file URIs which breaks
* PDF plotting URI links. This is an attempt to normalize Windows local file paths to a
* URI that PDF readers that can run JavaScript can handle.
*
* @note This does not expand environment or user variables. Variable expansion should be
* performed before calling. If \a aFileUri does not begin with 'file://', \a aFileUri
* returned unchanged.
*
* @param aFileUri is the string to be normalized.
* @return the normalized string.
*/
KICOMMON_API wxString NormalizeFileUri( const wxString& aFileUri );
#endif // STRING_UTILS_H