def evalRanges()

in hgext/pushlog/parsedatetime/__init__.py [0:0]


    def evalRanges(self, datetimeString, sourceTime=None):
        """
        Evaluate the C{datetimeString} text and determine if
        it represents a date or time range.

        @type  datetimeString: string
        @param datetimeString: datetime text to evaluate
        @type  sourceTime:     struct_time
        @param sourceTime:     C{struct_time} value to use as the base

        @rtype:  tuple
        @return: tuple of: start datetime, end datetime and the invalid flag
        """
        rangeFlag = retFlag = 0
        startStr = endStr = ''

        s = datetimeString.strip().lower()

        if self.ptc.rangeSep in s:
            s = s.replace(self.ptc.rangeSep, ' %s ' % self.ptc.rangeSep)
            s = s.replace('  ', ' ')

        for cre, rflag in [(self.ptc.CRE_TIMERNG1, 1),
                           (self.ptc.CRE_TIMERNG2, 2),
                           (self.ptc.CRE_TIMERNG4, 7),
                           (self.ptc.CRE_TIMERNG3, 3),
                           (self.ptc.CRE_DATERNG1, 4),
                           (self.ptc.CRE_DATERNG2, 5),
                           (self.ptc.CRE_DATERNG3, 6)]:
            m = cre.search(s)
            if m is not None:
                rangeFlag = rflag
                break

        debug and log.debug('evalRanges: rangeFlag = %s [%s]', rangeFlag, s)

        if m is not None:
            if (m.group() != s):
                # capture remaining string
                parseStr = m.group()
                chunk1 = s[:m.start()]
                chunk2 = s[m.end():]
                s = '%s %s' % (chunk1, chunk2)

                sourceTime, ctx = self.parse(s, sourceTime,
                                             VERSION_CONTEXT_STYLE)

                if not ctx.hasDateOrTime:
                    sourceTime = None
            else:
                parseStr = s

        if rangeFlag in (1, 2):
            m = re.search(self.ptc.rangeSep, parseStr)
            startStr = parseStr[:m.start()]
            endStr = parseStr[m.start() + 1:]
            retFlag = 2

        elif rangeFlag in (3, 7):
            m = re.search(self.ptc.rangeSep, parseStr)
            # capturing the meridian from the end time
            if self.ptc.usesMeridian:
                ampm = re.search(self.ptc.am[0], parseStr)

                # appending the meridian to the start time
                if ampm is not None:
                    startStr = parseStr[:m.start()] + self.ptc.meridian[0]
                else:
                    startStr = parseStr[:m.start()] + self.ptc.meridian[1]
            else:
                startStr = parseStr[:m.start()]

            endStr = parseStr[m.start() + 1:]
            retFlag = 2

        elif rangeFlag == 4:
            m = re.search(self.ptc.rangeSep, parseStr)
            startStr = parseStr[:m.start()]
            endStr = parseStr[m.start() + 1:]
            retFlag = 1

        elif rangeFlag == 5:
            m = re.search(self.ptc.rangeSep, parseStr)
            endStr = parseStr[m.start() + 1:]

            # capturing the year from the end date
            date = self.ptc.CRE_DATE3.search(endStr)
            endYear = date.group('year')

            # appending the year to the start date if the start date
            # does not have year information and the end date does.
            # eg : "Aug 21 - Sep 4, 2007"
            if endYear is not None:
                startStr = (parseStr[:m.start()]).strip()
                date = self.ptc.CRE_DATE3.search(startStr)
                startYear = date.group('year')

                if startYear is None:
                    startStr = startStr + ', ' + endYear
            else:
                startStr = parseStr[:m.start()]

            retFlag = 1

        elif rangeFlag == 6:
            m = re.search(self.ptc.rangeSep, parseStr)

            startStr = parseStr[:m.start()]

            # capturing the month from the start date
            mth = self.ptc.CRE_DATE3.search(startStr)
            mth = mth.group('mthname')

            # appending the month name to the end date
            endStr = mth + parseStr[(m.start() + 1):]

            retFlag = 1

        else:
            # if range is not found
            startDT = endDT = time.localtime()

        if retFlag:
            startDT, sctx = self.parse(startStr, sourceTime,
                                       VERSION_CONTEXT_STYLE)
            endDT, ectx = self.parse(endStr, sourceTime,
                                     VERSION_CONTEXT_STYLE)

            if not sctx.hasDateOrTime or not ectx.hasDateOrTime:
                retFlag = 0

        return startDT, endDT, retFlag