Patch to add image descriptions
Support for image descriptions in Pleroma Front-End
This patch adds support for image descriptions to Pleroma-FE. The basic functionality is there (adding descriptions) but there is currently no limit on the size of the description.
This addresses issue #136 (closed)
I have tested this by attaching 1, 2 and 3 image in the Pleroma FE and checking that the alt text shows up on the images in the timeline, as well as in the Mastodon web interface for Pleroma and for Mastodon. I also verified that alt text on existing images shows correctly.
Changes made to the Pleroma Front-End code:
For posting a status with images
-
Added code for text input field in
components/post_status_form/post_status_form.vue
.<div class="img-desc-container"> <label for="imageDescription">{{$t('post_status.image_description')}} </label> <input type="text" id="imageDescription" :placeholder="$t('post_status.image_description')" v-model="newStatus.imageDescriptions[file.id]" class="form-img-desc"> </div>
-
This required a new entry
image_description
ini18n/en.json
(other languages not done):"post_status": { ... "image_description": "Image description", ... }
-
Added
newStatus.imageDescriptions
incomponents/post_status_form/post_status_form.js
. I changedaddMediaFile()
so this map gets initially populated with the filename for each file id:addMediaFile (fileInfo) { this.newStatus.files.push(fileInfo) this.newStatus.imageDescriptions[fileInfo.id] = fileInfo.url.split('/').pop() this.enableSubmit() },
-
Changed
postStatus
insrc/services/status_poster/status_poster.service.js
andsrc/services/api/api.service.js
to include theimageDescriptions
map. TheapiService
adds this to the form to be osted:form.append('descriptions', JSON.stringify(imageDescriptions))
For displaying alt text on images
-
Changed the Attachment template in
src/components/attachment/attachment.vue
to add the image description to the StillImage as title and alt:<a v-if="type === 'image' && (!hidden || preloadImage)" class="image-attachment" :class="{'hidden': hidden && preloadImage}" :href="attachment.url" target="_blank" :title="attachment.description"> <StillImage :class="{'small': isSmall}" v-bind:alt="attachment.description" v-bind:title="attachment.description" referrerpolicy="no-referrer" :mimetype="attachment.mimetype" :src="attachment.large_thumb_url || attachment.url" /> </a>
-
Added
imageDescription
todata()
insrc/components/attachment/attachment.js
but I think it is unused. -
Changed the StillImage template in
src/components/still-image/still-image.vue
to add the image description to the StillImage as title and alt:<template> <div class='still-image' :class='{ animated: animated }' > <canvas ref="canvas" v-if="animated"></canvas> <img v-bind:alt="description" v-bind:title="description" ref="src" :src="src" :referrerpolicy="referrerpolicy" v-on:load="onLoad" /> </div> </template>
-
Added
description
toprops:
insrc/components/still-image/still-image.js
Changes made to the Pleroma Back-End code:
This is a separate patch, pleroma!626 (merged)
Most of the code was already in place, all I did was change the function attachments_from_ids()
in lib/pleroma/web/common_api/utils.ex
to take the image descriptions as argument and add them to the name field of the attachments.
def attachments_from_ids(ids, descs_str) do
{_,descs}=Jason.decode(descs_str)
Enum.map(ids || [], fn media_id ->
Map.put(Repo.get(Object, media_id).data,"name",descs[media_id])
end)
end
The call to this function in post()
in CommonAPI (web/common_api/common_api.ex
) was changed to take data["descriptions"]
as a second argument.
def post(user, %{"status" => status} = data) do
visibility = get_visibility(data)
limit = Pleroma.Config.get([:instance, :limit])
with status <- String.trim(status),
attachments <- attachments_from_ids(data["media_ids"],data["descriptions"]),
...