htmlspanner-ohos

本项目基于HtmlSpanner开发。

简介

htmlspanner-ohos 是 Android HtmlSpanner 的鸿蒙化等价迁移实现,为 OpenHarmony Text 和 StyledString 提供 HTML 和 CSS 解析能力。该库支持将 HTML 内容转换为 StyledString,实现富文本渲染。

效果展示

效果展示

下载安装

ohpm install @ohos/htmlspanner

OpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包

约束与限制

兼容性

  • DevEco Studio: 6.0.1 Beta1(6.0.1.245SP4), SDK: API12 Release(5.0.0.71), ROM: 5.1.0.120;

权限要求

  • 如需加载网络图片,需在 module.json5 中添加网络权限:
{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }
    ]
  }
}

使用示例

基础用法

import { HtmlSpannerText } from '@ohos/htmlspanner'

@Entry
@Component
struct Index {
  @State html: string = '<p>Hello <b>World</b>!</p>'
  @State css: string = ''

  build() {
    Column() {
      HtmlSpannerText({
        html: this.html,
        css: this.css
      })
    }
    .width('100%')
    .height('100%')
  }
}

链接点击处理

import { HtmlSpannerText } from '@ohos/htmlspanner'

@Entry
@Component
struct Index {
  @State html: string = '<a href="https://example.com">点击链接</a>'

  build() {
    Column() {
      HtmlSpannerText({
        html: this.html,
        css: '',
        onLinkClick: (href: string) => {
          console.info('Link clicked:', href)
          // 处理链接点击
        }
      })
    }
    .width('100%')
    .height('100%')
  }
}

自定义标签处理

import { HtmlSpanner, HtmlSpannerText, TableHandlerCompat } from '@ohos/htmlspanner'

@Entry
@Component
struct Index {
  @State html: string = '<table><tr><td>Cell</td></tr></table>'

  build() {
    Column() {
      HtmlSpannerText({
        html: this.html,
        css: '',
        onSpannerReady: (spanner: HtmlSpanner) => {
          spanner.registerHandler('table', new TableHandlerCompat(spanner))
        }
      })
    }
    .width('100%')
    .height('100%')
  }
}

使用编译选项

import { HtmlSpannerText } from '@ohos/htmlspanner'

@Entry
@Component
struct Index {
  @State html: string = '<p>  Multiple   spaces  </p>'

  build() {
    Column() {
      HtmlSpannerText({
        html: this.html,
        css: '',
        spannerOptions: {
          stripExtraWhiteSpace: true
        }
      })
    }
    .width('100%')
    .height('100%')
  }
}

使用说明

HtmlSpannerText 组件

HtmlSpannerText 是最常用的组件,直接渲染 HTML 内容。

基本属性:

  • html: string - HTML 内容
  • css: string - CSS 样式(可选)
  • spannerOptions: Partial<HtmlSpannerOptions> - 编译选项(可选)
  • cancellationCallback: CancellationCallback - 取消回调(可选)
  • onLinkClick: (href: string) => void - 链接点击回调(可选)
  • imageLoader: HtmlSpannerImageLoader - 自定义图片加载器(可选)
  • onSpannerReady: (spanner: HtmlSpanner) => void - Spanner 就绪回调(可选)

HtmlSpanner 类

HtmlSpanner 提供了更底层的 API,适用于需要手动控制渲染流程的场景。

主要方法:

// 创建实例
const spanner = new HtmlSpanner(options?, rendererOptions?)

// 解析 HTML 为节点树
const node = spanner.parse(html, callback?)

// 编译为文本模型
const model = spanner.toModel(html, css?, callback?)

// 渲染为 StyledString
const styledString = spanner.fromHtml(html, css?, callback?)

// 异步渲染(支持异步图片加载)
const styledString = await spanner.fromHtmlAsync(html, css?, callback?)

// 注册自定义标签处理器
spanner.registerHandler(tagName, handler)

// 注销标签处理器
spanner.unregisterHandler(tagName)

CSS 支持

库支持部分 CSS 属性,包括:

  • 文本样式:color, font-size, font-weight, font-style, font-family
  • 文本装饰:text-decoration, text-align, text-indent
  • 布局:display, margin-*, padding-*
  • 背景:background-color
  • 边框:border-style, border-color, border-width

图片加载

默认支持以下图片源:

  • HTTP/HTTPS URL:<img src="https://example.com/image.png">
  • 应用资源:<img src="$media:icon"><img src="app.media.icon">
  • 本地文件路径

自定义图片加载:

HtmlSpannerText({
  html: this.html,
  css: '',
  imageLoader: (source: string, run: AttachmentRun) => {
    // 自定义图片加载逻辑
    return createDefaultImageAttachment(run)
  }
})

表格支持

表格处理需要手动注册 TableHandlerCompat:

import { HtmlSpanner, HtmlSpannerText, TableHandlerCompat } from '@ohos/htmlspanner'

HtmlSpannerText({
  html: '<table><tr><td>Cell 1</td><td>Cell 2</td></tr></table>',
  css: '',
  onSpannerReady: (spanner: HtmlSpanner) => {
    spanner.registerHandler('table', new TableHandlerCompat(spanner))
  }
})

取消解析

支持通过 CancellationCallback 取消长时间运行的解析任务:

interface CancelGate {
  cancelled: boolean
}

class GateCallback implements CancellationCallback {
  private readonly gate: CancelGate

  constructor(gate: CancelGate) {
    this.gate = gate
  }

  isCancelled(): boolean {
    return this.gate.cancelled
  }
}

const gate: CancelGate = { cancelled: false }
const callback = new GateCallback(gate)

HtmlSpannerText({
  html: largeHtml,
  css: '',
  cancellationCallback: callback
})

// 取消解析
gate.cancelled = true

接口说明

组件

名称 描述 主要参数 必填 HarmonyOS 平台支持
HtmlSpannerText HTML渲染组件,直接将HTML内容渲染为StyledString html: string // HTML内容
css?: string // CSS样式
spannerOptions?: Partial<HtmlSpannerOptions> // 编译选项
cancellationCallback?: CancellationCallback // 取消回调
imageLoader?: HtmlSpannerImageLoader // 图片加载器
onLinkClick?: (href: string) => void // 链接点击回调
onSpannerReady?: (spanner: HtmlSpanner) => void // Spanner就绪回调

HtmlSpanner 方法

方法名 描述 参数 返回值 HarmonyOS 平台支持
parse 解析HTML为节点树 html: string // HTML内容
callback?: CancellationCallback // 取消回调
HtmlSpannerNode
parseUtf8 解析UTF-8字节 bytes: Uint8Array // UTF-8字节数组
callback?: CancellationCallback // 取消回调
HtmlSpannerNode
toModel 编译为文本模型 html: string // HTML内容
css?: string // CSS样式
callback?: CancellationCallback // 取消回调
SpannerTextModel
toModelUtf8 从UTF-8字节编译模型 bytes: Uint8Array // UTF-8字节数组
css?: string // CSS样式
callback?: CancellationCallback // 取消回调
SpannerTextModel
fromHtml 渲染为StyledString html: string // HTML内容
css?: string // CSS样式
callback?: CancellationCallback // 取消回调
StyledString
fromHtmlAsync 异步渲染为StyledString html: string // HTML内容
css?: string // CSS样式
callback?: CancellationCallback // 取消回调
Promise<StyledString>
fromHtmlUtf8 从UTF-8字节渲染 bytes: Uint8Array // UTF-8字节数组
css?: string // CSS样式
callback?: CancellationCallback // 取消回调
StyledString
fromTagNode 从节点树渲染 root: HtmlSpannerNode // 节点树
css?: string // CSS样式
callback?: CancellationCallback // 取消回调
StyledString
toStyledString 渲染为StyledString html: string // HTML内容
css?: string // CSS样式
callback?: CancellationCallback // 取消回调
StyledString
toStyledStringAsync 异步渲染为StyledString html: string // HTML内容
css?: string // CSS样式
callback?: CancellationCallback // 取消回调
Promise<StyledString>
toMutableStyledString 渲染为MutableStyledString html: string // HTML内容
css?: string // CSS样式
callback?: CancellationCallback // 取消回调
MutableStyledString
registerHandler 注册标签处理器 tagName: string // 标签名
handler: TagNodeHandlerCompat // 处理器
void
unregisterHandler 注销标签处理器 tagName: string // 标签名 void
getHandlerFor 获取标签处理器 tagName: string // 标签名 TagNodeHandlerCompat | undefined
getFont 获取字体 name: string | undefined // 字体名 FontFamily
setFontResolver 设置字体解析器 resolver: FontResolver // 字体解析器 void
setStripExtraWhiteSpace 设置空白折叠 value: boolean // 是否折叠空白 void
setAllowStyling 设置是否允许样式 value: boolean // 是否允许样式 void
setUseColoursFromStyle 设置是否使用样式颜色 value: boolean // 是否使用样式颜色 void
setUseFontSizeFromStyle 设置是否使用样式字号 value: boolean // 是否使用样式字号 void

类型

名称 描述 字段 HarmonyOS 平台支持
HtmlSpannerOptions HtmlSpanner构造选项 stripExtraWhiteSpace?: boolean // 是否折叠空白
allowStyling?: boolean // 是否允许样式
useColoursFromStyle?: boolean // 是否使用样式颜色
useFontSizeFromStyle?: boolean // 是否使用样式字号
pruneTags?: string[] // 剪枝标签列表
fontResolver?: FontResolver // 字体解析器
contrastPatcher?: ContrastPatcher // 对比度补丁器
htmlCleaner?: HtmlSpannerHtmlCleaner // HTML清理器
StyledStringRendererOptions StyledStringRenderer渲染选项 -
CancellationCallback 取消回调接口 isCancelled: () => boolean // 返回是否已取消
HtmlSpannerImageLoader 图片加载器类型 source: string // 图片源
run: AttachmentRun // 附件运行信息
HtmlSpannerImageLoaderResult 图片加载器返回类型 ImageAttachment | Promise<ImageAttachment | undefined> | undefined
AttachmentRun 附件运行信息 包含图片的位置、尺寸等
LinkRun 链接运行信息 -
CustomRun 自定义运行信息 -
CustomRunData 自定义运行数据 -
SerializableStyleRun 可序列化样式运行 -
TableRowAttachmentPayload 表格行附件负载 -
StyleProperties 样式属性接口 -
StyleValueUnit 样式值单位 'px' | 'em' | 'percentage' | 'pt' | 'rem' | 'vw' | 'vh' | 'auto'
TableRasterLayoutSpec 表格格栅布局规格 -
TableCellRect 表格单元格矩形 -
TableComplianceLayoutOptions 表格合规布局选项 -
HtmlSpannerTextCustomTagRule 自定义标签规则 tagName: string // 标签名
style?: HtmlSpannerTextCustomTagStyle // 样式
display?: HtmlSpannerTextCustomTagDisplay // 显示类型
HtmlSpannerTextCustomTagStyle 自定义标签样式 fontFamily?: string // 字体族
fontSize?: number // 字号
fontWeight?: HtmlSpannerTextCustomTagFontWeight // 字重
fontStyle?: HtmlSpannerTextCustomTagFontStyle // 字体样式
color?: string // 颜色
backgroundColor?: string // 背景色
textDecoration?: HtmlSpannerTextCustomTagTextDecoration // 文本装饰
textAlign?: HtmlSpannerTextCustomTagTextAlign // 文本对齐
HtmlSpannerTextCustomTagDisplay 自定义标签显示类型 'inline' | 'block'
HtmlSpannerTextCustomTagFontWeight 自定义标签字重 number | 'normal' | 'bold'
HtmlSpannerTextCustomTagFontStyle 自定义标签字体样式 'normal' | 'italic'
HtmlSpannerTextCustomTagTextAlign 自定义标签文本对齐 'left' | 'center' | 'right' | 'justify'
HtmlSpannerTextCustomTagTextDecoration 自定义标签文本装饰 'none' | 'underline' | 'line-through' | 'overline'
FontTypeface 字体字重 fontFamily: string // 字体族名
fontWeight?: number // 字重
HttpImageLayoutSnapshotVp HTTP图片布局快照 -
ScaledHttpImageDecodeDebugInfo 缩放图片解码调试信息 -
HttpImageCenterDebugLogger HTTP图片居中调试日志器 -
HtmlSpannerFileSource 文件源 -
HtmlSpannerHtmlSource HTML源 -
HtmlSpannerLoaderSource 加载器源 -
HtmlSpannerRawFileSource 原始文件源 -
HtmlSpannerTextSource 文本源 -
HtmlSpannerUtf8Source UTF-8源 -
SpannerTextModelJson 文本模型JSON -
CssDeclarationCompat CSS声明 -
CssRuleCompat CSS规则 -
CompiledCssRuleCompat 编译后CSS规则 -
StyleUpdater 样式更新器 -
StyleUpdaterHost 样式更新器宿主 -
TagNodeMatcher 标签节点匹配器 -

函数

名称 描述 参数 返回值 HarmonyOS 平台支持
createDefaultImageAttachment 创建默认图片附件 run: AttachmentRun // 附件运行信息 ImageAttachment | undefined
createImageCacheKey 创建图片缓存键 run: AttachmentRun // 附件运行信息 string
createImagePlaceholder 创建图片占位符 run: AttachmentRun // 附件运行信息
failed: boolean // 是否加载失败
StyledString
createScaledHttpImageLoader 创建HTTP图片加载器 - HtmlSpannerImageLoader
createScaledHttpImageAttachment 创建缩放HTTP图片附件 run: AttachmentRun // 附件运行信息
displayDensity: number // 显示密度
ImageAttachment | undefined
createScaledHttpImageAttachmentResolver 创建缩放HTTP图片附件解析器 displayDensity: number // 显示密度 (run: AttachmentRun) => ImageAttachment | undefined
clearHttpImageLayoutCache 清除HTTP图片布局缓存 - void
computeParagraphCenterLineBoxWidthVp 计算段落居中行盒宽度 - number
expandHttpImageForParagraphCenterFromCache 从缓存扩展HTTP图片 run: AttachmentRun // 附件运行信息 ImageAttachment | undefined
getHttpImageLayoutSnapshotDimensions 获取HTTP图片布局快照尺寸 run: AttachmentRun // 附件运行信息 HttpImageLayoutSnapshotVp | undefined
parseStyleValue 解析样式值 input: string | undefined | null // 样式字符串 StyleValue | undefined
translateLegacyFontSize 转换传统字号(1-7) fontSize: number // 传统字号(1-7) StyleValue
decodeUtf8BytesToString UTF-8字节解码为字符串 bytes: Uint8Array // UTF-8字节数组 string
replaceHtmlEntities 替换HTML实体 text: string // 文本内容
inAttribute: boolean // 是否在属性中
string
createDefaultContrastPatcher 创建默认对比度补丁器 - ContrastPatcher
defaultHtmlSpannerOptions 获取默认选项 - HtmlSpannerOptions
mergeHtmlSpannerOptions 合并选项 options?: Partial<HtmlSpannerOptions> // 部分选项 HtmlSpannerOptions
defaultStyledStringRendererOptions 获取默认渲染器选项 - StyledStringRendererOptions
readHtmlSource 读取HTML源 source: HtmlSpannerHtmlSource // HTML源 string | Promise<string>
getDisplayDensity 获取显示密度 - number
buildTableRasterLayoutSpecFromAttachmentRun 构建表格格栅布局规格 run: AttachmentRun // 附件运行信息 TableRasterLayoutSpec | undefined
createTableComplianceAttachmentResolver 创建表格合规附件解析器 options?: TableComplianceLayoutOptions // 布局选项 (run: AttachmentRun) => ImageAttachment | undefined
rasterTableLayoutSpecWithOffscreenCanvas 离屏Canvas栅格化表格 spec: TableRasterLayoutSpec // 布局规格 ImageAttachment
compileCssRulesSkippingFailures 编译CSS规则跳过失败 rules: string[] // CSS规则数组 CompiledCssRuleCompat[]
createMatchersFromSelector 从选择器创建匹配器 selector: string // CSS选择器 TagNodeMatcher[]
matchesSelectorChain 匹配选择器链 node: HtmlSpannerNode // HTML节点
matchers: TagNodeMatcher[] // 匹配器数组
boolean

关于混淆

obfuscation-rules.txt 中添加以下规则以避免混淆:

-keep class @ohos/htmlspanner.** { *; }
-keep class * implements @ohos/htmlspanner.HtmlSpannerImageLoader { *; }
-keep class * implements @ohos/htmlspanner.FontResolver { *; }
-keep class * implements @ohos/htmlspanner.CancellationCallback { *; }

目录结构

htmlspanner-ohos/
├── library/                  # 核心库代码
│   ├── src/main/ets/
│   │   ├── components/      # 组件(HtmlSpannerText)
│   │   ├── font/            # 字体处理
│   │   ├── handler/         # 标签处理器
│   │   ├── htmlspanner/     # 核心类
│   │   ├── model/           # 数据模型
│   │   ├── parser/          # 解析器
│   │   ├── renderer/        # 渲染器
│   │   ├── style/           # 样式处理
│   │   ├── table/           # 表格处理
│   │   └── util/            # 工具函数
│   └── oh-package.json5     # 库配置
├── entry/                    # Demo 应用
├── docs/                     # 文档
├── tests/                    # 测试用例
├── scripts/                  # 构建脚本
├── LICENSE                   # 许可证
├── NOTICE                    # 版权声明
└── README.OpenSource         # 开源声明

开源协议

本项目基于 Apache License 2.0 许可证。

第三方依赖