From 155ba4ff1dd93527842227f2a6a4a0608db88655 Mon Sep 17 00:00:00 2001 From: Matthieu Benoist <mbenoist@ausy-group.com> Date: Mon, 14 Jun 2021 11:17:04 +0200 Subject: [PATCH] Parse youtube iframe and replace it by div --- src/app/app.module.ts | 1 + .../core/services/tarteaucitron.service.ts | 13 ++++++- .../services/dataset-detail.service.ts | 2 +- .../cms-page/cms-page.component.scss | 1 + .../components/cms-page/cms-page.component.ts | 11 +++++- .../cms-post-detail.component.ts | 16 +++++--- .../models/cms-content.model.ts | 39 ++++++++++++++++++- src/scss/ghost-style.scss | 4 ++ 8 files changed, 75 insertions(+), 12 deletions(-) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index e0f0f14d..3b321148 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -42,6 +42,7 @@ export function initTarteaucitronService(tarteaucitronService: TarteAuCitronServ resolve(); }); } + } export function initAppConfig(appConfigService: AppConfigService) { diff --git a/src/app/core/services/tarteaucitron.service.ts b/src/app/core/services/tarteaucitron.service.ts index bc279692..2a442d1f 100644 --- a/src/app/core/services/tarteaucitron.service.ts +++ b/src/app/core/services/tarteaucitron.service.ts @@ -19,7 +19,8 @@ export class TarteAuCitronService { "showAlertSmall" : false, "cookieslist" : true, - "iconPosition": "BottomRight", + "iconPosition": "BottomLeft", + "showIcon": false, "AcceptAllCta" : true, "DenyAllCta": false, @@ -44,8 +45,18 @@ export class TarteAuCitronService { tarteaucitron.user.matomoHost = APP_CONFIG.statistics.matomoHost; (tarteaucitron.job = tarteaucitron.job || []).push('matomo'); + (tarteaucitron.job = tarteaucitron.job || []).push('youtube'); resolve(); }); } + + public initEvents() + { + if (tarteaucitron) { + console.log('passage ici.'); + tarteaucitron.initEvents.loadEvent(); + } + } + } diff --git a/src/app/dataset-detail/services/dataset-detail.service.ts b/src/app/dataset-detail/services/dataset-detail.service.ts index 684d5d71..c3cbd8f5 100644 --- a/src/app/dataset-detail/services/dataset-detail.service.ts +++ b/src/app/dataset-detail/services/dataset-detail.service.ts @@ -62,7 +62,7 @@ export class DatasetDetailService { }); // Get the metadata return this._elasticsearchService.getDatasetMetadata(slugOrUuid).pipe( - map((e) => { + map((e:any) => { if (e.hits.hits.length > 0) { const metadata = new Metadata(e.hits.hits[0]._source['metadata-fr']); this._dataset.uuid = metadata.geonet.uuid; diff --git a/src/app/editorialisation/components/cms-page/cms-page.component.scss b/src/app/editorialisation/components/cms-page/cms-page.component.scss index 839fae89..1222aec7 100644 --- a/src/app/editorialisation/components/cms-page/cms-page.component.scss +++ b/src/app/editorialisation/components/cms-page/cms-page.component.scss @@ -7,4 +7,5 @@ line-height: 1.2; padding: 1rem; } + } diff --git a/src/app/editorialisation/components/cms-page/cms-page.component.ts b/src/app/editorialisation/components/cms-page/cms-page.component.ts index 6a7f533c..f686d1b3 100644 --- a/src/app/editorialisation/components/cms-page/cms-page.component.ts +++ b/src/app/editorialisation/components/cms-page/cms-page.component.ts @@ -1,7 +1,8 @@ -import { Component, OnInit } from '@angular/core'; +import { AfterViewInit, Component, OnInit } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { ActivatedRoute, Router } from '@angular/router'; import { environment } from '../../../../environments/environment'; +import { TarteAuCitronService } from '../../../core/services'; import { ToolsService } from '../../../core/services/tools.service'; import { AppRoutes } from '../../../routes'; import { IPageHeaderInfo } from '../../../shared/models'; @@ -13,7 +14,7 @@ import { EditorialisationService, SeoSErvice } from '../../services'; templateUrl: './cms-page.component.html', styleUrls: ['./cms-page.component.scss'], }) -export class CMSPageComponent implements OnInit { +export class CMSPageComponent implements OnInit, AfterViewInit { page: CMSContent; safePageContent: SafeHtml; pageHeaderInfo: IPageHeaderInfo = { @@ -27,6 +28,7 @@ export class CMSPageComponent implements OnInit { private _toolsService: ToolsService, private _router: Router, private _seoService: SeoSErvice, + private _tacService: TarteAuCitronService, ) { } @@ -54,4 +56,9 @@ export class CMSPageComponent implements OnInit { }); }); } + + ngAfterViewInit() + { + this._tacService.initEvents(); + } } diff --git a/src/app/editorialisation/components/cms-post-detail/cms-post-detail.component.ts b/src/app/editorialisation/components/cms-post-detail/cms-post-detail.component.ts index 310ac417..c0872802 100644 --- a/src/app/editorialisation/components/cms-post-detail/cms-post-detail.component.ts +++ b/src/app/editorialisation/components/cms-post-detail/cms-post-detail.component.ts @@ -1,6 +1,6 @@ import { DatePipe } from '@angular/common'; -import { Component, OnInit } from '@angular/core'; -import { DomSanitizer, Meta, SafeHtml, Title } from '@angular/platform-browser'; +import { AfterViewInit, Component, OnInit } from '@angular/core'; +import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { ActivatedRoute, Router } from '@angular/router'; import { notificationMessages } from '../../../../i18n/traductions'; import { ToolsService } from '../../../core/services/tools.service'; @@ -9,14 +9,14 @@ import { SeoSErvice } from '../../services/seo.service' import { AppRoutes } from '../../../routes'; import { IPageHeaderInfo, Metadata, typesMetadata } from '../../../shared/models'; import { CMSContent } from '../../models/cms-content.model'; -import { environment } from '../../../../environments/environment'; +import { TarteAuCitronService } from '../../../core/services'; @Component({ selector: 'app-cms-post-detail', templateUrl: './cms-post-detail.component.html', styleUrls: ['./cms-post-detail.component.scss'], }) -export class CMSPostDetailComponent implements OnInit { +export class CMSPostDetailComponent implements OnInit, AfterViewInit { AppRoutes = AppRoutes; post: CMSContent; @@ -40,8 +40,7 @@ export class CMSPostDetailComponent implements OnInit { private _elasticSearchService: ElasticsearchService, private _seoService: SeoSErvice, private _toolsService: ToolsService, - private _titleService: Title, - private _meta: Meta, + private _tacService: TarteAuCitronService, ) { } @@ -84,6 +83,11 @@ export class CMSPostDetailComponent implements OnInit { } } + ngAfterViewInit() + { + this._tacService.initEvents(); + } + setBackupImage(metadata: Metadata) { diff --git a/src/app/editorialisation/models/cms-content.model.ts b/src/app/editorialisation/models/cms-content.model.ts index 9d7a45d9..9bf47025 100644 --- a/src/app/editorialisation/models/cms-content.model.ts +++ b/src/app/editorialisation/models/cms-content.model.ts @@ -1,4 +1,3 @@ - export interface IESCMSResponse { 'content-fr': IGhostContentResponse; type: string; @@ -111,7 +110,8 @@ export class GhostContentResponse { og_description?: string; og_image?: string; - constructor(data: IGhostContentResponse) { + constructor(data: IGhostContentResponse) + { this.id = data.id; this.status = (data.status != null) ? data.status : ''; this.title = (data.title != null) ? data.title : ''; @@ -143,9 +143,44 @@ export class GhostContentResponse { }); + this.html = this.youtubeParser(this.html); + this.author = (data.primary_author) ? data.primary_author : null; this.highlight = []; } + + private youtubeParser (content:string): string { + // recherche de youtube + if (content.search('iframe') > 0) { + console.log(content); + var parser = new DOMParser(); + var htmlContent = parser.parseFromString(content, 'text/html'); + + var iframes = htmlContent.getElementsByTagName('iframe'); + + for (var i = 0 ; i < iframes.length ; i++) { + let src = iframes[i].getAttribute('src'); + var link = src.match(new RegExp(/(http(s)?:\/\/)?((w){3}.)?youtu(be|.be)?(\.com)?\/.+/mgi)); + + if (link.length > 0) { + // on récupère la derniere portion + var vid: string[]|string = link[0].match(new RegExp(/embed\/[a-zA-Z0-9]*/mgi) ); + vid = vid[0].slice(6); + + var youtubeDiv = document.createElement('div'); + youtubeDiv.setAttribute('class','youtube_player'); + youtubeDiv.setAttribute('videoID', vid); + youtubeDiv.setAttribute('width', '100%'); + youtubeDiv.setAttribute('height','300px'); + + + iframes[i].parentNode.replaceChild(youtubeDiv,iframes[i]); + } + } + content = htmlContent.getElementsByTagName('body')[0].innerHTML; + } + return content; + } } export interface ICMSMedia { diff --git a/src/scss/ghost-style.scss b/src/scss/ghost-style.scss index 6d1855fd..6e7f079b 100644 --- a/src/scss/ghost-style.scss +++ b/src/scss/ghost-style.scss @@ -69,6 +69,10 @@ height: 300px; } + .youtube_player iframe { + height: 300px; + } + iframe:not([width]) { width: 100%; } -- GitLab