容器的概念
阅读本文前,默认您已经阅读了我的专栏Tin标记语言中的基础代码实现文章。
抽象概念
Tin的容器概念,顾名思义,就是包含某种内容信息的集合。这个集合里的内容不是分散地被TinEngine解析的,而是会被TinEngine从整体内容中分离出来,然后将这个集合整体进行解析,以相对独立的环境进行渲染操作。
相关的代码实现操作,在我的专栏Tin标记语言中,用Python创造一门标记语言并渲染(6)这篇文章里已经进行了详细的阐述。
关于如何将集合内容分离、辨别渲染、定位错误等内容,代码框架均在那篇文章中实现。我们将这个概念由抽象转为具体,就是使用列表遍历中的“pass_t 标志”,然后将容器内容转化为被分离出来的列表中的内容。
具体写法
这与Python没有半毛钱关系,我已经用Python实现Tin了。
在Tin中,容器实际上有另一个名称:“标签集”,相较于“标签行”,标签集就包含了在这个容器范围内的所有标签集。下面以密码容器(“-pass-”)为例,在Tin中,这样写:
<title>标签集(容器)演示
<main>这一段不再容器内~~~
;不玩了,下面定义密码:000
<key>000;密码是常规密码
;容器标记开始
<-pass->
<main>这是<-pass->容器的开始;center;green
<sp>2
;空行和注释在标签集(容器)中也可以存在
<middle>来一个logo
<img>TinLogo.png;http://smart-space.github.io/img/TinLogo.png;300x300
<sp>
<main>logo好看吗?
<stop>6
<main>这是容器里的最后一行;center;green
</-pass>
;</-pass>是相对于<-pass->的密码容器截止标记
<main>容器内容结束
Tin中使用英文分号(;)在开头,标示这一行是注释,渲染时同空行一样会被忽略。
由此看来,Tin的容器写法十分简单,不想前面提到的那篇文章中,使用Python实现的种种曲折。当然,Tin使用Python实现解析的。
行内块元素与标签集
因为Markdown语法没有容器这个概念(转化为html后有类似标记),因此这里要着重讲明HTML的行内块元素与Tin的标签集。
HTML是超文本标记语言,比Tin更上一个层次,但需要的解析渲染器的体积也更大。但是两者的标记主体类似,以其中的“标题”为例:
HTML | Tin |
---|---|
<h1>title</h1> | <title>title;;;0 or <title>title |
<h2>title</h2> | <title>title;;;1 |
… | … |
这样看上去,两者的标记很像,但本质上是不同的。
HTML使用的是元素概念,元素之间的叫“行内块元素”,也就是元素之间允许嵌套,解析的是元素之间的格式,然后再根据这个格式,对每一个元素进行渲染。
Tin使用的是标签(行)概念,特定的标记标签之间的整体叫做标签集,不允许嵌套,直接对每一个标签进行解析渲染,没有分析这一步。
因此,相对来说,Tin在“标记”这一块做得更直接一点。渲染HTML需要先解析元素之间的位置以及从属关系,才能够继续进行渲染。而Tin在每一行的开头,就用标记告诉TinEngine该怎么做,省去了中间解析从属关系的步骤,一定程度上提升了效率。
在TinEngine中,标签集的开头和结尾标记是额外告诉TinEngine现在渲染的标签行属于全文还是容器,根据这个TinEngine会调整错误回显和渲染逻辑。
而在TinChecker中,使用的是如HTML一样的嵌套逻辑。
Tin中常用的标签集写法
囊括式标签集
这个写法就是上面的例子。在标签集的首尾标记之间加入常规标签行。
分割式标签集
分割式标签集使用范围很小,(一直以来)只有密码容器和询问渲染容器能够使用分割式标签集。
分割式标签行即以标签集标记开头为整一行的开始,标签集内的每一个标签行之间用“|”分割,结尾不需要结束标记,因为TinEngine只将这一行的内容认定为标签集。下面以询问渲染容器(“-askyesno-”)为例:
<main>询问渲染容器一般用于非硬性要求规定的渲染内容,可以节省读者阅读时间
;下面是整一行,其中每一个标签行用“|”分割
<-askyesno-><main>这是本标签集的开始;center;orange|<main>这是第二行|<main>这是结尾
从此来看,分割式标签集的写法其实更简单,但是可读性差,一般只能用于容器内标签行数量很少的情况,否则读者不会受任何影响,但编者再写的时候就……
参数式标签集
参数时标签集目前只有即时呈现标签(“jit”,别问我为什么要使用“即时编译”,当时可能*抽了)能够使用。事实上,参数式标签集更像是标记,而不是容器,并且在TinEngine中也并不会有分离这一步操作。但是,这篇文章跟Python没有半毛钱关系,因此这里只从Tin的层面分析。
及时呈现标签可以让读者真正能够跟着编写者的思路阅读文章,该容器内的每一个标签行渲染后的一瞬间,TinText就会显示到那个位置,也就是说读者不需要自己滑动文本框的滑块。关于该标签的具体高效使用以后再说,先来看看这个容器怎么写:
<main><jit>这个标签虽然简单,但是很实用
;准备开始
<jit>+
;<jit>的参数只有两个值:+ 或 -,+ 表示开始
<title>假装这里面有很多行内容
<main>你会看到TinText自动滚动可视范围
<jit>-
;<jit>结束
<title>假装这里面有很多行内容
<main>TinText将不再滚动
结语
容器这个概念的产生、标签集的使用,给Tin带来了更丰富的语法。在不增加标记文本复杂程度的前提下, Tin适应了更加多样的呈现需求,真正做到了让读者跟随编写者的思路阅读文章。