forked from facebook/react-native-website
-
Notifications
You must be signed in to change notification settings - Fork 328
/
utils.js
95 lines (87 loc) · 2.45 KB
/
utils.js
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
94
95
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
'use strict';
const he = require('he');
const magic = require('./magic');
// Adds multiple platform tags for prop name
function formatMultiplePlatform(platforms) {
let platformString = '';
platforms.forEach(platform => {
switch (platform.trim().toLowerCase()) {
case 'ios':
platformString += '<div class="label ios">' + 'iOS' + '</div> ';
break;
case 'android':
platformString += '<div class="label android">' + 'Android' + '</div>';
break;
case 'tv':
platformString += '<div class="label tv">' + 'TV' + '</div>';
break;
//TODO: Add a new CSS class for VR
case 'vr':
platformString += '<div class="label tv">' + 'VR' + '</div>';
}
});
return platformString;
}
// Wraps a string in an inline code block in a way that is safe to include in a
// table cell, by wrapping it as HTML <code> if necessary.
function stringToInlineCodeForTable(str) {
let useHtml = /[`|]/.test(str);
str = str.replace(/\n/g, ' ');
if (useHtml) {
return '<code>' + he.encode(str).replace(/\|/g, '|') + '</code>';
}
return '`' + str + '`';
}
function maybeLinkifyType(flowType) {
let url, text;
flowType.elements?.forEach(elem => {
if (Object.hasOwnProperty.call(magic.linkableTypeAliases, elem.name)) {
({url, text} = magic.linkableTypeAliases[elem.name]);
}
});
if (!text) {
text = stringToInlineCodeForTable(
flowType.raw || formatType(flowType.name)
);
}
if (url) {
return `[${text}](${url})`;
}
return text;
}
function formatType(name) {
if (name.toLowerCase() === 'boolean') return 'bool';
if (name.toLowerCase() === 'stringish') return 'string';
if (name === '$ReadOnlyArray') return 'array';
return name;
}
function maybeLinkifyTypeName(name) {
let url, text;
if (Object.hasOwnProperty.call(magic.linkableTypeAliases, name)) {
({url, text} = magic.linkableTypeAliases[name]);
}
if (!text) {
text = stringToInlineCodeForTable(name);
}
if (url) {
return `[${text}](${url})`;
}
return text;
}
function titleToId(title) {
return title.toLowerCase().replace(/[^a-z]+/g, '-');
}
module.exports = {
formatMultiplePlatform,
stringToInlineCodeForTable,
maybeLinkifyType,
maybeLinkifyTypeName,
formatType,
titleToId,
};