소스 검색

If adding .png fallback fails, revert to original URL

JC Brand 4 년 전
부모
커밋
496b070d2a
3개의 변경된 파일17개의 추가작업 그리고 8개의 파일을 삭제
  1. 1 1
      docs/source/configuration.rst
  2. 15 6
      src/templates/directives/image.js
  3. 1 1
      src/templates/image.js

+ 1 - 1
docs/source/configuration.rst

@@ -850,7 +850,7 @@ If you are using prebinding, can specify the fullname of the currently
 logged in user, otherwise the user's vCard will be fetched.
 
 geouri_regex
-----------------
+------------
 
 * Default:  ``/https:\/\/www.openstreetmap.org\/.*#map=[0-9]+\/([\-0-9.]+)\/([\-0-9.]+)\S*/g``
 

+ 15 - 6
src/templates/directives/image.js

@@ -2,25 +2,34 @@ import { converse } from "@converse/headless/converse-core";
 import { directive, html } from "lit-html";
 
 
-export const renderImage = directive((url, onLoad, onClick) => part => {
+/**
+ * lit-html directive which attempts to render an <img> element from a URL.
+ * It will fall back to rendering an <a> element if it can't.
+ *
+ * @param { String } src - The value that will be assigned to the `src` attribute of the `<img>` element.
+ * @param { String } href - The value that will be assigned to the `href` attribute of the `<img>` element.
+ * @param { Function } onLoad - A callback function to be called once the image has loaded.
+ * @param { Function } onClick - A callback function to be called once the image has been clicked.
+*/
+export const renderImage = directive((src, href, onLoad, onClick) => part => {
     function onError () {
         const u = converse.env.utils;
-        if (u.isURLWithImageExtension(url)) {
-            part.setValue(u.convertUrlToHyperlink(url));
+        if (u.isURLWithImageExtension(src)) {
+            part.setValue(u.convertUrlToHyperlink(href));
             part.commit();
         } else {
             // Before giving up and falling back to just rendering a hyperlink,
             // we attach `.png` and try one more time.
             // This works with some Imgur URLs
-            part.setValue(renderImage(`${url}.png`, onLoad, onClick));
+            part.setValue(renderImage(`${src}.png`, href, onLoad, onClick));
             part.commit();
         }
     }
     part.setValue(
-        html`<a href="${url}"
+        html`<a href="${href}"
                 class="chat-image__link"
                 target="_blank"
                 rel="noopener"
-            ><img class="chat-image img-thumbnail" src="${url}" @click=${onClick} @error=${onError} @load=${onLoad}/></a>`
+            ><img class="chat-image img-thumbnail" src="${src}" @click=${onClick} @error=${onError} @load=${onLoad}/></a>`
     );
 });

+ 1 - 1
src/templates/image.js

@@ -1,4 +1,4 @@
 import { html } from "lit-html";
 import { renderImage } from "./directives/image.js";
 
-export default (o) => html`${renderImage(o.url, o.onLoad, o.onClick)}`;
+export default (o) => html`${renderImage(o.url, o.url, o.onLoad, o.onClick)}`;