external-content.ts raw
1 export function determineExternalContentKind(externalContent: string): string | undefined {
2 if (externalContent.startsWith('http')) {
3 return 'web'
4 }
5 if (externalContent.startsWith('isbn:')) {
6 return 'isbn'
7 }
8 if (externalContent.startsWith('isan:')) {
9 return 'isan'
10 }
11 if (externalContent.startsWith('doi:')) {
12 return 'doi'
13 }
14 if (externalContent.startsWith('#')) {
15 return '#'
16 }
17 if (externalContent.startsWith('podcast:guid:')) {
18 return 'podcast:guid'
19 }
20 if (externalContent.startsWith('podcast:item:guid:')) {
21 return 'podcast:item:guid'
22 }
23 if (externalContent.startsWith('podcast:publisher:guid:')) {
24 return 'podcast:publisher:guid'
25 }
26
27 // Handle blockchain transaction format: <blockchain>:[<chainId>:]tx:<txid>
28 // Match pattern: blockchain name, optional chain ID, "tx:", transaction ID
29 const blockchainTxMatch = externalContent.match(/^([a-z]+):(?:[^:]+:)?tx:[a-f0-9]+$/i)
30 if (blockchainTxMatch) {
31 const blockchain = blockchainTxMatch[1].toLowerCase()
32 return `${blockchain}:tx`
33 }
34
35 // Handle blockchain address format: <blockchain>:[<chainId>:]address:<address>
36 // Match pattern: blockchain name, optional chain ID, "address:", address
37 const blockchainAddressMatch = externalContent.match(/^([a-z]+):(?:[^:]+:)?address:[a-zA-Z0-9]+$/i)
38 if (blockchainAddressMatch) {
39 const blockchain = blockchainAddressMatch[1].toLowerCase()
40 return `${blockchain}:address`
41 }
42 }
43