递归呈现的广义嵌套html元素树

htmltree的Python项目详细描述


**目录**用[doctoc]生成(http://doctoc.herokuapp.com/)*

-[python htmltree project](python htmltree project)
-[用python创建和操作html和css](用python创建和操作html和css)
-[安装](安装)
-[快速启动](快速启动)
-[打开python解释器并键入或粘贴以下内容](打开python解释器并键入或粘贴以下内容)
-[呈现并打印html](呈现并打印html)
-[现在添加一些样式和文本…](现在添加一些样式和文本)
-[并打印结果。](并打印结果)
-[保留字和连字符属性](保留字和连字符属性)
-[查看您的工作](查看您的工作)
-[讨论](讨论)
-[公开成员](公共成员)
-[呈现](呈现)
-[使用提示](使用提示)
-[滚动您自己的](滚动您自己的)
-[捆绑](捆绑)
-[循环](循环)
-[将htmltree与transcrypt™一起使用](将htmltree与transcrypt一起使用)
-[包装器列表函数](包装函数列表)
python htmltree project

一致、简单的语法。
*85个预定义的标记函数。
*动态创建HTML或另存为静态文件。
*使用灵活,易于扩展。
*使用cpython在本地运行,或者在浏览器中使用jacques de hooge的[*transcrrypt™*](https://transcrrypt.org/)python to js transpiler的python to jstranspiler
*依赖关系:python 3.x


<<<
` pip install htmltree `







<<<<<<


<<
////<<<<打开一条蟒蛇从htmltree import*
head=head()
body=body()
doc=html(head,body)
````
head=head()
head=head=head()
```
<;body>;
<;body>;
<;html>;
`````
````
````
who=meta(name="author",content="your name here")
head.c.append(who)
body.a.update(dict(style={background-color':'black'}))
banner=h1("你好,htmltree!"
body.c.append(banner)并打印结果。打印(doc.render(0))
`````
>;打印(doc.render(0))
<;lt;html>;
<;head>;
<;meta-content="您的姓名"name="author">;
>;
<;html>;
>;
>;
<;meta content="您的姓名"name="author">;
<;
<;head>;
>;
>;
<;lt;lt;
br/>;><;body style="background color:black;">;
<;h1 class="banner"style="color:green;">;
你好,htmltree!
<;/h1>;
<;/body>;
<;/html>;
````
在上面的示例中,我们创建元素并将它们分配给变量,以便以后更改其内容。不过,我们也可以一下子把它写出来。

````
doc=html(
head(
meta(name="author",content="your name here")),
body(
h1("你好,htmltree!",_class='banner',style={'color':'green'}),
style={'background-color':'black'})
`````

这是一个简短而干净的HTML格式,呈现的HTML完全相同。它还模仿了页面结构,但牺牲了稍后在执行过程中的易修改性。您的选择应该归结为是基于运行时才可用的信息创建静态HTML还是动态内容。


,‘横幅’,…)`?这样写是因为"class"是一个python关键字。尝试将其用作标识符将引发语法错误。

为了方便起见,所有包装函数都去掉了属性名中的前导下划线和尾随下划线,因此"class"也可以工作。正常HTml在属性名中不使用下划线,所以这个修复是安全的。我认为"for`as a`<;label>;`属性是标准html中唯一的其他冲突。


包装函数还将属性名称中的内部下划线替换为破折号。这避免了python试图将"data role="magic"解释为减法表达式的问题。改为使用"data\u role="magic"。如果需要使用以"-"开头的供应商特定属性进行样式设置,请添加一个尾随下划线,例如"moz"样式转换为"moz"样式。

*转换是在创建元素时进行的,而不是在呈现元素时进行的。*如果在元素属性之后添加、更新或替换元素属性创建时,使用属性的真名,例如,mybutton.a.update({'class':'super button'})`而不是'mybutton.a.update(dict({'super-button')`.





=doc.rendertofile('path/to/somefile.html')
webbrowser.open(fileurl)
````


快速入门示例应该是这样的:

![图1.](htmltree/doc/img/quickstart.png)

要查看最新的列表,您可以从python交互会话的命令行中执行"help(htmltree)",或者进一步查看此页上的列表。函数名和参数遵循简单且一致的约定,这些约定使用python的`*args,**kwargs`特性。

-函数是由带有首字母大写的标记命名的,例如'html()`
-非空标记的签名是'tagname(*content,**attrs)`
-空标记的签名标记是"tagname(**attrs)"(空是指不包含任何内容且不需要结束标记的元素,如`<;meta>;`,`<;br>;`,等等)

id=42,name='puddinane')```

,因为前三个参数是未命名的python知道它们按顺序属于"to*content"。最后两个参数是命名的,因此属于`**attrs`,div.python关于不混合list和keyword参数的规则的属性适用。在每个元素中,首先放置所有*content参数,然后放置所有**attrs参数。

<;style>;标记是模式的唯一例外。它的签名是"style(**content)"。这样做是为了减少(但也不能完全消除)在css规则集中引用选择器的需要。
-如果需要在样式元素上设置属性,请在下面的doctest中所示的二次调用中进行设置。
````
style=style(body=dict(margin=4px'),p=dict(color='blue')
style.a.update({'type':'text/css'})
style.render()
'<;style type="text/css">;body{margin:4px;}p{color:blue;}<;&style>;'
``
`htmltree'的设计模式是"尽可能简单,但不简单"。使用内置的python对象、dict和list,意味着在操作元素树时,这些对象的所有熟悉方法都可用。请注意,例如,在快速入门示例中使用了"update"和"append"。
```
body.a.update(dict(style={background-color':'black'}))
body.c.append(h1("你好,htmltree!",_class='myclass',id='myid'))
````
请稍等!什么是"body.a"和"body.c"?继续阅读…

\public members
您可以分别访问和修改元素"el"的属性和内容"el.a"和"el.c"。标记名也可用作'el.t',不过这通常不如其他两个标记名有用。

属性成员"el.a"是一个普通的python字典,包含任何关键字参数创建元素时传递。您可以使用"update()"对其进行修改,如快速入门示例中所示,也可以对其使用任何其他字典方法。您还可以将其完全替换为任何具有类似dict.items()方法的dict-like对象,该方法的行为类似于dict.items()

内容成员"el.c"通常是一个python列表。它包含在元素的结束标记和结束标记之间呈现的所有内容。列表可以包含字符串、int、float和对象的任意组合。在正常使用中,对象的类型为"htmltree.element"。这是htmltree.py中所有函数返回的元素类型。您可以使用所有常规的python list方法(append、insert等)来操作列表。

(如果插入对象(上面列出的对象除外)。它们应该有一个"render(indent=-1)"方法,该方法返回有效的HTML,其缩进约定与下一节中描述的htmltree.element.render方法相同。)


在上面的示例中,我们将其称为doc.render(0),以缩进的形式显示整个文档树。调用它时不带任何参数,将HTML作为一行发出,不带中断或空格。值>;0将缩进增加2个空格*该值。
```
>;>print(head.render())
<;head>;

>;
<;head>;
<;meta name="author"content="your name here"/>;
<;/head>;

>;>;打印(head.render(1))

<;head>;
<;meta name="author"content="your name here"/>;
<;/head>;
```

`rendertofile()`方法还接受一个"indent"参数。


这已经为htmltree.py中的所有包装函数完成了。但如果需要未定义的内容,则只需两行代码(不包括导入)。
```
from htmltree import kwelement
def foo(*content,**attrs):
return kwelement('foo',*content,**wrappers)
```
省略内容arg并将none传递给kwelement()。
```
def bar(**attrs):
return kwelement('bar',none,**attrs)
````

例如:
```
def doc head body():
head=head()
body=body()
doc=html(head,body)
return doc,head,body

>;doc,head,body=docheadbody()
```

```looping
使用循环简化许多相似元素的创建。
````
对于id in('one','two','three'):
content="help!我被困在div{}。".format(id)
body.c.append(div(content,id=id))

>;>print(body.render(0))
<;body>;
<;div id="one">;
帮助!我被困在第一区了。
<;div>;
<;div id="two">;
救命!我被困在第二组中。
<;div>;
<;div id="three">;
救命!我被困在第三组中。
```
*htmltree*如果导入为"htmltree",transcrypt会在将python文件转换为javascript时找到它。如果您需要通过其他方式安装和访问*htmltree*,请参见
*http://www.transcrypt.org/docs/html/special_facilities.html了解transcrypt的模块机制,以及
*http s://github.com/michael-f-ellis/htmltree/issues/3了解光盘使用一些特定的方法在编译时定位htmltree。

此外,还可以查看"tests/"目录中的模块"sanitycheck.py"和"client.py",作为使用htmltree和transcrypt开发和测试的模板。有关内置服务器的更详细模板、ajax/json数据更新以及源文件更改时的自动重建/重新加载,请参见[NearlyPurePythonWebAppDemo](https://github.com/michael-f-ellis/NearlyPurePythonWebAppDemo)

如果没有,请在github上提交一个问题,以便我可以修复它!


**属性):
旁白(*content,**属性):
页脚(*content,**属性):
页眉(*content,**属性):
h1(*content,**属性):
h2(*content,**属性):
h3(*content,**属性):
h4(*content,**属性):
h5(*content,**属性):
h6(*content,**属性):
nav(*content,**属性):
部分(*content,**attrs):
blockquote(*content,**attrs):
dd(*content,**attrs):
div(*content,**attrs):
dl(*content,**attrs):
dt(*content,**attrs):
figcaption(*content,**attrs):
fig(*content,**attrs):
**attrs):
主要(*content,**attrs):
ol(*content,**attrs):
p(*content,**attrs):
pre(*content,**attrs):
ul(*content,**attrs):
a(*content,**attrs):
b(*content,**attrs):
br(*attrs):
cite(*content,**attrs):
em(*content,**属性):
i(*content,**属性):
s(*content,**属性):
samp(*content,**属性):
small(*content,**属性):
span(*content,**属性):
strong(*content,**属性):
sub(*content,**属性):
sup(*content,**属性):
u(*content,**属性):
区域(**attrs):
音频(*content,**属性):
IMG(**attrs):
映射(*content,**属性):
跟踪(**attrs):
视频(*content,**属性):
嵌入(**attrs):
对象(*content,**属性):
参数(**attrs):
源(**attrs):
画布(*content,**属性):
noscript(*content,**属性):
脚本(*content,**属性):
标题(*content,**属性):
列(**attrs):
表(*content,**属性):
正文(*content,**属性):
td(*content,**属性):
tfoot(*content,**属性):
th(*content,**属性):
thead(*content,**属性):
tr(*content,**attrs):
按钮(*content,**attrs):
数据列表(*content,**attrs):
字段集(*content,**attrs):
表单(*content,**attrs):
输入(**attrs):
标签(*content,**attrs):
图例(*content,**attrs):
仪表(*content,**attrs):
操作组(*content,**属性:
选项(*content,**attrs):
输出(*content,**attrs):
进度(*content,**attrs):
选择(*content,**attrs):
文本区域(*content,**attrs):
````


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

推荐PyPI第三方库


热门话题
Java泛型重写抽象方法并具有子类的返回类型   Java中的字符串反转字符,同时保留一些字符   java将系统时间与我获取它的时间进行比较   java解析ODATA URL以在准备entityset之前读取ID值   java中的有界通配符下界泛型即使在传递超类时也不会编译   c#Java的JVM和Java的内部工作方式有什么不同。NET的CLR?   java如何在windows7上指定JDK的版本?   Java:列出单个目录中的所有文件(1020000+)   java使用Logback和Lombok   安卓谷歌玩java。lang.NullPointerException   使用RSA的解密结果在普通Java和Android中有所不同   具有默认连接池的java Spring引导   java我如何在一个坏的测试环境中前进?