-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathforever21.ts
104 lines (101 loc) · 3.33 KB
/
forever21.ts
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
class HtmlSelector implements Selector {
GetLink(parent: Element, query: string): string {
const elem = parent.querySelector<HTMLAnchorElement>(query)
return elem?.href!;
}
GetImages(parent: Element, query: string): string {
const elem = parent.querySelector<HTMLImageElement>(query)
return elem?.src!;
}
GetText(parent: Element, query: string): string {
const elem = parent.querySelector<HTMLParagraphElement>(query)
return elem?.textContent!;
}
Fetch(query: string): NodeListOf<Element> {
return document.querySelectorAll(query);
}
}
export class Forever21 implements Crawler {
private url: string;
constructor(private orderId: string, private selector: Selector) {
if (!selector) {
selector = new HtmlSelector();
}
this.url = `https://www.forever21.com/on/demandware.store/Sites-forever21-Site/`
+ `en_US/Order-Details?orderID=${this.orderId}&orderFilter=`;
}
ImageURL(e: Element): string {
let item = this.selector.GetImages(e, "img.product-line-item__image");
if (!item) {
item = "";
}
return `=IMAGE("${item}")`;
}
Type(e: Element): string {
return "";
}
Description(e: Element): string {
let item = this.selector.GetText(e, ".product-line-item__name.link");
if (!item) {
item = "";
}
return item.trim();
}
Brand(e: Element): string {
return "Forever21";
}
Size(e: Element): string {
let item = this.selector.GetText(e, "[data-line-item-component='size']");
if (!item) {
item = "";
}
return item.replace(/\n|\r|\t|\'/g, "").replace("Size:", "");
}
Color(e: Element): string {
let item = this.selector.GetText(e, "[data-line-item-component='color']");
if (!item) {
item = "";
}
return item.replace(/\n|\r|\t|\'/g, "").replace("Color:", "");
}
Price(e: Element): string {
let item = this.selector.GetText(e, "[data-line-item-component='price-total']");
if (!item) {
return "";
}
let cleanPrice = item.replace(/\n|\r|\t|\'/g, "").trim();
let priceParts = cleanPrice.split("$");
if (cleanPrice.length < 2) {
return item.replace("$", "");
}
if (priceParts.length === 3) {
return priceParts[1];
}
return priceParts[1];
}
Link(e: Element): string {
let item = this.selector.GetLink(e, ".product-line-item__name.link");
if (!item) {
item = "";
}
return item;
}
OrderLink(e: Element): string {
return this.url;
}
BuildRow(): string[] {
const rows = [] as string[];
const elements = this.selector.Fetch(".product-line-item--order");
elements.forEach((e) => {
rows.push(`\t`
+ `${this.ImageURL(e)}\t${this.Type(e)}\t${this.Description(e)}\t`
+ `${this.Brand(e)}\t${this.Size(e)}\t${this.Color(e)}\t`
+ `${this.Price(e)}\t\t\t\t\t\t`
+ `${this.OrderLink(e)}\t${this.Link(e)}\n`
);
})
return rows;
}
}
// const c = new Forever21("order-id", new HtmlSelector());
// console.log(c.BuildRow().join(""))