Add HTML
module for rendering messages
This commit is contained in:
parent
7d4ef9315b
commit
144cb58a47
2 changed files with 108 additions and 0 deletions
12
ts/html/index.ts
Normal file
12
ts/html/index.ts
Normal file
|
@ -0,0 +1,12 @@
|
|||
import linkTextInternal from 'link-text';
|
||||
|
||||
|
||||
export const linkText = (value: string): string =>
|
||||
linkTextInternal(value, { target: '_blank' });
|
||||
|
||||
export const replaceLineBreaks = (value: string): string =>
|
||||
value.replace(/\r?\n/g, '<br>');
|
||||
|
||||
// NOTE: How can we use `lodash/fp` `compose` with type checking?
|
||||
export const render = (value: string): string =>
|
||||
replaceLineBreaks(linkText(value));
|
96
ts/test-unit/html/index_test.ts
Normal file
96
ts/test-unit/html/index_test.ts
Normal file
|
@ -0,0 +1,96 @@
|
|||
import 'mocha';
|
||||
import { assert } from 'chai';
|
||||
|
||||
import * as HTML from '../../html';
|
||||
|
||||
interface Test {
|
||||
input: string;
|
||||
name: string;
|
||||
output?: string;
|
||||
outputHref?: string;
|
||||
outputLabel?: string;
|
||||
postText?: string;
|
||||
preText?: string;
|
||||
skipped?: boolean;
|
||||
}
|
||||
|
||||
describe('HTML', () => {
|
||||
describe('linkText', () => {
|
||||
const TESTS: Array<Test> = [
|
||||
{
|
||||
name: 'square brackets',
|
||||
input: 'https://www.example.com/test.html?foo=bar&baz[qux]=quux',
|
||||
output: 'https://www.example.com/test.html?foo=bar&baz[qux]=quux',
|
||||
},
|
||||
{
|
||||
name: 'Chinese characters',
|
||||
input: 'https://zh.wikipedia.org/zh-hans/信号',
|
||||
output: 'https://zh.wikipedia.org/zh-hans/信号',
|
||||
},
|
||||
{
|
||||
name: 'Cyrillic characters',
|
||||
input: 'https://ru.wikipedia.org/wiki/Сигнал',
|
||||
output: 'https://ru.wikipedia.org/wiki/Сигнал',
|
||||
},
|
||||
{
|
||||
skipped: true,
|
||||
name: 'trailing exclamation points',
|
||||
input: 'https://en.wikipedia.org/wiki/Mother!',
|
||||
output: 'https://en.wikipedia.org/wiki/Mother!',
|
||||
},
|
||||
{
|
||||
name: 'single quotes',
|
||||
input: "https://www.example.com/this-couldn't-be-true",
|
||||
output: "https://www.example.com/this-couldn#39;t-be-true",
|
||||
},
|
||||
{
|
||||
name: 'special characters before URL begins',
|
||||
preText: 'wink ;)',
|
||||
input: 'https://www.youtube.com/watch?v=oHg5SJYRHA0',
|
||||
output: 'https://www.youtube.com/watch?v=oHg5SJYRHA0',
|
||||
},
|
||||
{
|
||||
name: 'URLs without protocols',
|
||||
input: 'github.com',
|
||||
outputHref: 'http://github.com',
|
||||
outputLabel: 'github.com',
|
||||
},
|
||||
];
|
||||
|
||||
TESTS.forEach((test) => {
|
||||
(test.skipped ? it.skip : it)(`should handle ${test.name}`, () => {
|
||||
const preText = test.preText || 'Hello ';
|
||||
const postText = test.postText || ' World!';
|
||||
const input: string = `${preText}${test.input}${postText}`;
|
||||
const expected: string = [
|
||||
preText,
|
||||
`<a href="${test.outputHref || test.output}" target="_blank">`,
|
||||
test.outputLabel || test.output,
|
||||
'</a>',
|
||||
postText,
|
||||
].join('');
|
||||
|
||||
const actual = HTML.linkText(input);
|
||||
assert.equal(actual, expected);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('render', () => {
|
||||
it('should preserve line breaks', () => {
|
||||
const input: string = 'Hello\n\n\nWorld!';
|
||||
const expected: string = 'Hello<br><br><br>World!';
|
||||
|
||||
const actual = HTML.render(input);
|
||||
assert.equal(actual, expected);
|
||||
});
|
||||
|
||||
it('should escape HTML', () => {
|
||||
const input: string = "Hello\n<script>alert('evil');</script>World!";
|
||||
const expected: string = 'Hello<br><script>alert('evil');</script>World!';
|
||||
|
||||
const actual = HTML.render(input);
|
||||
assert.equal(actual, expected);
|
||||
});
|
||||
});
|
||||
});
|
Loading…
Add table
Reference in a new issue