在用户提交的内容中呈现换行符(Python web app)
我有一个web.py应用程序,它从文本区域获取输入并将其输入到数据库。我可以从数据库中获取信息并将其发布到页面上,但换行符不见了。如何在发回HTML时保留换行符?数据中确实包含在用户提交的内容中呈现换行符(Python web app),python,html,jinja2,web.py,Python,Html,Jinja2,Web.py,我有一个web.py应用程序,它从文本区域获取输入并将其输入到数据库。我可以从数据库中获取信息并将其发布到页面上,但换行符不见了。如何在发回HTML时保留换行符?数据中确实包含\r\n,但在HTML中不会呈现为换行符。有什么想法吗?下面是一个小例子: (2, u'Title', u'content here...hey\r\nthis\r\nhas\r\nbreaks in it....?', datetime.datetime(2012, 7, 5, 21, 5, 14, 35451
\r\n
,但在HTML中不会呈现为换行符。有什么想法吗?下面是一个小例子:
(2, u'Title', u'content here...hey\r\nthis\r\nhas\r\nbreaks in it....?',
datetime.datetime(2012, 7, 5, 21, 5, 14, 354516))
这是我从数据库返回的数据。我需要\r\n
来表示一个
,如果有两个
,那就太棒了。任何指示都将不胜感激
还有这个图书馆吗?我听说过markdown和Markup,但我找不到如何从python字符串发布html数据的示例?可以使用markdown之类的格式化语言,而不是使用非html的插入文本,因此不会显示为html(\r\n不是“p”标记等) 否则,您将需要手动替换/解析输入的文本(我认为这不是一个好主意,因为像markdown这样的语言就是为此而发明的) 有一些很好的python库可以将标记(存储在数据库中的数据)转换为html,如 它非常易于使用,请参见python标记链接中的示例:
>>> import markdown2
>>> markdown2.markdown("*boo!*") # or use `html = markdown_path(PATH)`
u'<p><em>boo!</em></p>\n'
>>> markdowner = Markdown()
>>> markdowner.convert("*boo!*")
u'<p><em>boo!</em></p>\n'
>>> markdowner.convert("**boom!**")
u'<p><strong>boom!</strong></p>\n'
导入标记2
>>>markdown2.markdown(“*boo!*”)35;或使用`html=markdown_路径(path)`
嘘 \n'
>>>markdowner=Markdown()
>>>markdowner.convert(“*boo!*”)
嘘 \n'
>>>markdowner.convert(“**boom!**”)
轰\n'
这将强制您使用标记语法(或您使用的任何格式)输入内容。为了简化此操作,可以使用所见即所得编辑器为您创建标记(如Stackoverflow上的编辑器)。
我认为Stackoverflow使用了很多其他的降价所见即所得编辑器
大规模毁灭性武器的例子:
<html>
<head>
<title>WMD Example using jquery</title>
<link rel="stylesheet" type="text/css" href="wmd.css"/>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" src="jquery.wmd.min.js"></script>
</head>
<body>
<h1>WMD Example using jquery</h1>
<div>
<textarea id="notes"/>
</div>
<script type="text/javascript">
$().ready(function() {
$("#notes").wmd();
});
</script>
</body>
</html>
使用jquery的WMD示例
使用jquery的WMD示例
$().ready(函数()){
$(“#注释”).wmd();
});
在html中,新行不呈现为新行是一种预期行为。您需要插入
或将输入解析为文本段落,并用
包装这些段落。
我将两者混合使用:使用
表示单换行,使用
表示双换行。您可以在保存到数据库时或在取出数据库时执行此解析
编辑:我为您制作了以下图形。有几十种方法可以查看解析器。我个人认为它们是一种状态机。为了实现它,您应该以流式方式读取输入字符串,例如使用
Edit2:将描述“下推自动机”更改为“状态机”。下推自动机是正确的,但不精确,而且它与图形不匹配——我把两者混淆了
Edit3:这里有一些sudo代码,介绍如何在代码中实现状态机解析器,使用while循环、switch case和if语句进行状态转换
state = 'plainState'
streamer = get_stream_reader_from_input()
buffer = ''
while true {
nextchar = streamer.readchar()
if (nextchar == null) { //EOS
print(buffer)
exit
}
switch (state) {
case('plainState') {
if (nextchar == '\n') {
state = 'singleBreakState'
}
else if (nextchar == '\r') {
state = 'CRState'
}
else {
buffer += nextchar
}
}
case('singleBreakState') {
if (nextchar == '\n') {
state = 'doubleBreakState'
}
else if (nextchar == '\r') {
state = 'CRState2'
}
else {
state = 'plainState'
buffer += '<br>' + nextchar
}
}
//...
}
}
state='plainState'
拖缆=从\u输入()获取\u流\u读取器\u
缓冲区=“”
虽然是真的{
nextchar=streamer.readchar()
如果(nextchar==null){//EOS
打印(缓冲区)
出口
}
开关(状态){
案例(“平原州”){
如果(nextchar=='\n'){
状态='singleBreakState'
}
else if(nextchar=='\r'){
状态='CRState'
}
否则{
缓冲区+=nextchar
}
}
案例('singleBreakState'){
如果(nextchar=='\n'){
状态='doubleBreakState'
}
else if(nextchar=='\r'){
状态='CRState2'
}
否则{
状态='plainState'
缓冲区+='
'+nextchar
}
}
//...
}
}
在提出解决方案之前,您需要对正在发生的事情有一些基本的了解。如果您不理解这个问题,“插入另一个库”方法要么根本不起作用(更好),要么很快就会适得其反(更糟)
@MichelMüller正确地指出,HTML源代码中的\n
在浏览器中不会呈现为这样。有关此行为的更详细解释,请参见(警告,描述了HTML2.0)。现在,要在HTML中添加换行符,可以使用
;要添加新段落,
你可以做很多事情来实现这一点,但你要解决的问题是什么?此用户提交的内容是什么?谁提交的?需要考虑的两个方面是:
- 最直接的方法是在将文本输出到模板格式化程序之前运行
。如果您不在模板中放入text.replace('\r\n','
')
,In将不起作用,因为Jinja不应逃逸您生成的{text | safe}
。但是,文本本身不应该具有完全信任,因此您必须避免使用两种主要方法。最简单的方法是将输出包装在
中,这样将按照输入的格式对其进行格式化
或者,您可以用>>> s 'hello\nthere\r\nthis\n\ris a test' >>> r = '<br />' >>> s.replace('\r\n',r).replace('\n\r',r).replace('\r',r).replace('\n',r) 'hello<br />there<br />this<br />is a test' >>>
(而不是
)替换新词,因为字符表示换行符而不是段落 对于第二种选择,这是一种方法:>>s '你好\n这里\r\n这是一个测试' >>>r='
' >>>s.replace('\r\n',r).replace('\n\r',r).replace('\r',r).replace('\n',r) “你好
这里
这是一个测试” >>>