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"]]}
...