| 
									
										
										
										
											2022-06-19 18:23:43 +02:00
										 |  |  | import {Store, UIEventSource} from "../UIEventSource"; | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  | import BaseUIElement from "../../UI/BaseUIElement"; | 
					
						
							|  |  |  | import {LicenseInfo} from "./LicenseInfo"; | 
					
						
							| 
									
										
										
										
											2021-10-07 22:06:47 +02:00
										 |  |  | import {Utils} from "../../Utils"; | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | export interface ProvidedImage { | 
					
						
							| 
									
										
										
										
											2021-10-07 22:06:47 +02:00
										 |  |  |     url: string, | 
					
						
							|  |  |  |     key: string, | 
					
						
							|  |  |  |     provider: ImageProvider | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default abstract class ImageProvider { | 
					
						
							| 
									
										
										
										
											2021-10-07 22:06:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-18 22:17:41 +02:00
										 |  |  |     public abstract readonly defaultKeyPrefixes: string[] | 
					
						
							| 
									
										
										
										
											2022-06-19 18:23:43 +02:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  |     public abstract SourceIcon(backlinkSource?: string): BaseUIElement; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Given a properies object, maps it onto _all_ the available pictures for this imageProvider | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2022-06-05 02:24:14 +02:00
										 |  |  |     public GetRelevantUrls(allTags: Store<any>, options?: { | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  |         prefixes?: string[] | 
					
						
							| 
									
										
										
										
											2021-10-07 22:06:47 +02:00
										 |  |  |     }): UIEventSource<ProvidedImage[]> { | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  |         const prefixes = options?.prefixes ?? this.defaultKeyPrefixes | 
					
						
							| 
									
										
										
										
											2021-10-07 22:06:47 +02:00
										 |  |  |         if (prefixes === undefined) { | 
					
						
							| 
									
										
										
										
											2022-02-14 02:26:03 +01:00
										 |  |  |             throw "No `defaultKeyPrefixes` defined by this image provider" | 
					
						
							| 
									
										
										
										
											2021-10-01 02:57:41 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  |         const relevantUrls = new UIEventSource<{ url: string; key: string; provider: ImageProvider }[]>([]) | 
					
						
							|  |  |  |         const seenValues = new Set<string>() | 
					
						
							|  |  |  |         allTags.addCallbackAndRunD(tags => { | 
					
						
							|  |  |  |             for (const key in tags) { | 
					
						
							| 
									
										
										
										
											2021-10-07 22:06:47 +02:00
										 |  |  |                 if (!prefixes.some(prefix => key.startsWith(prefix))) { | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  |                     continue | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-10-07 22:06:47 +02:00
										 |  |  |                 const values = Utils.NoEmpty(tags[key]?.split(";")?.map(v => v.trim()) ?? []) | 
					
						
							|  |  |  |                 for (const value of values) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     if (seenValues.has(value)) { | 
					
						
							|  |  |  |                         continue | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2021-10-07 22:06:47 +02:00
										 |  |  |                     seenValues.add(value) | 
					
						
							|  |  |  |                     this.ExtractUrls(key, value).then(promises => { | 
					
						
							|  |  |  |                         for (const promise of promises ?? []) { | 
					
						
							|  |  |  |                             if (promise === undefined) { | 
					
						
							|  |  |  |                                 continue | 
					
						
							|  |  |  |                             } | 
					
						
							|  |  |  |                             promise.then(providedImage => { | 
					
						
							|  |  |  |                                 if (providedImage === undefined) { | 
					
						
							|  |  |  |                                     return | 
					
						
							|  |  |  |                                 } | 
					
						
							|  |  |  |                                 relevantUrls.data.push(providedImage) | 
					
						
							|  |  |  |                                 relevantUrls.ping() | 
					
						
							|  |  |  |                             }) | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     }) | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         return relevantUrls | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-07 22:06:47 +02:00
										 |  |  |     public abstract ExtractUrls(key: string, value: string): Promise<Promise<ProvidedImage>[]>; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-13 00:51:53 +02:00
										 |  |  |     public abstract DownloadAttribution(url: string): Promise<LicenseInfo>; | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  | } |