diff --git a/app/assets/javascripts/discourse/lib/safari-hacks.js.es6 b/app/assets/javascripts/discourse/lib/safari-hacks.js.es6 index 42777ed4f1e..7cb249b15e2 100644 --- a/app/assets/javascripts/discourse/lib/safari-hacks.js.es6 +++ b/app/assets/javascripts/discourse/lib/safari-hacks.js.es6 @@ -1,10 +1,4 @@ -export function isAppleDevice() { - // IE has no DOMNodeInserted so can not get this hack despite saying it is like iPhone - // This will apply hack on all iDevices - return navigator.userAgent.match(/(iPad|iPhone|iPod)/g) && - navigator.userAgent.match(/Safari/g) && - !navigator.userAgent.match(/Trident/g); -} +import { isAppleDevice } from 'discourse/lib/utilities'; // we can't tell what the actual visible window height is // because we cannot account for the height of the mobile keyboard diff --git a/app/assets/javascripts/discourse/lib/show-modal.js.es6 b/app/assets/javascripts/discourse/lib/show-modal.js.es6 index c13d390925c..179a700da59 100644 --- a/app/assets/javascripts/discourse/lib/show-modal.js.es6 +++ b/app/assets/javascripts/discourse/lib/show-modal.js.es6 @@ -1,4 +1,4 @@ -import { isAppleDevice } from 'discourse/lib/safari-hacks'; +import { isAppleDevice } from 'discourse/lib/utilities'; export default function(name, opts) { opts = opts || {}; diff --git a/app/assets/javascripts/discourse/lib/utilities.js.es6 b/app/assets/javascripts/discourse/lib/utilities.js.es6 index cba27615715..1b4cfda3492 100644 --- a/app/assets/javascripts/discourse/lib/utilities.js.es6 +++ b/app/assets/javascripts/discourse/lib/utilities.js.es6 @@ -285,6 +285,21 @@ function uploadTypeFromFileName(fileName) { return isAnImage(fileName) ? 'image' : 'attachment'; } +function isGUID(value) { + return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value); +} + +function imageNameFromFileName(fileName) { + const split = fileName.split('.'); + const name = split[split.length-2]; + + if (exports.isAppleDevice() && isGUID(name)) { + return I18n.t('upload_selector.default_image_alt_text'); + } + + return name; +} + export function allowsImages() { return authorizesAllExtensions() || IMAGES_EXTENSIONS_REGEX.test(authorizedExtensions()); } @@ -309,8 +324,7 @@ export function uploadLocation(url) { export function getUploadMarkdown(upload) { if (isAnImage(upload.original_filename)) { - const split = upload.original_filename.split('.'); - const name = split[split.length-2]; + const name = imageNameFromFileName(upload.original_filename); return `![${name}|${upload.width}x${upload.height}](${upload.short_url || upload.url})`; } else if (!Discourse.SiteSettings.prevent_anons_from_downloading_files && (/\.(mov|mp4|webm|ogv|mp3|ogg|wav|m4a)$/i).test(upload.original_filename)) { return uploadLocation(upload.url); @@ -399,5 +413,13 @@ export function determinePostReplaceSelection({ selection, needle, replacement } } } +export function isAppleDevice() { + // IE has no DOMNodeInserted so can not get this hack despite saying it is like iPhone + // This will apply hack on all iDevices + return navigator.userAgent.match(/(iPad|iPhone|iPod)/g) && + navigator.userAgent.match(/Safari/g) && + !navigator.userAgent.match(/Trident/g); +} + // This prevents a mini racer crash export default {}; diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 0721af6522c..cfde3d76e18 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1355,6 +1355,7 @@ en: uploading: "Uploading" select_file: "Select File" image_link: "link your image will point to" + default_image_alt_text: image search: sort_by: "Sort by" diff --git a/test/javascripts/lib/utilities-test.js.es6 b/test/javascripts/lib/utilities-test.js.es6 index 8ef76a79fac..00e00f4c198 100644 --- a/test/javascripts/lib/utilities-test.js.es6 +++ b/test/javascripts/lib/utilities-test.js.es6 @@ -16,6 +16,7 @@ import { caretRowCol, setCaretPosition } from 'discourse/lib/utilities'; +import * as Utilities from 'discourse/lib/utilities'; QUnit.module("lib:utilities"); @@ -124,6 +125,13 @@ QUnit.test("getUploadMarkdown", assert => { assert.ok(testUploadMarkdown("important.txt") === 'important.txt (42 Bytes)\n'); }); +QUnit.test("replaces GUID in image alt text on iOS", assert => { + assert.equal(testUploadMarkdown("8F2B469B-6B2C-4213-BC68-57B4876365A0.jpeg"),'![8F2B469B-6B2C-4213-BC68-57B4876365A0|100x200](/uploads/123/abcdef.ext)'); + + sandbox.stub(Utilities, 'isAppleDevice').returns(true); + assert.equal(testUploadMarkdown("8F2B469B-6B2C-4213-BC68-57B4876365A0.jpeg"),'![image|100x200](/uploads/123/abcdef.ext)'); +}); + QUnit.test("isAnImage", assert => { _.each(["png", "jpg", "jpeg", "bmp", "gif", "tif", "tiff", "ico"], function(extension) { var image = "image." + extension;