-
Notifications
You must be signed in to change notification settings - Fork 64
/
transform.ts
93 lines (87 loc) · 2.36 KB
/
transform.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import {
DesiredValues,
Options,
TransformationOption,
ListingProps,
} from "./types";
function applyOption<desiredValueType extends DesiredValues>(
string: string,
props: Partial<ListingProps> & { string: string },
option: TransformationOption<desiredValueType>
): desiredValueType {
// conditional
if (typeof option === "function") {
return option(string, props);
}
// all
else {
return option;
}
}
export function transform(
input: Partial<ListingProps> & { string: string },
options?: Partial<Options>
): string {
let protocol = "";
let truncation = Infinity;
let attributes: { [key: string]: string | undefined | true } = {};
let truncateFromTheMiddle = false;
// special transformation
if (options && options.specialTransform) {
for (let index = 0; index < options.specialTransform.length; index++) {
const transformer = options.specialTransform[index];
if (transformer.test.test(input.string)) {
return transformer.transform(input.string, input);
}
}
}
// exclude
if (options && options.exclude) {
if (applyOption(input.string, input, options.exclude))
return input.string;
}
// protocol
if (options && options.protocol) {
protocol = applyOption(input.string, input, options.protocol);
}
if (input.protocol) {
protocol = "";
} else if (!protocol) {
protocol = input.isEmail
? "mailto:"
: input.isFile
? "file:///"
: "http://";
}
// truncation
if (options && options.truncate) {
truncation = applyOption(input.string, input, options.truncate);
}
if (options && options.middleTruncation) {
truncateFromTheMiddle = applyOption(
input.string,
input,
options.middleTruncation
);
}
// attributes
if (options && options.attributes) {
attributes = applyOption(input.string, input, options.attributes);
}
return `<a ${Object.keys(attributes)
.map((key) =>
attributes[key] === true ? key : `${key}="${attributes[key]}" `
)
.join(" ")}href="${protocol}${input.string}">${
input.string.length > truncation
? truncateFromTheMiddle
? input.string.substring(0, Math.floor(truncation / 2)) +
"…" +
input.string.substring(
input.string.length - Math.ceil(truncation / 2),
input.string.length
)
: input.string.substring(0, truncation) + "…"
: input.string
}</a>`;
}