Handle line feeds in comments
authorChocobozzz <me@florianbigard.com>
Tue, 20 Feb 2018 09:41:11 +0000 (10:41 +0100)
committerChocobozzz <me@florianbigard.com>
Tue, 20 Feb 2018 09:41:11 +0000 (10:41 +0100)
client/src/app/shared/misc/utils.ts
client/src/app/videos/+video-watch/comment/video-comment.component.ts
client/src/app/videos/+video-watch/comment/video-comment.service.ts
server/middlewares/validators/video-comments.ts

index e2e4c5b36bb3ea2ccb591c7c7fa8b5d036e6d9f1..64bc69b0daf95a923c874017f7568e504bc695ab 100644 (file)
@@ -88,6 +88,12 @@ function objectToFormData (obj: any, form?: FormData, namespace?: string) {
   return fd
 }
 
+function lineFeedToHtml (obj: object, keyToNormalize: string) {
+  return immutableAssign(obj, {
+    [keyToNormalize]: obj[keyToNormalize].replace(/\r?\n|\r/g, '<br />')
+  })
+}
+
 export {
   viewportHeight,
   getParameterByName,
@@ -97,5 +103,6 @@ export {
   isInSmallView,
   isInMobileView,
   immutableAssign,
-  objectToFormData
+  objectToFormData,
+  lineFeedToHtml
 }
index 7c664ca603c1770bd18d8d2c0e0365ec21633f8b..9176de80f4a2e1e520001fbfb29c68388deeaa2f 100644 (file)
@@ -90,7 +90,7 @@ export class VideoCommentComponent implements OnInit, OnChanges {
 
   private init () {
     this.sanitizedCommentHTML = sanitizeHtml(this.comment.text, {
-      allowedTags: [ 'p', 'span' ]
+      allowedTags: [ 'p', 'span', 'br' ]
     })
 
     this.newParentComments = this.parentComments.concat([ this.comment ])
index c42f554966bd5780f925207f6eafe73c8015fd92..14d32b1aa6f1732e2e17a59230d385c1aab8800c 100644 (file)
@@ -2,6 +2,7 @@ import { HttpClient, HttpParams } from '@angular/common/http'
 import { Injectable } from '@angular/core'
 import 'rxjs/add/operator/catch'
 import 'rxjs/add/operator/map'
+import { immutableAssign, lineFeedToHtml } from '@app/shared/misc/utils'
 import { Observable } from 'rxjs/Observable'
 import { ResultList } from '../../../../../../shared/models'
 import {
@@ -26,16 +27,18 @@ export class VideoCommentService {
 
   addCommentThread (videoId: number | string, comment: VideoCommentCreate) {
     const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comment-threads'
+    const normalizedComment = lineFeedToHtml(comment, 'text')
 
-    return this.authHttp.post(url, comment)
+    return this.authHttp.post(url, normalizedComment)
       .map(data => this.extractVideoComment(data['comment']))
       .catch(this.restExtractor.handleError)
   }
 
   addCommentReply (videoId: number | string, inReplyToCommentId: number, comment: VideoCommentCreate) {
     const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comments/' + inReplyToCommentId
+    const normalizedComment = lineFeedToHtml(comment, 'text')
 
-    return this.authHttp.post(url, comment)
+    return this.authHttp.post(url, normalizedComment)
       .map(data => this.extractVideoComment(data['comment']))
       .catch(this.restExtractor.handleError)
   }
index 63804da30ac49746a43f943976dffb4a187a3d07..227bc1fca8f5bd798aeb2818e43f0e671680995a 100644 (file)
@@ -43,7 +43,7 @@ const addVideoCommentThreadValidator = [
   body('text').custom(isValidVideoCommentText).not().isEmpty().withMessage('Should have a valid comment text'),
 
   async (req: express.Request, res: express.Response, next: express.NextFunction) => {
-    logger.debug('Checking addVideoCommentThread parameters.', { parameters: req.params })
+    logger.debug('Checking addVideoCommentThread parameters.', { parameters: req.params, body: req.body })
 
     if (areValidationErrors(req, res)) return
     if (!await isVideoExist(req.params.videoId, res)) return
@@ -59,7 +59,7 @@ const addVideoCommentReplyValidator = [
   body('text').custom(isValidVideoCommentText).not().isEmpty().withMessage('Should have a valid comment text'),
 
   async (req: express.Request, res: express.Response, next: express.NextFunction) => {
-    logger.debug('Checking addVideoCommentReply parameters.', { parameters: req.params })
+    logger.debug('Checking addVideoCommentReply parameters.', { parameters: req.params, body: req.body })
 
     if (areValidationErrors(req, res)) return
     if (!await isVideoExist(req.params.videoId, res)) return