647 fmt = None |
648 fmt = None |
648 if len(args) == 2: |
649 if len(args) == 2: |
649 fmt = evalstring(context, mapping, args[1]) |
650 fmt = evalstring(context, mapping, args[1]) |
650 try: |
651 try: |
651 if fmt is None: |
652 if fmt is None: |
652 return util.datestr(date) |
653 return dateutil.datestr(date) |
653 else: |
654 else: |
654 return util.datestr(date, fmt) |
655 return dateutil.datestr(date, fmt) |
655 except (TypeError, ValueError): |
656 except (TypeError, ValueError): |
656 # i18n: "date" is a keyword |
657 # i18n: "date" is a keyword |
657 raise error.ParseError(_("date expects a date information")) |
658 raise error.ParseError(_("date expects a date information")) |
658 |
659 |
659 @templatefunc('dict([[key=]value...])', argspec='*args **kwargs') |
660 @templatefunc('dict([[key=]value...])', argspec='*args **kwargs') |
952 # i18n: "localdate" is a keyword |
953 # i18n: "localdate" is a keyword |
953 raise error.ParseError(_("localdate expects one or two arguments")) |
954 raise error.ParseError(_("localdate expects one or two arguments")) |
954 |
955 |
955 date = evalfuncarg(context, mapping, args[0]) |
956 date = evalfuncarg(context, mapping, args[0]) |
956 try: |
957 try: |
957 date = util.parsedate(date) |
958 date = dateutil.parsedate(date) |
958 except AttributeError: # not str nor date tuple |
959 except AttributeError: # not str nor date tuple |
959 # i18n: "localdate" is a keyword |
960 # i18n: "localdate" is a keyword |
960 raise error.ParseError(_("localdate expects a date information")) |
961 raise error.ParseError(_("localdate expects a date information")) |
961 if len(args) >= 2: |
962 if len(args) >= 2: |
962 tzoffset = None |
963 tzoffset = None |
963 tz = evalfuncarg(context, mapping, args[1]) |
964 tz = evalfuncarg(context, mapping, args[1]) |
964 if isinstance(tz, bytes): |
965 if isinstance(tz, bytes): |
965 tzoffset, remainder = util.parsetimezone(tz) |
966 tzoffset, remainder = dateutil.parsetimezone(tz) |
966 if remainder: |
967 if remainder: |
967 tzoffset = None |
968 tzoffset = None |
968 if tzoffset is None: |
969 if tzoffset is None: |
969 try: |
970 try: |
970 tzoffset = int(tz) |
971 tzoffset = int(tz) |
971 except (TypeError, ValueError): |
972 except (TypeError, ValueError): |
972 # i18n: "localdate" is a keyword |
973 # i18n: "localdate" is a keyword |
973 raise error.ParseError(_("localdate expects a timezone")) |
974 raise error.ParseError(_("localdate expects a timezone")) |
974 else: |
975 else: |
975 tzoffset = util.makedate()[1] |
976 tzoffset = dateutil.makedate()[1] |
976 return (date[0], tzoffset) |
977 return (date[0], tzoffset) |
977 |
978 |
978 @templatefunc('max(iterable)') |
979 @templatefunc('max(iterable)') |
979 def max_(context, mapping, args, **kwargs): |
980 def max_(context, mapping, args, **kwargs): |
980 """Return the max of an iterable""" |
981 """Return the max of an iterable""" |