kotlin读取html,Kotlin DSL for HTML实例解析

本文解析了Kotlin DSL在创建HTML方面的应用,通过需求分析、设计和实现,阐述了如何构建一个允许创建类似`html { head { } body { } }`的Kotlin代码来输出HTML文本的DSL。讲解了DSL的基础知识,包括Kotlin中的lambda表达式和扩展方法,并展示了在Gradle和Anko等场景中的DSL使用。
摘要由CSDN通过智能技术生成

Kotlin DSL for HTML实例解析

Kotlin DSL, 指用Kotlin写的Domain Specific Language.

本文通过解析官方的Kotlin DSL写html的例子, 来说明Kotlin DSL是什么.

首先是一些基础知识, 包括什么是DSL, 实现DSL利用了那些Kotlin的语法, 常用的情形和流行的库.

对html实例的解析, 没有一冲上来就展示正确答案, 而是按照分析需求, 设计, 和实现细化的步骤来逐步让解决方案变得明朗清晰.

理论基础

DSL: 领域特定语言

DSL: Domain Specific Language.

专注于一个方面而特殊设计的语言.

可以看做是封装了一套东西, 用于特定的功能, 优势是复用性和可读性的增强. -> 意思是提取了一套库吗?

不是.

DSL和简单的方法提取不同, 有可能代码的形式或者语法变了, 更接近自然语言, 更容易让人看懂.

Kotlin语言基础

做一个DSL, 改变语法, 在Kotlin中主要依靠:

lambda表达式.

扩展方法.

三个lambda语法:

如果只有一个参数, 可以用it直接表示.

如果lambda表达式是函数的最后一个参数, 可以移到小括号()外面. 如果lambda是唯一的参数, 可以省略小括号().

lambda可以带receiver.

扩展方法.

流行的DSL使用场景

Gradle的build文件就是用DSL写的.

之前是Groovy DSL, 现在也有Kotlin DSL了.

还有Anko.

这个库包含了很多功能, UI组件, 网络, 后台任务, 数据库等.

和服务器端用的: Ktor

应用场景: Type-Safe Builders

type-safe builders指类型安全, 静态类型的builders.

这种builders就比较适合创建Kotlin DSL, 用于构建复杂的层级结构数据, 用半陈述式的方式.

官方文档举的是html的例子.

后面就对这个例子进行一个梳理和解析.

html实例解析

1 需求分析

首先明确一下我们的目标.

做一个最简单的假设, 我们期待的结果是在Kotlin代码中类似这样写:

html {

head { }

body { }

}

就能输出这样的文本:

发现1: 调用形式

仔细观察第一段Kotlin代码, html{}应该是一个方法调用, 只不过这个方法只有一个lambda表达式作为参数, 所以省略了().

里面的head{}和body{}也是同理, 都是两个以lambda作为唯一参数的方法.

发现2: 层级关系

因为标签的层级关系, 可以理解为每个标签都负责自己包含的内容, 父标签只负责按顺序显示子标签的内容.

发现3: 调用限制

由于和等标签只在标签中才有意义, 所以应该限制外部只能调用html{}方法, head{}和body{}方法只有在html{}的方法体中才能调用.

发现4: 应该需要完成的

如何加入和显示文字.

标签可能有自己的属性.

标签应该有正确的缩进.

2 设计

标签基类

因为标签看起来都是类似的, 为了代码复用, 首先设计一个抽象的标签类Tag, 包含:

标签名称.

一个子标签的list.

一个属性列表.

一个渲染方法, 负责输出本标签内容(包含标签名, 子标签和所有属性).

怎么加文字

文字比较特殊, 它不带标签符号<>, 就输出自己.

所以它的渲染方法就是输出文字本身.

可以提取出一个更加基类的接口Element, 只包含渲染方法. 这个接口的子类是Tag和TextElement.

有文字的标签, 如, 它的输出结果:

    

HTML encoding with Kotlin

文字元素是作为标签的一个子标签的.

这里的实现不容易自己想到, 直接看后面的实现部分揭晓答案吧.

3 实现

有了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值