-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathht-elements-catalog-path-parser.js
More file actions
112 lines (109 loc) · 3.51 KB
/
ht-elements-catalog-path-parser.js
File metadata and controls
112 lines (109 loc) · 3.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
"use strict";
async function addFilterDataInSearch(search, parameters, nameInFilter) {
let result = "";
let valueInFilter = parameters[nameInFilter];
if (valueInFilter && valueInFilter.length > 0) {
search === "" ? (result += "?") : (result += "&");
result += `${nameInFilter}=${valueInFilter.join(",")}`;
return result;
}
return "";
}
export async function getPathFromParameters(parameters) {
try {
let path = "";
let pathname = "/catalog";
let search = "";
let categories = parameters.categories;
if (categories && categories.length > 0) {
pathname += `/${categories.join("/")}`;
}
search += await addFilterDataInSearch(search, parameters, "direction");
search += await addFilterDataInSearch(search, parameters, "platform");
search += await addFilterDataInSearch(search, parameters, "languages");
search += await addFilterDataInSearch(search, parameters, "tools");
search += await addFilterDataInSearch(search, parameters, "browsers");
search += await addFilterDataInSearch(search, parameters, "tags");
// &sort
let sort = parameters.sort;
if (sort) {
search === "" ? (search += "?") : (search += "&");
search += `sort=${sort}`;
}
// &search
let searchText = parameters.search;
if (searchText && searchText !== "") {
search === "" ? (search += "?") : (search += "&");
search += `search=${searchText}`;
}
path = pathname + search;
return path;
} catch (error) {
throw new Error("getPathFromParameters: " + error.message);
}
}
export function getParametersFromPath(path) {
try {
// parse path
path = path.replace("/catalog", "");
let pathname = path;
let search = "";
const questionMarkIndex = path.indexOf("?");
if (questionMarkIndex !== -1) {
pathname = path.slice(0, questionMarkIndex);
search = path.slice(questionMarkIndex);
}
let parameters = {};
// categories
if (pathname !== "" && pathname !== "/")
parameters.categories = pathname.substring(1).split("/");
// search params
const searchParameters = getParametersFromSearch(search);
parameters = Object.assign(parameters, searchParameters);
return parameters;
} catch (error) {
console.log("getParametersFromPath: " + error.message);
}
}
function getParametersFromSearch(search) {
try {
const parsed = {};
if (search === "") return parsed;
// search
const searchIndex = search.indexOf("search=");
if (searchIndex !== -1) {
const splittedSearch = search.split("search=");
parsed.search = splittedSearch[1];
// Remove search part
search = splittedSearch[0];
}
// attributes & tags & sort
if (search !== "?") {
// Remove first "?"
search = search.substring(1);
// Remove last & if exist (if was parameter search=)
if (searchIndex !== -1) search = search.substring(0, search.length - 1);
const params = search.split("&");
for (const param of params) {
const nameValue = param.split("=");
const name = nameValue[0];
const value = nameValue[1];
if (
name === "direction" ||
name === "platform" ||
name === "languages" ||
name === "tools" ||
name === "browsers" ||
name === "tags"
) {
parsed[name] = value.split(",");
} else {
parsed[name] = value;
}
}
}
return parsed;
} catch (error) {
throw new Error("getParametersFromSearch: " + error.message);
}
}