2010-11-18 4 views
0

В Scala, как можно преобразовать:Преобразование XML в LaTeX

<p>here we have a <a href="http://www.scala-lang.org/api/current/index.html">link</a> example.</p> 

в

here we have a \url{http://www.scala-lang.org/api/current/index.html}{link} example. 

где <p></p> карты для "ничего", и <a href"_">_</> карты в \url{_}{_}

+1

''

следует отобразить на пустую строку после того, как в конце пункта –

ответ

-1

Определение регэкспы:

scala> val link = """<a href="(.+)">(.+)</a>""".r 
link: scala.util.matching.Regex = <a href="(.+)">(.+)</a> 

scala> val paragraph = """<p>(.+)</p>""".r 
paragraph: scala.util.matching.Regex = <p>(.+)</p> 

scala> val text = """<p>here we have a <a href="http://www.scala-lang.org/api/current/index.html">link</a> example.</p>""" 
text: java.lang.String = <p>here we have a <a href="http://www.scala-lang.org/api/current/index.html">link</a> example.</p> 

Нанести их на вход:

scala> val modifiedText = paragraph.replaceAllIn(text, {matched => val paragraph(content) = matched; content}) 
modifiedText: String = here we have a <a href="http://www.scala-lang.org/api/current/index.html">link</a> example. 

scala> link.replaceAllIn(modifiedText, {matched => val link(href, title) = matched; "\\\\url{%s}{%s}" format(href, title)}) 
res11: String = here we have a \url{http://www.scala-lang.org/api/current/index.html}{link} example. 
+0

А теперь попробовать его на two urls

. – Debilski

+0

Требуется более сложное регулярное выражение, smth вроде '([^<>]*)' –

+0

. Я бы использовал что-то вроде ']*>\([^<]*)', чтобы оно не сломалось, если в элементе 'a' есть другие атрибуты (например,' style' или 'class' или что-то). –

3

В качестве альтернативы, если вам нужно больше преобразования *, вы можете начать с этого. Он также будет работать с вложенными тегами <a/>, независимо от того, что это может сделать.

В коде необходимо некоторое обращение к эвакуации. Например. некоторые символы сбрасываются в XML, которые не экранированы в латекс и наоборот. Не стесняйтесь добавлять это.

import xml._ 

val input = <p>And now try it on a <a href="link1">text</a> with <a href="link2">two urls</a></p> 

def mkURL(meta: MetaData, text: String) = { 
    val url = meta.asAttrMap.get("href") 
    "\\url{%s}{%s}".format(url getOrElse "", text) 
} 

def transform(xhtml: NodeSeq): String = { 
    xhtml.map { node => 
    node match { 
     case Node("p", _, [email protected]_*) => transform(ch) 
     case Node("a", meta, [email protected]_*) => mkURL(meta, transform(ch)) 
     case x => x.toString 
    } 
    } mkString 
} 

println(transform(input)) 

// And now try it on a \url{link1}{text} with \url{link2}{two urls} 

[*] Добавление поддержки \emph будет что-то вроде

case Node("em", _, [email protected]_*) => transform(ch).mkString("\\emph{", "", "}") 
0

Более общего способа использует парсер, как парсер комбинатор SCALA, либо доступные, Яву. , если файл хорошо сформирован xml, способ обработки xml тоже в порядке.

Смежные вопросы