Преобразование XML в LaTeX - PullRequest
       17

Преобразование XML в LaTeX

0 голосов
/ 18 ноября 2010

Как в Scala я могу преобразовать:

<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{_}{_}

Ответы [ 3 ]

3 голосов
/ 19 ноября 2010

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

В коде есть необходимость в обработке escape.Например, некоторые символы экранированы в 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", _, ch@_*) => transform(ch)
      case Node("a", meta, ch@_*) => 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", _, ch@_*) => transform(ch).mkString("\\emph{", "", "}")
0 голосов
/ 19 ноября 2010

Более общий способ - использовать парсеры, такие как комбинатор парсеров scala, или доступные из java.если файл является правильно сформированным xml, способ обработки xml тоже подойдет.

0 голосов
/ 18 ноября 2010

Определить регулярные выражения:

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...