lib: use Period for rendering DateSpans
This commit is contained in:
		
							parent
							
								
									94537f30d4
								
							
						
					
					
						commit
						7d81adcefa
					
				| @ -21,6 +21,8 @@ with both ends unspecified matches all dates.) | ||||
| An 'Interval' is ledger's \"reporting interval\" - weekly, monthly, | ||||
| quarterly, etc. | ||||
| 
 | ||||
| 'Period' will probably replace DateSpan in due course. | ||||
| 
 | ||||
| -} | ||||
| 
 | ||||
| -- XXX fromGregorian silently clips bad dates, use fromGregorianValid instead ? | ||||
| @ -80,7 +82,6 @@ import System.Locale (TimeLocale, defaultTimeLocale) | ||||
| #endif | ||||
| import Data.Time.Calendar | ||||
| import Data.Time.Calendar.OrdinalDate | ||||
| import Data.Time.Calendar.WeekDate | ||||
| import Data.Time.Clock | ||||
| import Data.Time.LocalTime | ||||
| import Safe (headMay, lastMay, readMay) | ||||
| @ -89,6 +90,7 @@ import Text.Megaparsec.Text | ||||
| import Text.Printf | ||||
| 
 | ||||
| import Hledger.Data.Types | ||||
| import Hledger.Data.Period | ||||
| import Hledger.Utils | ||||
| 
 | ||||
| 
 | ||||
| @ -100,65 +102,10 @@ instance Show DateSpan where | ||||
| showDate :: Day -> String | ||||
| showDate = formatTime defaultTimeLocale "%0C%y/%m/%d" | ||||
| 
 | ||||
| -- XXX review for more boundary crossing issues | ||||
| -- | Render a datespan as a display string, abbreviating into a | ||||
| -- compact form if possible. | ||||
| showDateSpan ds@(DateSpan (Just from) (Just to)) = | ||||
|   case (toGregorian from, toGregorian to) of | ||||
|     -- special cases we can abbreviate: | ||||
|     -- a year, YYYY | ||||
|     ((fy,1,1), (ty,1,1))   | fy+1==ty           -> formatTime defaultTimeLocale "%0C%y" from | ||||
|     -- a half, YYYYhN | ||||
|     ((fy,1,1), (ty,7,1))   | fy==ty             -> formatTime defaultTimeLocale "%0C%yh1" from | ||||
|     ((fy,7,1), (ty,1,1))   | fy+1==ty           -> formatTime defaultTimeLocale "%0C%yh2" from | ||||
|     -- a quarter, YYYYqN | ||||
|     ((fy,1,1), (ty,4,1))   | fy==ty             -> formatTime defaultTimeLocale "%0C%yq1" from | ||||
|     ((fy,4,1), (ty,7,1))   | fy==ty             -> formatTime defaultTimeLocale "%0C%yq2" from | ||||
|     ((fy,7,1), (ty,10,1))  | fy==ty             -> formatTime defaultTimeLocale "%0C%yq3" from | ||||
|     ((fy,10,1), (ty,1,1))  | fy+1==ty           -> formatTime defaultTimeLocale "%0C%yq4" from | ||||
|     -- a month, YYYY/MM | ||||
|     ((fy,fm,1), (ty,tm,1)) | fy==ty && fm+1==tm -> formatTime defaultTimeLocale "%0C%y/%m" from | ||||
|     ((fy,12,1), (ty,1,1))  | fy+1==ty           -> formatTime defaultTimeLocale "%0C%y/%m" from | ||||
|     -- a week (two successive mondays), | ||||
|     -- YYYYwN ("week N of year YYYY") | ||||
|     -- _ | let ((fy,fw,fd), (ty,tw,td)) = (toWeekDate from, toWeekDate to) in fy==ty && fw+1==tw && fd==1 && td==1 | ||||
|     --                                             -> formatTime defaultTimeLocale "%0f%gw%V" from | ||||
|     -- YYYY/MM/DDwN ("week N, starting on YYYY/MM/DD") | ||||
|     _ | let ((fy,fw,fd), (ty,tw,td)) = (toWeekDate from, toWeekDate (addDays (-1) to)) in fy==ty && fw==tw && fd==1 && td==7 | ||||
|                                                 -> formatTime defaultTimeLocale "%0C%y/%m/%dw%V" from | ||||
|     -- a day, YYYY/MM/DDd (d suffix is to distinguish from a regular date in register) | ||||
|     ((fy,fm,fd), (ty,tm,td)) | fy==ty && fm==tm && fd+1==td -> formatTime defaultTimeLocale "%0C%y/%m/%dd" from | ||||
|     -- ((fy,fm,fd), (ty,tm,td)) | fy==ty && fm==tm && fd+1==td -> formatTime defaultTimeLocale "%0C%y/%m/%d" from -- try without the d | ||||
|     -- crossing a year boundary | ||||
|     ((fy,fm,fd), (ty,tm,td)) | fy+1==ty && fm==12 && tm==1 && fd==31 && td==1 -> formatTime defaultTimeLocale "%0C%y/%m/%dd" from | ||||
|     -- crossing a month boundary XXX wrongly shows LEAPYEAR/2/28-LEAPYEAR/3/1 as LEAPYEAR/2/28 | ||||
|     ((fy,fm,fd), (ty,tm,td)) | fy==ty && fm+1==tm && fd `elem` fromMaybe [] (lookup fm lastdayofmonth) && td==1 -> formatTime defaultTimeLocale "%0C%y/%m/%dd" from | ||||
|     -- otherwise, YYYY/MM/DD-YYYY/MM/DD | ||||
|     _                                           -> showDateSpan' ds | ||||
|   where lastdayofmonth = [(1,[31]) | ||||
|                          ,(2,[28,29]) | ||||
|                          ,(3,[31]) | ||||
|                          ,(4,[30]) | ||||
|                          ,(5,[31]) | ||||
|                          ,(6,[30]) | ||||
|                          ,(7,[31]) | ||||
|                          ,(8,[31]) | ||||
|                          ,(9,[30]) | ||||
|                          ,(10,[31]) | ||||
|                          ,(11,[30]) | ||||
|                          ,(12,[31]) | ||||
|                          ] | ||||
| 
 | ||||
| showDateSpan ds = showDateSpan' ds | ||||
| 
 | ||||
| -- | Render a datespan as a display string like [START]-[ENDINCL] | ||||
| -- (optional start date, hyphen, optional inclusive end date). | ||||
| showDateSpan' (DateSpan from to) = | ||||
|   concat | ||||
|     [maybe "" showDate from | ||||
|     ,"-" | ||||
|     ,maybe "" (showDate . prevday) to | ||||
|     ] | ||||
| showDateSpan :: DateSpan -> String | ||||
| showDateSpan = showPeriod . dateSpanAsPeriod | ||||
| 
 | ||||
| -- | Get the current local date. | ||||
| getCurrentDay :: IO Day | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| {-| | ||||
| 
 | ||||
| Manipulating the time periods typically used for reports | ||||
| using Period, a richer abstraction than DateSpan. | ||||
| Manipulate the time periods typically used for reports with Period, | ||||
| a richer abstraction that will probably replace DateSpan. | ||||
| See also Types and Dates. | ||||
| 
 | ||||
| -} | ||||
| @ -11,9 +11,10 @@ where | ||||
| 
 | ||||
| import Data.Time.Calendar | ||||
| import Data.Time.Calendar.WeekDate | ||||
| import Data.Time.Format | ||||
| import Text.Printf | ||||
| 
 | ||||
| import Hledger.Data.Types | ||||
| import Hledger.Data.Dates () -- DateSpan Show instance | ||||
| 
 | ||||
| -- | Convert Periods to DateSpans. | ||||
| -- | ||||
| @ -116,3 +117,18 @@ isLastDayOfMonth y m d = | ||||
|     12 -> d==31 | ||||
|     _ -> False | ||||
| 
 | ||||
| -- | Render a period as a compact display string suitable for user output. | ||||
| -- | ||||
| -- >>> showPeriod (WeekPeriod (fromGregorian 2016 7 25)) | ||||
| -- "2016/07/25w30" | ||||
| showPeriod (DayPeriod b)       = formatTime defaultTimeLocale "%0C%y/%m/%dd" b    -- DATEd | ||||
| showPeriod (WeekPeriod b)      = formatTime defaultTimeLocale "%0C%y/%m/%dw%V" b  -- STARTDATEwYEARWEEK | ||||
| showPeriod (MonthPeriod y m)   = printf "%04d/%02d" y m                           -- YYYY/MM | ||||
| showPeriod (QuarterPeriod y q) = printf "%04dq%d" y q                             -- YYYYqN | ||||
| showPeriod (YearPeriod y)      = printf "%04d" y                                  -- YYYY | ||||
| showPeriod (PeriodBetween b e) = formatTime defaultTimeLocale "%0C%y/%m/%d" b | ||||
|                                  ++ formatTime defaultTimeLocale "-%0C%y/%m/%d" (addDays (-1) e) -- STARTDATE-INCLUSIVEENDDATE | ||||
| showPeriod (PeriodFrom b)      = formatTime defaultTimeLocale "%0C%y/%m/%d-" b                   -- STARTDATE- | ||||
| showPeriod (PeriodTo e)        = formatTime defaultTimeLocale "-%0C%y/%m/%d" (addDays (-1) e)    -- -INCLUSIVEENDDATE | ||||
| showPeriod PeriodAll           = "-" | ||||
| 
 | ||||
|  | ||||
| @ -120,9 +120,10 @@ library: | ||||
|     - Hledger.Data.Dates | ||||
|     - Hledger.Data.Journal | ||||
|     - Hledger.Data.Ledger | ||||
|     - Hledger.Data.StringFormat | ||||
|     - Hledger.Data.Period | ||||
|     - Hledger.Data.Posting | ||||
|     - Hledger.Data.RawOptions | ||||
|     - Hledger.Data.StringFormat | ||||
|     - Hledger.Data.Timeclock | ||||
|     - Hledger.Data.Transaction | ||||
|     - Hledger.Data.Types | ||||
|  | ||||
| @ -109,6 +109,7 @@ library | ||||
|       Hledger.Data.Dates | ||||
|       Hledger.Data.Journal | ||||
|       Hledger.Data.Ledger | ||||
|       Hledger.Data.Period | ||||
|       Hledger.Data.StringFormat | ||||
|       Hledger.Data.Posting | ||||
|       Hledger.Data.RawOptions | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user