From 9df2bf4024466ddcbc852fa6cbd3203b04014d12 Mon Sep 17 00:00:00 2001 From: Joe Uhren Date: Sat, 18 Jun 2022 14:19:52 -0600 Subject: [PATCH] Favicon updated to use 4 different sizes -Instead of using a single file for the favicon, there are now 4 size options for a more modern favicon experience as inspired by this article: https://www.emergeinteractive.com/insights/detail/The-Essentials-of-FavIcons/ -Old default favicon file has been replaced with 4 different sized pngs -Not all sizes need to be set. If any of the new settings are left blank or the filename does not exist, that favicon size will be skipped --- app.js | 19 ++++++++++++++++++- lib/settings.js | 32 +++++++++++++++++++++++++++++--- public/favicon-128.png | Bin 0 -> 5108 bytes public/favicon-180.png | Bin 0 -> 7237 bytes public/favicon-192.png | Bin 0 -> 7800 bytes public/favicon-32.png | Bin 0 -> 1484 bytes public/favicon.ico | Bin 34494 -> 0 bytes settings.json.template | 20 +++++++++++++++++--- views/layout.pug | 8 ++++++++ 9 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 public/favicon-128.png create mode 100644 public/favicon-180.png create mode 100644 public/favicon-192.png create mode 100644 public/favicon-32.png delete mode 100644 public/favicon.ico diff --git a/app.js b/app.js index d057b24..3f911ab 100644 --- a/app.js +++ b/app.js @@ -49,7 +49,24 @@ if (settings.webserver.cors.enabled == true) { app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'pug'); -app.use(favicon(path.join(__dirname, settings.shared_pages.favicon))); +var default_favicon = ''; + +// loop through the favicons +Object.keys(settings.shared_pages.favicons).forEach(function(key, index, map) { + // remove the public directory from the path if exists + if (settings.shared_pages.favicons[key] != null && settings.shared_pages.favicons[key].indexOf('public/') > -1) + settings.shared_pages.favicons[key] = settings.shared_pages.favicons[key].replace(/public\//g, ''); + + // check if the favicon file exists + if (!db.fs.existsSync(path.join('./public', settings.shared_pages.favicons[key]))) + settings.shared_pages.favicons[key] = ''; + else if (default_favicon == '') + default_favicon = settings.shared_pages.favicons[key]; +}); + +if (default_favicon != '') + app.use(favicon(path.join('./public', default_favicon))); + app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); diff --git a/lib/settings.js b/lib/settings.js index c602beb..1f277a1 100644 --- a/lib/settings.js +++ b/lib/settings.js @@ -98,9 +98,23 @@ exports.shared_pages = { "theme": "Exor", // page_title: The text to display at the end of the HTML title tag and also displayed in the page header when the "shared_pages.page_header.home_link" setting is set to "title" "page_title": "eIquidus", - // favicon: The path to an icon file that is displayed in a browser window/tab and serves as branding for your website. Its main purpose is to help visitors locate your page easier when they have multiple tabs open - // NOTE: The path root is / - "favicon": "public/favicon.ico", + // favicons: a collection of image or icon files that are displayed in a browser window/tab and serve as branding for your website. Their main purpose is to help visitors locate your page easier when they have multiple tabs open + // Modern favicon sizes were inspired by this web article: https://www.emergeinteractive.com/insights/detail/The-Essentials-of-FavIcons/ + // NOTE: If any of the favicons are left blank or not set to a valid file, they will be disabled and unused + "favicons": { + // favicon32: The path to a 32x32 image or icon file + // NOTE: The path root is /public + "favicon32": "favicon-32.png", + // favicon128: The path to a 128x128 image or icon file + // NOTE: The path root is /public + "favicon128": "favicon-128.png", + // favicon180: The path to a 180x180 image or icon file + // NOTE: The path root is /public + "favicon180": "favicon-180.png", + // favicon192: The path to a 192x192 image or icon file + // NOTE: The path root is /public + "favicon192": "favicon-192.png" + }, // logo: The path to an image file that is displayed on the api page as well as in one of the top panels when enabled // This logo can also be displayed in the header when the "shared_pages.page_header.home_link" setting is set to "logo" and the "shared_pages.page_header.home_link_logo" setting is blank or an invalid file // NOTE: The path root is /public @@ -1702,6 +1716,18 @@ exports.loadSettings = function loadSettings() { if (Object.byString(json_settings, 'richlist') != null) delete json_settings.richlist; if (Object.byString(json_settings, 'movement') != null) delete json_settings.movement; + // fix old deprecated settings from v1.100 + if (json_settings.shared_pages.favicons == null && json_settings.shared_pages.favicon != null && fs.existsSync(json_settings.shared_pages.favicon)) { + // create a new empty favicons object + json_settings.shared_pages.favicons = {}; + + // map the old favicon to the first entry in the new location + json_settings = fix_deprecated_setting(json_settings, 'shared_pages.favicon', 'shared_pages.favicons.favicon32'); + + // delete old setting + delete json_settings.shared_pages.favicon; + } + // loop through all settings from the settings.json file for (var current_setting in json_settings) { // merge settings from settings.json with the defaults from settings.js diff --git a/public/favicon-128.png b/public/favicon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..cb99157a1e73ceecc6fdaebc5a2ba1e1286b3150 GIT binary patch literal 5108 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 SV9ozM12t51m0K0aRf2%V%Um5@) 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 literal 0 HcmV?d00001 diff --git a/public/favicon-32.png b/public/favicon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..7c962d5d7ae60ffa0f25bee93982f61906240a33 GIT binary patch literal 1484 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 diff --git a/settings.json.template b/settings.json.template index 8e71704..8441613 100644 --- a/settings.json.template +++ b/settings.json.template @@ -97,9 +97,23 @@ "theme": "Exor", // page_title: The text to display at the end of the HTML title tag and also displayed in the page header when the "shared_pages.page_header.home_link" setting is set to "title" "page_title": "eIquidus", - // favicon: The path to an icon file that is displayed in a browser window/tab and serves as branding for your website. Its main purpose is to help visitors locate your page easier when they have multiple tabs open - // NOTE: The path root is / - "favicon": "public/favicon.ico", + // favicons: a collection of image or icon files that are displayed in a browser window/tab and serve as branding for your website. Their main purpose is to help visitors locate your page easier when they have multiple tabs open + // Modern favicon sizes were inspired by this web article: https://www.emergeinteractive.com/insights/detail/The-Essentials-of-FavIcons/ + // NOTE: If any of the favicons are left blank or not set to a valid file, they will be disabled and unused + "favicons": { + // favicon32: The path to a 32x32 image or icon file + // NOTE: The path root is /public + "favicon32": "favicon-32.png", + // favicon128: The path to a 128x128 image or icon file + // NOTE: The path root is /public + "favicon128": "favicon-128.png", + // favicon180: The path to a 180x180 image or icon file + // NOTE: The path root is /public + "favicon180": "favicon-180.png", + // favicon192: The path to a 192x192 image or icon file + // NOTE: The path root is /public + "favicon192": "favicon-192.png" + }, // logo: The path to an image file that is displayed on the api page as well as in one of the top panels when enabled // This logo can also be displayed in the header when the "shared_pages.page_header.home_link" setting is set to "logo" and the "shared_pages.page_header.home_link_logo" setting is blank or an invalid file // NOTE: The path root is /public diff --git a/views/layout.pug b/views/layout.pug index 4e72de3..6460f17 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -5,6 +5,14 @@ html(lang='en') meta(name='viewport' content='width=device-width, initial-scale=1') meta(http-equiv='Content-Language', content='en') title=page_title_prefix + ' - ' + settings.shared_pages.page_title + if settings.shared_pages.favicons.favicon32 != '' + link(rel='icon', href=settings.shared_pages.favicons.favicon32, sizes='32x32') + if settings.shared_pages.favicons.favicon128 != '' + link(rel='icon', href=settings.shared_pages.favicons.favicon128, sizes='128x128') + if settings.shared_pages.favicons.favicon180 != '' + link(rel='icon', href=settings.shared_pages.favicons.favicon180, sizes='180x180') + if settings.shared_pages.favicons.favicon192 != '' + link(rel='icon', href=settings.shared_pages.favicons.favicon192, sizes='192x192') link(rel='stylesheet', href='/css/themes/' + settings.shared_pages.theme.toLowerCase() + '/bootstrap.min.css' + (themeHash == null ? '' : '?h=' + themeHash)) link(rel='stylesheet', href='https://use.fontawesome.com/releases/v5.15.4/css/all.css') if active == 'markets' || active == 'richlist'