htexpr将html字符串编译成python表达式

htexpr的Python项目详细描述


htexpr

htexpr将类似html的语法编译成python表达式。它是 灵感来源于JSX,旨在补充优秀的dash 包,它允许您在 Python。下面是一个示例,一个简单的ascii表:

app.layout=htexpr.compile("""<div>  <table style={"margin": "0 auto"}>    <tr><th>char</th><th>name</th><th>category</th></tr>	[	  (<tr style={'background-color': '#eee' if line % 2 else '#ccc'}>	     <td>{ char }</td>	     <td>{ unicodedata.name(char, '???') }</td>	     <td>{ unicodedata.category(char) }</td>	   </tr>)	  for line, char in enumerate(chr(i) for i in range(32, 128))	]  </table></div>""").run()

将其与使用函数调用的类似实现进行比较:

app.layout=html.Div([html.Table(style={"margin":"0 auto"},children=[html.Tr(html.Th("char"),html.Th("name"),html.Th("category"))]+[html.Tr([html.Td(char),html.Td(unicodedata.name(char,'???')),html.Td(unicodedata.category(char))],style={'background-color':'#eee'ifline%2else'#ccc'})forline,charinenumerate(chr(i)foriinrange(32,128))])])

后者有一个小错误,在我看来很容易犯 意外,但在htexpr语法中完全避免。

有点复杂的Unicode table示例 进一步演示语法。

API

使用以下导入:

importdash_core_componentsasdccimportdash_html_componentsashtmlimportdash_table

然后用表达式和诸如

之类的元素调用htexpr.compile
<div class="c"><Input id="i" type="number" /></div>

将转换为python函数调用:

html.Div(className="c", children=[
    dcc.Input(id="i", type="number", children=[])
])

html标记可以在任何情况下写入,dcc标记必须在 与函数名大小写完全相同。属性变成 className和其他一些小写属性,如rowspan 转化为驼峰病例(rowSpan)。以及map_tagmap_attribute关键字参数覆盖这些默认值。

表达式必须使用其eval方法求值 有效,对引用的所有变量都有适当的绑定 (包括进口dash_html_components as html等)a 在调用中捕获全局和局部的方便方法 环境是run

语法

所有标记都必须关闭:<div>...</div><div />。字面意义的 属性值必须出现在引号中,python值必须出现在括号中 []或大括号{}。元素中的文本也可以包括python 括号或大括号中的表达式。

大括号可以包含任何python表达式,但大括号不是 包含在表达式中;但是,如果顶部有冒号 作为属性值出现的表达式的级别,大括号是 包括。这允许使用 以错误的类型注释为代价的单级大括号。 括号包含在表达式中,因此它们总是指定一个列表 价值。括号中的表达式被拼接到 父元素,因此

<ul>
  <li> Item Zero </li>
  [(<li> Item {i} </li>) for i in range(1,10)]
  <li> Item Ten </li>
</ul>

结果是一个包含11个元素的单一平面列表 ul元素。此拼接仅由托架触发 语法,因此大括号内的列表值表达式不能获取 拼接处理。

htexpr语法可以嵌套在python表达式中,但是 子表达式必须括在括号中:(<li>...</li>)

开发状态

我写这篇文章是为了帮助我完成一个我一直在做的项目 上面显示的那种括号错误。代码适用于 目的是这样的,但有可能是我没有 考虑过的。

这里使用的python语法非常简单:它可以识别 字符串和各种括号表达式。通过了解更多 python也许可以消除 比较运算符和标记,因此不需要 将嵌套表达式括在括号中。

错误消息并不总是有用的,尤其是代码 对象还没有可靠的行号数据。

由于库使用ast模块创建代码对象,因此 可能相当依赖于cpython实现。我没看 使用另一个python需要做多少工作 实现。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在jframe中模糊的背景上创建一个透明的矩形   java和super之间有区别。getX()和简单的x?   使用ant的java删除eclipse项目   java找不到。txt文件?   多线程Java wait()notify()   带按钮的java透明控件   java Android Studio 3无法构建我的项目   性能最佳(最快且节省内存)的Java收集/数据结构,可同时插入和删除项   spring+hibernate集成中的java ClassNotFoundException   java如何在Android上建立异步URL连接?   java当我选择contacts选项卡时,选项卡栏消失了   java根据数据库中的日期获取结果,不考虑时间   java如何访问WebChromeClient中的方法?   java如何在安卓中使用两行列表项?   spring Swagger Java日期格式验证引发异常