@@ -3,11 +3,12 @@ import sanitizeHtml from 'sanitize-html';
33import type { EmbedV1 } from '$lib/types/embed-sdk' ;
44
55// Embed Service types https://github.com/Lantern-chat/embed-service/blob/master/embed-sdk/index.d.ts
6- type Data = EmbedV1
6+ type Data = EmbedV1 ;
77
88/** conditional render */
9- const cr = ( value : string | undefined , seperator = '' ) : string => value !== undefined ? ` ${ seperator } ${ value } ` : ''
10- const linkCardTemplate = ( { data : d , url } : { data : Data , url : string } ) => `
9+ const cr = ( value : string | undefined , seperator = '' ) : string =>
10+ value !== undefined ? ` ${ seperator } ${ value } ` : '' ;
11+ const linkCardTemplate = ( { data : d , url } : { data : Data ; url : string } ) => `
1112<div class="flex flex-col flex-wrap justify-stretch gap-4 min-[500px]:flex-row">
1213 <div class="min-w-0 flex-1 px-3 py-2 flex flex-col">
1314 <p class="mb-1 mt-0 text-sm leading-none opacity-70">${ cr ( d . p ?. n ) } ${ cr ( d . au ?. n , '-' ) } </p>
@@ -22,84 +23,95 @@ const linkCardTemplate = ({ data: d, url }: { data: Data, url: string }) => `
2223<div class="text-sm leading-tight underline text-blue-400">${ url } </div>
2324 </a >
2425 </div>
25- ${ d . imgs && d . imgs . length ? `
26+ ${
27+ d . imgs && d . imgs . length
28+ ? `
2629 <div class=" w-full flex-shrink-0 p-2 min-[500px]:max-w-40">
2730 <img class="my-0 h-full w-full rounded object-cover" src=${ d . imgs [ 0 ] . u } >
28- </div>` : '' }
29- ${ d . vid ? `
31+ </div>`
32+ : ''
33+ }
34+ ${
35+ d . vid
36+ ? `
3037 <div class=" w-full flex-shrink-0 p-2 min-[500px]:max-w-40">
3138 <video class="my-0 h-full w-full rounded object-cover" poster="${ d . thumb ?. u } " src="${ d . vid . u } " ></video>
32- </div>` : '' }
39+ </div>`
40+ : ''
41+ }
3342</div>
3443` ;
3544
3645export const previewLinks = async ( html : string ) => {
37- let document : Document
46+ let document : Document ;
3847 if ( import . meta. env . SSR ) {
39- const { parseHTML } = await import ( 'linkedom' )
40- const dom = parseHTML ( html , 'text/html' )
41- document = dom . document
48+ const { parseHTML } = await import ( 'linkedom' ) ;
49+ const dom = parseHTML ( html , 'text/html' ) ;
50+ document = dom . document ;
4251 } else {
43- document = new DOMParser ( ) . parseFromString ( html , 'text/html' )
52+ document = new DOMParser ( ) . parseFromString ( html , 'text/html' ) ;
4453 }
45- const fragment = document . createDocumentFragment ( )
54+ const fragment = document . createDocumentFragment ( ) ;
4655
47- const links : Array < HTMLAnchorElement > = [ ]
56+ const links : Array < HTMLAnchorElement > = [ ] ;
4857 document . childNodes . forEach ( ( node ) => {
49- fragment . append ( node )
58+ fragment . append ( node ) ;
5059 if ( 'tagName' in node && node . tagName === 'P' ) {
5160 // get a list of all anchor tags in their own paragraph with the href as inner
5261 // should be equivalent to \n\n<markdown-link>\n\n
53- const child = node . firstChild
54- if ( child
55- && node . childNodes . length === 1
56- && child . nodeName === 'A'
57- && 'href' in child
58- && child . href === child . innerHTML ) {
59- links . push ( child )
62+ const child = node . firstChild ;
63+ if (
64+ child &&
65+ node . childNodes . length === 1 &&
66+ child . nodeName === 'A' &&
67+ 'href' in child &&
68+ child . href === child . innerHTML
69+ ) {
70+ links . push ( child ) ;
6071 }
6172 }
62- } )
73+ } ) ;
6374
6475 // cache data for identical url within the same request
65- const cache = new Map < string , Data > ( )
76+ const cache = new Map < string , Data > ( ) ;
6677 return Promise . all (
6778 links . map ( async ( a ) => {
68- let data = cache . get ( a . href )
79+ let data = cache . get ( a . href ) ;
6980 if ( ! data ) {
7081 try {
7182 const res = await fetch ( 'https://embed.internal.weird.one?lang=en' , {
7283 method : 'POST' ,
7384 headers : {
74- 'Content-Type' : 'text/plain' ,
85+ 'Content-Type' : 'text/plain'
7586 } ,
7687 body : a . href
77- } )
78- if ( ! res . ok )
79- console . error ( `${ res . status } ${ res . statusText } : for url ${ a . href } ` )
80- const json = await res . json ( )
81- data = cache . set ( a . href , json [ 1 ] ) . get ( a . href )
82-
88+ } ) ;
89+ if ( res . ok ) {
90+ const json = await res . json ( ) ;
91+ data = cache . set ( a . href , json [ 1 ] ) . get ( a . href ) ;
92+ } else {
93+ console . error ( `Embed server error: ${ res . status } ${ res . statusText } : for url ${ a . href } ` ) ;
94+ }
8395 } catch ( err ) {
84- if ( err instanceof TypeError )
85- console . error ( `${ err . message } . ${ err . cause } ` )
86- else throw err
96+ if ( err instanceof TypeError ) console . error ( `${ err . message } . ${ err . cause } ` ) ;
97+ else throw err ;
8798 }
8899 }
89- if ( ! data ) return
90- const linkCard = document . createElement ( 'div' )
91- linkCard . className = "unfurl overflow-hidden rounded-r border-l-4 border-gray-200 bg-gray-200 bg-opacity-10"
92- linkCard . innerHTML = linkCardTemplate ( { data, url : a . href } )
93- a . replaceWith ( linkCard )
100+ if ( ! data ) return ;
101+ const linkCard = document . createElement ( 'div' ) ;
102+ linkCard . className =
103+ 'unfurl overflow-hidden rounded-r border-l-4 border-gray-200 bg-gray-200 bg-opacity-10' ;
104+ linkCard . innerHTML = linkCardTemplate ( { data, url : a . href } ) ;
105+ a . replaceWith ( linkCard ) ;
94106 } )
95107 ) . then ( ( ) => {
96- const container = document . createElement ( 'div' )
97- container . appendChild ( fragment . cloneNode ( true ) )
98- return container . innerHTML
99- } )
100- }
108+ const container = document . createElement ( 'div' ) ;
109+ container . appendChild ( fragment . cloneNode ( true ) ) ;
110+ return container . innerHTML ;
111+ } ) ;
112+ } ;
101113
102114/** Render the markdown string to sanitized HTML, ready for display in the app. */
103115export function renderMarkdownSanitized ( markdown : string ) {
104- return sanitizeHtml ( marked . parse ( markdown ) as string )
116+ return sanitizeHtml ( marked . parse ( markdown ) as string ) ;
105117}
0 commit comments