Skip to content

Commit 3811623

Browse files
committedJan 18, 2021
Refactor to improve bundle size
1 parent 8c63801 commit 3811623

File tree

1 file changed

+67
-93
lines changed

1 file changed

+67
-93
lines changed
 

‎index.js

+67-93
Original file line numberDiff line numberDiff line change
@@ -4,44 +4,20 @@ var repeat = require('repeat-string')
44

55
module.exports = markdownTable
66

7-
var trailingWhitespace = / +$/
8-
9-
// Characters.
10-
var space = ' '
11-
var lineFeed = '\n'
12-
var dash = '-'
13-
var colon = ':'
14-
var verticalBar = '|'
15-
16-
var x = 0
17-
var C = 67
18-
var L = 76
19-
var R = 82
20-
var c = 99
21-
var l = 108
22-
var r = 114
23-
247
// Create a table from a matrix of strings.
258
function markdownTable(table, options) {
269
var settings = options || {}
27-
var padding = settings.padding !== false
28-
var start = settings.delimiterStart !== false
29-
var end = settings.delimiterEnd !== false
3010
var align = (settings.align || []).concat()
31-
var alignDelimiters = settings.alignDelimiters !== false
32-
var alignments = []
3311
var stringLength = settings.stringLength || defaultStringLength
12+
var alignments = []
3413
var rowIndex = -1
35-
var rowLength = table.length
3614
var cellMatrix = []
3715
var sizeMatrix = []
38-
var row = []
39-
var sizes = []
4016
var longestCellByColumn = []
4117
var mostCellsPerRow = 0
42-
var cells
4318
var columnIndex
44-
var columnLength
19+
var row
20+
var sizes
4521
var largest
4622
var size
4723
var cell
@@ -53,21 +29,19 @@ function markdownTable(table, options) {
5329

5430
// This is a superfluous loop if we don’t align delimiters, but otherwise we’d
5531
// do superfluous work when aligning, so optimize for aligning.
56-
while (++rowIndex < rowLength) {
57-
cells = table[rowIndex]
32+
while (++rowIndex < table.length) {
5833
columnIndex = -1
59-
columnLength = cells.length
6034
row = []
6135
sizes = []
6236

63-
if (columnLength > mostCellsPerRow) {
64-
mostCellsPerRow = columnLength
37+
if (table[rowIndex].length > mostCellsPerRow) {
38+
mostCellsPerRow = table[rowIndex].length
6539
}
6640

67-
while (++columnIndex < columnLength) {
68-
cell = serialize(cells[columnIndex])
41+
while (++columnIndex < table[rowIndex].length) {
42+
cell = serialize(table[rowIndex][columnIndex])
6943

70-
if (alignDelimiters === true) {
44+
if (settings.alignDelimiters !== false) {
7145
size = stringLength(cell)
7246
sizes[columnIndex] = size
7347

@@ -87,51 +61,50 @@ function markdownTable(table, options) {
8761

8862
// Figure out which alignments to use.
8963
columnIndex = -1
90-
columnLength = mostCellsPerRow
9164

9265
if (typeof align === 'object' && 'length' in align) {
93-
while (++columnIndex < columnLength) {
66+
while (++columnIndex < mostCellsPerRow) {
9467
alignments[columnIndex] = toAlignment(align[columnIndex])
9568
}
9669
} else {
9770
code = toAlignment(align)
9871

99-
while (++columnIndex < columnLength) {
72+
while (++columnIndex < mostCellsPerRow) {
10073
alignments[columnIndex] = code
10174
}
10275
}
10376

10477
// Inject the alignment row.
10578
columnIndex = -1
106-
columnLength = mostCellsPerRow
10779
row = []
10880
sizes = []
10981

110-
while (++columnIndex < columnLength) {
82+
while (++columnIndex < mostCellsPerRow) {
11183
code = alignments[columnIndex]
11284
before = ''
11385
after = ''
11486

115-
if (code === l) {
116-
before = colon
117-
} else if (code === r) {
118-
after = colon
119-
} else if (code === c) {
120-
before = colon
121-
after = colon
87+
if (code === 99 /* `c` */) {
88+
before = ':'
89+
after = ':'
90+
} else if (code === 108 /* `l` */) {
91+
before = ':'
92+
} else if (code === 114 /* `r` */) {
93+
after = ':'
12294
}
12395

12496
// There *must* be at least one hyphen-minus in each alignment cell.
125-
size = alignDelimiters
126-
? Math.max(
127-
1,
128-
longestCellByColumn[columnIndex] - before.length - after.length
129-
)
130-
: 1
97+
size =
98+
settings.alignDelimiters === false
99+
? 1
100+
: Math.max(
101+
1,
102+
longestCellByColumn[columnIndex] - before.length - after.length
103+
)
131104

132-
cell = before + repeat(dash, size) + after
105+
cell = before + repeat('-', size) + after
133106

134-
if (alignDelimiters === true) {
107+
if (settings.alignDelimiters !== false) {
135108
size = before.length + size + after.length
136109

137110
if (size > longestCellByColumn[columnIndex]) {
@@ -149,83 +122,84 @@ function markdownTable(table, options) {
149122
sizeMatrix.splice(1, 0, sizes)
150123

151124
rowIndex = -1
152-
rowLength = cellMatrix.length
153125
lines = []
154126

155-
while (++rowIndex < rowLength) {
127+
while (++rowIndex < cellMatrix.length) {
156128
row = cellMatrix[rowIndex]
157129
sizes = sizeMatrix[rowIndex]
158130
columnIndex = -1
159-
columnLength = mostCellsPerRow
160131
line = []
161132

162-
while (++columnIndex < columnLength) {
133+
while (++columnIndex < mostCellsPerRow) {
163134
cell = row[columnIndex] || ''
164135
before = ''
165136
after = ''
166137

167-
if (alignDelimiters === true) {
138+
if (settings.alignDelimiters !== false) {
168139
size = longestCellByColumn[columnIndex] - (sizes[columnIndex] || 0)
169140
code = alignments[columnIndex]
170141

171-
if (code === r) {
172-
before = repeat(space, size)
173-
} else if (code === c) {
174-
if (size % 2 === 0) {
175-
before = repeat(space, size / 2)
176-
after = before
142+
if (code === 114 /* `r` */) {
143+
before = repeat(' ', size)
144+
} else if (code === 99 /* `c` */) {
145+
if (size % 2) {
146+
before = repeat(' ', size / 2 + 0.5)
147+
after = repeat(' ', size / 2 - 0.5)
177148
} else {
178-
before = repeat(space, size / 2 + 0.5)
179-
after = repeat(space, size / 2 - 0.5)
149+
before = repeat(' ', size / 2)
150+
after = before
180151
}
181152
} else {
182-
after = repeat(space, size)
153+
after = repeat(' ', size)
183154
}
184155
}
185156

186-
if (start === true && columnIndex === 0) {
187-
line.push(verticalBar)
157+
if (settings.delimiterStart !== false && !columnIndex) {
158+
line.push('|')
188159
}
189160

190161
if (
191-
padding === true &&
162+
settings.padding !== false &&
192163
// Don’t add the opening space if we’re not aligning and the cell is
193164
// empty: there will be a closing space.
194-
!(alignDelimiters === false && cell === '') &&
195-
(start === true || columnIndex !== 0)
165+
!(settings.alignDelimiters === false && cell === '') &&
166+
(settings.delimiterStart !== false || columnIndex)
196167
) {
197-
line.push(space)
168+
line.push(' ')
198169
}
199170

200-
if (alignDelimiters === true) {
171+
if (settings.alignDelimiters !== false) {
201172
line.push(before)
202173
}
203174

204175
line.push(cell)
205176

206-
if (alignDelimiters === true) {
177+
if (settings.alignDelimiters !== false) {
207178
line.push(after)
208179
}
209180

210-
if (padding === true) {
211-
line.push(space)
181+
if (settings.padding !== false) {
182+
line.push(' ')
212183
}
213184

214-
if (end === true || columnIndex !== columnLength - 1) {
215-
line.push(verticalBar)
185+
if (
186+
settings.delimiterEnd !== false ||
187+
columnIndex !== mostCellsPerRow - 1
188+
) {
189+
line.push('|')
216190
}
217191
}
218192

219193
line = line.join('')
220194

221-
if (end === false) {
222-
line = line.replace(trailingWhitespace, '')
195+
if (settings.delimiterEnd === false) {
196+
line = line.replace(/ +$/, '')
223197
}
224198

225199
lines.push(line)
226200
}
227201

228-
return lines.join(lineFeed)
202+
return lines.join('\n')
229203
}
230204

231205
function serialize(value) {
@@ -237,13 +211,13 @@ function defaultStringLength(value) {
237211
}
238212

239213
function toAlignment(value) {
240-
var code = typeof value === 'string' ? value.charCodeAt(0) : x
241-
242-
return code === L || code === l
243-
? l
244-
: code === R || code === r
245-
? r
246-
: code === C || code === c
247-
? c
248-
: x
214+
var code = typeof value === 'string' ? value.charCodeAt(0) : 0
215+
216+
return code === 67 /* `C` */ || code === 99 /* `c` */
217+
? 99 /* `c` */
218+
: code === 76 /* `L` */ || code === 108 /* `l` */
219+
? 108 /* `l` */
220+
: code === 82 /* `R` */ || code === 114 /* `r` */
221+
? 114 /* `r` */
222+
: 0
249223
}

0 commit comments

Comments
 (0)
Please sign in to comment.