You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					48 lines
				
				923 B
			
		
		
			
		
	
	
					48 lines
				
				923 B
			| 
											3 years ago
										 | 'use strict'; | ||
|  | const stripAnsi = require('strip-ansi'); | ||
|  | const isFullwidthCodePoint = require('is-fullwidth-code-point'); | ||
|  | const emojiRegex = require('emoji-regex'); | ||
|  | 
 | ||
|  | const stringWidth = string => { | ||
|  | 	if (typeof string !== 'string' || string.length === 0) { | ||
|  | 		return 0; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	string = stripAnsi(string); | ||
|  | 
 | ||
|  | 	if (string.length === 0) { | ||
|  | 		return 0; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	string = string.replace(emojiRegex(), '  '); | ||
|  | 
 | ||
|  | 	let width = 0; | ||
|  | 
 | ||
|  | 	for (let i = 0; i < string.length; i++) { | ||
|  | 		const code = string.codePointAt(i); | ||
|  | 
 | ||
|  | 		// Ignore control characters
 | ||
|  | 		if (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) { | ||
|  | 			continue; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// Ignore combining characters
 | ||
|  | 		if (code >= 0x300 && code <= 0x36F) { | ||
|  | 			continue; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// Surrogates
 | ||
|  | 		if (code > 0xFFFF) { | ||
|  | 			i++; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		width += isFullwidthCodePoint(code) ? 2 : 1; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return width; | ||
|  | }; | ||
|  | 
 | ||
|  | module.exports = stringWidth; | ||
|  | // TODO: remove this in the next major version
 | ||
|  | module.exports.default = stringWidth; |