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