diff options
Diffstat (limited to 'site/ipuer.fnl')
| -rw-r--r-- | site/ipuer.fnl | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/site/ipuer.fnl b/site/ipuer.fnl new file mode 100644 index 0000000..f878912 --- /dev/null +++ b/site/ipuer.fnl @@ -0,0 +1,81 @@ +(import-macros {: map} :lib.macro) + +(local peg + (if (pick-values 1 (pcall require :lpeg)) + (require :lpeg) + (require :vendor.lpeglj))) +(local number (require :lib.number)) +(local parser (require :parser)) +(local fetcher (require :fetcher)) + +(fn url-formatter [path page] + (.. "https://ipuer.ru/catalog/" path "/?p=" page)) + +(local product-peg + (* ;; id + (parser.anywhere + (parser.tag :div + {:data-id (peg.Cg parser.pegs.number :id) :class "*"})) + ;; url and image + (parser.anywhere + (parser.tag :a {:href (peg.Cg (parser.till "\"") :url)} + (parser.tag :img {:src (peg.Cg (parser.till "\"") :image) :alt "*"}))) + ;; title + (parser.anywhere + (parser.tag :div {:class "card-product_title"} + (parser.tag :a {:href "*"} + (parser.tag :span {} (peg.Cg (parser.till "</span>") :title))))) + ;; price + (parser.anywhere + (parser.tag :span {:class "card-price"} + (* (peg.Cg + (* parser.pegs.number + (parser.maybe (* " " parser.pegs.number))) + :price) + " р."))) + (parser.anywhere + (+ (parser.tag :a {:data-url "*" :class "*" :data-add-text "*"} "В корзину") + (parser.tag :a {:data-url "*" :class "*"} "В корзину"))))) + +(fn normalize [product] + (local year + (number.string->number + (: (parser.anywhere + (* (peg.C (^ (peg.R "09") 4)) + (parser.maybe " ") + (- "г" (peg.P "гр")))) + :match product.title))) + (local weight + (number.string->number + (: (parser.anywhere (* (peg.C parser.pegs.number) (parser.maybe " ") "гр")) + :match product.title))) + (local price (number.string->number product.price)) + + {:site "ipuer" + :id product.id + :url (.. "https://ipuer.ru" product.url) + :title product.title + :description "" + ;; FIXME: parse all editions into different projects + :image (.. "https://ipuer.ru" product.image) + :year year + :price price + :weight weight + :category product.category + :price-per (if (and price weight (< 0 weight)) + (/ (math.ceil (* (/ price weight) 10)) 10) + nil)}) + +(fn products [] + (fetcher.from-html + url-formatter + [{:path "shen-puer" :category "Шен пуэр"} + {:path "shu-puer" :category "Шу пуэр"} + {:path "drugoy-chay"} + {:path "blagovoniya" :category "Благовония"} + {:path "posuda" :category "Посуда"} + {:path "282" :category "Посуда"}] + normalize + product-peg)) + +{: products} |
