DateTimeFormat.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /*
  2. * Copyright (c) 2021, Tim Flynn <trflynn89@pm.me>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Optional.h>
  8. #include <AK/String.h>
  9. #include <AK/StringView.h>
  10. #include <AK/Types.h>
  11. #include <AK/Vector.h>
  12. #include <LibUnicode/Forward.h>
  13. namespace Unicode {
  14. enum class Era : u8 {
  15. BC,
  16. AD,
  17. };
  18. enum class Month : u8 {
  19. January,
  20. February,
  21. March,
  22. April,
  23. May,
  24. June,
  25. July,
  26. August,
  27. September,
  28. October,
  29. November,
  30. December,
  31. };
  32. enum class Weekday : u8 {
  33. Sunday,
  34. Monday,
  35. Tuesday,
  36. Wednesday,
  37. Thursday,
  38. Friday,
  39. Saturday,
  40. };
  41. enum class DayPeriod : u8 {
  42. AM,
  43. PM,
  44. Morning1,
  45. Morning2,
  46. Afternoon1,
  47. Afternoon2,
  48. Evening1,
  49. Evening2,
  50. Night1,
  51. Night2,
  52. };
  53. enum class HourCycle : u8 {
  54. H11,
  55. H12,
  56. H23,
  57. H24,
  58. };
  59. enum class CalendarPatternStyle : u8 {
  60. Narrow,
  61. Short,
  62. Long,
  63. Numeric,
  64. TwoDigit,
  65. };
  66. struct CalendarPattern {
  67. enum class Field {
  68. Era,
  69. Year,
  70. Month,
  71. Weekday,
  72. Day,
  73. DayPeriod,
  74. Hour,
  75. Minute,
  76. Second,
  77. FractionalSecondDigits,
  78. TimeZoneName,
  79. };
  80. template<typename Callback>
  81. void for_each_calendar_field_zipped_with(CalendarPattern const& other, Callback&& callback)
  82. {
  83. callback(era, other.era, Field::Era);
  84. callback(year, other.year, Field::Year);
  85. callback(month, other.month, Field::Month);
  86. callback(weekday, other.weekday, Field::Weekday);
  87. callback(day, other.day, Field::Day);
  88. callback(day_period, other.day_period, Field::DayPeriod);
  89. callback(hour, other.hour, Field::Hour);
  90. callback(minute, other.minute, Field::Minute);
  91. callback(second, other.second, Field::Second);
  92. callback(fractional_second_digits, other.fractional_second_digits, Field::FractionalSecondDigits);
  93. callback(time_zone_name, other.time_zone_name, Field::TimeZoneName);
  94. }
  95. String skeleton {};
  96. String pattern {};
  97. Optional<String> pattern12 {};
  98. // https://unicode.org/reports/tr35/tr35-dates.html#Calendar_Fields
  99. Optional<CalendarPatternStyle> era {};
  100. Optional<CalendarPatternStyle> year {};
  101. Optional<CalendarPatternStyle> month {};
  102. Optional<CalendarPatternStyle> weekday {};
  103. Optional<CalendarPatternStyle> day {};
  104. Optional<CalendarPatternStyle> day_period {};
  105. Optional<CalendarPatternStyle> hour {};
  106. Optional<CalendarPatternStyle> minute {};
  107. Optional<CalendarPatternStyle> second {};
  108. Optional<u8> fractional_second_digits {};
  109. Optional<CalendarPatternStyle> time_zone_name {};
  110. };
  111. struct CalendarRangePattern : public CalendarPattern {
  112. enum class Field {
  113. Era,
  114. Year,
  115. Month,
  116. Day,
  117. AmPm,
  118. DayPeriod,
  119. Hour,
  120. Minute,
  121. Second,
  122. FractionalSecondDigits,
  123. };
  124. Optional<Field> field {};
  125. String start_range {};
  126. StringView separator {};
  127. String end_range {};
  128. };
  129. enum class CalendarFormatType : u8 {
  130. Date,
  131. Time,
  132. DateTime,
  133. };
  134. struct CalendarFormat {
  135. CalendarPattern full_format {};
  136. CalendarPattern long_format {};
  137. CalendarPattern medium_format {};
  138. CalendarPattern short_format {};
  139. };
  140. HourCycle hour_cycle_from_string(StringView hour_cycle);
  141. StringView hour_cycle_to_string(HourCycle hour_cycle);
  142. CalendarPatternStyle calendar_pattern_style_from_string(StringView style);
  143. StringView calendar_pattern_style_to_string(CalendarPatternStyle style);
  144. Vector<Unicode::HourCycle> get_regional_hour_cycles(StringView locale);
  145. Optional<Unicode::HourCycle> get_default_regional_hour_cycle(StringView locale);
  146. String combine_skeletons(StringView first, StringView second);
  147. Optional<CalendarFormat> get_calendar_format(StringView locale, StringView calendar, CalendarFormatType type);
  148. Vector<CalendarPattern> get_calendar_available_formats(StringView locale, StringView calendar);
  149. Optional<Unicode::CalendarRangePattern> get_calendar_default_range_format(StringView locale, StringView calendar);
  150. Vector<Unicode::CalendarRangePattern> get_calendar_range_formats(StringView locale, StringView calendar, StringView skeleton);
  151. Vector<Unicode::CalendarRangePattern> get_calendar_range12_formats(StringView locale, StringView calendar, StringView skeleton);
  152. Optional<StringView> get_calendar_era_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Unicode::Era value);
  153. Optional<StringView> get_calendar_month_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Unicode::Month value);
  154. Optional<StringView> get_calendar_weekday_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Unicode::Weekday value);
  155. Optional<StringView> get_calendar_day_period_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Unicode::DayPeriod value);
  156. Optional<StringView> get_calendar_day_period_symbol_for_hour(StringView locale, StringView calendar, CalendarPatternStyle style, u8 hour);
  157. Optional<StringView> get_time_zone_name(StringView locale, StringView time_zone, CalendarPatternStyle style);
  158. }