Android DSL

news2024/11/22 21:30:10

文章目录

  • Android DSL
    • 概述
    • 使用DSL构建HTML
    • 代码下载

Android DSL

概述

Kotlin DSL(领域特定语言)是一种使用 Kotlin 语言编写的,用于解决特定问题领域的语言。DSL 使得代码更易读、易写,因为它的语法和领域问题的语法更接近。Kotlin 的强大类型系统和灵活性使得创建 DSL 变得更加容易。

使用DSL构建HTML

定义接口:

interface IElement {

    // 拼接HTML字符串,每个元素都需要实现
    fun render(builder: StringBuilder, indent: String): String
}

实现父类:

/**
 * 需要传入标签名和内容
 * 每个元素都有标签名,如:<p>hello</p>、<img />
 */
open class BaseElement(val tagName: String, val content: String = "") : IElement {

    private val children = mutableListOf<BaseElement>() //元素内的所有子元素
    private val _attributes = mutableMapOf<String, String>() //元素的属性名和属性值
    protected val attributes get() = _attributes

    protected fun addElement(element: BaseElement) {
        this.children.add(element)
    }

    protected fun renderAttributes(): String {
        val builder = StringBuilder()
        if (attributes.isNotEmpty()) {
            for ((attrName, attrValue) in attributes) {
                builder.append(""" $attrName="$attrValue"""")
            }
        }
        return builder.toString()
    }

    override fun render(builder: StringBuilder, indent: String): String {
        builder.append("$indent<$tagName")
        builder.append(renderAttributes())
        builder.append(">\n")
        if (content.isNotBlank()) {
            builder.append("    $indent$content\n")
        }
        children.forEach {
            it.render(builder, "    $indent")
        }
        builder.append("$indent</$tagName>\n")
        return builder.toString()
    }

    operator fun invoke(): String {
        val builder = StringBuilder()
        return render(builder, "")
    }
}

实现子元素:

fun html(block: Html.() -> Unit): Html {
    val html = Html()
    html.block()
    return html
}

// <html>标签
class Html() : BaseElement("html") {
    fun head(block: Head.() -> Unit): Head {
        val head = Head()
        head.block()
        addElement(head)
        return head
    }

    fun body(block: Body.() -> Unit): Body {
        val body = Body()
        body.block()
        addElement(body)
        return body
    }
}

// <head>标签
class Head : BaseElement("head") {
    fun title(block: () -> String): Title {
        val content = block()
        val title = Title(content)
        addElement(title)
        return title
    }
}

// <title>标签
class Title(content: String) : BaseElement("title", content)

// <body>标签
class Body : BaseElement("body") {
    fun h1(block: () -> String): H1 {
        val content = block()
        val h1 = H1(content)
        addElement(h1)
        return h1
    }

    fun p(block: () -> String): P {
        val content = block()
        val p = P(content)
        addElement(p)
        return p
    }

    fun a(href: String = "", block: () -> String): A {
        val content = block()
        val a = A(content).apply {
            this.href = href
        }
        addElement(a)
        return a
    }

    fun img(src: String = "", alt: String = ""): Img {
        val img = Img().apply {
            this.src = src
            this.alt = alt
        }
        addElement(img)
        return img
    }
}

// <h1>标签
class H1(content: String) : BaseElement("h1", content)

// <p>标签
class P(content: String) : BaseElement("p", content)

// <a>标签
class A(content: String) : BaseElement("a", content) {
    var href: String
        get() = attributes["href"]!!
        set(value) {
            attributes["href"] = value
        }
}

// <img>标签
class Img : BaseElement("img") {
    var src: String
        get() = attributes["src"]!!
        set(value) {
            attributes["src"] = value
        }

    var alt: String
        get() = attributes["alt"]!!
        set(value) {
            attributes["alt"] = value
        }

    override fun render(builder: StringBuilder, indent: String): String {
        return builder.append("$indent<$tagName")
            .append(renderAttributes())
            .append(" />\n")
            .toString()
    }
}

使用:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val webView: WebView = findViewById(R.id.webView)

        val htmlStr = getHtmlStr()
        webView.loadData(htmlStr, "text/html", "UTF-8")
    }

    private fun getHtmlStr(): String {
        return html {
            head {
                title {
                    "hello Kotlin"
                }
            }
            body {
                h1 {
                    "hello world DSL"
                }
                p {
                    "--------------------------"
                }
                img(
                    src = "https://img-home.csdnimg.cn/images/20201124032511.png",
                    alt = "hello DSL"
                )
                p {
                    "=========================="
                }
                a(href = "https://blog.csdn.net/qq_14876133") {
                    "Kotlin"
                }
            }
        }()
    }
}

效果:

在这里插入图片描述

输出的html字符串:

<html>
        <head>
            <title>
                hello Kotlin
            </title>
        </head>
        <body>
            <h1>
                hello world DSL
            </h1>
            <p>
                --------------------------
            </p>
            <img src="https://img-home.csdnimg.cn/images/20201124032511.png" alt="hello DSL" />
            <p>
                ==========================
            </p>
            <a href="https://blog.csdn.net/qq_14876133">
                Kotlin
            </a>
        </body>
    </html>

代码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1153479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2021-arxiv-LoRA Low-Rank Adaptation of Large Language Models

2021-arxiv-LoRA Low-Rank Adaptation of Large Language Models Paper: https://arxiv.org/abs/2106.09685 Code: https://github.com/microsoft/LoRA 大型语言模型的LoRA低秩自适应 自然语言处理的一个重要范式包括对通用领域数据的大规模预训练和对特定任务或领域的适应。…

elementUI树节点全选,反选,半选状态

// <template>部分 <div class"check-block"><el-divider></el-divider><el-checkbox :indeterminate"indeterminate" v-model"checkAll" change"handleCheckAllChange">全选</el-checkbox><e…

足底筋膜炎怎么治疗最有效

足底筋膜炎的几种症状表现&#xff1a; 1、足跟的内侧足底处的疼痛和压痛。 2、早晨起床后疼痛和僵硬明显&#xff0c;活动后痛感逐渐减轻。 3、光脚或用脚尖跑步、走路都会加剧疼痛。 4、疼痛随着跑步、长时间走路或站立等负重活动而加剧。轻度时可能会以足底僵硬为主&…

可直接在Maya实时表情捕捉的面捕头盔,为3D模型表情制作提速!

面捕表情捕捉头盔可以用于捕捉真人的面部表情&#xff0c;从微小的皱纹到大的脸部肌肉运动&#xff0c;通过面捕头盔&#xff0c;都可以实时转化到虚拟角色上。 在元宇宙浪潮下&#xff0c;围绕虚拟人的应用场景和时长变得愈加多元&#xff0c;人们对虚拟人的精度不再仅限于简…

01.CentOS7静默安装oracle11g

CentOS7静默安装oracle11g 一、下载Oracle11g安装包二、开始安装oracle11g三、配置Oracle监听程序四、添加数据库实例五、设置开机启动六、登录后解除锁定 一、下载Oracle11g安装包 下载链接&#xff1a;https://pan.baidu.com/s/1gcLMFGX7-8ju7OoFOFLzQA 提取码&#xff1a;6…

python_PyQt5日周月K线纵向对齐显示_3_聚焦某段图形

目录 写在前面&#xff1a; 结果显示&#xff1a; 代码&#xff1a; 写在前面&#xff1a; “PyQt5日周月K线纵向对齐显示”&#xff0c;将分三篇博文描述 1 数据处理。将数据处理成适合图形显示的格式。&#xff08;已写&#xff0c;请看往期博文&#xff09; 2 显示工具…

搜维尔科技:Varjo在心理学、医学研究、技术、工程学等领域都在使用

该软件用于心理学、医学研究、可用性、品牌和营销等领域。vajio头显组合到了运动8.0平台中,提供了在高保真虚拟环境中进行的行为研究,否则这些环境的成本太高,不切实际,甚至无法在现实世界中再现。 在心理学、医学研究、可用性、技术、工程学、市场营销等领域工作的学术和商业研…

【项目管理】生命周期风险评估

规划阶段目标&#xff1a;识别系统的业务战略&#xff0c;以支撑系统的安全需求及安全战略 规划阶段评估重点&#xff1a;1、本阶段不需要识别资产和脆弱性&#xff1b;2、应根据被评估对象的应用对象、应用环境、业务状况、操作要求等方面识别威胁&#xff1b; 设计阶段目标…

草莓熊代码

话不多说直接上代码 如果需要exe文件电脑可以不依赖环境直接运行请评论或者私信 注意: 不需要年月日显示 注释 879-894 行不需要雪花显示 注释 895-908 行不需要礼物显示 注释 771 行653行 可以修改 祝你节日快乐内容657行 可以修改 草莓熊 内容修改程序标题 第 16 行# -*- co…

Tower for Mac—Git客户端 支持M1

Tower是一款Mac OS X系统上的Git客户端软件&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助用户更加方便地管理和使用Git版本控制系统。以下是Tower的一些特点&#xff1a; 1. 界面友好&#xff1a;Tower的界面友好&#xff0c;使用户能够轻松地掌握软件的使用方法。 …

使用考试培训系统定制适合不同学生需求的教学内容

考试培训系统是一种方便高效的教育工具&#xff0c;可以根据不同学生的需求定制教学内容。通过使用这个系统&#xff0c;教师可以为学生提供个性化的学习计划&#xff0c;帮助他们提高学习效果。以下将详细介绍如何使用考试培训系统定制适合不同学生需求的教学内容。 考试培训系…

联手皇室企业 哪吒汽车发力阿联酋

布局阿联酋,哪吒汽车全球化战略加速落地。10月27日,哪吒汽车与阿联酋知名企业——EIH Automotive &Trading,在上海签署战略合作协议,并宣布2024年将为阿联酋带去多款车型。拥有皇室背景的EIH Automotive &Trading,将成为哪吒汽车在阿联酋的首家战略经销商,加速哪吒汽车…

【深度学习实验】网络优化与正则化(二):基于自适应学习率的优化算法详解:Adagrad、Adadelta、RMSprop

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 随机梯度下降SGD算法a. PyTorch中的SGD优化器b. 使用SGD优化器的前馈神经网络 2.随机梯度下降的改进方法a. 学习率调整b. 梯度估计修正 3. 梯度估计修正&#xff1a;动量法Momen…

Termux SFTP如何实现远程文件传输

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

LSH 复习(考试向)

LSH Review OverallMinhash SignaturesBinary Matrix&#xff08;bit-vector&#xff09;Construct MinHash matrixGenerate simulated permutationsJaccard similarities Tuning Parameters for rNNS Overall hash就是将不同长度规则的文本转化成相同长度的字符串&#xff0c…

问CHAT:以“重要性”为题写一篇作文

今天小编带大家看看&#xff0c;如何利用CHAT 写一篇作文&#xff0c;那我们来根据要求来问它。 问CHAT &#xff1a;以“重要性”为题写一篇作文&#xff0c;非语言交流的基础”根据下面的提纲来写作文。 1)非言语交际概述。 (暗示:暗示、敏感、情感、非语言) 2)非言语交际的…

Leetcode刷题---搜索插入位置(Java实现二分查找算法)

题目描述&#xff1a; 题解一 class Solution {public int searchInsert(int[] nums, int target) {int i0;while(i<nums.length){if(nums[i]>target){return i;}if(nums[i]<target ){i;}}return i;} }题解二—使用二分查找算法 使用算法前提&#xff1a;数组是一…

52张扑克牌(Python字符串替换)

输入a~d的字母对应扑克牌黑、红、梅、方花色 1~13数字对应扑克牌点数&#xff1b;输出“字母数字”字符串对应的扑克牌花色和点数。 (本笔记适合熟悉Python循环和str字符串处理的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free…

【二叉树经典题目】

根据二叉树创建字符串 本题的关键在于什么情况要省略括号&#xff0c;什么情况不能省略&#xff1a; 左右为空可以省略括号 左不为空&#xff0c;右为空可以省略括号左为空,右不为空不能省略括号 class Solution { public://1.左右为空可以省略括号//2.左不为空&#xff0c;右…

杰林码纠错算法库(lib、dll)以及AWGN信道BPSK信号下的仿真程序(C/C++)

2023年10月30日此次是我最后一次在国内发布纠错算法的测试程序&#xff0c;这个算法2018年左右就出来了第一个版本&#xff0c;部分网络上也能下载到测试程序&#xff0c;尽管以前的版本效率跟不上&#xff0c;而且码率比较固定只能支持0.63。通过几年的努力&#xff0c;我这次…