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;
							 |