2024年Clojure现状调查!分享您的想法。

欢迎!请参阅关于页面了解更多此平台的工作方式。

0
Clojure

我想像下面的示例一样在EDN文件中存储博文,然后将其转换为HTML。

下面是一个示例文件

    {:slug "slug"
 :title "The first blog post"
 :body [[:div
         [:p "First paragraph"]
         [:ul

          [:li "List Item 1"]
          [:li "List Item 2"]
          [:li "List Item 3"]]

         [:p "Second paragraph"]]]}

然后我尝试使用以下代码读取它

(ns cl-www.core
  (:use [hiccup.core])
  (:require [cl-www.logic :refer [render-everything]]
            [cl-www.common :refer [prettify-html]]
            [clojure.edn]
            [clojure.java.io])
  (:import (org.jsoup Jsoup)
           (org.jsoup.nodes Document))
  (:gen-class))

(def path "/Users/myuser/cl-www/resources/p-2022-12-17.edn")

(defn test-edn
  []
  (let [post-data (-> path
                      (slurp)
                      (read-string))
        post-struct (:body post-data)
        html-struct [:html
                     [:body
                      [:h1 "Hello"]
                      post-struct]]

        html (->> html-struct
                  (html)
                  (prettify-html))]

    (println html)))

当我运行(test-edn)时,我得到以下错误
执行错误(IllegalArgumentException)在hiccup.compiler/normalize-element(compiler.clj:59)文件中。[:div [:p "第一段"] [:ul [:li "列表项1"] [:li "列表项2"] [:li "列表项3"]] [:p "第二段"]]不是一个有效的元素名称。
我该如何修复,也就是

  1. 手动编写一个EDN文件,然后
  2. 在Clojure中读取它
  3. 将其插入到Hiccup结构中,并
  4. 将其导出为HTML?
是的,在上面EDN中的`:body`是一个包含向量的向量,这是无效的Hiccup。在Hiccup中,向量的第一个元素通常是一个关键字,表示要渲染的标签。

1 答案

0

已选定
 
最佳答案

看起来EDN文件的`:body`值有错误。这个可以工作

{:slug "slug"
 :title "The first blog post"
 :body [:div
         [:p "First paragraph"]
         [:ul

          [:li "List Item 1"]
          [:li "List Item 2"]
          [:li "List Item 3"]]

         [:p "Second paragraph"]]}
...