This file is indexed.

/usr/lib/python3/dist-packages/parsedatetime/pdt_locales/icu.py is in python3-parsedatetime 2.1-3+deb9u1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# -*- encoding: utf-8 -*-

"""
pdt_locales

All of the included locale classes shipped with pdt.
"""
import datetime

try:
    range = xrange
except NameError:
    pass

try:
    import PyICU as pyicu
except:
    pyicu = None


def icu_object(mapping):
    return type('_icu', (object,), mapping)


def merge_weekdays(base_wd, icu_wd):
    result = []
    for left, right in zip(base_wd, icu_wd):
        if left == right:
            result.append(left)
            continue
        left = set(left.split('|'))
        right = set(right.split('|'))
        result.append('|'.join(left | right))
    return result


def get_icu(locale):
    from . import base
    result = dict([(key, getattr(base, key))
                   for key in dir(base) if not key.startswith('_')])
    result['icu'] = None

    if pyicu is None:
        return icu_object(result)

    if locale is None:
        locale = 'en_US'
    result['icu'] = icu = pyicu.Locale(locale)

    if icu is None:
        return icu_object(result)

    # grab spelled out format of all numbers from 0 to 100
    rbnf = pyicu.RuleBasedNumberFormat(pyicu.URBNFRuleSetTag.SPELLOUT, icu)
    result['numbers'].update([(rbnf.format(i), i) for i in range(0, 100)])

    symbols = result['symbols'] = pyicu.DateFormatSymbols(icu)

    # grab ICU list of weekdays, skipping first entry which
    # is always blank
    wd = [w.lower() for w in symbols.getWeekdays()[1:]]
    swd = [sw.lower() for sw in symbols.getShortWeekdays()[1:]]

    # store them in our list with Monday first (ICU puts Sunday first)
    result['Weekdays'] = merge_weekdays(result['Weekdays'],
                                        wd[1:] + wd[0:1])
    result['shortWeekdays'] = merge_weekdays(result['shortWeekdays'],
                                             swd[1:] + swd[0:1])
    result['Months'] = [m.lower() for m in symbols.getMonths()]
    result['shortMonths'] = [sm.lower() for sm in symbols.getShortMonths()]
    keys = ['full', 'long', 'medium', 'short']

    createDateInstance = pyicu.DateFormat.createDateInstance
    createTimeInstance = pyicu.DateFormat.createTimeInstance
    icu_df = result['icu_df'] = {
        'full': createDateInstance(pyicu.DateFormat.kFull, icu),
        'long': createDateInstance(pyicu.DateFormat.kLong, icu),
        'medium': createDateInstance(pyicu.DateFormat.kMedium, icu),
        'short': createDateInstance(pyicu.DateFormat.kShort, icu),
    }
    icu_tf = result['icu_tf'] = {
        'full': createTimeInstance(pyicu.DateFormat.kFull, icu),
        'long': createTimeInstance(pyicu.DateFormat.kLong, icu),
        'medium': createTimeInstance(pyicu.DateFormat.kMedium, icu),
        'short': createTimeInstance(pyicu.DateFormat.kShort, icu),
    }

    result['dateFormats'] = {}
    result['timeFormats'] = {}
    for x in keys:
        result['dateFormats'][x] = icu_df[x].toPattern()
        result['timeFormats'][x] = icu_tf[x].toPattern()

    am = pm = ts = ''

    # ICU doesn't seem to provide directly the date or time separator
    # so we have to figure it out
    o = result['icu_tf']['short']
    s = result['timeFormats']['short']

    result['usesMeridian'] = 'a' in s
    result['uses24'] = 'H' in s

    # '11:45 AM' or '11:45'
    s = o.format(datetime.datetime(2003, 10, 30, 11, 45))

    # ': AM' or ':'
    s = s.replace('11', '').replace('45', '')

    if len(s) > 0:
        ts = s[0]

    if result['usesMeridian']:
        # '23:45 AM' or '23:45'
        am = s[1:].strip()
        s = o.format(datetime.datetime(2003, 10, 30, 23, 45))

        if result['uses24']:
            s = s.replace('23', '')
        else:
            s = s.replace('11', '')

            # 'PM' or ''
        pm = s.replace('45', '').replace(ts, '').strip()

    result['timeSep'] = [ts]
    result['meridian'] = [am, pm] if am and pm else []

    o = result['icu_df']['short']
    s = o.format(datetime.datetime(2003, 10, 30, 11, 45))
    s = s.replace('10', '').replace('30', '').replace(
        '03', '').replace('2003', '')

    if len(s) > 0:
        ds = s[0]
    else:
        ds = '/'

    result['dateSep'] = [ds]
    s = result['dateFormats']['short']
    l = s.lower().split(ds)
    dp_order = []

    for s in l:
        if len(s) > 0:
            dp_order.append(s[:1])

    result['dp_order'] = dp_order
    return icu_object(result)