# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# adapted from http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
# -thepaul

# This is an implementation of wcwidth() and wcswidth() (defined in
# IEEE Std 1002.1-2001) for Unicode.
#
# http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html
# http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html
#
# In fixed-width output devices, Latin characters all occupy a single
# "cell" position of equal width, whereas ideographic CJK characters
# occupy two such cells. Interoperability between terminal-line
# applications and (teletype-style) character terminals using the
# UTF-8 encoding 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.
#
# 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/
#
# Markus Kuhn -- 2007-05-26 (Unicode 5.0)
#
# Permission to use, copy, modify, and distribute this software
# for any purpose and without fee is hereby granted. The author
# disclaims all warranties with regard to this software.
#
# Latest C version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c

# auxiliary function for binary search in interval table


def bisearch(ucs, table):
    min = 0
    max = len(table) - 1
    if ucs < table[0][0] or ucs > table[max][1]:
        return 0
    while max >= min:
        mid = (min + max) / 2
        if ucs > table[mid][1]:
            min = mid + 1
        elif ucs < table[mid][0]:
            max = mid - 1
        else:
            return 1
    return 0


# The following two functions define the column width of an ISO 10646
# character as follows:
#
#    - The null character (U+0000) has a column width of 0.
#
#    - Other C0/C1 control characters and DEL will lead to a return
#      value of -1.
#
#    - Non-spacing and enclosing combining characters (general
#      category code 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 have a column width of 2.
#
#    - All remaining characters (including all printable
#      ISO 8859-1 and WGL4 characters, Unicode control characters,
#      etc.) have a column width of 1.
#
# This implementation assumes that wchar_t characters are encoded
# in ISO 10646.

# sorted list of non-overlapping intervals of non-spacing characters
# generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c"
combining = (
    (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)
)


# sorted list of non-overlapping intervals of East Asian Ambiguous
# characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c"
ambiguous = (
    (0x00A1, 0x00A1), (0x00A4, 0x00A4), (0x00A7, 0x00A8),
    (0x00AA, 0x00AA), (0x00AE, 0x00AE), (0x00B0, 0x00B4),
    (0x00B6, 0x00BA), (0x00BC, 0x00BF), (0x00C6, 0x00C6),
    (0x00D0, 0x00D0), (0x00D7, 0x00D8), (0x00DE, 0x00E1),
    (0x00E6, 0x00E6), (0x00E8, 0x00EA), (0x00EC, 0x00ED),
    (0x00F0, 0x00F0), (0x00F2, 0x00F3), (0x00F7, 0x00FA),
    (0x00FC, 0x00FC), (0x00FE, 0x00FE), (0x0101, 0x0101),
    (0x0111, 0x0111), (0x0113, 0x0113), (0x011B, 0x011B),
    (0x0126, 0x0127), (0x012B, 0x012B), (0x0131, 0x0133),
    (0x0138, 0x0138), (0x013F, 0x0142), (0x0144, 0x0144),
    (0x0148, 0x014B), (0x014D, 0x014D), (0x0152, 0x0153),
    (0x0166, 0x0167), (0x016B, 0x016B), (0x01CE, 0x01CE),
    (0x01D0, 0x01D0), (0x01D2, 0x01D2), (0x01D4, 0x01D4),
    (0x01D6, 0x01D6), (0x01D8, 0x01D8), (0x01DA, 0x01DA),
    (0x01DC, 0x01DC), (0x0251, 0x0251), (0x0261, 0x0261),
    (0x02C4, 0x02C4), (0x02C7, 0x02C7), (0x02C9, 0x02CB),
    (0x02CD, 0x02CD), (0x02D0, 0x02D0), (0x02D8, 0x02DB),
    (0x02DD, 0x02DD), (0x02DF, 0x02DF), (0x0391, 0x03A1),
    (0x03A3, 0x03A9), (0x03B1, 0x03C1), (0x03C3, 0x03C9),
    (0x0401, 0x0401), (0x0410, 0x044F), (0x0451, 0x0451),
    (0x2010, 0x2010), (0x2013, 0x2016), (0x2018, 0x2019),
    (0x201C, 0x201D), (0x2020, 0x2022), (0x2024, 0x2027),
    (0x2030, 0x2030), (0x2032, 0x2033), (0x2035, 0x2035),
    (0x203B, 0x203B), (0x203E, 0x203E), (0x2074, 0x2074),
    (0x207F, 0x207F), (0x2081, 0x2084), (0x20AC, 0x20AC),
    (0x2103, 0x2103), (0x2105, 0x2105), (0x2109, 0x2109),
    (0x2113, 0x2113), (0x2116, 0x2116), (0x2121, 0x2122),
    (0x2126, 0x2126), (0x212B, 0x212B), (0x2153, 0x2154),
    (0x215B, 0x215E), (0x2160, 0x216B), (0x2170, 0x2179),
    (0x2190, 0x2199), (0x21B8, 0x21B9), (0x21D2, 0x21D2),
    (0x21D4, 0x21D4), (0x21E7, 0x21E7), (0x2200, 0x2200),
    (0x2202, 0x2203), (0x2207, 0x2208), (0x220B, 0x220B),
    (0x220F, 0x220F), (0x2211, 0x2211), (0x2215, 0x2215),
    (0x221A, 0x221A), (0x221D, 0x2220), (0x2223, 0x2223),
    (0x2225, 0x2225), (0x2227, 0x222C), (0x222E, 0x222E),
    (0x2234, 0x2237), (0x223C, 0x223D), (0x2248, 0x2248),
    (0x224C, 0x224C), (0x2252, 0x2252), (0x2260, 0x2261),
    (0x2264, 0x2267), (0x226A, 0x226B), (0x226E, 0x226F),
    (0x2282, 0x2283), (0x2286, 0x2287), (0x2295, 0x2295),
    (0x2299, 0x2299), (0x22A5, 0x22A5), (0x22BF, 0x22BF),
    (0x2312, 0x2312), (0x2460, 0x24E9), (0x24EB, 0x254B),
    (0x2550, 0x2573), (0x2580, 0x258F), (0x2592, 0x2595),
    (0x25A0, 0x25A1), (0x25A3, 0x25A9), (0x25B2, 0x25B3),
    (0x25B6, 0x25B7), (0x25BC, 0x25BD), (0x25C0, 0x25C1),
    (0x25C6, 0x25C8), (0x25CB, 0x25CB), (0x25CE, 0x25D1),
    (0x25E2, 0x25E5), (0x25EF, 0x25EF), (0x2605, 0x2606),
    (0x2609, 0x2609), (0x260E, 0x260F), (0x2614, 0x2615),
    (0x261C, 0x261C), (0x261E, 0x261E), (0x2640, 0x2640),
    (0x2642, 0x2642), (0x2660, 0x2661), (0x2663, 0x2665),
    (0x2667, 0x266A), (0x266C, 0x266D), (0x266F, 0x266F),
    (0x273D, 0x273D), (0x2776, 0x277F), (0xE000, 0xF8FF),
    (0xFFFD, 0xFFFD), (0xF0000, 0xFFFFD), (0x100000, 0x10FFFD)
)


def mk_wcwidth(ucs):
    # test for 8-bit control characters
    if ucs == 0:
        return 0
    if ucs < 32 or (ucs >= 0x7f and ucs < 0xa0):
        return -1

    # binary search in table of non-spacing characters
    if bisearch(ucs, combining):
        return 0

    # if we arrive here, ucs is not a combining or C0/C1 control character

    return 1 + \
        int(ucs >= 0x1100 and
            (ucs <= 0x115f or                     # Hangul Jamo init. consonants
             ucs == 0x2329 or ucs == 0x232a or
             (ucs >= 0x2e80 and ucs <= 0xa4cf and
              ucs != 0x303f) or                   # CJK ... Yi
                (ucs >= 0xac00 and ucs <= 0xd7a3) or  # Hangul Syllables
                (ucs >= 0xf900 and ucs <= 0xfaff) or  # CJK Compatibility Ideographs
                (ucs >= 0xfe10 and ucs <= 0xfe19) or  # Vertical forms
                (ucs >= 0xfe30 and ucs <= 0xfe6f) or  # CJK Compatibility Forms
                (ucs >= 0xff00 and ucs <= 0xff60) or  # Fullwidth Forms
                (ucs >= 0xffe0 and ucs <= 0xffe6) or
                (ucs >= 0x20000 and ucs <= 0x2fffd) or
                (ucs >= 0x30000 and ucs <= 0x3fffd)))


def mk_wcswidth(pwcs):
    width = 0
    for c in pwcs:
        w = mk_wcwidth(c)
        if w < 0:
            return -1
        else:
            width += w

    return width


# The following functions are the same as mk_wcwidth() and
# mk_wcswidth(), except that spacing characters in the East Asian
# Ambiguous (A) category as defined in Unicode Technical Report #11
# have a column width of 2. This variant might be useful for users of
# CJK legacy encodings who want to migrate to UCS without changing
# the traditional terminal character-width behaviour. It is not
# otherwise recommended for general use.
def mk_wcwidth_cjk(ucs):
    # binary search in table of non-spacing characters
    if bisearch(ucs, ambiguous):
        return 2

    return mk_wcwidth(ucs)


def mk_wcswidth_cjk(pwcs):
    width = 0

    for c in pwcs:
        w = mk_wcwidth_cjk(c)
        if w < 0:
            return -1
        width += w

    return width

# python-y versions, dealing with unicode objects


def wcwidth(c):
    return mk_wcwidth(ord(c))


def wcswidth(s):
    return mk_wcswidth(map(ord, s))


def wcwidth_cjk(c):
    return mk_wcwidth_cjk(ord(c))


def wcswidth_cjk(s):
    return mk_wcswidth_cjk(map(ord, s))


if __name__ == "__main__":
    samples = (
        ('MUSIC SHARP SIGN', 1),
        ('FULLWIDTH POUND SIGN', 2),
        ('FULLWIDTH LATIN CAPITAL LETTER P', 2),
        ('CJK RADICAL BOLT OF CLOTH', 2),
        ('LATIN SMALL LETTER A', 1),
        ('LATIN SMALL LETTER AE', 1),
        ('SPACE', 1),
        ('NO-BREAK SPACE', 1),
        ('CJK COMPATIBILITY IDEOGRAPH-F920', 2),
        ('MALAYALAM VOWEL SIGN UU', 0),
        ('ZERO WIDTH SPACE', 0),
        ('ZERO WIDTH NO-BREAK SPACE', 0),
        ('COMBINING PALATALIZED HOOK BELOW', 0),
        ('COMBINING GRAVE ACCENT', 0),
    )
    nonprinting = u'\r\n\t\a\b\f\v\x7f'

    import unicodedata

    for name, printwidth in samples:
        uchr = unicodedata.lookup(name)
        calculatedwidth = wcwidth(uchr)
        assert calculatedwidth == printwidth, \
            'width for %r should be %d, but is %d?' % (uchr, printwidth, calculatedwidth)

    for c in nonprinting:
        calculatedwidth = wcwidth(c)
        assert calculatedwidth < 0, \
            '%r is a control character, but wcwidth gives %d' % (c, calculatedwidth)

    assert wcwidth('\0') == 0  # special case

    # depending on how python is compiled, code points above U+FFFF may not be
    # treated as single characters, so ord() won't work. test a few of these
    # manually.

    assert mk_wcwidth(0xe01ef) == 0
    assert mk_wcwidth(0x10ffff) == 1
    assert mk_wcwidth(0x3fffd) == 2

    teststr = u'B\0ig br\u00f8wn moose\ub143\u200b'
    calculatedwidth = wcswidth(teststr)
    assert calculatedwidth == 17, 'expected 17, got %d' % calculatedwidth

    calculatedwidth = wcswidth_cjk(teststr)
    assert calculatedwidth == 18, 'expected 18, got %d' % calculatedwidth

    assert wcswidth(u'foobar\u200b\a') < 0

    print 'tests pass.'
