@@ -2,8 +2,9 @@ import { type Parser } from '@lemons_dev/parsinom/lib/Parser';
22import { P_UTILS } from '@lemons_dev/parsinom/lib/ParserUtils' ;
33import { P } from '@lemons_dev/parsinom/lib/ParsiNOM' ;
44import { runParser } from 'packages/core/src/parsers/ParsingError' ;
5- import { isUrl } from 'packages/core/src/utils/Utils' ;
5+ import { isUrl , openURL } from 'packages/core/src/utils/Utils' ;
66import { P_FilePath } from 'packages/core/src/parsers/nomParsers/GeneralNomParsers' ;
7+ import { type IPlugin } from 'packages/core/src/IPlugin' ;
78
89const P_MDLinkInner : Parser < [ string , string | undefined , string | undefined ] > = P . sequence (
910 P_FilePath , // the file path
@@ -15,13 +16,7 @@ const P_MDLink: Parser<MarkdownLink> = P.or(
1516 // wiki links
1617 P . sequenceMap (
1718 ( a , b ) : MarkdownLink => {
18- return {
19- isEmbed : a !== undefined ,
20- target : b [ 0 ] ,
21- block : b [ 1 ] ,
22- alias : b [ 2 ] ,
23- internal : true ,
24- } ;
19+ return new MarkdownLink ( a !== undefined , b [ 0 ] , b [ 1 ] , b [ 2 ] , true ) ;
2520 } ,
2621 P . string ( '!' ) . optional ( ) ,
2722 P_MDLinkInner . wrapString ( '[[' , ']]' ) ,
@@ -31,13 +26,7 @@ const P_MDLink: Parser<MarkdownLink> = P.or(
3126 ( a , b , c ) : MarkdownLink => {
3227 const internal = ! isUrl ( c ) ;
3328
34- return {
35- isEmbed : a !== undefined ,
36- target : c ,
37- block : undefined ,
38- alias : b ,
39- internal : internal ,
40- } ;
29+ return new MarkdownLink ( a !== undefined , c , undefined , b , internal ) ;
4130 } ,
4231 P . string ( '!' ) . optional ( ) ,
4332 P . manyNotOf ( '[]' ) . wrapString ( '[' , ']' ) ,
@@ -47,12 +36,36 @@ const P_MDLink: Parser<MarkdownLink> = P.or(
4736
4837const P_MDLinkList : Parser < MarkdownLink [ ] > = P . separateBy ( P_MDLink , P . string ( ',' ) . trim ( P_UTILS . optionalWhitespace ( ) ) ) ;
4938
50- export interface MarkdownLink {
39+ export class MarkdownLink {
5140 isEmbed : boolean ;
5241 target : string ;
5342 block ?: string ;
5443 alias ?: string ;
5544 internal : boolean ;
45+
46+ constructor ( isEmbed : boolean , target : string , block ?: string , alias ?: string , internal ?: boolean ) {
47+ this . isEmbed = isEmbed ;
48+ this . target = target ;
49+ this . block = block ;
50+ this . alias = alias ;
51+ this . internal = internal ?? true ;
52+ }
53+
54+ static fromUrl ( url : URL ) : MarkdownLink {
55+ return new MarkdownLink ( false , url . href , undefined , url . hostname , false ) ;
56+ }
57+
58+ fullTarget ( ) : string {
59+ return this . block ? `${ this . target } #${ this . block } ` : this . target ;
60+ }
61+
62+ open ( plugin : IPlugin , relativeFilePath : string , newTab : boolean ) : void {
63+ if ( this . internal ) {
64+ plugin . internal . openFile ( this . fullTarget ( ) , relativeFilePath , newTab ) ;
65+ } else {
66+ openURL ( this . target ) ;
67+ }
68+ }
5669}
5770
5871export class MDLinkParser {
@@ -69,13 +82,7 @@ export class MDLinkParser {
6982 }
7083
7184 static urlToLink ( url : URL ) : MarkdownLink {
72- return {
73- isEmbed : false ,
74- target : url . href ,
75- block : undefined ,
76- alias : url . hostname ,
77- internal : false ,
78- } ;
85+ return MarkdownLink . fromUrl ( url ) ;
7986 }
8087
8188 static parseLinkOrUrl ( str : string ) : MarkdownLink {
@@ -86,7 +93,7 @@ export class MDLinkParser {
8693 }
8794 }
8895
89- static convertToLinkString ( str : string ) : string {
96+ static toLinkString ( str : string ) : string {
9097 if ( MDLinkParser . isLink ( str ) ) {
9198 return str ;
9299 } else if ( isUrl ( str ) ) {
0 commit comments