python.tkinter设计标记语言(渲染7-动态呈现标签) - 副本
@TOC
前言
Tin标记语言的一个特性就是在渲染呈现的时候,让读者的思维跟着作者走,那么动态呈现是肯定的(当然,这是除了每渲染一则标记就更新阅读器,这个不算)。在新版的TinML中,就有若干负责动态呈现内容的标签:
-
<part>
,由读者来决定呈现哪部分的内容(这个标签在上一篇文章讲过,本文将不展示实现细节)
-
<wait>
,由读者决定何时开始阅读接下来的内容(这个标签在上一篇文章讲过,本文将不展示实现细节)
-
<pages>
,将一部分内容分为若干个标签页进行阅读 -
<ac>
,作为锚点,由读者决定是否跳转到对应的位置查看
动态呈现标签的解释和渲染
上述这些标签在解析中是无法和普通渲染标记、流程控制标记区分出来的,因此它们的呈现全部在解释器和渲染器中完成。
本小节将以<pages>
标签为例解释。
<part>
实际上还是属于流程控制标记,因为其可以嵌套,且最终渲染内容可以被读者选择进行渲染呈现,而<pages>
无论读者是否想看,都会渲染,只不过对于读者来说,可以选择对已经完成渲染的内容是否查看。
和<part>
标记类似,当<pages>
开头标记出现后,解释器部分self.PAGES_TAG
被赋值为True
,那么就会在正式匹配标签与标记之前触发解析多页面内容。根据TinML优先级中控制标签大于元素标签的规则,多页面标记的判定要晚于<part>
的判定。
if self.PAGES_TAG:
if unit[1] not in ('</pages>','</page>'):
if len(unit)==3:
tincontent=''.join(unit[1:])
else:
tincontent=unit[1]+'|'.join(unit[2:])
self.page_content.append(tincontent)
continue
<pages>
虽然无法在单一源文本嵌套,但是允许多页面分割(本来就应该的属性)。当遇到界面终止标签</page>
后,渲染已经读取的页面内容,清空缓存列表并继续读取:
case '</page>':
#<pages>的间隔标签
page_tin='\n'.join(self.page_content)
#渲染页面,但是是线程阻塞的
self.pages[page_num].thread_render(page_tin,True)
self.page_content.clear()
page_num+=1
当读到标记终止标记(也是左后一个页面终止标记),整个标签的解释才算结束,当渲染完最后一个界面后,将完成整个标签的渲染:
case '</pages>':
#<pages>的间隔标签
page_tin='\n'.join(self.page_content)
#渲染页面,但是是线程阻塞的
self.pages[page_num].thread_render(page_tin,True)
self.page_content.clear()
#<pages>的结束标签
pages=self.pages.copy()
self.tinml.addtin('<pages>',pages=pages,names=page_names)
del page_num
del page_names
self.PAGES_TAG=False
self.pages.clear()
self.page_content.clear()
<pages>
在TinText(TinGroup)软件中测测试标签渲染例子如下:
这两个页面都是在内部TinText(TinEngine)展示的,且无论读者是否想看都会进行解析渲染。
总的来看,动态呈现标签和流程控制标签很像,都是通过解释器的多次循环获取呈现标签来推进整个标签内容的读取、解释、渲染。