@@ -313,6 +313,10 @@ public final class Main {
313313
314314 private static final Insets GRID_BAG_ITEM_INSETS = new Insets (8 , DEFAULT_HGAP , 8 , DEFAULT_HGAP );
315315
316+ private static final String [] HTML_FILE_EXTENSIONS = { "html" , "htm" };
317+
318+ private static final String HTML_FILE_SUFFIX = fileSuffix (HTML_FILE_EXTENSIONS [0 ]);
319+
316320 private static final String [] ICON_RESOURCE_PATHS = { "/icon_16.png" , "/icon_32.png" , "/icon_64.png" ,
317321 "/icon_128.png" };
318322
@@ -422,7 +426,7 @@ public final class Main {
422426
423427 private static final String PROFILE_FILE_EXTENSION = "json" ;
424428
425- private static final String PROFILE_FILE_SUFFIX = "." + PROFILE_FILE_EXTENSION ;
429+ private static final String PROFILE_FILE_SUFFIX = fileSuffix ( PROFILE_FILE_EXTENSION ) ;
426430
427431 private static final int SETTINGS_LABEL_DIMENSION_HEIGHT = 15 ;
428432
@@ -1556,6 +1560,10 @@ private static void deleteSingleInstanceLockFile() {
15561560 }
15571561 }
15581562
1563+ private static String fileSuffix (final String extension ) {
1564+ return "." + extension ;
1565+ }
1566+
15591567 private static String getDefaultVJoyPath () {
15601568 return System .getenv ("ProgramFiles" ) + File .separator + "vJoy" ;
15611569 }
@@ -2035,10 +2043,17 @@ private void executeWhileVisible(final Runnable runnable) {
20352043 });
20362044 }
20372045
2038- public void exportVisualization (final File file ) {
2046+ public void exportVisualization (File file ) {
20392047 initTemplateSvgDocument ();
20402048 Objects .requireNonNull (templateSvgDocument , "Field templateSvgDocument must not be null" );
20412049
2050+ final var filename = file .getName ().toLowerCase (Locale .ROOT );
2051+ final var missingExtension = Arrays .stream (HTML_FILE_EXTENSIONS )
2052+ .noneMatch (extension -> filename .endsWith (fileSuffix (extension )));
2053+ if (missingExtension ) {
2054+ file = new File (file .getAbsoluteFile () + HTML_FILE_SUFFIX );
2055+ }
2056+
20422057 try {
20432058 final var domImplementation = documentBuilder .getDOMImplementation ();
20442059 final var htmlDocumentType = domImplementation .createDocumentType ("html" , "-//W3C//DTD XHTML 1.1//EN" ,
@@ -4655,7 +4670,7 @@ private static final class HtmlFileChooser extends AbstractProfileFileChooser {
46554670 private static final long serialVersionUID = -1707951153902772391L ;
46564671
46574672 private HtmlFileChooser (final File profileFile ) {
4658- super (new FileNameExtensionFilter (STRINGS .getString ("HTML_FILE_DESCRIPTION" ), "htm" , "html" ));
4673+ super (new FileNameExtensionFilter (STRINGS .getString ("HTML_FILE_DESCRIPTION" ), HTML_FILE_EXTENSIONS ));
46594674
46604675 String filename ;
46614676 if (profileFile != null ) {
@@ -4665,7 +4680,7 @@ private HtmlFileChooser(final File profileFile) {
46654680 filename = STRINGS .getString ("UNTITLED" );
46664681 }
46674682
4668- setSelectedFile (new File (filename + ".html" ));
4683+ setSelectedFile (new File (filename + HTML_FILE_SUFFIX ));
46694684 }
46704685 }
46714686
0 commit comments