2013-07-22 5 views
0

Мне нужно отобразить содержимое списка в фрагменте.snippet не интерпретирует теги html

У меня есть функция, как это:

def generateHtml(data: List[Documents]): NodeSeq = { 
    val html = <ul><li></li></ul> 
    def css = "li" #> data.map { 
     document => 
     "* *" #> (document.title + ": " + document.content) 
    } 
    css(html) 
    } 

значение список имеет HTML-код, как это:

val data: List[Document] = List(Document("<b>title</b> 1", "content 1"),Document("`<b>title</b> 2", "content 2")) 

работает хорошо, потому что он показывает мне список значений, но проблема заключается в том, что он не интерпретирует html-код (метки <b>)

В моем фрагменте он показывает мне что-то вроде этого:

<b>title</b> 1: content 1 
<b>title</b> 2: content 2 

но то, что мне нужно интерпретировать Тас б

что-то вроде этого:

заголовка 1: Содержание 1

название 2: Содержание 2

любое предложение, которое я могу сделать, чтобы интерпретировать теги

я нашел подобную проблему здесь: Scala: Parse HTML-fragment

зонда с решениями, но не работает

ответ

1

Это происходит потому, что есть преобразование между String в scala.xml.Text, который ускользает символы по умолчанию. Если вы обернуть строку в scala.xml.Unparsed, он должен делать то, что uou ищет:

def generateHtml(data: List[Documents]): NodeSeq = { 
    val html = <ul><li></li></ul> 
    def css = "li" #> data.map { 
    document => 
     "* *" #> scala.xml.Unparsed(document.title + ": " + document.content) 
    } 
    css(html) 
} 

Обратите внимание, что это не является хорошей идея сделать с ненадежным содержанием, то есть: вещи, которые пользователь может ввести. В таких ситуациях вам, вероятно, будет лучше использовать что-то вроде Markdown или Textile.

0

В дополнение к тому, что сказал jcern, лучше сохранить названия без <b></b>. И в то время рендеринга, вы могли бы написать

"li" #> data.map(doc => <li><b>{doc.title}</b>: {dot.content}</li>) 

alternatevly, и еще лучше, вы можете использовать "CSS преобразования" как то:

val html = <ul><li> <b class="title">t</b>: <span class="content">c</span> </li></ul> 
// (in real-world render method, the html: NodeSeq is taken as a method parameter) 

val transformation = "ul *" #> data.map{ doc => 
    ".title *" #> doc.title & 
     ".content" #> doc.content 
} 

transformation(css) 
Смежные вопросы