From 4f35924b9304f88adeb9000955d285f54695c2fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Agneray?= <francois.agneray@lam.fr>
Date: Mon, 27 Jun 2022 17:04:12 +0200
Subject: [PATCH] Dynamic link => external or internal link

---
 .../dynamic-router-link.component.html        | 23 +++++++++++++------
 .../dynamic-router-link.component.ts          |  4 ++++
 .../parsers/dynamic-router-link-parser.ts     | 14 +++++------
 3 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/client/src/app/instance/webpage/hooks/components/dynamic-router-link.component.html b/client/src/app/instance/webpage/hooks/components/dynamic-router-link.component.html
index 54addb95..aa0d6e16 100644
--- a/client/src/app/instance/webpage/hooks/components/dynamic-router-link.component.html
+++ b/client/src/app/instance/webpage/hooks/components/dynamic-router-link.component.html
@@ -1,8 +1,17 @@
-<a *ngIf="link" 
-  [routerLink]="link"
-  [queryParams]="queryParams ? queryParams : {}" 
-  [fragment]="anchorFragment ? anchorFragment : null"
-  [ngClass]="css"
+<a *ngIf="isExternalLink()"
+    href="{{ link }}"
+    [ngClass]="css"
 >
-    <ng-content></ng-content>
-</a>
\ No newline at end of file
+    <ng-container *ngTemplateOutlet="contentTpl"></ng-container>
+</a>
+
+<a *ngIf="!isExternalLink()" 
+    [routerLink]="link"
+    [queryParams]="queryParams ? queryParams : {}" 
+    [fragment]="anchorFragment ? anchorFragment : null"
+    [ngClass]="css"
+>
+    <ng-container *ngTemplateOutlet="contentTpl"></ng-container>
+</a>
+
+<ng-template #contentTpl><ng-content></ng-content></ng-template>
diff --git a/client/src/app/instance/webpage/hooks/components/dynamic-router-link.component.ts b/client/src/app/instance/webpage/hooks/components/dynamic-router-link.component.ts
index d3bff4e1..4cd0537e 100644
--- a/client/src/app/instance/webpage/hooks/components/dynamic-router-link.component.ts
+++ b/client/src/app/instance/webpage/hooks/components/dynamic-router-link.component.ts
@@ -10,4 +10,8 @@ export class DynamicRouterLinkComponent {
     @Input() queryParams: {[key: string]: any};
     @Input() anchorFragment: string;
     @Input() css: string;
+
+    isExternalLink() {
+        return this.link.startsWith('http');
+    }
 }
diff --git a/client/src/app/instance/webpage/hooks/parsers/dynamic-router-link-parser.ts b/client/src/app/instance/webpage/hooks/parsers/dynamic-router-link-parser.ts
index 796a3f08..9a283f52 100644
--- a/client/src/app/instance/webpage/hooks/parsers/dynamic-router-link-parser.ts
+++ b/client/src/app/instance/webpage/hooks/parsers/dynamic-router-link-parser.ts
@@ -11,10 +11,7 @@ export class DynamicRouterLinkParser implements HookParser {
     classAttrRegex: RegExp;
 
     constructor(private hookFinder: HookFinder) {
-        // Lets assemble a regex that finds the opening <a>-tags for internal links
-        const domainName = this.escapeRegExp(window.location.hostname.replace('www.', '')); // <-- This is our website name
-        const internalUrl = '(?:(?:https:)?\\/\\/(?:www\\.)?' + domainName + '|(?!(?:https:)?\\/\\/))([^\\"]*?)';
-        const hrefAttr = '\\s+href\=\\"' + internalUrl + '\\"';
+        const hrefAttr = '\\s+href\=\\"([^\\"]*?)\\"';
         const anyOtherAttr = '\\s+[a-zA-Z]+\\=\\"[^\\"]*?\\"';
         const linkOpeningTag = '\\<a(?:' + anyOtherAttr + ')*?' + hrefAttr + '(?:' + anyOtherAttr + ')*?\\>';
 
@@ -43,10 +40,13 @@ export class DynamicRouterLinkParser implements HookParser {
         // e.g. '/jedi/windu' from 'https://www.mysite.com/jedi/windu', which is what we need
         const hrefAttrMatch = hookValue.openingTag.match(this.hrefAttrRegex);
         let relativeLink = hrefAttrMatch[1];
-
+        
         // Select css part
+        let css = null;
         const classAttrMatch = hookValue.openingTag.match(this.classAttrRegex);
-        let css = classAttrMatch[1];
+        if (classAttrMatch) {
+            css = classAttrMatch[1];
+        }
 
         // The relative part of the link may still contain the query string and the 
         // anchor fragment, so we need to split it up accordingly
@@ -64,7 +64,7 @@ export class DynamicRouterLinkParser implements HookParser {
                 link: relativeLink,
                 queryParams: queryParams,
                 anchorFragment: anchorFragment,
-                css: css
+                css
             }
         };
     }
-- 
GitLab