# Stringz [![Build Status](https://travis-ci.org/sallar/stringz.svg?branch=master)](https://travis-ci.org/sallar/stringz) [![codecov](https://codecov.io/gh/sallar/stringz/branch/master/graph/badge.svg)](https://codecov.io/gh/sallar/stringz) [![npm](https://img.shields.io/npm/dm/stringz.svg)](https://www.npmjs.com/package/stringz) A really small, performant, unicode-aware library for working with Strings in Node.js. Javascript has a serious problem with unicode. Even ES6 canโ€™t solve the problem entirely since some characters like the new colored emojis are three bytes instead of two bytes. Sometimes even more! `"๐Ÿ‘๐Ÿฝ".length` returns `4` which is totally wrong (hint: it should be 1!). ES6's `Array.from` tried to solve this, but that even fails: `Array.from("๐Ÿ‘๐Ÿฝ")` returns `["๐Ÿ‘", "๐Ÿฝ"]` which is incorrect. This library tries to tackle all these problems with a mega RegExp. [Read More Here](https://mathiasbynens.be/notes/javascript-unicode). ## Features * Unicode-aware string manipulation tools * High performance ## Install ```bash $ npm install stringz --save ``` And import it in your awesome node app: ```javascript // ES2015+ import * as stringz from 'stringz'; // OR: import { limit, substring, length, substr } from 'stringz'; ``` ```javascript // CommonJS const stringz = require('stringz'); // OR: const { limit, substr } = require('stringz'); ``` ## Usage * [`limit()`](#limit-string-to-width) * [`length()`](#string-length) * [`substring()`](#substring) * [`substr()`](#substr) * [`indexOf()`](#indexof) * [`toArray()`](#toarray) ### Limit String to Width function limit(str[, limit[, padStr[, padPosition]]]) | Param | Type | Default | Description | | ----------- | ------------------- | -------------------- | --------------------------------------------------------- | | str | String | _none_ | The string to be limited | | limit | Number | 16 | Desired string length | | padStr | String | "#" | Character to pad the output with | | padPosition | String | "right" | Pad position: "right" or "left" | #### Examples ```javascript // Truncate: limit('Lifeโ€™s like a box of chocolates.', 20); // "Life's like a box of" // Pad: limit('Everybody loves emojis!', 26, '๐Ÿ’ฉ'); // "Everybody loves emojis!๐Ÿ’ฉ๐Ÿ’ฉ๐Ÿ’ฉ" limit('What are you looking at?', 30, '+', 'left'); // "++++++What are you looking at?" // Unicode Aware: limit('๐Ÿค”๐Ÿค”๐Ÿค”', 2); // "๐Ÿค”๐Ÿค”" limit('๐Ÿ‘๐Ÿฝ๐Ÿ‘๐Ÿฝ', 4, '๐Ÿ‘๐Ÿฝ'); // "๐Ÿ‘๐Ÿฝ๐Ÿ‘๐Ÿฝ๐Ÿ‘๐Ÿฝ๐Ÿ‘๐Ÿฝ" ``` ### String Length function length(str) | Param | Type | Default | Description | | ----- | ------------------- | ------- | ------------------------------- | | str | String | _none_ | String to return the length for | #### Examples ```javascript length('Iรฑtรซrnรขtiรดnร lizรฆtiรธnโ˜ƒ๐Ÿ’ฉ'); // 22 ``` ### Substring function substring(str, start[, end]) | Param | Type | Default | Description | | ----- | ------------------- | ------------- | -------------------- | | str | String | _none_ | String to be devided | | start | Number | _none_ | Start position | | end | Number | End of string | End position | #### Examples ```javascript substring('Emojis ๐Ÿ‘๐Ÿฝ are ๐Ÿ† poison. ๐ŸŒฎs are bad.', 7, 14); // "๐Ÿ‘๐Ÿฝ are ๐Ÿ†" ``` ### Substr function substr(str[, start[, length]]) | Param | Type | Default | Description | | ------ | ------------------- | ------------------------------------- | -------------------- | | str | String | _none_ | String to be devided | | start | Number | Start of string | Start position | | length | Number | String length minus `start` parameter | Length of result | #### Examples ```javascript substr('A.C. Milan ๐Ÿ‡ฎ๐Ÿ‡นโšฝ๏ธ', 5, 7); // "Milan ๐Ÿ‡ฎ๐Ÿ‡น" ``` ### IndexOf function indexOf(str[, searchStr[, position]]) | Param | Type | Default | Description | | --------- | ------------------- | ------- | --------------------- | | str | String | _none_ | String to get index | | searchStr | String | _none_ | String to be searched | | position | Number | 0 | Start of searching | #### Examples ```javascript indexOf('Emojis ๐Ÿ‘๐Ÿฝ are ๐Ÿ† poison. ๐ŸŒฎs are bad.', 'are'); // 9 indexOf('Emojis ๐Ÿ‘๐Ÿฝ are ๐Ÿ† poison. ๐ŸŒฎs are bad.', 'are', 10); // 26 ``` ### ToArray function toArray(str) | Param | Type | Default | Description | | ----- | ------------------- | ------- | -------------------------- | | str | String | _none_ | String to convert to array | #### Examples ```javascript toArray('๐Ÿ‘๐Ÿฝ๐Ÿ†๐ŸŒฎ'); // ['๐Ÿ‘๐Ÿฝ', '๐Ÿ†', '๐ŸŒฎ'] ``` ## Test ```bash $ npm test ``` ## Benchmark This library scores high in a length benchmark (it's intended usage) and should be fast for most use case. ``` Stringz .length (accurate) x 861,039 ops/sec ยฑ1.57% (84 runs sampled) Lodash .toArray (accurate) x 795,108 ops/sec ยฑ2.13% (82 runs sampled) Emoji Aware .split (inaccurate) x 2,269 ops/sec ยฑ1.38% (85 runs sampled) Spliddit .length (inaccurate) x 487,718 ops/sec ยฑ2.21% (83 runs sampled) UTF8 Length (inaccurate) x 232,918 ops/sec ยฑ1.02% (87 runs sampled) Fastest is Stringz .length ``` To run benchmarks yourself: ```bash $ cd ./benchmark $ npm install $ node run.js ``` ## Changelog [Moved to CHANGELOG.md](CHANGELOG.md) ## License This software is released under the [MIT License](http://sallar.mit-license.org/).