diff --git a/src/app/pipes/create-links.pipe.ts b/src/app/pipes/create-links.pipe.ts new file mode 100644 index 000000000..e031c9b0d --- /dev/null +++ b/src/app/pipes/create-links.pipe.ts @@ -0,0 +1,35 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Pipe, PipeTransform } from '@angular/core'; + +/** + * Pipe to search URLs that are not inside tags and add the corresponding tags. + */ +@Pipe({ + name: 'coreCreateLinks', +}) +export class CoreCreateLinksPipe implements PipeTransform { + protected static replacePattern = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])(?![^<]*>|[^<>]*<\/)/gim; + + /** + * Takes some text and adds anchor tags to all links that aren't inside anchors. + * + * @param text Text to treat. + * @return Treated text. + */ + transform(text: string): string { + return text.replace(CoreCreateLinksPipe.replacePattern, '$1'); + } +} diff --git a/src/app/pipes/no-tags.pipe.ts b/src/app/pipes/no-tags.pipe.ts new file mode 100644 index 000000000..c1da56431 --- /dev/null +++ b/src/app/pipes/no-tags.pipe.ts @@ -0,0 +1,34 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Pipe, PipeTransform } from '@angular/core'; + +/** + * Pipe to remove HTML tags. + */ +@Pipe({ + name: 'coreNoTags', +}) +export class CoreNoTagsPipe implements PipeTransform { + + /** + * Takes a text and removes HTML tags. + * + * @param text The text to treat. + * @return Treated text. + */ + transform(text: string): string { + return text.replace(/(<([^>]+)>)/ig, ''); + } +} diff --git a/src/app/pipes/pipes.module.ts b/src/app/pipes/pipes.module.ts new file mode 100644 index 000000000..053fec971 --- /dev/null +++ b/src/app/pipes/pipes.module.ts @@ -0,0 +1,33 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { NgModule } from '@angular/core'; +import { CoreCreateLinksPipe } from './create-links.pipe'; +import { CoreNoTagsPipe } from './no-tags.pipe'; +import { CoreTimeAgoPipe } from './time-ago.pipe'; + +@NgModule({ + declarations: [ + CoreCreateLinksPipe, + CoreNoTagsPipe, + CoreTimeAgoPipe, + ], + imports: [], + exports: [ + CoreCreateLinksPipe, + CoreNoTagsPipe, + CoreTimeAgoPipe, + ] +}) +export class CorePipesModule {} diff --git a/src/app/pipes/time-ago.pipe.ts b/src/app/pipes/time-ago.pipe.ts new file mode 100644 index 000000000..ad53c086a --- /dev/null +++ b/src/app/pipes/time-ago.pipe.ts @@ -0,0 +1,53 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Pipe, PipeTransform } from '@angular/core'; +import { Translate } from '@singletons/core.singletons'; +import { CoreLogger } from '@singletons/logger'; +import moment from 'moment'; + +/** + * Pipe to turn a UNIX timestamp to "time ago". + */ +@Pipe({ + name: 'coreTimeAgo', +}) +export class CoreTimeAgoPipe implements PipeTransform { + private logger: CoreLogger; + + constructor() { + this.logger = CoreLogger.getInstance('CoreTimeAgoPipe'); + } + + /** + * Turn a UNIX timestamp to "time ago". + * + * @param timestamp The UNIX timestamp (without milliseconds). + * @return Formatted time. + */ + transform(timestamp: string | number): string { + if (typeof timestamp == 'string') { + // Convert the value to a number. + const numberTimestamp = parseInt(timestamp, 10); + if (isNaN(numberTimestamp)) { + this.logger.error('Invalid value received', timestamp); + + return timestamp; + } + timestamp = numberTimestamp; + } + + return Translate.instance.instant('core.ago', {$a: moment(timestamp * 1000).fromNow(true)}); + } +}