diff --git a/package.json b/package.json index 618cd5d8..153bc40d 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "react-dom": "^18.2.0", "react-hook-form": "^7.43.9", "react-string-replace": "^1.1.0", - "react-virtuoso": "^4.3.3", + "react-virtuoso": "^4.3.4", "react-youtube": "^10.1.0", "swr": "^2.1.5", "tailwind-merge": "^1.12.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ab6b606..68fbbf0e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,8 +53,8 @@ dependencies: specifier: ^1.1.0 version: 1.1.0 react-virtuoso: - specifier: ^4.3.3 - version: 4.3.3(react-dom@18.2.0)(react@18.2.0) + specifier: ^4.3.4 + version: 4.3.4(react-dom@18.2.0)(react@18.2.0) react-youtube: specifier: ^10.1.0 version: 10.1.0(react@18.2.0) @@ -3600,9 +3600,9 @@ packages: engines: { node: '>=0.12.0' } dev: false - /react-virtuoso@4.3.3(react-dom@18.2.0)(react@18.2.0): + /react-virtuoso@4.3.4(react-dom@18.2.0)(react@18.2.0): resolution: - { integrity: sha512-x0DeGmVAVOVaTXRMG7jzrHBwK7+dkt7n0G3tNmZXphQUBgkVBYuZoaJltQeZGFN42++3XvrgwStKCtmzgMJ0lA== } + { integrity: sha512-r+zxsUKCLBhjT4925xY7YQz3pVqiJvkxrN8OSBpCd5VBWJCVGt0lpZOVpDQ2nX7yuCELFMuZOiFNCCYSJ1/OHQ== } engines: { node: '>=10' } peerDependencies: react: '>=16 || >=17 || >= 18' diff --git a/src/app/note/components/parser.tsx b/src/app/note/components/parser.tsx new file mode 100644 index 00000000..dd186807 --- /dev/null +++ b/src/app/note/components/parser.tsx @@ -0,0 +1,48 @@ +import { Event, parseReferences } from 'nostr-tools'; + +const getURLs = new RegExp( + '(^|[ \t\r\n])((ftp|http|https|gopher|mailto|news|nntp|telnet|wais|file|prospero|aim|webcal):(([A-Za-z0-9$_.+!*(),;/?:@&~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*(),;/?:@&~=%-]*))?([A-Za-z0-9$_+!*();/?:~-]))', + 'g' +); + +export const noteParser = (event: Event) => { + const references = parseReferences(event); + const content = { original: event.content, parsed: event.content, images: [], videos: [], others: [] }; + + // handle media + content.original.match(getURLs)?.forEach((url) => { + if (url.match(/\.(jpg|jpeg|gif|png|webp|avif)$/i)) { + // image url + content.images.push(url.trim()); + // remove url from original content + content.parsed = content.parsed.replace(url, ''); + } else if (url.match(/(http:|https:)?(\/\/)?(www\.)?(youtube.com|youtu.be)\/(watch|embed)?(\?v=|\/)?(\S+)?/)) { + // youtube + content.videos.push(url.trim()); + // remove url from original content + content.parsed = content.parsed.replace(url, ''); + } else if (url.match(/\.(mp4|webm|mov)$/i)) { + // video + content.videos.push(url.trim()); + // remove url from original content + content.parsed = content.parsed.replace(url, ''); + } else { + content.others.push(url.trim()); + } + }); + + // handle note references + references?.forEach((reference) => { + if (reference?.profile) { + content.parsed.replace(reference.text, ``); + } + if (reference?.event) { + content.parsed.replace(reference.text, `;`); + } + if (reference?.address) { + content.parsed.replace(reference.text, ``); + } + }); + + return content; +};