2010-11-18 32 views
0

En Scala, comment puis-je transformer:Transformer 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> cartes pour "rien", et <a href"_">_</> cartes à \url{_}{_}

+1

''

devrait associez à une ligne vide après la fin du paragraphe –

Répondre

-1

Définir regexps:

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> 

Appliquez-les à l'entrée:

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

Et maintenant essayer sur un two urls

. – Debilski

+0

Juste une expression rationnelle plus complexe est nécessaire, comme ([^<>]*) ' –

+0

Je voudrais utiliser quelque chose comme' ]*>\([^<]*) 'de sorte qu'il ne casse pas s'il y a d'autres attributs dans l'élément' a' (comme 'style' ou' class' ou quelque chose). –

3

Comme alternative, si vous avez besoin de plus de transformations *, vous pouvez commencer par cela. Il fonctionnera également avec les balises <a/> imbriquées, quel que soit le sens que cela puisse avoir.

Il y a un besoin de manipulation d'échappement dans le code. Par exemple. certains caractères sont échappés en XML qui ne sont pas échappés dans Latex et inversement. N'hésitez pas à ajouter ceci.

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} 

[*] Ajout du support pour \emph serait quelque chose comme

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

Plus façon générique utilise parseurs, comme analyseur de scala de combinateur, ou ceux disponibles java. si le fichier est bien formaté xml, la façon de traiter xml est ok aussi.