[Pkg-javascript-commits] [node-wcwidth.js] 01/04: Import Upstream version 1.0.0

Suhail P psuhailp-guest at moszumanska.debian.org
Sun Oct 30 10:35:33 UTC 2016


This is an automated email from the git hooks/post-receive script.

psuhailp-guest pushed a commit to branch master
in repository node-wcwidth.js.

commit 28f64a0895dae491aadea42d4df04d0800e9f465
Author: Suhail P <psuhailp at gmail.com>
Date:   Sun Oct 30 07:40:56 2016 +0000

    Import Upstream version 1.0.0
---
 .gitignore    |   1 +
 .npmignore    |   5 +++
 INSTALL.md    |  12 +++++++
 LICENSE.md    |  29 +++++++++++++++
 NEWS          |  11 ++++++
 README.md     | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 combining.js  |  56 +++++++++++++++++++++++++++++
 doc/index.md  |  56 +++++++++++++++++++++++++++++
 index.js      |  95 ++++++++++++++++++++++++++++++++++++++++++++++++
 package.json  |  48 +++++++++++++++++++++++++
 test/index.js | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 11 files changed, 529 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c2658d7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+node_modules/
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 0000000..2654702
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,5 @@
+.hg
+.hgtags
+.hgignore
+.npmignore
+node_modules/
diff --git a/INSTALL.md b/INSTALL.md
new file mode 100644
index 0000000..a69f247
--- /dev/null
+++ b/INSTALL.md
@@ -0,0 +1,12 @@
+How to build and install wcwidth.js
+===================================
+
+This package does not provide an automated way to build or install the library
+except using [`npm`](http://npmjs.org/package/wcwidth.js) because `wcwidth.js`
+is intended to runs on top of [`node.js`](http://nodejs.org). If you have
+`node.js` in your system,
+
+    npm install wcwidth.js
+
+brings the latest version of `wcwidth.js` and installs it with its all
+depending packages.
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..1ab0f0f
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,29 @@
+wcwidth.js: a javascript portng of C's wcwidth()
+================================================
+
+Copyright (C) 2012-2014 by Jun Woong and Tim Oxley.
+
+This package is a javascript porting of `wcwidth()` implementation
+[by Markus Kuhn](http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c).
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..7280d73
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,11 @@
+What's new in wcwidth.js?
+=========================
+
+2014-11-16  1.0.0 released
+2014-09-18  Restructued code and added tests by Tim Oxley
+2014-04-26  0.0.4 released
+2012-12-13  0.0.3 released
+2012-12-12  Moved the repository to git/github
+2012-10-16  0.0.2 released
+2012-10-16  Using `wcwidth' without invoking it checked
+2012-10-12  First release
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5c3efa4
--- /dev/null
+++ b/README.md
@@ -0,0 +1,103 @@
+wcwidth.js: a javascript porting of C's wcwidth()
+=================================================
+
+`wcwidth.js` is a simple javascript porting of `wcwidth()` implemented in C
+[by Markus Kuhn](http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c).
+
+[`wcwidth()`](http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html)
+and its string version,
+[`wcswidth()`](http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html)
+are defined by IEEE Std 1002.1-2001, a.k.a. POSIX.1-2001, and return the number
+of columns used to represent a wide character and string on fixed-width output
+devices like terminals. Markus's implementation assumes wide characters to be
+encoded in [ISO 10646](http://en.wikipedia.org/wiki/Universal_Character_Set),
+which is _almost_ true for JavaScript; _almost_ because JavaScript uses
+[UCS-2](http://en.wikipedia.org/wiki/UTF-16) and has problems with surrogate
+pairs. `wcwidth.js` converts surrogate pairs to Unicode code points to handle
+them correctly.
+
+Following the original implementation, this library defines the column width of
+an ISO 10646 character as follows:
+- the null character (`U+0000`) has a column width of `opts.null` (whose
+  default value is 0);
+- other
+  [C0/C1 control characters](http://en.wikipedia.org/wiki/C0_and_C1_control_codes)
+  and `DEL` will lead to a column width of `opts.control` (whose default value
+  is 0);
+- non-spacing and enclosing combining characters
+  ([general category code](http://www.unicode.org/reports/tr44/#GC_Values_Table)
+  `Mn` or `Me`) in the Unicode database) have a column width of 0;
+- `SOFT HYPHEN` (`U+00AD`) has a column width of 1;
+- other format characters (general category code `Cf` in the Unicode database)
+  and `ZERO WIDTH SPACE` (`U+200B`) have a column width of 0;
+- Hangul Jamo medial vowels and final consonants (`U+1160`-`U+11FF`) have a
+  column width of 0;
+- spacing characters in the East Asian Wide (`W`) or East Asian Full-width
+  (`F`) category as defined in
+  [Unicode Technical Report #11](http://www.unicode.org/reports/tr11/) have a
+  column width of 2; and
+- all remaining characters (including all printable
+  [ISO 8859-1](http://en.wikipedia.org/wiki/ISO/IEC_8859-1) and
+  [WGL4 characters](http://en.wikipedia.org/wiki/Windows_Glyph_List_4), Unicode
+  control characters, etc.) have a column width of 1.
+
+A surrogate high or low value which constitutes no pair is considered to have a
+column width of 1 according to the behavior of widespread terminals.
+
+See the
+[documentation](https://github.com/mycoboco/wcwidth.js/blob/master/doc/index.md)
+from the C implementation for details.
+
+`wcwidth.js` is simple to use:
+
+    var wcwidth = require('wcwidth.js')
+
+    wcwidth('한글')    // 4
+    wcwidth('\0')      // 0; NUL
+    wcwidth('\t')      // 0; control characters
+
+If you plan to replace `NUL` or control characters with, say, `???` before
+printing, use `wcwidth.config()` that returns a closure to run `wcwidth` with
+your configuration:
+
+    var mywidth = wcwidth.config({
+        nul:     3,
+        control: 3
+    })
+
+    mywidth('\0\f')      // 6
+    mywidth('한\t글')    // 7
+
+Setting these options to -1 gives a function that returns -1 for a string
+containing an instance of `NUL` or control characters:
+
+    mywidth = wcwidth.config({
+        nul:     0,
+        control: -1
+    })
+
+    mywidth('java\0script')    // 10
+    mywidth('java\tscript')    // -1
+
+This is useful when detecting if a string has non-printable characters.
+
+Due to the risk of monkey-patching, the `String` getter is no longer provided.
+Even if discouraged, you can still monkey-patch by yourself as follows:
+
+    String.prototype.__defineGetter__('wcwidth', function () {
+        return wcwidth(this);
+    })
+    '한글'.wcwidth    // 4
+
+JavaScript has no character type, thus meaningless to have two versions of
+`wcwidth` while POSIX does for C. `wcwidth` also accepts a code value obtained
+by `charCodeAt()`:
+
+    wcwidth('한')                  // prints 2
+    wcwidth('글'.charCodeAt(0))    // prints 2
+
+`INSTALL.md` explains how to build and install the library. For the copyright
+issues, see the accompanying `LICENSE.md` file.
+
+If you have a question or suggestion, do not hesitate to contact me via email
+(woong.jun at gmail.com) or web (http://code.woong.org/).
diff --git a/combining.js b/combining.js
new file mode 100644
index 0000000..ca8ea6d
--- /dev/null
+++ b/combining.js
@@ -0,0 +1,56 @@
+/*
+ *  look-up table for non-spacing characters
+ */
+
+module.exports = [
+    [ 0x0300, 0x036F ], [ 0x0483, 0x0486 ], [ 0x0488, 0x0489 ],
+    [ 0x0591, 0x05BD ], [ 0x05BF, 0x05BF ], [ 0x05C1, 0x05C2 ],
+    [ 0x05C4, 0x05C5 ], [ 0x05C7, 0x05C7 ], [ 0x0600, 0x0603 ],
+    [ 0x0610, 0x0615 ], [ 0x064B, 0x065E ], [ 0x0670, 0x0670 ],
+    [ 0x06D6, 0x06E4 ], [ 0x06E7, 0x06E8 ], [ 0x06EA, 0x06ED ],
+    [ 0x070F, 0x070F ], [ 0x0711, 0x0711 ], [ 0x0730, 0x074A ],
+    [ 0x07A6, 0x07B0 ], [ 0x07EB, 0x07F3 ], [ 0x0901, 0x0902 ],
+    [ 0x093C, 0x093C ], [ 0x0941, 0x0948 ], [ 0x094D, 0x094D ],
+    [ 0x0951, 0x0954 ], [ 0x0962, 0x0963 ], [ 0x0981, 0x0981 ],
+    [ 0x09BC, 0x09BC ], [ 0x09C1, 0x09C4 ], [ 0x09CD, 0x09CD ],
+    [ 0x09E2, 0x09E3 ], [ 0x0A01, 0x0A02 ], [ 0x0A3C, 0x0A3C ],
+    [ 0x0A41, 0x0A42 ], [ 0x0A47, 0x0A48 ], [ 0x0A4B, 0x0A4D ],
+    [ 0x0A70, 0x0A71 ], [ 0x0A81, 0x0A82 ], [ 0x0ABC, 0x0ABC ],
+    [ 0x0AC1, 0x0AC5 ], [ 0x0AC7, 0x0AC8 ], [ 0x0ACD, 0x0ACD ],
+    [ 0x0AE2, 0x0AE3 ], [ 0x0B01, 0x0B01 ], [ 0x0B3C, 0x0B3C ],
+    [ 0x0B3F, 0x0B3F ], [ 0x0B41, 0x0B43 ], [ 0x0B4D, 0x0B4D ],
+    [ 0x0B56, 0x0B56 ], [ 0x0B82, 0x0B82 ], [ 0x0BC0, 0x0BC0 ],
+    [ 0x0BCD, 0x0BCD ], [ 0x0C3E, 0x0C40 ], [ 0x0C46, 0x0C48 ],
+    [ 0x0C4A, 0x0C4D ], [ 0x0C55, 0x0C56 ], [ 0x0CBC, 0x0CBC ],
+    [ 0x0CBF, 0x0CBF ], [ 0x0CC6, 0x0CC6 ], [ 0x0CCC, 0x0CCD ],
+    [ 0x0CE2, 0x0CE3 ], [ 0x0D41, 0x0D43 ], [ 0x0D4D, 0x0D4D ],
+    [ 0x0DCA, 0x0DCA ], [ 0x0DD2, 0x0DD4 ], [ 0x0DD6, 0x0DD6 ],
+    [ 0x0E31, 0x0E31 ], [ 0x0E34, 0x0E3A ], [ 0x0E47, 0x0E4E ],
+    [ 0x0EB1, 0x0EB1 ], [ 0x0EB4, 0x0EB9 ], [ 0x0EBB, 0x0EBC ],
+    [ 0x0EC8, 0x0ECD ], [ 0x0F18, 0x0F19 ], [ 0x0F35, 0x0F35 ],
+    [ 0x0F37, 0x0F37 ], [ 0x0F39, 0x0F39 ], [ 0x0F71, 0x0F7E ],
+    [ 0x0F80, 0x0F84 ], [ 0x0F86, 0x0F87 ], [ 0x0F90, 0x0F97 ],
+    [ 0x0F99, 0x0FBC ], [ 0x0FC6, 0x0FC6 ], [ 0x102D, 0x1030 ],
+    [ 0x1032, 0x1032 ], [ 0x1036, 0x1037 ], [ 0x1039, 0x1039 ],
+    [ 0x1058, 0x1059 ], [ 0x1160, 0x11FF ], [ 0x135F, 0x135F ],
+    [ 0x1712, 0x1714 ], [ 0x1732, 0x1734 ], [ 0x1752, 0x1753 ],
+    [ 0x1772, 0x1773 ], [ 0x17B4, 0x17B5 ], [ 0x17B7, 0x17BD ],
+    [ 0x17C6, 0x17C6 ], [ 0x17C9, 0x17D3 ], [ 0x17DD, 0x17DD ],
+    [ 0x180B, 0x180D ], [ 0x18A9, 0x18A9 ], [ 0x1920, 0x1922 ],
+    [ 0x1927, 0x1928 ], [ 0x1932, 0x1932 ], [ 0x1939, 0x193B ],
+    [ 0x1A17, 0x1A18 ], [ 0x1B00, 0x1B03 ], [ 0x1B34, 0x1B34 ],
+    [ 0x1B36, 0x1B3A ], [ 0x1B3C, 0x1B3C ], [ 0x1B42, 0x1B42 ],
+    [ 0x1B6B, 0x1B73 ], [ 0x1DC0, 0x1DCA ], [ 0x1DFE, 0x1DFF ],
+    [ 0x200B, 0x200F ], [ 0x202A, 0x202E ], [ 0x2060, 0x2063 ],
+    [ 0x206A, 0x206F ], [ 0x20D0, 0x20EF ], [ 0x302A, 0x302F ],
+    [ 0x3099, 0x309A ], [ 0xA806, 0xA806 ], [ 0xA80B, 0xA80B ],
+    [ 0xA825, 0xA826 ], [ 0xFB1E, 0xFB1E ], [ 0xFE00, 0xFE0F ],
+    [ 0xFE20, 0xFE23 ], [ 0xFEFF, 0xFEFF ], [ 0xFFF9, 0xFFFB ],
+    [ 0x10A01, 0x10A03 ], [ 0x10A05, 0x10A06 ], [ 0x10A0C, 0x10A0F ],
+    [ 0x10A38, 0x10A3A ], [ 0x10A3F, 0x10A3F ], [ 0x1D167, 0x1D169 ],
+    [ 0x1D173, 0x1D182 ], [ 0x1D185, 0x1D18B ], [ 0x1D1AA, 0x1D1AD ],
+    [ 0x1D242, 0x1D244 ], [ 0xE0001, 0xE0001 ], [ 0xE0020, 0xE007F ],
+    [ 0xE0100, 0xE01EF ]
+]
+
+// end of combining.js
diff --git a/doc/index.md b/doc/index.md
new file mode 100644
index 0000000..6831d06
--- /dev/null
+++ b/doc/index.md
@@ -0,0 +1,56 @@
+wcwidth.js: a javascript porting of C's wcwidth()
+=================================================
+
+The following explanation comes from the
+[original C implementation](http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c) with
+editorial changes for [markdown](http://daringfireball.net/projects/markdown/):
+
+This is an implementation of
+[`wcwidth()`](http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html)
+and
+[`wcswidth()`](http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html)
+(defined in IEEE Std 1002.1-2001) for
+[Unicode](http://en.wikipedia.org/wiki/Unicode).
+
+In fixed-width output devices, Latin characters all occupy a single "cell"
+position of equal width, whereas
+[ideographic CJK characters](http://en.wikipedia.org/wiki/CJK_Unified_Ideographs)
+occupy two such cells. Interoperability between terminal-line applications and
+(teletype-style) character terminals using the
+[UTF-8 encoding](http://en.wikipedia.org/wiki/UTF-8) requires agreement on
+which character should advance the cursor by how many cell positions. No
+established formal standards exist at present on which Unicode character shall
+occupy how many cell positions on character terminals. These routines are a
+first attempt of defining such behavior based on simple rules applied to data
+provided by the [Unicode Consortium](http://www.unicode.org/).
+
+For some graphical characters, the Unicode standard explicitly defines a
+character-cell width via the definition of the East Asian FullWidth (`F`), Wide
+(`W`), Half-width (`H`), and Narrow (`Na`) classes. In all these cases, there
+is no ambiguity about which width a terminal shall use. For characters in the
+East Asian Ambiguous (`A`) class, the width choice depends purely on a
+preference of backward compatibility with either historic CJK or Western
+practice. Choosing single-width for these characters is easy to justify as the
+appropriate long-term solution, as the CJK practice of displaying these
+characters as double-width comes from historic implementation simplicity (8-bit
+encoded characters were displayed single-width and 16-bit ones double-width,
+even for Greek, Cyrillic, etc.) and not any typographic considerations.
+
+Much less clear is the choice of width for the Not East Asian (Neutral) class.
+Existing practice does not dictate a width for any of these characters. It
+would nevertheless make sense typographically to allocate two character cells
+to characters such as for instance `EM SPACE` or `VOLUME INTEGRAL`, which
+cannot be represented adequately with a single-width glyph. The following
+routines at present merely assign a single-cell width to all neutral
+characters, in the interest of simplicity. This is not entirely satisfactory
+and should be reconsidered before establishing a formal standard in this area.
+At the moment, the decision which Not East Asian (Neutral) characters should be
+represented by double-width glyphs cannot yet be answered by applying a simple
+rule from the Unicode database content. Setting up a proper standard for the
+behavior of UTF-8 character terminals will require a careful analysis not only
+of each Unicode character, but also of each presentation form, something the
+author of these routines has avoided to do so far.
+
+[http://www.unicode.org/unicode/reports/tr11/](http://www.unicode.org/unicode/reports/tr11/)
+
+_Markus Kuhn_ -- 2007-05-26 (Unicode 5.0)
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..3817caa
--- /dev/null
+++ b/index.js
@@ -0,0 +1,95 @@
+/*
+ *  wcwidth.js: a javascript porting of Markus Kuhn's wcwidth()
+ */
+
+"use strict"
+
+var defaults = require('defaults')
+
+var combining = require('./combining')
+
+
+var DEFAULTS = {
+    nul:     0,
+    control: 0
+}
+
+
+function bisearch(ucs) {
+  var min = 0
+  var max = combining.length - 1
+  var mid
+
+  if (ucs < combining[0][0] || ucs > combining[max][1]) return false
+
+  while (max >= min) {
+      mid = Math.floor((min + max) / 2)
+      if (ucs > combining[mid][1]) min = mid + 1
+      else if (ucs < combining[mid][0]) max = mid - 1
+      else return true
+  }
+
+  return false
+}
+
+
+function wcwidth(ucs, opts) {
+    // test for 8-bit control characters
+    if (ucs === 0) return opts.nul
+    if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) return opts.control
+
+    // binary search in table of non-spacing characters
+    if (bisearch(ucs)) return 0
+
+    // if we arrive here, ucs is not a combining or C0/C1 control character
+    return 1 +
+        (ucs >= 0x1100 &&
+         (ucs <= 0x115f ||                       // Hangul Jamo init. consonants
+          ucs == 0x2329 || ucs == 0x232a ||
+          (ucs >= 0x2e80 && ucs <= 0xa4cf &&
+           ucs != 0x303f) ||                     // CJK ... Yi
+          (ucs >= 0xac00 && ucs <= 0xd7a3) ||    // Hangul Syllables
+          (ucs >= 0xf900 && ucs <= 0xfaff) ||    // CJK Compatibility Ideographs
+          (ucs >= 0xfe10 && ucs <= 0xfe19) ||    // Vertical forms
+          (ucs >= 0xfe30 && ucs <= 0xfe6f) ||    // CJK Compatibility Forms
+          (ucs >= 0xff00 && ucs <= 0xff60) ||    // Fullwidth Forms
+          (ucs >= 0xffe0 && ucs <= 0xffe6) ||
+          (ucs >= 0x20000 && ucs <= 0x2fffd) ||
+          (ucs >= 0x30000 && ucs <= 0x3fffd)));
+}
+
+
+function wcswidth(str, opts) {
+    var h, l
+    var s = 0, n
+
+    if (typeof str !== 'string') return wcwidth(str, opts)
+
+    for (var i = 0; i < str.length; i++) {
+        h = str.charCodeAt(i)
+        if (h >= 0xd800 && h <= 0xdbff) {
+            l = str.charCodeAt(++i)
+            if (l >= 0xdc00 && l <= 0xdfff) h = (h-0xd800)*0x400 + (l-0xdc00)+0x10000
+            else i--
+        }
+        n = wcwidth(h, opts)
+        if (n < 0) return -1
+        s += n
+    }
+
+    return s
+}
+
+
+module.exports = function wcwidth(str) {
+  return wcswidth(str, DEFAULTS)
+}
+
+module.exports.config = function(opts) {
+  opts = defaults(opts || {}, DEFAULTS)
+  return function wcwidth(str) {
+      return wcswidth(str, opts)
+  }
+}
+
+// end of wcwidth.js
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..0290900
--- /dev/null
+++ b/package.json
@@ -0,0 +1,48 @@
+{
+  "name": "wcwidth.js",
+  "version": "1.0.0",
+  "description": "a javascript porting of C's wcwidth()",
+  "author": {
+    "name": "Woong Jun",
+    "email": "woong.jun at gmail.com",
+    "url": "http://code.woong.org/"
+  },
+  "contributors": [
+    {
+      "name": "Tim Oxley",
+      "email": "secoif at gmail.com",
+      "url": "http://campjs.com/"
+    }
+  ],
+  "homepage": "http://code.woong.org/wcwidth.js",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/mycoboco/wcwidth.js.git"
+  },
+  "bugs": {
+    "url": "https://github.com/mycoboco/wcwidth.js/issues",
+    "email": "woong.jun at gmail.com"
+  },
+  "main": "index.js",
+  "dependencies": {
+    "defaults": "^1.0.0"
+  },
+  "devDependencies": {
+    "tape": "^2.13.4"
+  },
+  "engines": { "node": ">=0.8.0" },
+  "licenses": "MIT",
+  "keywords": [
+    "wide character", "wc",
+    "wide character string", "wcs",
+    "terminal", "width",
+    "wcwidth", "wcswidth"
+  ],
+  "directories": {
+    "doc": "doc",
+    "test": "test"
+  },
+  "scripts": {
+    "test": "tape test/*.js"
+  }
+}
diff --git a/test/index.js b/test/index.js
new file mode 100644
index 0000000..ef20934
--- /dev/null
+++ b/test/index.js
@@ -0,0 +1,113 @@
+/*
+ *  test cases for wcwidth
+ */
+
+"use strict"
+
+var wcwidth = require('../')
+var test = require('tape')
+
+
+test('handles regular strings', function (t) {
+    t.strictEqual(wcwidth('abc'), 3)
+    t.end()
+})
+
+test('handles wide strings', function (t) {
+    t.strictEqual(wcwidth('한글字的模块テスト'), 18)
+    t.end()
+})
+
+test('handles wide characters mixed with regular characters', function (t) {
+    t.strictEqual(wcwidth('abc 한글字的模块テスト'), 22)
+    t.end()
+})
+
+test('handles Hangul Jamos', function (t) {
+    t.strictEqual(wcwidth('\u1100\u1175'), 2)          // 가
+    t.strictEqual(wcwidth('\u1112\u1161\u11ab'), 2)    // 한
+    t.strictEqual(wcwidth('\u1100\u1160\u11ab'), 2)    // JUNGSEONG FILLER
+    t.strictEqual(wcwidth('\u115f\u1161'), 2)          // CHOSEONG FILLER
+    t.strictEqual(wcwidth('\u115f\u11ab'), 2)          // CHOSEONG FILLER
+    t.strictEqual(wcwidth('\u115f\u1160\u11ab'), 2)    // CHO/JUNGSEONG FILLER
+    t.strictEqual(wcwidth('\u115f\u1161\u11ab'), 2)    // CHOSEONG FILLER
+    t.strictEqual(wcwidth('\u1161'), 0)                // incomplete
+    t.strictEqual(wcwidth('\u11ab'), 0)                // incomplete
+    t.strictEqual(wcwidth('\u1161\u11ab'), 0)          // incomplete
+    t.strictEqual(wcwidth('\u1160\u11ab'), 0)          // incomplete
+    t.strictEqual(wcwidth('듀ᇰ'), 2)
+    t.end()
+})
+
+test('handle surrogate pairs', function (t) {
+    t.strictEqual(wcwidth('\ud835\udca5\ud835\udcc8'), 2)
+    t.strictEqual(wcwidth('𝒥𝒶𝓋𝒶𝓈𝒸𝓇𝒾𝓅𝓉'), 10)
+    t.strictEqual(wcwidth('\ud840\udc34\ud840\udd58'), 4)
+    t.end()
+})
+
+test('invalid sequences with surrogate high/low values', function (t) {
+    t.strictEqual(wcwidth('\ud835\u0065'), 2)
+    t.strictEqual(wcwidth('\u0065\udcc8'), 2)
+    t.strictEqual(wcwidth('a\ud835\u0065\u0065\udcc8z'), 6)
+    t.end()
+})
+
+test('ignores control characters e.g. \\n', function (t) {
+    t.strictEqual(wcwidth('abc\t한글字的模块テスト\ndef'), 24)
+    t.end()
+})
+
+test('ignores bad input', function (t) {
+    t.strictEqual(wcwidth(''), 0)
+    t.strictEqual(wcwidth(3), 0)
+    t.strictEqual(wcwidth({}), 0)
+    t.strictEqual(wcwidth([]), 0)
+    t.strictEqual(wcwidth(), 0)
+    t.end()
+})
+
+test('ignores NUL', function (t) {
+    t.strictEqual(wcwidth(String.fromCharCode(0)), 0)
+    t.strictEqual(wcwidth('\0'), 0)
+    t.end()
+})
+
+test('ignores NUL mixed with chars', function (t) {
+    t.strictEqual(wcwidth('a' + String.fromCharCode(0) + '\n字的'), 5)
+    t.strictEqual(wcwidth('a\0\n한글'), 5)
+    t.end()
+})
+
+test('can have custom value for NUL', function (t) {
+    t.strictEqual(wcwidth.config({
+        nul: 10
+    })(String.fromCharCode(0) + 'a字的'), 15)
+    t.strictEqual(wcwidth.config({
+        nul: 3
+    })('\0' + 'a한글'), 8)
+    t.end()
+})
+
+test('can have custom control char value', function (t) {
+    t.strictEqual(wcwidth.config({
+        control: 1
+    })('abc\n한글字的模块テスト\ndef'), 26)
+    t.end()
+})
+
+test('negative custom control chars == -1', function (t) {
+    t.strictEqual(wcwidth.config({
+        control: -1
+    })('abc\n한글字的模块テスト\ndef'), -1)
+    t.end()
+})
+
+test('negative custom value for NUL == -1', function (t) {
+    t.strictEqual(wcwidth.config({
+        nul: -1
+    })('abc\n한글字的模块テスト\0def'), -1)
+    t.end()
+})
+
+// end of test cases

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-wcwidth.js.git



More information about the Pkg-javascript-commits mailing list