(ns frontend.tools.html-export (:require-macros [hiccups.core :as hiccups :refer [html]]) (:require [frontend.db :as db] [frontend.components.block :as block] [frontend.extensions.slide :as slide] [hiccups.runtime :as hiccupsrt] [clojure.walk :as walk] [clojure.set :as set] [medley.core :as medley])) ;; Consider generate a db index so that search can still works ;; Or maybe TiddlyWiki ;; It could be better that we can reuse some parts of this module in a nodejs tool, ;; so users don't have to use the web for exporting to htmls or publishing. (defn- build-block [config block] (let [body (:block/body block) block (block/build-block-part config block)] [:div.block block (when (seq body) (for [child body] (do (block/markup-element-cp config child))))])) (defn export-page [page-name blocks show-notification!] (let [{:keys [slide] :as properties} (db/get-page-properties page-name) slide? slide blocks (if (:block/pre-block? (first blocks)) (rest blocks) blocks)] (if (seq blocks) (let [config {:html-export? true :slide? slide?} hiccup (if slide? (let [sections (block/build-slide-sections blocks (merge config {:id "slide" :start-level 2 :page-name page-name}) build-block)] (slide/slide-content false "" sections)) [:div.page (for [block blocks] (build-block config block))]) remove-attrs #{:on-click :on-change} hiccup (walk/postwalk (fn [f] (if (and (map? f) (seq (set/intersection remove-attrs (set (keys f))))) (medley/remove-keys remove-attrs f) f)) hiccup)] (html hiccup)) (show-notification! "The published content can't be empty." :error))))