11std::string qtFilterListToFileInputAccept(
const QStringList &filterList)
14 for (
const auto &
filter : filterList) {
17 const auto &extensions =
type->accept()->mimeType().extensions();
18 std::transform(extensions.begin(), extensions.end(), std::back_inserter(transformed),
19 [](
const Type::Accept::MimeType::Extension &
extension) {
20 return extension.value().toString();
27std::optional<emscripten::val> qtFilterListToTypes(
const QStringList &filterList)
31 auto types = emscripten::val::array();
33 for (
const auto &fileFilter : filterList) {
34 auto type = Type::fromQt(fileFilter);
36 auto jsType = emscripten::val::object();
37 jsType.set(
"description",
type->description().toString().toStdString());
39 jsType.set(
"accept", ([&
mimeType =
type->accept()->mimeType()]() {
40 val acceptDict = val::object();
42 QList<emscripten::val> extensions;
43 extensions.reserve(mimeType.extensions().size());
45 mimeType.extensions().begin(), mimeType.extensions().end(),
46 std::back_inserter(extensions),
47 [](const Type::Accept::MimeType::Extension &extension) {
48 return val(extension.value().toString().toStdString());
50 acceptDict.set(
"application/octet-stream",
51 emscripten::val::array(extensions.begin(),
56 types.call<
void>(
"push", std::move(jsType));
60 return types[
"length"].as<
int>() == 0 ? std::optional<emscripten::val>() :
types;
64Type::Type(
QStringView description, std::optional<Accept> accept)
65 : m_description(description.trimmed()), m_accept(
std::move(accept))
69Type::~Type() =
default;
84 if (!
match.hasMatch())
87 constexpr size_t DescriptionIndex = 1;
88 constexpr size_t FilterListFromParensIndex = 2;
89 constexpr size_t PlainFilterListIndex = 3;
92 ?
match.capturedView(DescriptionIndex)
94 const auto filterList =
match.capturedView(
match.hasCaptured(FilterListFromParensIndex)
95 ? FilterListFromParensIndex
96 : PlainFilterListIndex);
98 auto accept = Type::Accept::fromQt(filterList);
105Type::Accept::Accept() =
default;
107Type::Accept::~Accept() =
default;
109std::optional<Type::Accept> Type::Accept::fromQt(
QStringView qtRepresentation)
117 auto internalMatch = internalRegex.matchView(qtRepresentation,
offset);
120 while (internalMatch.hasMatch()) {
121 auto webExtension = MimeType::Extension::fromQt(internalMatch.capturedView(1));
126 mimeType.addExtension(*webExtension);
128 internalMatch = internalRegex.matchView(qtRepresentation, internalMatch.capturedEnd());
140Type::Accept::MimeType::MimeType() =
default;
142Type::Accept::MimeType::~MimeType() =
default;
146 m_extensions.push_back(std::move(
extension));
151Type::Accept::MimeType::Extension::~Extension() =
default;
153std::optional<Type::Accept::MimeType::Extension>
154Type::Accept::MimeType::Extension::fromQt(
QStringView qtRepresentation)
161 if (qtAcceptAllRegex.matchView(qtRepresentation).hasMatch())
170 auto extensionMatch = qtFilenameMatcherRegex.matchView(qtRepresentation);
171 if (extensionMatch.hasMatch())
172 return Extension(extensionMatch.capturedView(2));
180 auto options = emscripten::val::object();
182 options.set(
"types", std::move(*
typeList));
183 options.set(
"excludeAcceptAllOption",
true);
186 options.set(
"multiple", acceptMultiple);
193 auto options = emscripten::val::object();
195 if (!suggestedName.empty())
196 options.set(
"suggestedName", emscripten::val(suggestedName));
198 if (
auto typeList = qtFilterListToTypes(filterList))
199 options.set(
"types", emscripten::val(std::move(*
typeList)));
206 return qtFilterListToFileInputAccept(filterList);