You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@esme.apache.org by vd...@apache.org on 2009/11/28 22:33:49 UTC

svn commit: r885151 - in /incubator/esme/trunk/server/src/main/scala/org/apache/esme: lib/MsgParser.scala model/Message.scala

Author: vdichev
Date: Sat Nov 28 21:33:49 2009
New Revision: 885151

URL: http://svn.apache.org/viewvc?rev=885151&view=rev
Log:
Parser improvements for inline formatting.

Modified:
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/MsgParser.scala
    incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Message.scala

Modified: incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/MsgParser.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/MsgParser.scala?rev=885151&r1=885150&r2=885151&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/MsgParser.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/org/apache/esme/lib/MsgParser.scala Sat Nov 28 21:33:49 2009
@@ -228,15 +228,29 @@
     case xs => MsgText(xs.mkString(""))
   }
 
-  lazy val emph: Parser[Emph] = '_' ~> rep1(not(spaceEOF) ~ not('_') ~ not(hashTag) ~ not(atName) ~> anyChar) <~ '_' ^^ {
-    case xs => Emph(xs.mkString)
+  lazy val begOrSpace: Parser[Int] = rep1(' ') ^^ {case lst => lst.length} | beginl ^^^ 0
+  lazy val spaceOrEnd: Parser[Int] = EOL ^^^ 0 | rep1(' ') ^^ {case lst => lst.length}
+
+  def peek[T](p: Parser[T]): Parser[T] = Parser { in =>
+    p(in) match {
+      case s @ Success(v, _) => Success(v, in)
+      case e @ Error(msg, _) => Error(msg, in)
+      case f @ Failure(msg, _) => Failure(msg, in)
+    }
+  }
+
+  lazy val beginl = Parser[Unit]{ in =>
+    if(in.pos.column==1) Success((), in) else Failure("", in)
   }
   
-  lazy val strong: Parser[Strong] = 
-  '*' ~> rep1(not(spaceEOF) ~ not('*') ~ not(hashTag) ~ not(atName) ~> anyChar) <~ '*' ^^ {
-    case xs => Strong(xs.mkString)
+  def surrounded(sep: String)(constructor: (String) => MsgInfo): Parser[MsgInfo] =
+    begOrSpace ~ accept(sep) ~> rep1(not(spaceEOF) ~ not(accept(sep)) ~ not(hashTag) ~ not(atName) ~> anyChar) <~ accept(sep) ~ peek(spaceOrEnd) ^^ {
+    case xs => constructor(xs.mkString)
   }
   
+  lazy val emph = surrounded("_"){Emph(_)}
+  lazy val strong = surrounded("*"){Strong(_)}
+
   lazy val EOF: Parser[Elem] = elem("EOF", isEof _)
 
   def perform(in: String): Box[Performances] = _perform(in) match {

Modified: incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Message.scala
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Message.scala?rev=885151&r1=885150&r2=885151&view=diff
==============================================================================
--- incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Message.scala (original)
+++ incubator/esme/trunk/server/src/main/scala/org/apache/esme/model/Message.scala Sat Nov 28 21:33:49 2009
@@ -316,6 +316,16 @@
               <xml:group> <a href={"/u/"+id}>{url}</a> </xml:group>)).
           getOrElse(Text("") )
 
+        case e: Elem if e.label == "em" =>
+          e.attribute("text").map(text =>
+            <em>{text}</em>).
+          getOrElse(e)
+        
+        case e: Elem if e.label == "strong" =>
+          e.attribute("text").map(text =>
+            <strong>{text}</strong>).
+          getOrElse(e)
+        
         case x => x
       })
   }
@@ -392,6 +402,12 @@
     tags.map(x => x.split(" ").mkString("_")) mkString " "
   }
 
+  /**
+   * Parse and format into XML
+   * Note that the text representation of the XML must be readable
+   * for clients that don't support markup formatting
+   * and is recommended to result in the same XML when parsed
+   */
   def setTextAndTags(in: String, tags: List[Tag], metaData: Box[Elem]): Box[Message] = {
     MsgParser.parseMessage(in).map{
       lst =>
@@ -403,8 +419,8 @@
               case MsgText(text) => Text(text)
               case URL(url) => <url id={url.id.toString}
                   url={url.url.toString} uniqueId={url.uniqueId.is} >{url.url.toString}</url>
-              case Emph(text) => <em>{text}</em>
-              case Strong(text) => <strong>{text}</strong>
+              case Emph(text) => <xml:group> <em text={text}>_{text}_</em> </xml:group>
+              case Strong(text) => <xml:group> <strong text={text}>*{text}*</strong> </xml:group>
             }
           }</body>
         <tags>{