visdom 0.5.6

A html document syntax and operation library, use APIs similar to jquery, easy to use for web scraping and confused html.
Documentation
# Changelog

0.2.1 版本后各个接口方法已经基本趋于稳定,后面将不会做大的调整。

## [0.5.6] - 2022-09-29

### 增加

- 增加 `htmls()``outer_htmls()` 方法,相比于 `html()``outer_html()` 仅获取第一个元素、此两方法获取所有元素的 `html`
## [0.5.5] - 2022-08-23

### 增加

- 增加 `texts_by_rec` 方法,获取文本节点时可以通过第三个参数来控制哪些节点是可以继续递归遍历的。

### 修改

- 升级`rphtml`使得`text`方法能正常运用在注释节点上。

## [0.5.4] - 2022-08-02

### 修复

- 修复 `insert_before` `before` `insert_after` `after` 等相邻节点操作、错误过滤了`<img />`等不能插入子节点的空标签、导致无法正确插入节点的问题。

### 增加

- 增加 `replace_with` 操作,方便快速替换节点。

## [0.5.3] - 2022-07-31

### 修复

- 修复 `:contains` 选择器包含中文字符、因为在正则匹配中没有使用 chars 长度引起 panic 的问题。

## [0.5.2] - 2022-04-26

### 增加

- 增加 `:has` 伪类选择器,以配合 `:not` 伪类能组成 `:not(:has(p))` 等实现 `has` 反选逻辑。

## [0.5.1] - 2022-02-22

### 修改

- 修改 `load(html: &str)` -> `load<'html>(html: impl Into<Cow<'html, str>>)`,改进返回的 `Elements` 只能接受 `'static` 严格生命周期的问题。

## [0.5.0] - 2022-02-11

### 变更

- (break change) 新增了 `features` 的条件编译,将可能不会用到的 DOM 节点操作 API 分离出来,具体可以参见[README 里的 Feature flags]./README.md#feature-flags,如果仍想使用全部 API,可以在 `features` 中使用 `full`
### 修复

- 修复 `has_class` 当查找的 class 为空格分隔的列表时,找到一个就返回`true`,实际逻辑应该是全部包含才能返回 `true`
### 增加

- 增加了主要 API 的 doc 文档。

## [0.4.13] - 2022-02-08

### 增加

- 为元素 `IElementTrait` 增加 `.value()` 方法,为 `Elements` 增加 `.val()` 方法,返回 `IFormValue` 枚举,当元素为 `multiple``select` 时,返回 `IFormValue::Multiple(Vec<String>)`,其它返回 `IFormValue::Single(String)`,通过 `to_string` 方法返回 `String` 值。
- 增加伪类 `:checked`,以方便获取表单元素中选取的元素。

### 修复

- 修复 `:root` 伪类在非子类查找时候丢失查询 handle 的问题
- 删除冗余的 `println!` debug 信息

## [0.4.12] - 2022-02-07

### 增加

- 增加 `:root` 伪类,方便快速获取 `HTML` 元素
- 修改错误类型为支持转换到 `anyhow::Error`

## [0.4.10] - 2021-04-22

### 修复

- 修复 `texts(limit_depth: usize)` 方法获取文本节点时,可能会漏掉内容标签的问题,参数由 `u32` 统一为 `usize`
- 修复 element trait 的 `set_text()` 方法实体进行转义时,仅转义 `<>&` 这三个特殊字符,单双引号不再进行转义,和浏览器保持一致

### 修改

- 增加 `texts_by(limit_depth: usize, handle: Box<dyn Fn(usize, &BoxDynText) -> bool ))` 方法,方便获取节点时,可以根据节点类型等进行排除

- `element` trait 增加 `text_chars()` 方法,和 `text_contents()` 方法不同,当内容中包含 html 实体转义字符时,该方法不会进行转义,而是保留原始字符

## [0.4.9] - 2021-04-14

### 修复

- 修复 `prev_until` 获取结果节点顺序为逆序的问题

## [0.4.8] - 2021-03-27

### 修复

- 修复节点插入时,当有不可插入节点时提示节点多次`BorrowMut`的问题

### 修改

- 升级 `rphtml` 去掉一些无用的逻辑判断,加速解析速度
- 增加更多 `mutation` 相关操作的测试用例

## [0.4.7] - 2021-03-26

### 修改

- 修改 `set_attribute` 时,value 值带引号时将对引号进行实体转义的逻辑
- 增加更多的测试用例,基本覆盖到所有代码逻辑,去掉一些不太实用的接口代码

## [0.4.6] - 2021-03-26

### 修复

- 修复 `add` 方法错误书写变量名及使用 range 时丢失最后一个元素的问题
- 修复 `unique_parents` 时判断了所有父元素导致逻辑错误的问题

### 修改

- 增加更多测试用例及逻辑细节

### 修改

- 重构了 `find` 方法的处理逻辑,相比以前代码更清晰

## [0.4.5] - 2021-03-24

### 修复

- 修复 `has_ele` 方法判断 Combinator 为 `ParentAll` 可能出错的问题,这个可能会影响到最终结果集,有使用 0.4.4 版本的需要升级以修复该问题

### 修改

- 重构了 `find` 方法的处理逻辑,相比以前代码更清晰

### 其它

- 继续增加更多测试用例,基本覆盖到所有重要的处理逻辑

## [0.4.4] - 2021-03-24

### 修复

- 修复 `add` 方法合并时可能出现计算错误的问题

### 修改

- 增加 `has_attr` 属性判断方法,统一错误选择器的错误处理,

### 其它

- 增加更多测试用例,去掉一些冗余逻辑

## [0.4.3] - 2021-03-24

### 修复

- 修复在使用 `:last-child``:nth-last-child` 在整体匹配情况下 `index` 位置取反的问题

### 其它

- 增加更多测试用例,进一步提升代码测试覆盖率

## [0.4.2] - 2021-03-23

### 修复

- 修复使用 `nth-` 的伪类选择器,当 n 为负数时,匹配元素顺序可能颠倒的问题
- 修复`[attribute]`属性选择器当属性为空查找的边界情况,与浏览器选择器保持一致

### 其它

- 增加了更多测试用例,去掉了一些冗余代码

## [0.4.1] - 2021-03-21

### 修复

- 修改`:last-of-type(index)``:nth-last-of-type(index)`指定 index 值查找时,没有保持节点顺序的问题

### 修改

- 增加更多测试用例以及更多在线示例

## [0.4.0] - 2021-03-20 :star:

### Broken change

- 针对节点的文本操作由原来的`&str`类型改为了`String`类型

### 优化

- 优化了 rphtml 和 htmlentity,在 html 解析和 render 等文本处理的时间上有了很大的性能提升
- 优化了选择器的处理逻辑,去掉了中间的数据处理,查找速度上比以前更快

## [0.3.2] - 2021-03-06

### 修复

- 修复使用 prevAll 可能导致节点顺序不对的问题

### 优化

- 去除子元素查找时不必要的节点复制,使得查找速度更快

## [0.3.1] - 2021-03-05

### 修复

- 修复因更新 `get_attribute` 属性查找方式后 `set_attribute``get_attribute` 方法没有同步逻辑导致的属性不同步问题

## [0.3.0] - 2021-03-05

### 修复

- 修复 `Nth` pattern 正则匹配的错误,导致 `:nth-child(10)` 中索引`10`不能被正确解析的问题

### 修改

- 为保证节点超找速度,将 `mesdoc` 整合到项目中,将不再单独维护,重写了实现 `IElementTrait` 等的对象类型,避免了查找时不必要的复制
- 进一步优化了各个伪类选择器,相比 goquery 库都有更快的查找速度
- 优化了规则、命名常量、文件拆分等细节,整体更清晰
- `rphtml` 库增加了标签属性名小写 name 映射,方便更快定位到属性,加快属性选择器的查找速度
- performance 下增加了更全面的选择器查找速度对比示例

## [0.2.7] - 2021-03-05

### 修改

- 重写 `mesdoc` 节点匹配逻辑,规则处理逻辑等,节点查找速度有了较大提升,修复了 `parent` 没有去重的问题等
- 增加更多测试用例和性能对比测试等

## [0.2.6] - 2021-03-04

### 修改

- 修复 `rphtml` 解析属性值错误处理反斜杠的逻辑

## [0.2.6] - 2021-03-03

### 修改

- 优化 `get_attribute` 逻辑
- `rphtml` 判断属性名的逻辑和 `mesdoc` 保持一致
- 增加更多性能对比测试代码

## [0.2.5] - 2021-03-03

### 修改

- 优化 `find` 查找子节点时的性能,当节点数目较大时有很大的性能提升
- 增加更多与 go + goquery 等的查找性能对比测试

## [0.2.4] - 2021-03-02

### 修改

- 修复 issue #2 中提到的标签名、属性名大小写问题,增加标签名支持英文冒号:

## [0.2.3] - 2021-02-24

### 修改

- 修改 `load``load_catch` 方法默认解析 html 采用最兼容的模式
- 增加 `load_options``load_options_catch` 两个方法,上述两个方法是对应此两个方法、使用最兼容模式参数的调用。
- 对应增加导出 `html::ParseOptions`,以便需要调用新增 options 方法调用时使用

## [0.2.2] - 2021-02-24

### 修改

- 升级 `rphtml`,去除掉了 wasm 的部分,修改部分数据结构和逻辑,使得解析更为快速且保持更好的兼容性
- 修复了 `rphtml` 中节点判断 `is_document` 的逻辑,新增加了解析参数允许纠错没有实体转译的 `<`- `visdom` 中因 `rphtml` 升级导致的部分同步修改

## [0.2.1] - 2021-02-20

### 修改

- 修改 `mesdoc``slice` 方法支持 `RangeBounds` 参数
- 重新导出 `mesdoc` 中各个 trait 里用到的返回类型等,方便在逻辑处理时可能会用到时做各种处理

## [0.2.0] - 2021-02-19

### 修改

- 修复 `rphtml` 中解析 `pre` 标签、自闭合标签不正确的问题,重新修改文档节点与根节点的引用关系
- `mesdoc` 中针对 `IDocumentTrait` 增加 `source_code`, `title`, `body`, `head` 方法等,方便快速获取文档信息,同时针对 `Elements` 增加 `document` 方法方便快速获取 `IDocumentTrait` 文档节点
- `visdom` 中修改针对 `rphtml``mesdoc` 升级做对应的修改

## [0.1.12] - 2021-02-17

### 修改

- 优化 `mesdoc` 中元素去重逻辑

## [0.1.11] - 2021-02-17

### 修改

- 升级 `mesdoc`,修复部分选择器没有去重的问题

## [0.1.10] - 2021-02-16

### 修改

- 进一步完善 `mesdoc` 中的代码细节,减少耦合逻辑
- 升级 rphtml, 修改`pre`等标签的调用 `html` 方法没有被`encode`的问题
- 增加更多测试代码

## [0.1.9] - 2021-02-16

### 修改

- `mesdoc` 补充 `id` 选择器的逻辑,完善可从缓存中快速获取的元素
- 修改 README 等

## [0.1.8] - 2021-02-15

### 修改

- `mesdoc` 去掉无用的生命周期声明,优化 `:only-child` 伪类选择器和 `select` 方法
- 修改 README 等

## [0.1.7] - 2021-02-14

### 修改

- `mesdoc` 中伪类选择器`:first-child`,`:last-child`,`:first-of-type`,`:last-of-type`改为别名选择器,减少代码
- 微调 `mesdoc``filter` 方法的实现,逻辑更为清晰

## [0.1.6] - 2021-02-13

### 修改

- 优化 `mesdoc` `:nth-child`等伪类选择器的性能
- 重写了`mesdoc``filter` 方法的逻辑,去掉了 id 选择器 `in_cache` 的逻辑,减少复杂度
- 修复了部分选择器不能正确匹配的问题

## [0.1.5] - 2021-02-10

### 修改

- 继续优化 `mesdoc` 中伪类选择器的性能

## [0.1.4] - 2021-02-09

### 修改

- 优化 `mesdoc` 中部分伪类选择器的性能
- 增加更多测试

### 修改

- 修复 `mesdoc``[attr|=value]` 选择器逻辑逻辑不正确的问题,优化 `value` 正则的匹配逻辑
- `mesdoc` 新增 `:contains` 内容选择器
- 增加更多测试用例、完善文档

## [0.1.3] - 2021-02-09

### 修改

- 修复 `mesdoc``[attr|=value]` 选择器逻辑逻辑不正确的问题,优化 `value` 正则的匹配逻辑
- `mesdoc` 新增 `:contains` 内容选择器
- 增加更多测试用例、完善文档

## [0.1.2] - 2021-02-08

### 修改

- `mesdoc``unique` 方法改为对外公共方法 `add`,增加 eq 的快捷方法`first`,`last`
- 修复 `mesdoc` `add` 排序方法存在的错误逻辑,增强了缓存的逻辑
- 修改部分判断逻辑为函数式写法
- 增加更多测试用例以及修改文档中的错误、完善部分文档说明

## [0.1.1] - 2021-02-07

### 修改

- 修复 `mesdoc` 中对比元素位置时的 bug
- 修复了 `mesdoc``parent``prev_all` 等所有需要去重的方法缺少去重而导致的重复节点错误
- 重写了 `mesdoc``closest``siblings` 方法,增加去重和排序
- 修改针对 text 节点`set_text`方法为直接修改内容,修复了原方法设置父节点错误导致的问题
- 增加 rust doc 注释和更多测试用例

## [0.1.0] - 2021-02-06

### 修改

- 去掉了 `mesdoc` 的 sort 方法
- 重写了 `unique` 方法以实现快速合并选择器的重复节点,速度有了大幅提升
- 修复了节点操作缺少父节点字段导致的节点丢失