(local templates (require :templates)) (local html (require :vendor.html)) (fn improve-typography [text] (var result (-> text (string.gsub "(\n|\r)" " ") (string.gsub "%s+" " "))) (let [nbsp-replaces ["на" "На" "и" "И" "в" "В" "о" "О" "с" "С" "со" "Со" "до" "До" "для" "Для" "а" "А" "но" "Но" "на" "На" "я" "Я" "мы" "Мы" "над" "Над" "под" "Под" "г." "Г." "ул." "Ул." "д." "Д." "%d+"]] (each [_ v (ipairs nbsp-replaces)] (set result (-> result (string.gsub (.. "( " v ") ") "%1 ") (string.gsub (.. "(%s" v ") ") " %1 ") (string.gsub (.. "^(" v ") ") "%1 "))))) result) (fn test-improve-typography [] (assert (= (improve-typography "Я лежу на пляжу!") "Я лежу на пляжу!")) (assert (= (improve-typography "500 рублей мы сняли со счета!") "500 рублей мы сняли со счета!")) (assert (= (improve-typography "500 рублей мы сняли со счета!") "500 рублей мы сняли со счета!"))) (local texts { :address (improve-typography "г. Омск, ул. Пушкина, д. 133/9, этаж 2. Вход с крыльца Магнита, дверь слева, домофон 4") :individual-ceremony (improve-typography "Индивидуальная чайная церемония: мастер готовит для вас чай на ваш выбор. О времени встречи договариваемся. Стоимость 1000 рублей с человека, до 5 человек.") :weekly-meetings (improve-typography "Еженедельное мероприятие: каждую субботу в 15:00 мы собираемся и пьем чай из нашей коллекции. Для посещения необходима запись в комментариях под соответствующим постом в нашей группе в телеграме. Стоимость 500 рублей с человека.") }) (fn pick-gallery-photo [list] (let [chosen (. list (math.random (# list)))] [:div {} [:a {:href (.. "static/" chosen.name ".webp") :target "_blank"} [:img {:src (.. "static/" chosen.name "-p.webp") :alt chosen.alt}]]])) (fn content [] [[:div {:class "content"} [:article {:class "article"} [:img {:class "logo" :src "/static/logo.svg" :alt "Белая жаба в мультяшном стиле с чайником на голове"}] [:h1 {} [:NO-ESCAPE "Чайная комната «Белая жаба»"]] [:nav {} [:a {:href "https://t.me/whitetoadtea"} "телеграм"] [:span {} "~"] [:a {:href "https://vk.com/whitetoadtea"} "вконтакте"]]] [:article {:class "article"} [:h2 {} "Адрес"] [:p {} [:NO-ESCAPE texts.address]]] [:article {:class "article"} [:h2 {} "Форматы участия"] [:ol {} [:li {} [:NO-ESCAPE texts.individual-ceremony] [:div {:class "button-wrapper"} [:a {:href "https://t.me/whitetoadvlad" :class "button"} "Записаться"]]] [:li {} [:NO-ESCAPE texts.weekly-meetings] [:div {:class "button-wrapper"} [:a {:href "https://t.me/whitetoadtea" :class "button"} "Подписаться"]]]]]] [:div {:class "gallery"} (pick-gallery-photo [{:name "people" :alt "Люди в чайной"} {:name "gaiwan2" :alt "Близко сфотографированный чайный столик с пиалами и гайванью"} {:name "teapot2" :alt "Пиала и чайник на фоне гирлянды"}]) (pick-gallery-photo [{:name "table" :alt "Сфотографированные сверху пиалы на японском столике"}]) [:div {} [:video {:autoplay true :loop true :muted true} [:source {:src "static/boiling-p.webm" :type "video/webm"}]]] (pick-gallery-photo [{:name "gaiwan" :alt "Гайвань и ширма с гирляндами на фоне"} {:name "wall" :alt "Белая стена с веером и тенью окна"} {:name "teapot" :alt "Чайник в темноте на светлом фоне гирлянд"} {:name "teapot3" :alt "Чайник в руке на фоне растений"}]) (pick-gallery-photo [{:name "rack" :alt "Стеллаж с чайной посудой"} {:name "flowers" :alt "Ваза с цветами рядом с чайным столиком"}]) [:div {} [:video {:autoplay true :loop true :muted true} [:source {:src "static/gaiwan-p.webm" :type "video/webm"}]]]]]) (fn render [request] (values 200 {} (html.render (templates.base-template (content)) true))) {: render}