11import { AbstractViewField } from '../AbstractViewField' ;
2- import { type ViewFieldMDRC , type ViewFieldVariable } from '../../../renderChildren/ViewFieldMDRC' ;
3- import { type ViewFieldDeclaration } from '../../../parsers/viewFieldParser/ViewFieldDeclaration' ;
2+ import { type ViewFieldMDRC } from '../../../renderChildren/ViewFieldMDRC' ;
43import { Signal } from '../../../utils/Signal' ;
54import { getUUID } from '../../../utils/Utils' ;
65import { ErrorLevel , MetaBindExpressionError , MetaBindValidationError } from '../../../utils/errors/MetaBindErrors' ;
@@ -15,11 +14,11 @@ export class LinkVF extends AbstractViewField {
1514 super ( renderChild ) ;
1615 }
1716
18- public buildVariables ( declaration : ViewFieldDeclaration ) : ViewFieldVariable [ ] {
17+ protected buildVariables ( ) : void {
1918 // filter out empty strings
20- const entries : ( string | BindTargetDeclaration ) [ ] = declaration . templateDeclaration . filter ( x =>
21- typeof x === 'string' ? x : true ,
22- ) ;
19+ const entries : ( string | BindTargetDeclaration ) [ ] = this . base
20+ . getDeclaration ( )
21+ . templateDeclaration . filter ( x => ( typeof x === 'string' ? x : true ) ) ;
2322
2423 if ( entries . length !== 1 ) {
2524 throw new MetaBindValidationError ( {
@@ -38,87 +37,62 @@ export class LinkVF extends AbstractViewField {
3837 } ) ;
3938 }
4039
41- const variable : ViewFieldVariable = {
42- bindTargetDeclaration : firstEntry ,
43- inputSignal : new Signal < unknown > ( undefined ) ,
44- uuid : getUUID ( ) ,
45- contextName : `MB_VAR_0` ,
46- } ;
47-
48- return [ variable ] ;
49- }
50-
51- protected _render ( container : HTMLElement ) : void {
52- this . component = new LinkListComponent ( {
53- target : container ,
54- props : {
55- mdLinkList : [ ] ,
40+ this . variables = [
41+ {
42+ bindTargetDeclaration : firstEntry ,
43+ inputSignal : new Signal < unknown > ( undefined ) ,
44+ uuid : getUUID ( ) ,
45+ contextName : `MB_VAR_0` ,
5646 } ,
57- } ) ;
58- }
59-
60- protected async _update ( container : HTMLElement , text : string ) : Promise < void > {
61- const linkList = MDLinkParser . parseLinkList ( text ) ;
62- this . component = new LinkListComponent ( {
63- target : container ,
64- props : {
65- mdLinkList : linkList ,
66- } ,
67- } ) ;
68- }
69-
70- public destroy ( ) : void {
71- this . component ?. $destroy ( ) ;
47+ ] ;
7248 }
7349
74- computeValue ( variables : ViewFieldVariable [ ] ) : string {
75- if ( variables . length !== 1 ) {
50+ protected computeValue ( ) : string {
51+ if ( this . variables . length !== 1 ) {
7652 throw new MetaBindExpressionError ( {
7753 errorLevel : ErrorLevel . CRITICAL ,
7854 effect : 'failed to evaluate link view field' ,
7955 cause : 'there should be exactly one variable' ,
8056 } ) ;
8157 }
8258
83- const variable = variables [ 0 ] ;
59+ const variable = this . variables [ 0 ] ;
8460 const content = variable . inputSignal . get ( ) ;
8561
8662 // we want the return value to be a human-readable string, since someone could save this to the frontmatter
8763 if ( typeof content === 'string' ) {
88- return this . convertToLink ( content ) ;
64+ return MDLinkParser . convertToLinkString ( content ) ;
8965 } else if ( Array . isArray ( content ) ) {
9066 const strings = content . filter ( x => typeof x === 'string' ) as string [ ] ;
9167 return strings
92- . map ( x => this . convertToLink ( x ) )
68+ . map ( x => MDLinkParser . convertToLinkString ( x ) )
9369 . filter ( x => x !== '' )
9470 . join ( ', ' ) ;
9571 } else {
9672 return '' ;
9773 }
9874 }
9975
100- convertToLink ( str : string ) : string {
101- if ( MDLinkParser . isLink ( str ) ) {
102- return str ;
103- } else if ( MDLinkParser . isLink ( `[[${ str } ]]` ) ) {
104- return `[[${ str } ]]` ;
105- } else if ( this . getUrl ( str ) ) {
106- const url = this . getUrl ( str ) ! ;
107- return `[${ url . hostname } ](${ str } )` ;
108- } else {
109- return '' ;
110- }
76+ protected onInitialRender ( container : HTMLElement ) : void {
77+ this . component = new LinkListComponent ( {
78+ target : container ,
79+ props : {
80+ mdLinkList : [ ] ,
81+ } ,
82+ } ) ;
11183 }
11284
113- getUrl ( str : string ) : URL | undefined {
114- try {
115- return new URL ( str ) ;
116- } catch ( e ) {
117- return undefined ;
118- }
85+ protected async onRerender ( container : HTMLElement , text : string ) : Promise < void > {
86+ const linkList = MDLinkParser . parseLinkList ( text ) ;
87+ this . component = new LinkListComponent ( {
88+ target : container ,
89+ props : {
90+ mdLinkList : linkList ,
91+ } ,
92+ } ) ;
11993 }
12094
121- public getDefaultDisplayValue ( ) : string {
122- return '' ;
95+ protected onunmount ( ) : void {
96+ this . component ?. $destroy ( ) ;
12397 }
12498}
0 commit comments