在用户提交的内容中呈现换行符(Python Web应用程序)

Pax*_*ell 3 html python jinja2 web.py

我有一个web.py应用程序从textarea获取输入并将其输入到数据库.我可以从数据库中获取信息并将其发布到页面,但NEWLINES已经消失.在回发到HTML时,如何保留换行符?数据确实包含\r\n在内,但在HTML中不会呈现为NEWLINES.有什么想法吗?这是一个小例子:

(2, u'Title', u'content here...hey\r\nthis\r\nhas\r\nbreaks in it....?', 
    datetime.datetime(2012, 7, 5, 21, 5, 14, 354516))
Run Code Online (Sandbox Code Playgroud)

这是我从数据库中返回的.我需要\r\n代表一个<br />,如果有两个,<p>那就太棒了.任何方向都会非常感激.

还有一个图书馆吗?我听说过markdown和mark up但是我找不到如何从python字符串发布html数据的例子?

Bur*_*lid 11

两种主要方法.最简单的方法是将输出包装在<pre></pre>其中,将其格式化为输入.

或者,您可以使用<br />(而不是<p>)替换newlies,因为字符代表换行符而不是段落.

对于第二种选择,这是一种方法:

>>> 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'
>>> 
Run Code Online (Sandbox Code Playgroud)

或者第三个选项 - 使用许多文本条目库/格式之一并通过它们呈现内容(如其他人所述 - 如markdown).

但是,如果您只想做一个简单的替换,那就太过分了.

  • 对于像我这样寻找jinja2解决方案的人,以下stackoverflow链接可以解答这个问题.我很难找到这个答案所以把链接放在这里http://stackoverflow.com/questions/10436458/allowing-br-tags-with-google-app-engine-and-jinja2 (2认同)

Mic*_*ler 6

不作为换行符呈现的换行符是html中的预期行为.你想要的是插入 <br>或解析您的输入到文本段落并包装那些<p>..</p>

我会做两者的混合:<br>用于单个换行符和<p>.. </p>用于双换行符.您可以在保存到数据库时或在将其保存时进行解析.

编辑:我为您制作了以下图片.有很多方法可以查看解析器.就个人而言,我想将它们视为一种状态机.为了实现它,您应该以流方式读取输入字符串,例如使用http://docs.python.org/library/stringio.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
      }
    }
    //...
  }
}  
Run Code Online (Sandbox Code Playgroud)