马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
@TOC
前言
本文只作为条记纪录。
前文我们已经通过TinText渲染器部分和TinML得到了test.tin表明后的标志内容列表。本文,我们将根据这个表明结果将Tin标志转为html文件。
转为html的长处
第一,Tin标志语言作为一个小小小小小项目,光把编写内容出现在TinText中是不敷的,必要导出为别的常见文件。
第二,html富足常见,而且可以通过html格式继承转化为别的格式文件。html转图片、PDF、Markdown等格式的功能,已经有了美满的实现。我们只必要把Tin标志文本转译为html格式文本,就相称于打开了一扇落地窗😇,进而可以借助html格式变化为别的可以大概变化的任何格式文件。
而假如我们想给Tin标志文本转化为另一个新的格式文件,大概单纯就是为了练手,同样可以根据表明结果列表来举行编写。本篇文章中,就以HTML为例。
tin转译为html
工具类
我们先界说一下转译工具类。
- class TinTranslator():
- """
- tin->html的转译工具类
- *后续可能支持tin->markdown
- """
- def __init__(self,tinml:TinML):
- self.tinml=tinml
- self.doc=None
-
- self.tinPmark=('*','/','_','-','!')
- self.tinPlink_re=re.compile('.*?!\[(.*?)\]\((..*?)\)')
复制代码 这里,我们界说了一些根本属性和小工具。
TinTranslator直接绑定TinML,做到及时同步。
转译功能
这里先以<title>为例。
TinText利用dominate作为html天生工具。
- def tohtml(self,_title='TinText',_style=''):
- #tin->html
- doc=dominate.document(title=_title)
- doc.head.add(meta(charset='utf-8'))
- if _style!='':
- doc.head.add(style(_style))
- _body=div()
- doc.body.add(_body)
- for tag,kw in self.tinml:
- if tag == '<title>':
- #标题
- text=kw['title']
- level=int(kw['level'])
- if level==1:
- _body.add(h1(text))
- elif level==2:
- _body.add(h2(text))
- elif level==3:
- _body.add(h3(text))
- elif level==4:
- _body.add(h4(text))
- elif level==5:
- _body.add(h5(text))
- elif level==6:
- _body.add(h6(text))
复制代码 有相识释结果,转译就很方便了,不必要处置处罚大概的错误。
<p>有点复杂,由于Tin的p标志与html的p标志并差别级,而是包罗了html中的b, u, i, s, a等标志,还要继承下分情况,因此必要雷同TinText中的预渲染步调。
- def __tinP_to_html(self,texts):
- #tin段落转html段落
- res=[]
- for text in texts:
- if text=='':
- res.append(br())
- elif text[0]==' ':
- res.append(text[1:])
- elif text[0] not in self.tinPmark:
- res.append(text)
- else:
- head_mark=text[:5]
- head_num=0
- now_p=None#初始化,空
- if '*' in head_mark: head_num+=1
- if '/' in head_mark: head_num+=1
- if '_' in head_mark: head_num+=1
- if '-' in head_mark: head_num+=1
- #开始具体转义html<p>
- if '!' in head_mark:
- result=self.tinPlink_re.match(text)
- if result:
- url_text,url=result.groups()
- if url_text=='':
- url_text=url
- now_p=a(url_text,href=url)
- else:
- head_num+=1
- if '*' in head_mark:
- if now_p:
- now_p=b(now_p)
- else:
- now_p=b(text[head_num:])
- if '/' in head_mark:
- if now_p:
- now_p=i(now_p)
- else:
- now_p=i(text[head_num:])
- if '_' in head_mark:
- if now_p:
- now_p=u(now_p)
- else:
- now_p=u(text[head_num:])
- if '-' in head_mark:
- if now_p:
- now_p=s(now_p)
- else:
- now_p=s(text[head_num:])
- res.append(now_p)
- return res
复制代码 转译部分的代码如下:
- elif tag == '<p>':
- #段落
- texts=kw['text']
- _p=p('')
- htmltexts=self.__tinP_to_html(texts)
- for htmltext in htmltexts:
- _p.add(htmltext)
- _body.add(_p)
复制代码 只管保持转译部分的干净,额外的处置处罚交给转译器类的内置函数。
结果展示
下图中,左侧为欣赏器,右侧为TinText.TinReader。
项目所在
Github - TinText
|