2017-08-12 16:48:01 +00:00
|
|
|
/*
|
2020-08-29 13:27:11 +00:00
|
|
|
* Copyright (C) 2015 Andy VanWagoner (andy@vanwagoner.family)
|
2017-08-12 16:48:01 +00:00
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
|
|
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
|
|
|
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
|
|
|
* THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2022-10-23 02:55:20 +00:00
|
|
|
#include "JSObject.h"
|
2017-08-12 16:48:01 +00:00
|
|
|
#include <unicode/udat.h>
|
2022-10-23 02:55:20 +00:00
|
|
|
#include <wtf/unicode/icu/ICUHelpers.h>
|
|
|
|
|
|
|
|
struct UDateIntervalFormat;
|
2018-01-03 05:16:05 +00:00
|
|
|
|
2022-10-23 02:55:20 +00:00
|
|
|
#if !defined(HAVE_ICU_U_DATE_INTERVAL_FORMAT_FORMAT_RANGE_TO_PARTS)
|
|
|
|
// ICU header is up-to-date if the build is non-Darwin or using Apple Internal SDK.
|
|
|
|
#if (USE(APPLE_INTERNAL_SDK) || !OS(DARWIN)) && U_ICU_VERSION_MAJOR_NUM >= 64
|
|
|
|
#define HAVE_ICU_U_DATE_INTERVAL_FORMAT_FORMAT_RANGE_TO_PARTS 1
|
|
|
|
#endif
|
|
|
|
#endif
|
2017-08-12 16:48:01 +00:00
|
|
|
|
|
|
|
namespace JSC {
|
|
|
|
|
2022-10-23 02:55:20 +00:00
|
|
|
enum class RelevantExtensionKey : uint8_t;
|
|
|
|
|
2017-08-12 16:48:01 +00:00
|
|
|
class JSBoundFunction;
|
|
|
|
|
2022-10-23 02:55:20 +00:00
|
|
|
struct UDateIntervalFormatDeleter {
|
|
|
|
JS_EXPORT_PRIVATE void operator()(UDateIntervalFormat*);
|
|
|
|
};
|
|
|
|
|
|
|
|
class IntlDateTimeFormat final : public JSNonFinalObject {
|
2017-08-12 16:48:01 +00:00
|
|
|
public:
|
2022-10-23 02:55:20 +00:00
|
|
|
using Base = JSNonFinalObject;
|
|
|
|
|
|
|
|
static constexpr bool needsDestruction = true;
|
|
|
|
|
|
|
|
static void destroy(JSCell* cell)
|
|
|
|
{
|
|
|
|
static_cast<IntlDateTimeFormat*>(cell)->IntlDateTimeFormat::~IntlDateTimeFormat();
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename CellType, SubspaceAccess mode>
|
|
|
|
static IsoSubspace* subspaceFor(VM& vm)
|
|
|
|
{
|
|
|
|
return vm.intlDateTimeFormatSpace<mode>();
|
|
|
|
}
|
2017-08-12 16:48:01 +00:00
|
|
|
|
|
|
|
static IntlDateTimeFormat* create(VM&, Structure*);
|
|
|
|
static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
|
|
|
|
|
|
|
|
DECLARE_INFO;
|
|
|
|
|
2022-10-23 02:55:20 +00:00
|
|
|
void initializeDateTimeFormat(JSGlobalObject*, JSValue locales, JSValue options);
|
|
|
|
JSValue format(JSGlobalObject*, double value) const;
|
|
|
|
JSValue formatToParts(JSGlobalObject*, double value, JSString* sourceType = nullptr) const;
|
|
|
|
JSValue formatRange(JSGlobalObject*, double startDate, double endDate);
|
|
|
|
JSValue formatRangeToParts(JSGlobalObject*, double startDate, double endDate);
|
|
|
|
JSObject* resolvedOptions(JSGlobalObject*) const;
|
2017-08-12 16:48:01 +00:00
|
|
|
|
|
|
|
JSBoundFunction* boundFormat() const { return m_boundFormat.get(); }
|
|
|
|
void setBoundFormat(VM&, JSBoundFunction*);
|
|
|
|
|
2022-10-23 02:55:20 +00:00
|
|
|
static IntlDateTimeFormat* unwrapForOldFunctions(JSGlobalObject*, JSValue);
|
|
|
|
|
|
|
|
private:
|
2017-08-12 16:48:01 +00:00
|
|
|
IntlDateTimeFormat(VM&, Structure*);
|
|
|
|
void finishCreation(VM&);
|
|
|
|
static void visitChildren(JSCell*, SlotVisitor&);
|
|
|
|
|
2022-10-23 02:55:20 +00:00
|
|
|
static Vector<String> localeData(const String&, RelevantExtensionKey);
|
|
|
|
|
|
|
|
UDateIntervalFormat* createDateIntervalFormatIfNecessary(JSGlobalObject*);
|
|
|
|
|
|
|
|
enum class HourCycle : uint8_t { None, H11, H12, H23, H24 };
|
2020-08-29 13:27:11 +00:00
|
|
|
enum class Weekday : uint8_t { None, Narrow, Short, Long };
|
|
|
|
enum class Era : uint8_t { None, Narrow, Short, Long };
|
|
|
|
enum class Year : uint8_t { None, TwoDigit, Numeric };
|
|
|
|
enum class Month : uint8_t { None, TwoDigit, Numeric, Narrow, Short, Long };
|
|
|
|
enum class Day : uint8_t { None, TwoDigit, Numeric };
|
2022-10-23 02:55:20 +00:00
|
|
|
enum class DayPeriod : uint8_t { None, Narrow, Short, Long };
|
2020-08-29 13:27:11 +00:00
|
|
|
enum class Hour : uint8_t { None, TwoDigit, Numeric };
|
|
|
|
enum class Minute : uint8_t { None, TwoDigit, Numeric };
|
|
|
|
enum class Second : uint8_t { None, TwoDigit, Numeric };
|
|
|
|
enum class TimeZoneName : uint8_t { None, Short, Long };
|
2022-10-23 02:55:20 +00:00
|
|
|
enum class DateTimeStyle : uint8_t { None, Full, Long, Medium, Short };
|
2017-08-12 16:48:01 +00:00
|
|
|
|
|
|
|
void setFormatsFromPattern(const StringView&);
|
2022-10-23 02:55:20 +00:00
|
|
|
static ASCIILiteral hourCycleString(HourCycle);
|
2020-08-29 13:27:11 +00:00
|
|
|
static ASCIILiteral weekdayString(Weekday);
|
|
|
|
static ASCIILiteral eraString(Era);
|
|
|
|
static ASCIILiteral yearString(Year);
|
|
|
|
static ASCIILiteral monthString(Month);
|
|
|
|
static ASCIILiteral dayString(Day);
|
2022-10-23 02:55:20 +00:00
|
|
|
static ASCIILiteral dayPeriodString(DayPeriod);
|
2020-08-29 13:27:11 +00:00
|
|
|
static ASCIILiteral hourString(Hour);
|
|
|
|
static ASCIILiteral minuteString(Minute);
|
|
|
|
static ASCIILiteral secondString(Second);
|
|
|
|
static ASCIILiteral timeZoneNameString(TimeZoneName);
|
2022-10-23 02:55:20 +00:00
|
|
|
static ASCIILiteral formatStyleString(DateTimeStyle);
|
|
|
|
|
|
|
|
static HourCycle hourCycleFromSymbol(UChar);
|
|
|
|
static HourCycle parseHourCycle(const String&);
|
|
|
|
static HourCycle hourCycleFromPattern(const Vector<UChar, 32>&);
|
|
|
|
static void replaceHourCycleInSkeleton(Vector<UChar, 32>&, bool hour12);
|
|
|
|
static void replaceHourCycleInPattern(Vector<UChar, 32>&, HourCycle);
|
|
|
|
|
|
|
|
using UDateFormatDeleter = ICUDeleter<udat_close>;
|
2017-08-12 16:48:01 +00:00
|
|
|
|
|
|
|
WriteBarrier<JSBoundFunction> m_boundFormat;
|
|
|
|
std::unique_ptr<UDateFormat, UDateFormatDeleter> m_dateFormat;
|
2022-10-23 02:55:20 +00:00
|
|
|
std::unique_ptr<UDateIntervalFormat, UDateIntervalFormatDeleter> m_dateIntervalFormat;
|
2017-08-12 16:48:01 +00:00
|
|
|
|
|
|
|
String m_locale;
|
2022-10-23 02:55:20 +00:00
|
|
|
String m_dataLocale;
|
2017-08-12 16:48:01 +00:00
|
|
|
String m_calendar;
|
|
|
|
String m_numberingSystem;
|
|
|
|
String m_timeZone;
|
2022-10-23 02:55:20 +00:00
|
|
|
HourCycle m_hourCycle { HourCycle::None };
|
2017-08-12 16:48:01 +00:00
|
|
|
Weekday m_weekday { Weekday::None };
|
|
|
|
Era m_era { Era::None };
|
|
|
|
Year m_year { Year::None };
|
|
|
|
Month m_month { Month::None };
|
|
|
|
Day m_day { Day::None };
|
2022-10-23 02:55:20 +00:00
|
|
|
DayPeriod m_dayPeriod { DayPeriod::None };
|
2017-08-12 16:48:01 +00:00
|
|
|
Hour m_hour { Hour::None };
|
|
|
|
Minute m_minute { Minute::None };
|
|
|
|
Second m_second { Second::None };
|
2022-10-23 02:55:20 +00:00
|
|
|
uint8_t m_fractionalSecondDigits { 0 };
|
2017-08-12 16:48:01 +00:00
|
|
|
TimeZoneName m_timeZoneName { TimeZoneName::None };
|
2022-10-23 02:55:20 +00:00
|
|
|
DateTimeStyle m_dateStyle { DateTimeStyle::None };
|
|
|
|
DateTimeStyle m_timeStyle { DateTimeStyle::None };
|
2017-08-12 16:48:01 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace JSC
|