@atcute/bluesky-richtext-secmenter (中文(简体) )
将 Bluesky 丰富的文本分解成渲染符号.
npm install @atcute/bluesky-richtext-segmenter
Bluesky 的帖子包含文字和方面(引用、链接等的字节范围说明)。 这个 软件包将文本分割成片段,每个片段都有其相关特征,这样你就可以将其制成 适当的.
使用量
import { segmentize } from '@atcute/bluesky-richtext-segmenter';
// text and facets from a post record
const text = 'hello @bsky.app!';
const facets = [
{
index: { byteStart: 6, byteEnd: 15 },
features: [
{ $type: 'app.bsky.richtext.facet#mention', did: 'did:plc:z72i7hdynmk6r22z27h6tvur' },
],
},
];
const segments = segmentize(text, facets);
// -> [
// { text: 'hello ', features: undefined },
// { text: '@bsky.app', features: [{ $type: '...#mention', did: '...' }] },
// { text: '!', features: undefined }
// ]
渲染段
每个段包含 text 选择 features。基于特性类型的渲染:
import { segmentize, type RichtextSegment } from '@atcute/bluesky-richtext-segmenter';
const renderSegment = (segment: RichtextSegment, index: number) => {
const { text, features } = segment;
if (!features) {
return <span key={index}>{text}</span>;
}
// segments can have multiple features, use the first one
const feature = features[0];
switch (feature.$type) {
case 'app.bsky.richtext.facet#mention':
return (
<a key={index} href={`/profile/${feature.did}`}>
{text}
</a>
);
case 'app.bsky.richtext.facet#link':
return (
<a key={index} href={feature.uri} target="_blank" rel="noopener noreferrer">
{text}
</a>
);
case 'app.bsky.richtext.facet#tag':
return (
<a key={index} href={`/search?q=${encodeURIComponent('#' + feature.tag)}`}>
{text}
</a>
);
default:
return <span key={index}>{text}</span>;
}
};
const RichText = ({ text, facets }: { text: string; facets?: Facet[] }) => {
const segments = segmentize(text, facets);
return <>{segments.map(renderSegment)}</>;
};