opal 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -1
  3. data/lib/opal/cli.rb +9 -1
  4. data/lib/opal/cli_options.rb +12 -3
  5. data/lib/opal/cli_runners/nodejs.rb +3 -2
  6. data/lib/opal/version.rb +1 -1
  7. data/opal/corelib/kernel.rb +7 -0
  8. data/opal/corelib/runtime.js +4 -0
  9. data/spec/lib/cli_spec.rb +16 -0
  10. data/stdlib/nodejs.rb +1 -2
  11. data/stdlib/nodejs/{process.rb → kernel.rb} +7 -4
  12. data/stdlib/nodejs/node_modules/.bin/js-yaml +140 -0
  13. data/stdlib/nodejs/node_modules/glob/LICENSE +15 -0
  14. data/stdlib/nodejs/node_modules/glob/README.md +357 -0
  15. data/stdlib/nodejs/node_modules/glob/common.js +177 -0
  16. data/stdlib/nodejs/node_modules/glob/glob.js +649 -0
  17. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/.eslintrc +17 -0
  18. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/LICENSE +15 -0
  19. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/README.md +37 -0
  20. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/inflight.js +44 -0
  21. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE +15 -0
  22. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md +36 -0
  23. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json +52 -0
  24. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/test/basic.js +51 -0
  25. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js +33 -0
  26. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/package.json +61 -0
  27. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/test.js +97 -0
  28. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/LICENSE +16 -0
  29. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/README.md +42 -0
  30. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/inherits.js +1 -0
  31. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/inherits_browser.js +23 -0
  32. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/package.json +51 -0
  33. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/test.js +25 -0
  34. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/.npmignore +1 -0
  35. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/.travis.yml +4 -0
  36. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/LICENSE +23 -0
  37. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/README.md +216 -0
  38. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/benchmark.js +15 -0
  39. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/browser.js +1181 -0
  40. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/minimatch.js +845 -0
  41. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore +2 -0
  42. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.travis.yml +3 -0
  43. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md +121 -0
  44. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js +8 -0
  45. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js +191 -0
  46. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore +2 -0
  47. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml +4 -0
  48. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile +6 -0
  49. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md +80 -0
  50. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js +5 -0
  51. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js +38 -0
  52. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json +73 -0
  53. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js +56 -0
  54. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml +4 -0
  55. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE +18 -0
  56. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown +62 -0
  57. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js +6 -0
  58. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js +13 -0
  59. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json +83 -0
  60. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js +39 -0
  61. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json +75 -0
  62. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js +32 -0
  63. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt +1075 -0
  64. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt +182 -0
  65. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js +9 -0
  66. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js +10 -0
  67. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh +24 -0
  68. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js +15 -0
  69. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/nested.js +16 -0
  70. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/order.js +10 -0
  71. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/pad.js +13 -0
  72. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js +7 -0
  73. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js +50 -0
  74. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/package.json +60 -0
  75. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/basic.js +399 -0
  76. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/brace-expand.js +45 -0
  77. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/defaults.js +274 -0
  78. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js +8 -0
  79. data/stdlib/nodejs/node_modules/glob/node_modules/once/LICENSE +27 -0
  80. data/stdlib/nodejs/node_modules/glob/node_modules/once/README.md +51 -0
  81. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE +15 -0
  82. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/README.md +36 -0
  83. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/package.json +52 -0
  84. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js +51 -0
  85. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js +33 -0
  86. data/stdlib/nodejs/node_modules/glob/node_modules/once/once.js +21 -0
  87. data/stdlib/nodejs/node_modules/glob/node_modules/once/package.json +60 -0
  88. data/stdlib/nodejs/node_modules/glob/node_modules/once/test/once.js +23 -0
  89. data/stdlib/nodejs/node_modules/glob/package.json +72 -0
  90. data/stdlib/nodejs/node_modules/glob/sync.js +409 -0
  91. data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +277 -0
  92. data/stdlib/nodejs/node_modules/js-yaml/LICENSE +21 -0
  93. data/stdlib/nodejs/node_modules/js-yaml/README.md +288 -0
  94. data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +140 -0
  95. data/stdlib/nodejs/node_modules/js-yaml/bower.json +23 -0
  96. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.js +3666 -0
  97. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +3 -0
  98. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +102 -0
  99. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +18 -0
  100. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +31 -0
  101. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +22 -0
  102. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +18 -0
  103. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +197 -0
  104. data/stdlib/nodejs/node_modules/js-yaml/index.js +7 -0
  105. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +39 -0
  106. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +62 -0
  107. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +554 -0
  108. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +25 -0
  109. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +1581 -0
  110. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +78 -0
  111. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +103 -0
  112. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +18 -0
  113. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +25 -0
  114. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +28 -0
  115. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +17 -0
  116. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +25 -0
  117. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +61 -0
  118. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +133 -0
  119. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +37 -0
  120. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +110 -0
  121. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +183 -0
  122. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +85 -0
  123. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +84 -0
  124. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +27 -0
  125. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +8 -0
  126. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +12 -0
  127. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +36 -0
  128. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +56 -0
  129. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +61 -0
  130. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +8 -0
  131. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +33 -0
  132. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +8 -0
  133. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +98 -0
  134. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esparse +117 -0
  135. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esvalidate +177 -0
  136. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +115 -0
  137. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/LICENSE +21 -0
  138. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +239 -0
  139. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +36 -0
  140. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +22 -0
  141. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +59 -0
  142. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +13 -0
  143. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +33 -0
  144. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +28 -0
  145. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +23 -0
  146. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +49 -0
  147. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +35 -0
  148. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +270 -0
  149. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +1 -0
  150. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +146 -0
  151. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +55 -0
  152. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +47 -0
  153. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +40 -0
  154. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +48 -0
  155. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +50 -0
  156. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +43 -0
  157. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +27 -0
  158. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +26 -0
  159. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +148 -0
  160. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +50 -0
  161. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +481 -0
  162. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +14 -0
  163. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +50 -0
  164. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +54 -0
  165. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +75 -0
  166. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +1168 -0
  167. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +18 -0
  168. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +88 -0
  169. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +798 -0
  170. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +77 -0
  171. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +2 -0
  172. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +8 -0
  173. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +825 -0
  174. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +33 -0
  175. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +11 -0
  176. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +10 -0
  177. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +26 -0
  178. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +673 -0
  179. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
  180. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +107 -0
  181. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +23 -0
  182. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +22 -0
  183. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +69 -0
  184. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +6 -0
  185. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +1415 -0
  186. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +62 -0
  187. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +73 -0
  188. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +117 -0
  189. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +177 -0
  190. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +3908 -0
  191. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +69 -0
  192. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +239 -0
  193. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +422 -0
  194. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +66 -0
  195. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +387 -0
  196. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +20238 -0
  197. data/stdlib/nodejs/node_modules/js-yaml/package.json +83 -0
  198. data/{package.json → stdlib/nodejs/package.json} +0 -3
  199. data/stdlib/phantomjs.rb +1 -6
  200. data/tasks/testing.rake +1 -4
  201. metadata +191 -6
  202. data/stdlib/nodejs/runtime.rb +0 -26
@@ -0,0 +1,77 @@
1
+ /**
2
+ * class Namespace
3
+ *
4
+ * Simple object for storing attributes. Implements equality by attribute names
5
+ * and values, and provides a simple string representation.
6
+ *
7
+ * See also [original guide][1]
8
+ *
9
+ * [1]:http://docs.python.org/dev/library/argparse.html#the-namespace-object
10
+ **/
11
+ 'use strict';
12
+
13
+ var _ = require('underscore');
14
+
15
+ /**
16
+ * new Namespace(options)
17
+ * - options(object): predefined propertis for result object
18
+ *
19
+ **/
20
+ var Namespace = module.exports = function Namespace(options) {
21
+ _.extend(this, options);
22
+ };
23
+
24
+ /**
25
+ * Namespace#isset(key) -> Boolean
26
+ * - key (string|number): property name
27
+ *
28
+ * Tells whenever `namespace` contains given `key` or not.
29
+ **/
30
+ Namespace.prototype.isset = function (key) {
31
+ return _.has(this, key);
32
+ };
33
+
34
+ /**
35
+ * Namespace#set(key, value) -> self
36
+ * -key (string|number|object): propery name
37
+ * -value (mixed): new property value
38
+ *
39
+ * Set the property named key with value.
40
+ * If key object then set all key properties to namespace object
41
+ **/
42
+ Namespace.prototype.set = function (key, value) {
43
+ if (typeof (key) === 'object') {
44
+ _.extend(this, key);
45
+ } else {
46
+ this[key] = value;
47
+ }
48
+ return this;
49
+ };
50
+
51
+ /**
52
+ * Namespace#get(key, defaultValue) -> mixed
53
+ * - key (string|number): property name
54
+ * - defaultValue (mixed): default value
55
+ *
56
+ * Return the property key or defaulValue if not set
57
+ **/
58
+ Namespace.prototype.get = function (key, defaultValue) {
59
+ return !this[key] ? defaultValue: this[key];
60
+ };
61
+
62
+ /**
63
+ * Namespace#unset(key, defaultValue) -> mixed
64
+ * - key (string|number): property name
65
+ * - defaultValue (mixed): default value
66
+ *
67
+ * Return data[key](and delete it) or defaultValue
68
+ **/
69
+ Namespace.prototype.unset = function (key, defaultValue) {
70
+ var value = this[key];
71
+ if (value !== null) {
72
+ delete this[key];
73
+ return value;
74
+ } else {
75
+ return defaultValue;
76
+ }
77
+ };
@@ -0,0 +1,8 @@
1
+ language: node_js
2
+ node_js:
3
+ - "0.11"
4
+
5
+ before_script:
6
+ - "export DISPLAY=:99.0"
7
+ - "sh -e /etc/init.d/xvfb start"
8
+ - sleep 2
@@ -0,0 +1,825 @@
1
+ # Underscore.string [![Build Status](https://secure.travis-ci.org/epeli/underscore.string.png?branch=master)](http://travis-ci.org/epeli/underscore.string) #
2
+
3
+
4
+
5
+ Javascript lacks complete string manipulation operations.
6
+ This an attempt to fill that gap. List of build-in methods can be found
7
+ for example from [Dive Into JavaScript][d].
8
+
9
+ [d]: http://www.diveintojavascript.com/core-javascript-reference/the-string-object
10
+
11
+
12
+ As name states this an extension for [Underscore.js][u] (and [Lo-Dash](http://lodash.com/)), but it can be used
13
+ independently from **_s**-global variable. But with Underscore.js you can
14
+ use Object-Oriented style and chaining:
15
+
16
+ [u]: http://underscorejs.org/
17
+
18
+ ```javascript
19
+ _(" epeli ").chain().trim().capitalize().value()
20
+ => "Epeli"
21
+ ```
22
+
23
+ ## Download ##
24
+
25
+ * [Development version](https://raw.github.com/epeli/underscore.string/master/lib/underscore.string.js) *Uncompressed with Comments 18kb*
26
+ * [Production version](https://github.com/epeli/underscore.string/raw/master/dist/underscore.string.min.js) *Minified 7kb*
27
+
28
+
29
+ ## Node.js installation ##
30
+
31
+ **npm package**
32
+
33
+ npm install underscore.string
34
+
35
+ **Standalone usage**:
36
+
37
+ ```javascript
38
+ var _s = require('underscore.string');
39
+ ```
40
+
41
+ **Integrate with Underscore.js**:
42
+
43
+ ```javascript
44
+ var _ = require('underscore');
45
+
46
+ // Import Underscore.string to separate object, because there are conflict functions (include, reverse, contains)
47
+ _.str = require('underscore.string');
48
+
49
+ // Mix in non-conflict functions to Underscore namespace if you want
50
+ _.mixin(_.str.exports());
51
+
52
+ // All functions, include conflict, will be available through _.str object
53
+ _.str.include('Underscore.string', 'string'); // => true
54
+ ```
55
+
56
+ **Or Integrate with Underscore.js without module loading**
57
+
58
+ Run the following expression after Underscore.js and Underscore.string are loaded
59
+ ```javascript
60
+ // _.str becomes a global variable if no module loading is detected
61
+ // Mix in non-conflict functions to Underscore namespace
62
+ _.mixin(_.str.exports());
63
+ ```
64
+
65
+ ## String Functions ##
66
+
67
+ For availability of functions in this way you need to mix in Underscore.string functions:
68
+
69
+ ```javascript
70
+ _.mixin(_.string.exports());
71
+ ```
72
+
73
+ otherwise functions from examples will be available through _.string or _.str objects:
74
+
75
+ ```javascript
76
+ _.str.capitalize('epeli')
77
+ => "Epeli"
78
+ ```
79
+
80
+ **numberFormat** _.numberFormat(number, [ decimals=0, decimalSeparator='.', orderSeparator=','])
81
+
82
+ Formats the numbers.
83
+
84
+ ```javascript
85
+ _.numberFormat(1000, 2)
86
+ => "1,000.00"
87
+
88
+ _.numberFormat(123456789.123, 5, '.', ',')
89
+ => "123,456,789.12300"
90
+ ```
91
+
92
+
93
+ **levenshtein** _.levenshtein(string1, string2)
94
+
95
+ Calculates [Levenshtein distance][ld] between two strings.
96
+ [ld]: http://en.wikipedia.org/wiki/Levenshtein_distance
97
+
98
+ ```javascript
99
+ _.levenshtein('kitten', 'kittah')
100
+ => 2
101
+ ```
102
+
103
+ **capitalize** _.capitalize(string)
104
+
105
+ Converts first letter of the string to uppercase.
106
+
107
+ ```javascript
108
+ _.capitalize("foo Bar")
109
+ => "Foo Bar"
110
+ ```
111
+
112
+ **chop** _.chop(string, step)
113
+
114
+ ```javascript
115
+ _.chop('whitespace', 3)
116
+ => ['whi','tes','pac','e']
117
+ ```
118
+
119
+ **clean** _.clean(str)
120
+
121
+ Compress some whitespaces to one.
122
+
123
+ ```javascript
124
+ _.clean(" foo bar ")
125
+ => 'foo bar'
126
+ ```
127
+
128
+ **chars** _.chars(str)
129
+
130
+ ```javascript
131
+ _.chars('Hello')
132
+ => ['H','e','l','l','o']
133
+ ```
134
+
135
+ **swapCase** _.swapCase(str)
136
+
137
+ Returns a copy of the string in which all the case-based characters have had their case swapped.
138
+
139
+ ```javascript
140
+ _.swapCase('hELLO')
141
+ => 'Hello'
142
+ ```
143
+
144
+ **include** available only through _.str object, because Underscore has function with the same name.
145
+
146
+ ```javascript
147
+ _.str.include("foobar", "ob")
148
+ => true
149
+ ```
150
+
151
+ (removed) **includes** _.includes(string, substring)
152
+
153
+ Tests if string contains a substring.
154
+
155
+ ```javascript
156
+ _.includes("foobar", "ob")
157
+ => true
158
+ ```
159
+
160
+ **includes** function was removed
161
+
162
+ But you can create it in this way, for compatibility with previous versions:
163
+
164
+ ```javascript
165
+ _.includes = _.str.include
166
+ ```
167
+
168
+ **count** _.count(string, substring)
169
+
170
+ ```javascript
171
+ _('Hello world').count('l')
172
+ => 3
173
+ ```
174
+
175
+ **escapeHTML** _.escapeHTML(string)
176
+
177
+ Converts HTML special characters to their entity equivalents.
178
+
179
+ ```javascript
180
+ _('<div>Blah blah blah</div>').escapeHTML();
181
+ => '&lt;div&gt;Blah blah blah&lt;/div&gt;'
182
+ ```
183
+
184
+ **unescapeHTML** _.unescapeHTML(string)
185
+
186
+ Converts entity characters to HTML equivalents.
187
+
188
+ ```javascript
189
+ _('&lt;div&gt;Blah blah blah&lt;/div&gt;').unescapeHTML();
190
+ => '<div>Blah blah blah</div>'
191
+ ```
192
+
193
+ **insert** _.insert(string, index, substing)
194
+
195
+ ```javascript
196
+ _('Hello ').insert(6, 'world')
197
+ => 'Hello world'
198
+ ```
199
+
200
+ **isBlank** _.isBlank(string)
201
+
202
+ ```javascript
203
+ _('').isBlank(); // => true
204
+ _('\n').isBlank(); // => true
205
+ _(' ').isBlank(); // => true
206
+ _('a').isBlank(); // => false
207
+ ```
208
+
209
+ **join** _.join(separator, *strings)
210
+
211
+ Joins strings together with given separator
212
+
213
+ ```javascript
214
+ _.join(" ", "foo", "bar")
215
+ => "foo bar"
216
+ ```
217
+
218
+ **lines** _.lines(str)
219
+
220
+ ```javascript
221
+ _.lines("Hello\nWorld")
222
+ => ["Hello", "World"]
223
+ ```
224
+
225
+ **reverse** available only through _.str object, because Underscore has function with the same name.
226
+
227
+ Return reversed string:
228
+
229
+ ```javascript
230
+ _.str.reverse("foobar")
231
+ => 'raboof'
232
+ ```
233
+
234
+ **splice** _.splice(string, index, howmany, substring)
235
+
236
+ Like a array splice.
237
+
238
+ ```javascript
239
+ _('https://edtsech@bitbucket.org/edtsech/underscore.strings').splice(30, 7, 'epeli')
240
+ => 'https://edtsech@bitbucket.org/epeli/underscore.strings'
241
+ ```
242
+
243
+ **startsWith** _.startsWith(string, starts)
244
+
245
+ This method checks whether string starts with starts.
246
+
247
+ ```javascript
248
+ _("image.gif").startsWith("image")
249
+ => true
250
+ ```
251
+
252
+ **endsWith** _.endsWith(string, ends)
253
+
254
+ This method checks whether string ends with ends.
255
+
256
+ ```javascript
257
+ _("image.gif").endsWith("gif")
258
+ => true
259
+ ```
260
+
261
+ **succ** _.succ(str)
262
+
263
+ Returns the successor to str.
264
+
265
+ ```javascript
266
+ _('a').succ()
267
+ => 'b'
268
+
269
+ _('A').succ()
270
+ => 'B'
271
+ ```
272
+
273
+ **supplant**
274
+
275
+ Supplant function was removed, use Underscore.js [template function][p].
276
+
277
+ [p]: http://documentcloud.github.com/underscore/#template
278
+
279
+ **strip** alias for *trim*
280
+
281
+ **lstrip** alias for *ltrim*
282
+
283
+ **rstrip** alias for *rtrim*
284
+
285
+ **titleize** _.titleize(string)
286
+
287
+ ```javascript
288
+ _('my name is epeli').titleize()
289
+ => 'My Name Is Epeli'
290
+ ```
291
+
292
+ **camelize** _.camelize(string)
293
+
294
+ Converts underscored or dasherized string to a camelized one. Begins with
295
+ a lower case letter unless it starts with an underscore or string
296
+
297
+ ```javascript
298
+ _('moz-transform').camelize()
299
+ => 'mozTransform'
300
+ _('-moz-transform').camelize()
301
+ => 'MozTransform'
302
+ ```
303
+
304
+ **classify** _.classify(string)
305
+
306
+ Converts string to camelized class name. First letter is always upper case
307
+
308
+ ```javascript
309
+ _('some_class_name').classify()
310
+ => 'SomeClassName'
311
+ ```
312
+
313
+ **underscored** _.underscored(string)
314
+
315
+ Converts a camelized or dasherized string into an underscored one
316
+
317
+ ```javascript
318
+ _('MozTransform').underscored()
319
+ => 'moz_transform'
320
+ ```
321
+
322
+ **dasherize** _.dasherize(string)
323
+
324
+ Converts a underscored or camelized string into an dasherized one
325
+
326
+ ```javascript
327
+ _('MozTransform').dasherize()
328
+ => '-moz-transform'
329
+ ```
330
+
331
+ **humanize** _.humanize(string)
332
+
333
+ Converts an underscored, camelized, or dasherized string into a humanized one.
334
+ Also removes beginning and ending whitespace, and removes the postfix '_id'.
335
+
336
+ ```javascript
337
+ _(' capitalize dash-CamelCase_underscore trim ').humanize()
338
+ => 'Capitalize dash camel case underscore trim'
339
+ ```
340
+
341
+ **trim** _.trim(string, [characters])
342
+
343
+ trims defined characters from begining and ending of the string.
344
+ Defaults to whitespace characters.
345
+
346
+ ```javascript
347
+ _.trim(" foobar ")
348
+ => "foobar"
349
+
350
+ _.trim("_-foobar-_", "_-")
351
+ => "foobar"
352
+ ```
353
+
354
+
355
+ **ltrim** _.ltrim(string, [characters])
356
+
357
+ Left trim. Similar to trim, but only for left side.
358
+
359
+
360
+ **rtrim** _.rtrim(string, [characters])
361
+
362
+ Right trim. Similar to trim, but only for right side.
363
+
364
+ **truncate** _.truncate(string, length, truncateString)
365
+
366
+ ```javascript
367
+ _('Hello world').truncate(5)
368
+ => 'Hello...'
369
+
370
+ _('Hello').truncate(10)
371
+ => 'Hello'
372
+ ```
373
+
374
+ **prune** _.prune(string, length, pruneString)
375
+
376
+ Elegant version of truncate.
377
+ Makes sure the pruned string does not exceed the original length.
378
+ Avoid half-chopped words when truncating.
379
+
380
+ ```javascript
381
+ _('Hello, world').prune(5)
382
+ => 'Hello...'
383
+
384
+ _('Hello, world').prune(8)
385
+ => 'Hello...'
386
+
387
+ _('Hello, world').prune(5, ' (read a lot more)')
388
+ => 'Hello, world' (as adding "(read a lot more)" would be longer than the original string)
389
+
390
+ _('Hello, cruel world').prune(15)
391
+ => 'Hello, cruel...'
392
+
393
+ _('Hello').prune(10)
394
+ => 'Hello'
395
+ ```
396
+
397
+ **words** _.words(str, delimiter=/\s+/)
398
+
399
+ Split string by delimiter (String or RegExp), /\s+/ by default.
400
+
401
+ ```javascript
402
+ _.words(" I love you ")
403
+ => ["I","love","you"]
404
+
405
+ _.words("I_love_you", "_")
406
+ => ["I","love","you"]
407
+
408
+ _.words("I-love-you", /-/)
409
+ => ["I","love","you"]
410
+
411
+ _.words(" ")
412
+ => []
413
+ ```
414
+
415
+ **sprintf** _.sprintf(string format, *arguments)
416
+
417
+ C like string formatting.
418
+ Credits goes to [Alexandru Marasteanu][o].
419
+ For more detailed documentation, see the [original page][o].
420
+
421
+ [o]: http://www.diveintojavascript.com/projects/javascript-sprintf
422
+
423
+ ```javascript
424
+ _.sprintf("%.1f", 1.17)
425
+ "1.2"
426
+ ```
427
+
428
+ **pad** _.pad(str, length, [padStr, type])
429
+
430
+ pads the `str` with characters until the total string length is equal to the passed `length` parameter. By default, pads on the **left** with the space char (`" "`). `padStr` is truncated to a single character if necessary.
431
+
432
+ ```javascript
433
+ _.pad("1", 8)
434
+ -> " 1";
435
+
436
+ _.pad("1", 8, '0')
437
+ -> "00000001";
438
+
439
+ _.pad("1", 8, '0', 'right')
440
+ -> "10000000";
441
+
442
+ _.pad("1", 8, '0', 'both')
443
+ -> "00001000";
444
+
445
+ _.pad("1", 8, 'bleepblorp', 'both')
446
+ -> "bbbb1bbb";
447
+ ```
448
+
449
+ **lpad** _.lpad(str, length, [padStr])
450
+
451
+ left-pad a string. Alias for `pad(str, length, padStr, 'left')`
452
+
453
+ ```javascript
454
+ _.lpad("1", 8, '0')
455
+ -> "00000001";
456
+ ```
457
+
458
+ **rpad** _.rpad(str, length, [padStr])
459
+
460
+ right-pad a string. Alias for `pad(str, length, padStr, 'right')`
461
+
462
+ ```javascript
463
+ _.rpad("1", 8, '0')
464
+ -> "10000000";
465
+ ```
466
+
467
+ **lrpad** _.lrpad(str, length, [padStr])
468
+
469
+ left/right-pad a string. Alias for `pad(str, length, padStr, 'both')`
470
+
471
+ ```javascript
472
+ _.lrpad("1", 8, '0')
473
+ -> "00001000";
474
+ ```
475
+
476
+ **center** alias for **lrpad**
477
+
478
+ **ljust** alias for *rpad*
479
+
480
+ **rjust** alias for *lpad*
481
+
482
+ **toNumber** _.toNumber(string, [decimals])
483
+
484
+ Parse string to number. Returns NaN if string can't be parsed to number.
485
+
486
+ ```javascript
487
+ _('2.556').toNumber()
488
+ => 3
489
+
490
+ _('2.556').toNumber(1)
491
+ => 2.6
492
+ ```
493
+
494
+ **strRight** _.strRight(string, pattern)
495
+
496
+ Searches a string from left to right for a pattern and returns a substring consisting of the characters in the string that are to the right of the pattern or all string if no match found.
497
+
498
+ ```javascript
499
+ _('This_is_a_test_string').strRight('_')
500
+ => "is_a_test_string";
501
+ ```
502
+
503
+ **strRightBack** _.strRightBack(string, pattern)
504
+
505
+ Searches a string from right to left for a pattern and returns a substring consisting of the characters in the string that are to the right of the pattern or all string if no match found.
506
+
507
+ ```javascript
508
+ _('This_is_a_test_string').strRightBack('_')
509
+ => "string";
510
+ ```
511
+
512
+ **strLeft** _.strLeft(string, pattern)
513
+
514
+ Searches a string from left to right for a pattern and returns a substring consisting of the characters in the string that are to the left of the pattern or all string if no match found.
515
+
516
+ ```javascript
517
+ _('This_is_a_test_string').strLeft('_')
518
+ => "This";
519
+ ```
520
+
521
+ **strLeftBack** _.strLeftBack(string, pattern)
522
+
523
+ Searches a string from right to left for a pattern and returns a substring consisting of the characters in the string that are to the left of the pattern or all string if no match found.
524
+
525
+ ```javascript
526
+ _('This_is_a_test_string').strLeftBack('_')
527
+ => "This_is_a_test";
528
+ ```
529
+
530
+ **stripTags**
531
+
532
+ Removes all html tags from string.
533
+
534
+ ```javascript
535
+ _('a <a href="#">link</a>').stripTags()
536
+ => 'a link'
537
+
538
+ _('a <a href="#">link</a><script>alert("hello world!")</script>').stripTags()
539
+ => 'a linkalert("hello world!")'
540
+ ```
541
+
542
+ **toSentence** _.toSentence(array, [delimiter, lastDelimiter])
543
+
544
+ Join an array into a human readable sentence.
545
+
546
+ ```javascript
547
+ _.toSentence(['jQuery', 'Mootools', 'Prototype'])
548
+ => 'jQuery, Mootools and Prototype';
549
+
550
+ _.toSentence(['jQuery', 'Mootools', 'Prototype'], ', ', ' unt ')
551
+ => 'jQuery, Mootools unt Prototype';
552
+ ```
553
+
554
+ **toSentenceSerial** _.toSentenceSerial(array, [delimiter, lastDelimiter])
555
+
556
+ The same as `toSentence`, but adjusts delimeters to use [Serial comma](http://en.wikipedia.org/wiki/Serial_comma).
557
+
558
+ ```javascript
559
+ _.toSentenceSerial(['jQuery', 'Mootools'])
560
+ => 'jQuery and Mootools';
561
+
562
+ _.toSentenceSerial(['jQuery', 'Mootools', 'Prototype'])
563
+ => 'jQuery, Mootools, and Prototype'
564
+
565
+ _.toSentenceSerial(['jQuery', 'Mootools', 'Prototype'], ', ', ' unt ');
566
+ => 'jQuery, Mootools, unt Prototype';
567
+ ```
568
+
569
+ **repeat** _.repeat(string, count, [separator])
570
+
571
+ Repeats a string count times.
572
+
573
+ ```javascript
574
+ _.repeat("foo", 3)
575
+ => 'foofoofoo';
576
+
577
+ _.repeat("foo", 3, "bar")
578
+ => 'foobarfoobarfoo'
579
+ ```
580
+
581
+ **surround** _.surround(string, wrap)
582
+
583
+ Surround a string with another string.
584
+
585
+ ```javascript
586
+ _.surround("foo", "ab")
587
+ => 'abfooab';
588
+ ```
589
+
590
+ **quote** _.quote(string, quoteChar) or _.q(string, quoteChar)
591
+
592
+ Quotes a string. `quoteChar` defaults to `"`.
593
+
594
+ ```javascript
595
+ _.quote('foo', quoteChar)
596
+ => '"foo"';
597
+ ```
598
+ **unquote** _.unquote(string, quoteChar)
599
+
600
+ Unquotes a string. `quoteChar` defaults to `"`.
601
+
602
+ ```javascript
603
+ _.unquote('"foo"')
604
+ => 'foo';
605
+ _.unquote("'foo'", "'")
606
+ => 'foo';
607
+ ```
608
+
609
+
610
+ **slugify** _.slugify(string)
611
+
612
+ Transform text into a URL slug. Replaces whitespaces, accentuated, and special characters with a dash.
613
+
614
+ ```javascript
615
+ _.slugify("Un éléphant à l'orée du bois")
616
+ => 'un-elephant-a-loree-du-bois';
617
+ ```
618
+
619
+ ***Caution: this function is charset dependent***
620
+
621
+ **naturalCmp** array.sort(_.naturalCmp)
622
+
623
+ Naturally sort strings like humans would do.
624
+
625
+ ```javascript
626
+ ['foo20', 'foo5'].sort(_.naturalCmp)
627
+ => [ 'foo5', 'foo20' ]
628
+ ```
629
+
630
+ **toBoolean** _.toBoolean(string) or _.toBool(string)
631
+
632
+ Turn strings that can be commonly considered as booleas to real booleans. Such as "true", "false", "1" and "0". This function is case insensitive.
633
+
634
+ ```javascript
635
+ _.toBoolean("true")
636
+ => true
637
+ _.toBoolean("FALSE")
638
+ => false
639
+ _.toBoolean("random")
640
+ => undefined
641
+ ```
642
+
643
+ It can be customized by giving arrays of truth and falsy value matcher as parameters. Matchers can be also RegExp objects.
644
+
645
+ ```javascript
646
+ _.toBoolean("truthy", ["truthy"], ["falsy"])
647
+ => true
648
+ _.toBoolean("true only at start", [/^true/])
649
+ => true
650
+ ```
651
+
652
+ ## Roadmap ##
653
+
654
+ Any suggestions or bug reports are welcome. Just email me or more preferably open an issue.
655
+
656
+ #### Problems
657
+
658
+ We lose two things for `include` and `reverse` methods from `_.string`:
659
+
660
+ * Calls like `_('foobar').include('bar')` aren't available;
661
+ * Chaining isn't available too.
662
+
663
+ But if you need this functionality you can create aliases for conflict functions which will be convenient for you:
664
+
665
+ ```javascript
666
+ _.mixin({
667
+ includeString: _.str.include,
668
+ reverseString: _.str.reverse
669
+ })
670
+
671
+ // Now wrapper calls and chaining are available.
672
+ _('foobar').chain().reverseString().includeString('rab').value()
673
+ ```
674
+
675
+ #### Standalone Usage
676
+
677
+ If you are using Underscore.string without Underscore. You also have `_.string` namespace for it and `_.str` alias
678
+ But of course you can just reassign `_` variable with `_.string`
679
+
680
+ ```javascript
681
+ _ = _.string
682
+ ```
683
+
684
+ ## Changelog ##
685
+
686
+ ### 2.4.0 ###
687
+
688
+ * Move from rake to gulp
689
+ * Add support form classify camelcase strings
690
+ * Fix bower.json
691
+ * [Full changelog](https://github.com/epeli/underscore.string/compare/v2.3.3...2.4.0)
692
+
693
+ ### 2.3.3 ###
694
+
695
+ * Add `toBoolean`
696
+ * Add `unquote`
697
+ * Add quote char option to `quote`
698
+ * Support dash-separated words in `titleize`
699
+ * [Full changelog](https://github.com/epeli/underscore.string/compare/v2.3.2...2.3.3)
700
+
701
+ ### 2.3.2 ###
702
+
703
+ * Add `naturalCmp`
704
+ * Bug fix to `camelize`
705
+ * Add ă, ș, ț and ś to `slugify`
706
+ * Doc updates
707
+ * Add support for [component](http://component.io/)
708
+ * [Full changelog](https://github.com/epeli/underscore.string/compare/v2.3.1...v2.3.2)
709
+
710
+ ### 2.3.1 ###
711
+
712
+ * Bug fixes to `escapeHTML`, `classify`, `substr`
713
+ * Faster `count`
714
+ * Documentation fixes
715
+ * [Full changelog](https://github.com/epeli/underscore.string/compare/v2.3.0...v2.3.1)
716
+
717
+ ### 2.3.0 ###
718
+
719
+ * Added `numberformat` method
720
+ * Added `levenshtein` method (Levenshtein distance calculation)
721
+ * Added `swapCase` method
722
+ * Changed default behavior of `words` method
723
+ * Added `toSentenceSerial` method
724
+ * Added `surround` and `quote` methods
725
+
726
+ ### 2.2.1 ###
727
+
728
+ * Same as 2.2.0 (2.2.0rc on npm) to fix some npm drama
729
+
730
+ ### 2.2.0 ###
731
+
732
+ * Capitalize method behavior changed
733
+ * Various perfomance tweaks
734
+
735
+ ### 2.1.1###
736
+
737
+ * Fixed words method bug
738
+ * Added classify method
739
+
740
+ ### 2.1.0 ###
741
+
742
+ * AMD support
743
+ * Added toSentence method
744
+ * Added slugify method
745
+ * Lots of speed optimizations
746
+
747
+ ### 2.0.0 ###
748
+
749
+ * Added prune, humanize functions
750
+ * Added _.string (_.str) namespace for Underscore.string library
751
+ * Removed includes function
752
+
753
+ For upgrading to this version you need to mix in Underscore.string library to Underscore object:
754
+
755
+ ```javascript
756
+ _.mixin(_.string.exports());
757
+ ```
758
+
759
+ and all non-conflict Underscore.string functions will be available through Underscore object.
760
+ Also function `includes` has been removed, you should replace this function by `_.str.include`
761
+ or create alias `_.includes = _.str.include` and all your code will work fine.
762
+
763
+ ### 1.1.6 ###
764
+
765
+ * Fixed reverse and truncate
766
+ * Added isBlank, stripTags, inlude(alias for includes)
767
+ * Added uglifier compression
768
+
769
+ ### 1.1.5 ###
770
+
771
+ * Added strRight, strRightBack, strLeft, strLeftBack
772
+
773
+ ### 1.1.4 ###
774
+
775
+ * Added pad, lpad, rpad, lrpad methods and aliases center, ljust, rjust
776
+ * Integration with Underscore 1.1.6
777
+
778
+ ### 1.1.3 ###
779
+
780
+ * Added methods: underscored, camelize, dasherize
781
+ * Support newer version of npm
782
+
783
+ ### 1.1.2 ###
784
+
785
+ * Created functions: lines, chars, words functions
786
+
787
+ ### 1.0.2 ###
788
+
789
+ * Created integration test suite with underscore.js 1.1.4 (now it's absolutely compatible)
790
+ * Removed 'reverse' function, because this function override underscore.js 'reverse'
791
+
792
+ ## Contribute ##
793
+
794
+ * Fork & pull request. Don't forget about tests.
795
+ * If you planning add some feature please create issue before.
796
+
797
+ Otherwise changes will be rejected.
798
+
799
+ ## Contributors list ##
800
+ [Can be found here](https://github.com/epeli/underscore.string/graphs/contributors).
801
+
802
+
803
+ ## Licence ##
804
+
805
+ The MIT License
806
+
807
+ Copyright (c) 2011 Esa-Matti Suuronen esa-matti@suuronen.org
808
+
809
+ Permission is hereby granted, free of charge, to any person obtaining a copy
810
+ of this software and associated documentation files (the "Software"), to deal
811
+ in the Software without restriction, including without limitation the rights
812
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
813
+ copies of the Software, and to permit persons to whom the Software is
814
+ furnished to do so, subject to the following conditions:
815
+
816
+ The above copyright notice and this permission notice shall be included in
817
+ all copies or substantial portions of the Software.
818
+
819
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
820
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
821
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
822
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
823
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
824
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
825
+ THE SOFTWARE.