zubat
1 介绍
2 解析它!
input-port->sxml
file->sxml
3 元素属性
node-attr
node-attr?
node-text
node-tag-name
node-id
node-id?
node-class
node-class?
4 查找元素
node-children
node-children?
node-child
node-all-children
node-select
node-select-first
node-select-id
5 柯里化
7.7

zubat

XG.Ley

 (require zubat) package: zubat

1 介绍

纵观现有的库,尚未发现能足够好用的HTML5解释器,sxml是一个XML解析库,它提供了基本方法,一些HTML5特有的解析方式却需要重新实现,为了查找到一个元素需要费一番周折。

sxml的基础上,实现了一些比较常用的功能,例如document.getElementById。 使用该库需要注意以下几点:

2 解析它!

zubat解析利用html-parsing这个库进行解析。

procedure

(input-port->sxml port)  sxml:element?

  port : input-port?
读取input-port,转化成sxml。

procedure

(file->sxml file-path)  sxml:element?

  file-path : path-string?
读取文件,转化成sxml。

3 元素属性

procedure

(node-attr el attr)  (or/c #f string?)

  el : sxml:element?
  attr : symbol?
查找元素某个属性。由于是从网页上攫取下来的属性,它只能是string类型,而且会自动string-trim一遍。

(define el '(main (@ (id "main-id")) "main text"))
(node-attr el 'id) ;; -> "main-id"
(node-attr el 'class) ;; #f

procedure

(node-attr? el attr)  boolean?

  el : sxml:element?
  attr : symbol?
元素是否存在某个属性。

(define el '(main (@ (id "main-id")) "main text"))
(node-attr? el 'id) ;; #t
(node-attr? el 'class) ;; #f

procedure

(node-text el)  string?

  el : sxml:element?
元素文本。

(define el '(main (@ (id "main-id")) "main text"))
(node-text el) ;; "main text"

procedure

(node-tag-name el)  string?

  el : sxml:element?
元素标签名称。

(define el '(main (@ (id "main-id")) "main text"))
(node-tag-name el) ;; "main"

procedure

(node-id el)  (or/c #f string?)

  el : sxml:element?
获取元素的id,id可能不存在,所以可能会返回#f

(define el '(main (@ (id "main-id")) "main text"))
(node-id el) ;; "main-id"
(define el '(main (@ (class "main-id")) "main text"))
(node-id el) ;; #f

procedure

(node-id? el id)  boolean?

  el : sxml:element?
  id : string?
检查元素是否有相应的id。
(define el '(main (@ (id "main-id")) "main text"))
(node-id? el "main-id") ;; #t
(node-id? el "main") ;; #f

procedure

(node-class el)  (listof string?)

  el : sxml:element?
获取元素class,以列表形式输出。

(define el '(div (@ (class "button")) "primary button"))
(node-class el) ;; '("button")
(define el '(main (@ (id "main-id")) "main text"))
(node-class el) ;; '()

procedure

(node-class? el name)  boolean?

  el : sxml:element?
  name : string?
元素是否包含某个class。

(define el '(div (@ (class "button")) "primary button"))
(node-class? el "button") ;; #t
(node-class? el "input") ;; #f

4 查找元素

样式以后再说罢。

procedure

(node-children el)  nodeset?

  el : (or/c emtpy? sxml:element?)
获取该元素下一级的所有子元素。

procedure

(node-children? root)  boolean?

  root : (or/c empty? sxml:element?)
该元素下是否有子元素。 或者该元素是否为叶子节点。

procedure

(node-child root)  (or/c #f sxml:element?)

  root : (or/c empty? sxml:element?)
获取第一个子元素。

procedure

(node-all-children root)  nodeset?

  root : (or/c empty? sxml:elements?)
获取所有子元素,与node-children不同在于,它深度遍历得到每个元素的子元素,得到一条包含所有子元素的列表。

procedure

(node-select root f)  nodeset?

  root : (or/c empty? sxml:element?)
  f : (-> sxml:element? boolean?)
从所有子元素中过滤所需要的元素。

类似于querySelectorAll,只是node-select接受的是一个高阶函数,不是选择器。

procedure

(node-select-first root f)  (or/c #f sxml:element?)

  root : (or/c empty? sxml:element?)
  f : (-> sxml:element? boolean?)
从所有子元素中过滤得到第一个元素。

procedure

(node-select-id root id)  (or/c #f sxml:element?)

  root : (or/c empty? sxml:element?)
  id : string?
传说中的getElementById

5 柯里化

本库同样提供全套柯里化服务。默认以curryr形式柯里化,以便在特定场景使用。

(require (prefix-in zubat: zubat/curry))
 
(define link-id (compose (zubat:select-id "link") (zubat:node-id)))
 
(link-id el)