| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  | import {UIEventSource} from "../UIEventSource"; | 
					
						
							|  |  |  | 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[] | 
					
						
							| 
									
										
										
										
											2021-10-07 22:06:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  |     private _cache = new Map<string, UIEventSource<LicenseInfo>>() | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  |     GetAttributionFor(url: string): UIEventSource<LicenseInfo> { | 
					
						
							|  |  |  |         const cached = this._cache.get(url); | 
					
						
							|  |  |  |         if (cached !== undefined) { | 
					
						
							|  |  |  |             return cached; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-10-06 02:30:23 +02:00
										 |  |  |         const src = UIEventSource.FromPromise(this.DownloadAttribution(url)) | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  |         this._cache.set(url, src) | 
					
						
							|  |  |  |         return src; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public abstract SourceIcon(backlinkSource?: string): BaseUIElement; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Given a properies object, maps it onto _all_ the available pictures for this imageProvider | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public GetRelevantUrls(allTags: UIEventSource<any>, options?: { | 
					
						
							|  |  |  |         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) { | 
					
						
							|  |  |  |             throw "The image provider" + this.constructor.name + " doesn't define `defaultKeyPrefixes`" | 
					
						
							| 
									
										
										
										
											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>[]>; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     protected abstract DownloadAttribution(url: string): Promise<LicenseInfo>; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  | } |