0

我需要一种方法来解析 HTML 标记以在用 Clojurescript 编写的 node.js 应用程序上打嗝。在客户端,我使用山核桃来完成这项工作,不幸的是它在 Node.js 上表现不佳。如果任何命名空间需要hickory.core节点拒绝运行应用程序说

ReferenceError: Node is not defined
    at hickory$core$node_type (/media/lapdaten/ARBEITSSD/dev/violinas_macchiato/target/out/hickory/core.cljs:35:1)
    at Object.<anonymous> (/media/lapdaten/ARBEITSSD/dev/violinas_macchiato/target/out/hickory/core.cljs:39:16)

如果我在节点已经运行时使用 figwheel 热加载库,CIDER 会给我各种山核桃函数的代码完成,但hickory.core/parse-fragment在运行时未定义(hickory.core/as-hiccup由于某种原因可用)。

这实际上是山核桃的一个已知问题,因为它依赖于浏览器 DOM API,而这在 Node.js 中不可用。我按照GitHub 上(set! js/DOMParser (.-DOMParser (js/require "xmldom")))的建议进行了尝试,但我实际上不知道在哪里放置该表达式。一般来说,GitHub 上的讨论让我毫无头绪……</p>

有没有人喜欢在 Node.js 上工作?关于如何让我的应用程序将 HTML 转换为打嗝的任何其他建议?

提前谢谢了!

奥利弗

4

1 回答 1

0

由于山核桃不以我能理解的方式支持 Node.js,我最近一直在研究原生 Node.js 解决方案。看看 posthtml -parser。它的好处是,它生成的 JSONjs->clj与几乎完全是山核桃格式只有一个距离,即以下内容:

(ns utils.phtmltohiccup
  (:require
   ["posthtml-parser" :as phr] ; requiring the shadow-cljs way
   ))
   
(def testhtml
  "<ul class=\"list\" important=\"false\"><li>Hello World</li><li>Hello Again</li></ul>")

(js->clj
 (phr
  testhtml) :keywordize-keys true)

产生:

[{:tag "ul"
  :attrs
  {:class "list"
   :important "false"}
  :content
  [{:tag "li"
    :content
    ["Hello World"]}
   {:tag "li"
    :content
    ["Hello Again"]}]}]

关于正确的山核桃的唯一区别似乎是缺少:type键和假定的类型:element。这种结构在 Clojurescript 中是高度可行的形式。当我确实需要打嗝时,我现在使用两个非常幼稚的函数之一将上面的山核桃转换为打嗝。堆栈消耗:

(defn parsed-to-hiccup-sc
  ""
  [hickory]
  (map
   (fn [element]
     (if (:tag element)
       (do
         (print (:tag element))
         (let [{:keys [tag attrs content]} element]
           (into [(keyword tag) attrs] (parsed-to-hiccup-sc content))
           ))
       (str element)))
   hickory))

或者我使用 clojure.walk (我假设它不消耗堆栈):

(defn parsed-to-hiccup-ns
  ""
  [hickory]
  (walk/postwalk
   (fn [element]
     (if (:tag element)
       (let [{:keys [tag attrs content]} element]
         (into [(keyword tag) attrs] content))
       (str element)))
   hickory))

目前这个解决方案对于我的意图和目的来说已经足够好了。但是,我将把这个库提请山核桃维护者的注意。也许有一种简单的方法可以将 posthtml-parser 集成到 hickory 中以获得适当的 Node.js 支持。

于 2020-09-04T14:26:26.820 回答