Package Exports
- string-kit
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (string-kit) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
String Kit
A string manipulation toolbox, featuring a string formater (inspired by printf), a variable inspector (output featuring ANSI color and HTML) and various escape function (shell argument, regexp, html, etc).
- License: MIT
- Current status: beta
- Platform: Node.js only (browser support is planned)
Install
Use Node Package Manager:
npm install string-kit
Escape functions collection
.escape.shellArg( str )
- str
String
the string to filter
It escapes the string so that it will be suitable as a shell command's argument.
.escape.regExp( str ) , .escape.regExpPattern( str )
- str
String
the string to filter
It escapes the string so that it will be suitable to inject it in a regular expression's pattern as a literal string.
Example of a search and replace from a user's input:
var result = data.replace(
new RegExp( stringKit.escape.regExp( userInputSearch ) , 'g' ) ,
stringKit.escape.regExpReplacement( userInputReplace )
) ;
.escape.regExpReplacement( str )
- str
String
the string to filter
It escapes the string so that it will be suitable as a literal string for a regular expression's replacement.
.escape.html( str )
- str
String
the string to filter
It escapes the string so that it will be suitable as HTML content.
Only < > &
are replaced by HTML entities.
.escape.htmlAttr( str )
- str
String
the string to filter
It escapes the string so that it will be suitable as an HTML tag attribute's value.
Only < > & "
are replaced by HTML entities.
It assumes valid HTML: the attribute's value should be into double quote, not in single quote.
.escape.htmlSpecialChars( str )
- str
String
the string to filter
It escapes all HTML special characters, < > & " '
are replaced by HTML entities.
.escape.control( str )
- str
String
the string to filter
It escapes all ASCII control characters (code lesser than or equals to 0x1F, or backspace).
Carriage return, newline and tabulation are respectively replaced by \r
, \n
and \t
.
Other characters are replaced by the unicode notation, e.g. NUL
is replaced by \x00
.
Full BDD spec generated by Mocha:
TOC
format()
should perform basic examples.
expect( format( 'Hello world' ) ).to.be( 'Hello world' ) ;
expect( format( 'Hello %s' , 'world' ) ).to.be( 'Hello world' ) ;
expect( format( 'Hello %s %s, how are you?' , 'Joe' , 'Doe' ) ).to.be( 'Hello Joe Doe, how are you?' ) ;
expect( format( 'I have %i cookies.' , 3 ) ).to.be( 'I have 3 cookies.' ) ;
%u should format unsigned integer.
expect( format( '%u' , 123 ) ).to.be( '123' ) ;
expect( format( '%u' , 0 ) ).to.be( '0' ) ;
expect( format( '%u' , -123 ) ).to.be( '0' ) ;
expect( format( '%u' ) ).to.be( '0' ) ;
%U should format positive unsigned integer.
expect( format( '%U' , 123 ) ).to.be( '123' ) ;
expect( format( '%U' , 0 ) ).to.be( '1' ) ;
expect( format( '%U' , -123 ) ).to.be( '1' ) ;
expect( format( '%U' ) ).to.be( '1' ) ;
should perform well the argument's number feature.
expect( format( '%s%s%s' , 'A' , 'B' , 'C' ) ).to.be( 'ABC' ) ;
expect( format( '%+1s%-1s%s' , 'A' , 'B' , 'C' ) ).to.be( 'BAC' ) ;
expect( format( '%3s%s' , 'A' , 'B' , 'C' ) ).to.be( 'CBC' ) ;
format.count() should count the number of arguments found.
expect( format.count( 'blah blih blah' ) ).to.be( 0 ) ;
expect( format.count( '%i %s' ) ).to.be( 2 ) ;
when using a filter object as the this context, the %[functionName] format should use a custom function to format the input.
var filters = {
fixed: function() { return 'F' ; } ,
double: function( str ) { return '' + str + str ; } ,
fxy: function( a , b ) { return '' + ( a * a + b ) ; }
} ;
expect( format.call( filters , '%[fixed]%s%s%s' , 'A' , 'B' , 'C' ) ).to.be( 'FABC' ) ;
expect( format.call( filters , '%s%[fxy:%a%a]' , 'f(x,y)=' , 5 , 3 ) ).to.be( 'f(x,y)=28' ) ;
expect( format.call( filters , '%s%[fxy:%+1a%-1a]' , 'f(x,y)=' , 5 , 3 ) ).to.be( 'f(x,y)=14' ) ;
Escape collection
escape.control() should escape control characters.
expect( string.escape.control( 'Hello\n\t... world!' ) ).to.be( 'Hello\\n\\t... world!' ) ;
expect( string.escape.control( 'Hello\\n\\t... world!' ) ).to.be( 'Hello\\n\\t... world!' ) ;
expect( string.escape.control( 'Hello\\\n\\\t... world!' ) ).to.be( 'Hello\\\\n\\\\t... world!' ) ;
expect( string.escape.control( 'Hello\\\\n\\\\t... world!' ) ).to.be( 'Hello\\\\n\\\\t... world!' ) ;
expect( string.escape.control( 'Nasty\x00chars\x1bhere\x7f!' ) ).to.be( 'Nasty\\x00chars\\x1bhere\\x7f!' ) ;
escape.shellArg() should escape a string so that it will be suitable as a shell command's argument.
//console.log( 'Shell arg:' , string.escape.shellArg( "Here's my shell's argument" ) ) ;
expect( string.escape.shellArg( "Here's my shell's argument" ) ).to.be( "'Here'\\''s my shell'\\''s argument'" ) ;
escape.regExp() should escape a string so that it will be suitable as a literal string into a regular expression pattern.
//console.log( 'String in RegExp:' , string.escape.regExp( "(This) {is} [my] ^$tring^... +doesn't+ *it*? |yes| \\no\\ /maybe/" ) ) ;
expect( string.escape.regExp( "(This) {is} [my] ^$tring^... +doesn't+ *it*? |yes| \\no\\ /maybe/" ) )
.to.be( "\\(This\\) \\{is\\} \\[my\\] \\^\\$tring\\^\\.\\.\\. \\+doesn't\\+ \\*it\\*\\? \\|yes\\| \\\\no\\\\ \\/maybe\\/" ) ;
escape.regExpReplacement() should escape a string so that it will be suitable as a literal string into a regular expression replacement.
expect( string.escape.regExpReplacement( "$he love$ dollar$ $$$" ) ).to.be( "$$he love$$ dollar$$ $$$$$$" ) ;
expect(
'$he love$ dollar$ $$$'.replace(
new RegExp( string.escape.regExp( '$' ) , 'g' ) ,
string.escape.regExpReplacement( '$1' )
)
).to.be( "$1he love$1 dollar$1 $1$1$1" ) ;
escape.html() should escape a string so that it will be suitable as HTML content.
//console.log( string.escape.html( "<This> isn't \"R&D\"" ) ) ;
expect( string.escape.html( "<This> isn't \"R&D\"" ) ).to.be( "<This> isn't \"R&D\"" ) ;
escape.htmlAttr() should escape a string so that it will be suitable as an HTML tag attribute's value.
//console.log( string.escape.htmlAttr( "<This> isn't \"R&D\"" ) ) ;
expect( string.escape.htmlAttr( "<This> isn't \"R&D\"" ) ).to.be( "<This> isn't "R&D"" ) ;
escape.htmlSpecialChars() should escape all HTML special characters.
//console.log( string.escape.htmlSpecialChars( "<This> isn't \"R&D\"" ) ) ;
expect( string.escape.htmlSpecialChars( "<This> isn't \"R&D\"" ) ).to.be( "<This> isn't "R&D"" ) ;
inspect()
should inspect a variable with default options accordingly.
var MyClass = function MyClass() {
this.variable = 1 ;
} ;
MyClass.prototype.report = function report() { console.log( 'Variable value:' , this.variable ) ; } ;
MyClass.staticFunc = function staticFunc() { console.log( 'Static function.' ) ; } ;
var sparseArray = [] ;
sparseArray[ 3 ] = 'three' ;
sparseArray[ 10 ] = 'ten' ;
sparseArray[ 20 ] = 'twenty' ;
sparseArray.customProperty = 'customProperty' ;
var object = {
a: 'A' ,
b: 2 ,
str: 'Woot\nWoot\rWoot\tWoot' ,
sub: {
u: undefined ,
n: null ,
t: true ,
f: false
} ,
emptyString: '' ,
emptyObject: {} ,
list: [ 'one','two','three' ] ,
emptyList: [] ,
sparseArray: sparseArray ,
hello: function hello() { console.log( 'Hello!' ) ; } ,
anonymous: function() { console.log( 'anonymous...' ) ; } ,
class: MyClass ,
instance: new MyClass() ,
buf: new Buffer( 'This is a buffer!' )
} ;
object.sub.circular = object ;
Object.defineProperties( object , {
c: { value: '3' } ,
d: {
get: function() { throw new Error( 'Should not be called by the test' ) ; } ,
set: function( value ) {}
}
} ) ;
//console.log( '>>>>>' , string.escape.control( string.inspect( object ) ) ) ;
//console.log( string.inspect( { style: 'color' } , object ) ) ;
expect( string.inspect( object ) ).to.be( '<Object> <object> {\n a: "A" <string>(1)\n b: 2 <number>\n str: "Woot\\nWoot\\rWoot\\tWoot" <string>(19)\n sub: <Object> <object> {\n u: undefined\n n: null\n t: true\n f: false\n circular: <Object> <object> [circular]\n }\n emptyString: "" <string>(0)\n emptyObject: <Object> <object> {}\n list: <Array>(3) <object> {\n [0] "one" <string>(3)\n [1] "two" <string>(3)\n [2] "three" <string>(5)\n length: 3 <number> <-conf -enum>\n }\n emptyList: <Array>(0) <object> {\n length: 0 <number> <-conf -enum>\n }\n sparseArray: <Array>(21) <object> {\n [3] "three" <string>(5)\n [10] "ten" <string>(3)\n [20] "twenty" <string>(6)\n length: 21 <number> <-conf -enum>\n customProperty: "customProperty" <string>(14)\n }\n hello: <Function> hello(0) <function>\n anonymous: <Function> (anonymous)(0) <function>\n class: <Function> MyClass(0) <function>\n instance: <MyClass> <object> {\n variable: 1 <number>\n }\n buf: <Buffer 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 21> <Buffer>(17)\n c: "3" <string>(1) <-conf -enum -w>\n d: <getter/setter> {\n get: <Function> (anonymous)(0) <function>\n set: <Function> (anonymous)(1) <function>\n }\n}\n' ) ;