| /** |
| * @license |
| * Copyright 2022 Google LLC |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| import 'ba-linkify/ba-linkify'; |
| import {CommentLinks} from '../types/common'; |
| import {getBaseUrl} from './url-util'; |
| |
| export function linkifyNormalUrls(base: string): string { |
| // Some tools are known to look for reviewers/CCs by finding lines such as |
| // "R=foo@gmail.com, bar@gmail.com". However, "=" is technically a valid email |
| // character, so ba-linkify interprets the entire string "R=foo@gmail.com" as |
| // an email address. To fix this, we insert a zero width space character |
| // \u200B before linking that prevents ba-linkify from associating the prefix |
| // with the email. After linking we remove the zero width space. |
| const baseWithZeroWidthSpace = base.replace(/^(R=|CC=)/g, '$&\u200B'); |
| const parts: string[] = []; |
| window.linkify(baseWithZeroWidthSpace, { |
| callback: (text, href) => { |
| const result = href ? createLinkTemplate(href, text) : text; |
| const resultWithoutZeroWidthSpace = result.replace(/\u200B/g, ''); |
| parts.push(resultWithoutZeroWidthSpace); |
| }, |
| }); |
| return parts.join(''); |
| } |
| |
| export function applyLinkRewritesFromConfig( |
| base: string, |
| repoCommentLinks: CommentLinks |
| ) { |
| const linkRewritesFromConfig = Object.values(repoCommentLinks).filter( |
| commentLinkInfo => commentLinkInfo.enabled !== false && commentLinkInfo.link |
| ); |
| const rewrites = linkRewritesFromConfig.map(rewrite => { |
| const replacementHref = rewrite.link!.startsWith('/') |
| ? `${getBaseUrl()}${rewrite.link!}` |
| : rewrite.link!; |
| return { |
| match: new RegExp(rewrite.match, 'g'), |
| replace: createLinkTemplate( |
| replacementHref, |
| rewrite.text ?? '$&', |
| rewrite.prefix, |
| rewrite.suffix |
| ), |
| }; |
| }); |
| return applyRewrites(base, rewrites); |
| } |
| |
| export function applyHtmlRewritesFromConfig( |
| base: string, |
| repoCommentLinks: CommentLinks |
| ) { |
| const htmlRewritesFromConfig = Object.values(repoCommentLinks).filter( |
| commentLinkInfo => commentLinkInfo.enabled !== false && commentLinkInfo.html |
| ); |
| const rewrites = htmlRewritesFromConfig.map(rewrite => { |
| return { |
| match: new RegExp(rewrite.match, 'g'), |
| replace: rewrite.html!, |
| }; |
| }); |
| return applyRewrites(base, rewrites); |
| } |
| |
| function applyRewrites( |
| base: string, |
| rewrites: {match: RegExp | string; replace: string}[] |
| ) { |
| return rewrites.reduce( |
| (text, rewrite) => text.replace(rewrite.match, rewrite.replace), |
| base |
| ); |
| } |
| |
| function createLinkTemplate( |
| href: string, |
| displayText: string, |
| prefix?: string, |
| suffix?: string |
| ) { |
| return `${ |
| prefix ?? '' |
| }<a href="${href}" rel="noopener" target="_blank">${displayText}</a>${ |
| suffix ?? '' |
| }`; |
| } |