33 DecorationType ,
44 BlockType ,
55 ContentValueType ,
6- BlockMapType
6+ BlockMapType ,
7+ LinkTargetType
78} from "./types" ;
89import Asset from "./components/asset" ;
910import Code from "./components/code" ;
@@ -12,10 +13,17 @@ import {
1213 classNames ,
1314 getTextContent ,
1415 getListNumber ,
15- toNotionImageUrl
16+ toNotionImageUrl ,
17+ getLinkTargetProps
1618} from "./utils" ;
1719
18- export const renderChildText = ( properties : DecorationType [ ] ) => {
20+ interface createRenderChildText {
21+ linkTarget ?: LinkTargetType ;
22+ }
23+
24+ export const createRenderChildText = ( options ?: createRenderChildText ) => (
25+ properties : DecorationType [ ]
26+ ) => {
1927 return properties ?. map ( ( [ text , decorations ] , i ) => {
2028 if ( ! decorations ) {
2129 return < React . Fragment key = { i } > { text } </ React . Fragment > ;
@@ -43,7 +51,13 @@ export const renderChildText = (properties: DecorationType[]) => {
4351 return < s key = { i } > { element } </ s > ;
4452 case "a" :
4553 return (
46- < a className = "notion-link" href = { decorator [ 1 ] } key = { i } >
54+ < a
55+ className = "notion-link"
56+ href = { decorator [ 1 ] }
57+ key = { i }
58+ rel = "noopener noreferrer"
59+ { ...getLinkTargetProps ( decorator [ 1 ] , options ?. linkTarget ) }
60+ >
4761 { element }
4862 </ a >
4963 ) ;
@@ -61,14 +75,17 @@ interface Block {
6175 block : BlockType ;
6276 level : number ;
6377 blockMap : BlockMapType ;
78+ linkTarget ?: LinkTargetType ;
6479
6580 fullPage ?: boolean ;
6681 mapPageUrl ?: MapPageUrl ;
6782}
6883
6984export const Block : React . FC < Block > = props => {
70- const { block, children, level, fullPage, blockMap } = props ;
85+ const { block, children, level, fullPage, blockMap, linkTarget } = props ;
7186 const blockValue = block ?. value ;
87+ const renderChildText = createRenderChildText ( { linkTarget } ) ;
88+
7289 switch ( blockValue ?. type ) {
7390 case "page" :
7491 if ( level === 0 ) {
0 commit comments