From a89453e9670eb171b1686e68b6d2c24a3adefafb Mon Sep 17 00:00:00 2001 From: orenom Date: Fri, 7 May 2021 23:19:54 +0200 Subject: [PATCH] add support for maps.wikimedia.org map images, fixes #1 --- media/.gitignore | 1 + media/map.png | Bin 0 -> 10205 bytes src/routes.js | 13 +++++++++- src/utils.js | 44 +++++++++++++++++++++++++------ static/styles.css | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 media/map.png diff --git a/media/.gitignore b/media/.gitignore index 5e7d273..d171260 100644 --- a/media/.gitignore +++ b/media/.gitignore @@ -2,3 +2,4 @@ * # Except this file !.gitignore +!map.png diff --git a/media/map.png b/media/map.png new file mode 100644 index 0000000000000000000000000000000000000000..7831cd7563e13a4da15df70a3aac0aaf5bbd54e9 GIT binary patch literal 10205 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 G`SCwN8c0?E literal 0 HcmV?d00001 diff --git a/src/routes.js b/src/routes.js index aed9e1b..a7cad25 100644 --- a/src/routes.js +++ b/src/routes.js @@ -30,7 +30,14 @@ module.exports = (app, utils) => { } if(req.url.startsWith('/media')) { - let media = await proxyMedia(req) + let media + + if(req.url.startsWith('/media/maps_wikimedia_org/')) { + media = await proxyMedia(req, 'maps.wikimedia.org') + } else { + media = await proxyMedia(req) + } + if(media.success === true) { return res.sendFile(media.path) } else { @@ -53,6 +60,10 @@ module.exports = (app, utils) => { return handleWikiPage(req, res, '/w/') }) + app.get('/wiki/Special:Map/*', (req, res, next) => { + return handleWikiPage(req, res, '/wiki/Map') + }) + app.get('/', (req, res, next) => { return handleWikiPage(req, res, '/') }) diff --git a/src/utils.js b/src/utils.js index 25cd1b1..5033058 100644 --- a/src/utils.js +++ b/src/utils.js @@ -140,6 +140,10 @@ module.exports = function(redis) { const upload_wikimedia_regx = /((https:|http:|)\/\/?upload.wikimedia.org)/gm data.html = data.html.replace(upload_wikimedia_regx, '/media') + // replace maps.wikimedia.org with /media + const maps_wikimedia_regx = /((https:|http:|)\/\/?maps.wikimedia.org)/gm + data.html = data.html.replace(maps_wikimedia_regx, '/media/maps_wikimedia_org') + // replace wiki links const wiki_href_regx = /(href=\"(https:|http:|)\/\/([A-z.]+\.)?(wikipedia.org|wikimedia.org|wikidata.org|mediawiki.org))/gm data.html = data.html.replace(wiki_href_regx, `href="${protocol}${config.domain}`) @@ -159,7 +163,7 @@ module.exports = function(redis) { }) } - this.proxyMedia = (req) => { + this.proxyMedia = (req, wiki_domain='') => { return new Promise(async resolve => { let params = new URLSearchParams(req.query).toString() || '' @@ -167,9 +171,20 @@ module.exports = function(redis) { params = '?' + params } - let path = req.url.split('/media')[1] - let wikimedia_path = path + params - let url = new URL(`https://upload.wikimedia.org${wikimedia_path}`) + let path = '' + let domain = 'upload.wikimedia.org' + let wikimedia_path = '' + + if(wiki_domain === 'maps.wikimedia.org') { + path = req.url.split('/media/maps_wikimedia_org')[1] + domain = 'maps.wikimedia.org' + wikimedia_path = path + } else { + path = req.url.split('/media')[1] + wikimedia_path = path + params + } + + url = new URL(`https://${domain}${wikimedia_path}`) let file = await saveFile(url, path) @@ -183,7 +198,13 @@ module.exports = function(redis) { this.saveFile = (url, file_path) => { return new Promise(async resolve => { - const media_path = path.join(__dirname, '../media') + let media_path = '' + if(url.href.startsWith('https://maps.wikimedia.org/')) { + media_path = path.join(__dirname, '../media/maps_wikimedia_org') + } else { + media_path = path.join(__dirname, '../media') + } + const path_with_filename = `${media_path}${file_path}` let path_without_filename = path_with_filename.split('/') path_without_filename.pop() @@ -202,7 +223,7 @@ module.exports = function(redis) { resolve({ success: true, path: path_with_filename }) }) }).on('error', (err) => { - console.log('Error while fetching data...', err) + console.log('Error while fetching data. Details:', err) resolve({ success: false, reason: 'SERVER_ERROR' }) }) } @@ -252,6 +273,12 @@ module.exports = function(redis) { url = `https://${lang}.wikipedia.org/w/${file}` } + if(prefix === '/wiki/Map') { + let page = 'Special:Map' + let sub_page = req.params['0'] || '' + url = `https://${lang}.wikipedia.org/wiki/${page}/${sub_page}` + } + if(prefix === '/') { url = `https://${lang}.wikipedia.org/?lang=${lang}` } @@ -345,9 +372,9 @@ module.exports = function(redis) { this.preferencesPage = (req, res) => { let user_preferences = req.cookies - let lang_select = '' let html = ` @@ -364,7 +392,7 @@ module.exports = function(redis) { - preferences - wikiless + Preferences - Wikiless
diff --git a/static/styles.css b/static/styles.css index 39e66bd..bdf33f0 100644 --- a/static/styles.css +++ b/static/styles.css @@ -74,6 +74,11 @@ details[open] #preferences { } /* END PREFERENCES CSS */ +/* WIKILESS OVERRIDES */ +#mw-specialMap-map { + background-image: url(/media/map.png) !important; +} +/* END WIKILESS OVERRIDES */ /* START WIKIPEDIA CSS */ #p-lang .uls-settings-trigger { @@ -8692,4 +8697,64 @@ div.after-portlet-lang:after { display:block } + +#mw-specialMap-container { + position:relative +} +#mw-specialMap-container .thumbinner { + display:inline-block; + position:relative; + width:256px +} +#mw-specialMap-inner { + height:256px; + position:relative +} +#mw-specialMap-map { + position:absolute; + width:256px; + height:256px; + background-position:center; + background-repeat:no-repeat; + background-size:256px 256px +} + +#mw-specialMap-marker { + position:absolute; + background-color:#7b4e10; + height:10px; + width:10px; + margin-top:-5px; + margin-left:-5px; + border-radius:5px +} +#mw-specialMap-caption { + display:block; + padding-top:0.5em +} +#mw-specialMap-icon { + display:inline-block; + margin:0 12px 0 0; + background-color:#7b4e10; + height:10px; + width:10px; + margin-top:-5px; + margin-left:0.5em; + border-radius:5px +} +#mw-specialMap-attributions { + position:absolute; + bottom:0; + font-size:9px; + right:0; + text-align:right +} + +#p-lang .uls-settings-trigger::-moz-focus-inner { + border:0 +} +#p-lang .uls-settings-trigger:focus { + outline:1px solid #36c +} + /* END WIKIPEDIA CSS */