def parse_terminal(pstate): next_tag = pstate.next_tag() if next_tag is _tag: return make_tag_query(pstate.next_str_and_advance()) elif next_tag is _negtag: return NotQuery(make_tag_query(pstate.next_str_and_advance()[1:])) elif next_tag is _fulltext: return FulltextQuery(pstate.next_str_and_advance()[1:-1]) elif next_tag is _dated: pstate.advance() return DatedQuery() elif next_tag in _STATELESS_TERMINALS: pstate.advance() return _STATELESS_TERMINALS[next_tag] elif next_tag in [_id]: result = IdQuery(int(pstate.next_match_obj().group(1))) pstate.advance() return result elif next_tag in [_before, _after]: from parsedatetime.parsedatetime import Calendar cal = Calendar() timetup = cal.parse(pstate.next_match_obj().group(1)) pstate.advance() import time return DateQuery(next_tag == _before, time.mktime(timetup[0])) else: pstate.expected("terminal")
def _read_reminder_params(user_input, force=False): """ :return: (headers, data), or None (meaning to action required) """ dt = None # Direct input using arguments or asking the user if user_input: res = Calendar().nlp(user_input) if res: dt, flags, start_pos, end_post, matched_text = res[0] user_input = user_input[0:start_pos].strip() else: user_input = input('What\'s the reminder: ') if not dt: date_str = input('When do you want to be reminded (NA to omit date): ') if date_str != "NA": dt,r = Calendar().parseDT(date_str) if r == 0: print('Unrecognizable time text') return date_msg = "" if dt: weekday = WEEKDAYS[dt.weekday()] date_msg = f'on {weekday}, {str(dt.day).zfill(2)}/{str(dt.month).zfill(2)}/{dt.year} at {str(dt.hour).zfill(2)}:{str(dt.minute).zfill(2)}\n' print(f'"{user_input}" {date_msg}') if not force: save = read_yes_no('Do you want to save this?') if force or save: return build_request_params(user_input, dt.year, dt.month, dt.day, dt.hour, dt.minute)
def parse_time(time_string): """Parse a relative time.""" from parsedatetime.parsedatetime import Calendar calendar = Calendar() time_struct, handled = calendar.parse(time_string) if not handled & 2: raise ValueError('could not parse time') return int(time.mktime(time_struct))
def datetime_from_friendly_text(text, locale=None): #: FIXME ugly hack #: WTF!!! parsedatetime is full of bugs. if locale == "zh_CN": text = text.replace(u"个月", "months")\ .replace(u"月", "months") calendar = Calendar(Constants(localeID=locale, usePyICU=False)) time_struct = calendar.parse(text) return datetime.datetime(*time_struct[0][:6])
def parse_time(timestr): """Parses a time string and returns the number of seconds from now to wait """ c = Calendar() result, status = c.parse(timestr) if status == 0: raise ValueError("I don't understand when you want me to do that") timestamp = time.mktime(result) now = time.time() return max(1, timestamp-now)
def parse_time(timestr): """Parses a time string and returns the number of seconds from now to wait """ c = Calendar() result, status = c.parse(timestr) if status == 0: raise ValueError("I don't understand when you want me to do that") timestamp = time.mktime(result) now = time.time() return max(1, timestamp - now)
def clean(self, value): """ Validates that the input can be converted to a time. Returns a Python datetime.time object. """ super(FuzzyTimeField, self).clean(value) if value in EMPTY_VALUES: return None if isinstance(value, datetime.time): return value c = Calendar() parsed = c.parse(value) if parsed[1] == 2: return datetime.time(*parsed[0][3:6]) raise ValidationError(self.error_messages['invalid'])
def date_time_from_str(datetime_str): # from http://stackoverflow.com/a/5903760, updated with more reasonable # variable names. assert datetime, "Unable to parse empty date/time string." parsed_result, date_type = Calendar().parse(datetime_str) parsed_datetime = None # what was returned (based on parsedatetime docs) # 0 = failed to parse # 1 = date (with current time, as a struct_time) # 2 = time (with current date, as a struct_time) # 3 = datetime if date_type == 3: # parsed_result is a datetime parsed_datetime = parsed_result elif date_type in (1, 2): # parsed_result is struct_time parsed_datetime = datetime.datetime(*parsed_result[:6]) else: # Failed to parse raise ValueError("Could not parse date/time string: " + datetime_str) return parsed_datetime
def clean(self, value): """ Validates that the input can be converted to a datetime. Returns a Python datetime.datetime object. """ super(DateTimeField, self).clean(value) if value in EMPTY_VALUES: return None if isinstance(value, datetime.datetime): return value if isinstance(value, datetime.date): return datetime.datetime(value.year, value.month, value.day) if isinstance(value, list): # Input comes from a SplitDateTimeWidget, for example. So, it's two # components: date and time. if len(value) != 2: raise ValidationError(self.error_messages['invalid']) value = '%s %s' % tuple(value) c = Calendar() parsed = c.parse(value) if parsed[1] == 3: return datetime.date(*parsed[0][:6]) raise ValidationError(self.error_messages['invalid'])
import calendar import time import locale import six import re from dateutil.tz import tzlocal from dateutil.parser import parse as dateutil_parse from datetime import datetime, timedelta from parsedatetime.parsedatetime import Calendar locale.setlocale(locale.LC_ALL, '') fuzzy_date_parse = Calendar().parse REMINDER_REGEX = r'^(\d+)([wdhm]?)(?:\s+(popup|email|sms))?$' def parse_reminder(rem): match = re.match(REMINDER_REGEX, rem) if not match: # Allow argparse to generate a message when parsing options return None n = int(match.group(1)) t = match.group(2) m = match.group(3) if t == 'w': n = n * 7 * 24 * 60 elif t == 'd': n = n * 24 * 60 elif t == 'h': n = n * 60
from pyschedules.retrieve import parse_schedules num_args = len(sys.argv) if num_args < 3: print("Please provide a username and password.") sys.exit() username = sys.argv[1] password = sys.argv[2] utc_start = None utc_stop = None if num_args >= 5: utc_start = Calendar.parse(sys.argv[3]) utc_stop = Calendar.parse(sys.argv[4]) class EntityTrigger(IEntityTrigger): __v_station = False __v_lineup = True __v_mapping = False __v_schedule = False __v_program = False __v_crew_member = False __v_genre = False def new_station(self, _id, callSign, name, affiliate, fccChannelNumber): """Callback run for each new station"""
import calendar import time import locale import six import re from dateutil.tz import tzlocal from dateutil.parser import parse as dateutil_parse from datetime import datetime, timedelta from parsedatetime.parsedatetime import Calendar locale.setlocale(locale.LC_ALL, '') fuzzy_date_parse = Calendar().parse fuzzy_datetime_parse = Calendar().parseDT REMINDER_REGEX = r'^(\d+)([wdhm]?)(?:\s+(popup|email|sms))?$' DURATION_REGEX = re.compile( r'^((?P<days>[\.\d]+?)(?:d|day|days))?[ :]*' r'((?P<hours>[\.\d]+?)(?:h|hour|hours))?[ :]*' r'((?P<minutes>[\.\d]+?)(?:m|min|mins|minute|minutes))?[ :]*' r'((?P<seconds>[\.\d]+?)(?:s|sec|secs|second|seconds))?$' ) def parse_reminder(rem): match = re.match(REMINDER_REGEX, rem) if not match: # Allow argparse to generate a message when parsing options return None
def execute(pagename, request, fieldname='value', titlesearch=0, statistic=0): _ = request.getText titlesearch = checkTitleSearch(request) if titlesearch < 0: check_surge_protect(request, kick=True) # get rid of spammer return advancedsearch = isAdvancedSearch(request) form = request.values # context is relevant only for full search if titlesearch: context = 0 elif advancedsearch: context = 180 # XXX: hardcoded context count for advancedsearch else: context = int(form.get('context', 0)) # Get other form parameters needle = form.get(fieldname, '') case = int(form.get('case', 0)) regex = int(form.get('regex', 0)) # no interface currently hitsFrom = int(form.get('from', 0)) mtime = None msg = '' historysearch = 0 # if advanced search is enabled we construct our own search query if advancedsearch: and_terms = form.get('and_terms', '').strip() or_terms = form.get('or_terms', '').strip() not_terms = form.get('not_terms', '').strip() #xor_terms = form.get('xor_terms', '').strip() categories = form.getlist('categories') or [''] timeframe = form.get('time', '').strip() language = form.getlist('language') or [''] mimetype = form.getlist('mimetype') or [0] excludeunderlay = form.get('excludeunderlay', 0) nosystemitems = form.get('nosystemitems', 0) historysearch = form.get('historysearch', 0) mtime = form.get('mtime', '') if mtime: mtime_parsed = None # get mtime from known date/time formats for fmt in (request.user.datetime_fmt, request.cfg.datetime_fmt, request.user.date_fmt, request.cfg.date_fmt): try: mtime_parsed = time.strptime(mtime, fmt) except ValueError: continue else: break if mtime_parsed: mtime = time.mktime(mtime_parsed) else: # didn't work, let's try parsedatetime cal = Calendar() mtime_parsed, parsed_what = cal.parse(mtime) # XXX it is unclear if usage of localtime here and in parsedatetime module is correct. # time.localtime is the SERVER's local time and of no relevance to the user (being # somewhere in the world) # mktime is reverse function for localtime, so this maybe fixes it again!? if parsed_what > 0 and mtime_parsed <= time.localtime(): mtime = time.mktime(mtime_parsed) else: mtime_parsed = None # we don't use invalid stuff # show info if mtime_parsed: # XXX mtime_msg is not shown in some cases mtime_msg = _( "(!) Only pages changed since '''%s''' are being displayed!", wiki=True) % request.user.getFormattedDateTime(mtime) else: mtime_msg = _( '/!\\ The modification date you entered was not ' 'recognized and is therefore not considered for the ' 'search results!', wiki=True) else: mtime_msg = None word_re = re.compile(r'(\"[\w\s]+"|\w+)') needle = '' if categories[0]: needle += 'category:%s ' % ','.join(categories) if language[0]: needle += 'language:%s ' % ','.join(language) if mimetype[0]: needle += 'mimetype:%s ' % ','.join(mimetype) if excludeunderlay: needle += '-domain:underlay ' if nosystemitems: needle += '-domain:system ' if and_terms: needle += '(%s) ' % and_terms if not_terms: needle += '(%s) ' % ' '.join( ['-%s' % t for t in word_re.findall(not_terms)]) if or_terms: needle += '(%s) ' % ' or '.join(word_re.findall(or_terms)) # check for sensible search term stripped = needle.strip() if len(stripped) == 0: request.theme.add_msg( _( 'Please use a more selective search term instead ' 'of {{{"%s"}}}', wiki=True) % wikiutil.escape(needle), "error") Page(request, pagename).send_page() return needle = stripped # Setup for type of search if titlesearch: title = _('Title Search: "%s"') sort = 'page_name' else: if advancedsearch: title = _('Advanced Search: "%s"') else: title = _('Full Text Search: "%s"') sort = 'weight' # search the pages from MoinMoin.search import searchPages, QueryParser, QueryError try: query = QueryParser(case=case, regex=regex, titlesearch=titlesearch).parse_query(needle) except QueryError: # catch errors in the search query request.theme.add_msg( _( 'Your search query {{{"%s"}}} is invalid. Please refer to ' 'HelpOnSearching for more information.', wiki=True, percent=True) % wikiutil.escape(needle), "error") Page(request, pagename).send_page() return results = searchPages(request, query, sort, mtime, historysearch) # directly show a single hit for title searches # this is the "quick jump" functionality if you don't remember # the pagename exactly, but just some parts of it if titlesearch and len(results.hits) == 1: page = results.hits[0] if not page.attachment: # we did not find an attachment page = Page(request, page.page_name) highlight = query.highlight_re() if highlight: querydict = {'highlight': highlight} else: querydict = {} url = page.url(request, querystr=querydict) request.http_redirect(url) return if not results.hits: # no hits? f = request.formatter querydict = dict(wikiutil.parseQueryString(request.query_string)) querydict.update({'titlesearch': 0}) request.theme.add_msg( _( 'Your search query {{{"%s"}}} didn\'t return any results. ' 'Please change some terms and refer to HelpOnSearching for ' 'more information.%s', wiki=True, percent=True) % (wikiutil.escape(needle), titlesearch and ''.join([ '<br>', _('(!) Consider performing a', wiki=True), ' ', f.url(1, href=request.page.url(request, querydict, escape=0)), _('full-text search with your search terms'), f.url(0), '.', ]) or ''), "error") Page(request, pagename).send_page() return # This action generates data using the user language request.setContentLanguage(request.lang) request.theme.send_title(title % needle, pagename=pagename) # Start content (important for RTL support) request.write(request.formatter.startContent("content")) # Hints f = request.formatter hints = [] if titlesearch: querydict = dict(wikiutil.parseQueryString(request.query_string)) querydict.update({'titlesearch': 0}) hints.append(''.join([ _( "(!) You're performing a title search that might not include" ' all related results of your search query in this wiki. <<BR>>', wiki=True), ' ', f.url(1, href=request.page.url(request, querydict, escape=0)), f.text( _('Click here to perform a full-text search with your ' 'search terms!')), f.url(0), ])) if advancedsearch and mtime_msg: hints.append(mtime_msg) if hints: request.write(searchHints(f, hints)) # Search stats request.write(results.stats(request, request.formatter, hitsFrom)) # Then search results info = not titlesearch if context: output = results.pageListWithContext(request, request.formatter, info=info, context=context, hitsFrom=hitsFrom, hitsInfo=1) else: output = results.pageList(request, request.formatter, info=info, hitsFrom=hitsFrom, hitsInfo=1) request.write(output) request.write(request.formatter.endContent()) request.theme.send_footer(pagename) request.theme.send_closing_html()
def fuzzydtparse(request): """ Attempts to parse a natural-language date/time string and return a formatted representation of the parsed date/time. The returned representations are formatted using django's php-style datetime formatting facilities. See http://docs.djangoproject.com/en/dev/ref/templates/builtins/#now for a full specification GET/POST arguments: dtstring *(required)* The natural-language date and/or time string to parse. dateformat (optional) A format specifier string used to format the returned representation if it is determined to be a date instance. The default format is 'l, F jS Y', which produces values like 'Thursday, October 1st 2009'. timeformat (optional) A format specifier string used to format the returned representation if it is determined to be a time instance. The default format is 'P', which produces values like '6:26 p.m.'. dtformat (optional) A format specifier string used to format the returned representation if it is determined to be a datetime instance. The default format is 'l, F jS Y, P', which produces values like 'Thursday, October 1st 2009, 6:26 p.m.'. require (optional) One of 'date', 'time', 'datetime'. If the parsed value is not of the specified type, the view will return 400/Bad Request callback (optional) JSONP callback. Returns a json dictionary containing two values: type An string indicating the kind of representation returned. One of 'date', 'time', or 'datetime' parsed A string representation of the parsed datetime. Invalid / unparsable datetimes will return 400/Bad Request. """ try: dtstring = request.REQUEST['dtstring'] except KeyError: return HttpResponseBadRequest() kind = { 'date': 1, 'time': 2, 'datetime': 3 } dateformat = request.REQUEST.get('dateformat', 'l, F jS Y' ) timeformat = request.REQUEST.get('timeformat', 'P') dtformat = request.REQUEST.get('dtformat', 'l, F jS Y, P') require = request.REQUEST.get('require', None) callback = request.REQUEST.get('callback', None) if require and require not in kind: return HttpResponseBadRequest() c = Calendar() # TODO: possible security hole? parsed = c.parse(dtstring) if parsed[1] == 0: return HttpResponseBadRequest() parsed_dt = datetime.datetime(*parsed[0][:6]) response_dict = {} if require and parsed[1] != kind[require]: return HttpResponseBadRequest() try: if parsed[1] == 1: response_dict['type'] = 'date' response_dict['parsed'] = format(parsed_dt, dateformat) elif parsed[1] == 2: response_dict['type'] = 'time' response_dict['parsed'] = format(parsed_dt, timeformat) elif parsed[1] == 3: response_dict['type'] = 'datetime' response_dict['parsed'] = format(parsed_dt, dtformat) else: #should never be here return HttpResponseBadRequest() except: return HttpResponseBadRequest() if callback: resp = "%s(%s)" % (callback, json.dumps(response_dict)) else: resp = json.dumps(response_dict) return HttpResponse(resp, mimetype='application/javascript')
def execute(pagename, request, fieldname='value', titlesearch=0, statistic=0): _ = request.getText titlesearch = checkTitleSearch(request) if titlesearch < 0: check_surge_protect(request, kick=True) # get rid of spammer return if 'metasearch' in request.values: form = MultiDict(request.values) form['action'] = 'MetaSearch' val = form.get('value', '') form['q'] = val request.values = CombinedMultiDict([MultiDict(form)]) return ms_execute(pagename, request) advancedsearch = isAdvancedSearch(request) form = request.values # context is relevant only for full search if titlesearch: context = 0 elif advancedsearch: context = 180 # XXX: hardcoded context count for advancedsearch else: context = int(form.get('context', 0)) # Get other form parameters needle = form.get(fieldname, '') case = int(form.get('case', 0)) regex = int(form.get('regex', 0)) # no interface currently hitsFrom = int(form.get('from', 0)) highlight_titles = int(form.get('highlight_titles', 1)) highlight_pages = int(form.get('highlight_pages', 1)) mtime = None msg = '' historysearch = 0 # if advanced search is enabled we construct our own search query if advancedsearch: and_terms = form.get('and_terms', '').strip() or_terms = form.get('or_terms', '').strip() not_terms = form.get('not_terms', '').strip() #xor_terms = form.get('xor_terms', '').strip() categories = form.getlist('categories') or [''] timeframe = form.get('time', '').strip() language = form.getlist('language') or [''] mimetype = form.getlist('mimetype') or [0] excludeunderlay = form.get('excludeunderlay', 0) nosystemitems = form.get('nosystemitems', 0) historysearch = form.get('historysearch', 0) mtime = form.get('mtime', '') if mtime: mtime_parsed = None # get mtime from known date/time formats for fmt in (request.user.datetime_fmt, request.cfg.datetime_fmt, request.user.date_fmt, request.cfg.date_fmt): try: mtime_parsed = time.strptime(mtime, fmt) except ValueError: continue else: break if mtime_parsed: mtime = time.mktime(mtime_parsed) else: # didn't work, let's try parsedatetime cal = Calendar() mtime_parsed, parsed_what = cal.parse(mtime) # XXX it is unclear if usage of localtime here and in parsedatetime module is correct. # time.localtime is the SERVER's local time and of no relevance to the user (being # somewhere in the world) # mktime is reverse function for localtime, so this maybe fixes it again!? if parsed_what > 0 and mtime_parsed <= time.localtime(): mtime = time.mktime(mtime_parsed) else: mtime_parsed = None # we don't use invalid stuff # show info if mtime_parsed: # XXX mtime_msg is not shown in some cases mtime_msg = _("(!) Only pages changed since '''%s''' are being displayed!", wiki=True) % request.user.getFormattedDateTime(mtime) else: mtime_msg = _('/!\\ The modification date you entered was not ' 'recognized and is therefore not considered for the ' 'search results!', wiki=True) else: mtime_msg = None word_re = re.compile(r'(\"[\w\s]+"|\w+)', re.UNICODE) needle = '' if categories[0]: needle += 'category:%s ' % ','.join(categories) if language[0]: needle += 'language:%s ' % ','.join(language) if mimetype[0]: needle += 'mimetype:%s ' % ','.join(mimetype) if excludeunderlay: needle += '-domain:underlay ' if nosystemitems: needle += '-domain:system ' if and_terms: needle += '(%s) ' % and_terms if not_terms: needle += '(%s) ' % ' '.join(['-%s' % t for t in word_re.findall(not_terms)]) if or_terms: needle += '(%s) ' % ' or '.join(word_re.findall(or_terms)) # check for sensible search term stripped = needle.strip() if len(stripped) == 0: request.theme.add_msg(_('Please use a more selective search term instead ' 'of {{{"%s"}}}', wiki=True) % wikiutil.escape(needle), "error") Page(request, pagename).send_page() return needle = stripped # Setup for type of search if titlesearch: title = _('Title Search: "%s"') sort = 'page_name' else: if advancedsearch: title = _('Advanced Search: "%s"') else: title = _('Full Text Search: "%s"') sort = 'weight' # search the pages from MoinMoin.search import searchPages, QueryParser, QueryError try: query = QueryParser(case=case, regex=regex, titlesearch=titlesearch).parse_query(needle) except QueryError: # catch errors in the search query request.theme.add_msg(_('Your search query {{{"%s"}}} is invalid. Please refer to ' 'HelpOnSearching for more information.', wiki=True, percent=True) % wikiutil.escape(needle), "error") Page(request, pagename).send_page() return results = searchPages(request, query, sort, mtime, historysearch) # directly show a single hit for title searches # this is the "quick jump" functionality if you don't remember # the pagename exactly, but just some parts of it if titlesearch and len(results.hits) == 1: page = results.hits[0] if not page.attachment: # we did not find an attachment page = Page(request, page.page_name) querydict = {} if highlight_pages: highlight = query.highlight_re() if highlight: querydict.update({'highlight': highlight}) url = page.url(request, querystr=querydict) request.http_redirect(url) return if not results.hits: # no hits? f = request.formatter querydict = wikiutil.parseQueryString(request.query_string).to_dict() querydict.update({'titlesearch': 0}) request.theme.add_msg(_('Your search query {{{"%s"}}} didn\'t return any results. ' 'Please change some terms and refer to HelpOnSearching for ' 'more information.%s', wiki=True, percent=True) % (wikiutil.escape(needle), titlesearch and ''.join([ '<br>', _('(!) Consider performing a', wiki=True), ' ', f.url(1, href=request.page.url(request, querydict, escape=0)), _('full-text search with your search terms'), f.url(0), '.', ]) or ''), "error") Page(request, pagename).send_page() return # This action generates data using the user language request.setContentLanguage(request.lang) request.theme.send_title(title % needle, pagename=pagename) # Start content (important for RTL support) request.write(request.formatter.startContent("content")) # Hints f = request.formatter hints = [] if titlesearch: querydict = wikiutil.parseQueryString(request.query_string).to_dict() querydict.update({'titlesearch': 0}) hints.append(''.join([ _("(!) You're performing a title search that might not include" ' all related results of your search query in this wiki. <<BR>>', wiki=True), ' ', f.url(1, href=request.page.url(request, querydict, escape=0)), f.text(_('Click here to perform a full-text search with your ' 'search terms!')), f.url(0), ])) if advancedsearch and mtime_msg: hints.append(mtime_msg) if hints: request.write(searchHints(f, hints)) # Search stats request.write(results.stats(request, request.formatter, hitsFrom)) # Then search results info = not titlesearch if context: output = results.pageListWithContext(request, request.formatter, info=info, context=context, hitsFrom=hitsFrom, hitsInfo=1, highlight_titles=highlight_titles, highlight_pages=highlight_pages) else: output = results.pageList(request, request.formatter, info=info, hitsFrom=hitsFrom, hitsInfo=1, highlight_titles=highlight_titles, highlight_pages=highlight_pages) request.write(output) request.write(request.formatter.endContent()) request.theme.send_footer(pagename) request.theme.send_closing_html()
from pyschedules.retrieve import parse_schedules num_args = len(sys.argv) if num_args < 3: print("Please provide a username and password.") sys.exit() username = sys.argv[1] password = sys.argv[2] utc_start = None utc_stop = None if num_args >= 5: utc_start = Calendar.parse(sys.argv[3]) utc_stop = Calendar.parse(sys.argv[4]) class EntityTrigger(IEntityTrigger): __v_station = False __v_lineup = True __v_mapping = False __v_schedule = False __v_program = False __v_crew_member = False __v_genre = False def new_station(self, _id, callSign, name, affiliate, fccChannelNumber): """Callback run for each new station""" if self.__v_station: