From d130478a35696e78eb2fd6e55b09e6885a9c2a23 Mon Sep 17 00:00:00 2001 From: Adam Megacz Date: Sat, 22 Jan 2011 18:31:53 -0800 Subject: [PATCH] update to sbp with regions in trees --- .gitignore | 2 + lib/edu.berkeley.sbp.jar | Bin 175445 -> 174406 bytes src/Doc.scala | 142 +++++++++++++++++++++++++--------------------- src/Html.scala | 1 + 4 files changed, 81 insertions(+), 64 deletions(-) diff --git a/.gitignore b/.gitignore index 7cba725..89b3ed2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ lib/edu.berkeley.sbp.jar wix.jar +build + diff --git a/lib/edu.berkeley.sbp.jar b/lib/edu.berkeley.sbp.jar index 22b8acffc6c9728f575546f549bcf6c3dd63c7d1..62a5973317a15d473b795f3d977200e6b6864cae 100644 GIT binary patch delta 13604 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
|sN)54SLP4eNzu`!OHAFvbW`i;B#;{nmHv#2U1 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 new Doc(new Header(), a.map(sectionFromTree)) } + t match { case Tree(_,Seq(_,Tree(_,a,_)),_) => new Doc(new Header(), a.map(sectionFromTree)) } def sectionFromTree(t:Tree) : Section = t match { - case Tree("Section", seq) => + case Tree("Section", seq,_) => seq(0) match { - case Tree("SectionHeader", Seq(Tree("=",e),c)) => + case Tree("SectionHeader", Seq(Tree("=",e,_),c),_) => new Section(e.length-1, textSequenceFromTree(c), paragraphsFromTrees(seq.tail)) } } def textSequenceFromTree (t:Tree) : Seq[Text] = t match { - case Tree("Word", chars ) => Seq(new Chars(stringFromTrees(chars))) - case Tree("Ordinal", x ) => Seq(new Command("ordinal", Seq(new Chars(stringFromTrees(x))))) - case Tree("Fraction", Seq(n,d) ) => Seq(new Command("fraction",Seq(new Chars(stringFromTree(n)), + case Tree("Word", chars ,_) => Seq(new Chars(stringFromTrees(chars))) + case Tree("Ordinal", x ,_) => Seq(new Command("ordinal", Seq(new Chars(stringFromTrees(x))))) + case Tree("Fraction", Seq(n,d) ,_) => Seq(new Command("fraction",Seq(new Chars(stringFromTree(n)), new Chars(stringFromTree(d))))) - case Tree("WS", _ ) => Seq(WS) - case Tree("Quotes", Seq(x) ) => Seq(new Quotes(textSequenceFromTree(x))) - case Tree("Pars", y ) => Seq(new SubPar(paragraphsFromTrees(y))) - case Tree("Command", Seq(x,y) ) => Seq(new Command(stringFromTree(x), textSequenceFromTree(y))) - case Tree("Command", Seq(x) ) => Seq(new Command(stringFromTree(x), Seq())) - case Tree("Link", Seq(text,link) ) => Seq(new Link(urlFromTree(link), textSequenceFromTree(text))) - case Tree("Footnote", x ) => Seq(new Footnote(concatMap(textSequenceFromTree,x))) - case Tree("Keyword", x ) => Seq(new Keyword(concatMap(textSequenceFromTree,x))) - case Tree("Math", x ) => Seq(new Math(stringFromTrees(x))) - case Tree("Italic", Seq(x) ) => Seq(new Styled(Italic , textSequenceFromTree(x))) - case Tree("Bold", Seq(x) ) => Seq(new Styled(Bold , textSequenceFromTree(x))) - case Tree("Highlight", Seq(x) ) => Seq(new Styled(Highlight , textSequenceFromTree(x))) - case Tree("TT", x ) => Seq(new Styled(TT , concatMap(textSequenceFromTree,x))) - case Tree("Strikethrough", x ) => Seq(new Styled(Strikethrough , concatMap(textSequenceFromTree,x))) - case Tree("Superscript", x ) => Seq(new Styled(Superscript , concatMap(textSequenceFromTree,x))) - case Tree("Subscript", x ) => Seq(new Styled(Subscript , concatMap(textSequenceFromTree,x))) - case Tree("Underline", x ) => Seq(new Styled(Underline , concatMap(textSequenceFromTree,x))) - case Tree("(e)", _) => Seq(new GlyphText(Euro)) - case Tree("(r)", _) => Seq(new GlyphText(CircleR)) - case Tree("(c)", _) => Seq(new GlyphText(CircleC)) - case Tree("(tm)", _) => Seq(new GlyphText(TradeMark)) - case Tree("--", _) => Seq(new GlyphText(Emdash)) - case Tree("<-", _) => Seq(new GlyphText(LeftArrow)) - case Tree("<=", _) => Seq(new GlyphText(DoubleLeftArrow)) - case Tree("=>", _) => Seq(new GlyphText(DoubleRightArrow)) - case Tree("<=>", _) => Seq(new GlyphText(DoubleLeftRightArrow)) - case Tree("<->", _) => Seq(new GlyphText(LeftRightArrow)) - case Tree("^o", _) => Seq(new GlyphText(Degree)) - case Tree("...", _) => Seq(new GlyphText(Ellipsis)) - case Tree("Text", ts) => concat(ts.map(textSequenceFromTree)) - case Tree("", Seq()) => Seq() + case Tree("WS", _ ,_) => Seq(WS) + case Tree("Quotes", Seq(x) ,_) => Seq(new Quotes(textSequenceFromTree(x))) + case Tree("Pars", y ,_) => Seq(new SubPar(paragraphsFromTrees(y))) + case Tree("Command", Seq(x,y) ,_) => Seq(new Command(stringFromTree(x), textSequenceFromTree(y))) + case Tree("Command", Seq(x) ,_) => Seq(new Command(stringFromTree(x), Seq())) + case Tree("Link", Seq(text,link) ,_) => Seq(new Link(urlFromTree(link), textSequenceFromTree(text))) + case Tree("Footnote", x ,_) => Seq(new Footnote(concatMap(textSequenceFromTree,x))) + case Tree("Keyword", x ,_) => Seq(new Keyword(concatMap(textSequenceFromTree,x))) + case Tree("Math", x ,_) => Seq(new Math(stringFromTrees(x))) + case Tree("Italic", Seq(x) ,_) => Seq(new Styled(Italic , textSequenceFromTree(x))) + case Tree("Bold", Seq(x) ,_) => Seq(new Styled(Bold , textSequenceFromTree(x))) + case Tree("Highlight", Seq(x) ,_) => Seq(new Styled(Highlight , textSequenceFromTree(x))) + case Tree("TT", x ,_) => Seq(new Styled(TT , concatMap(textSequenceFromTree,x))) + case Tree("Strikethrough", x ,_) => Seq(new Styled(Strikethrough , concatMap(textSequenceFromTree,x))) + case Tree("Superscript", x ,_) => Seq(new Styled(Superscript , concatMap(textSequenceFromTree,x))) + case Tree("Subscript", x ,_) => Seq(new Styled(Subscript , concatMap(textSequenceFromTree,x))) + case Tree("Underline", x ,_) => Seq(new Styled(Underline , concatMap(textSequenceFromTree,x))) + case Tree("(e)", _ ,_) => Seq(new GlyphText(Euro)) + case Tree("(r)", _ ,_) => Seq(new GlyphText(CircleR)) + case Tree("(c)", _ ,_) => Seq(new GlyphText(CircleC)) + case Tree("(tm)", _ ,_) => Seq(new GlyphText(TradeMark)) + case Tree("--", _ ,_) => Seq(new GlyphText(Emdash)) + case Tree("<-", _ ,_) => Seq(new GlyphText(LeftArrow)) + case Tree("<=", _ ,_) => Seq(new GlyphText(DoubleLeftArrow)) + case Tree("=>", _ ,_) => Seq(new GlyphText(DoubleRightArrow)) + case Tree("<=>", _ ,_) => Seq(new GlyphText(DoubleLeftRightArrow)) + case Tree("<->", _ ,_) => Seq(new GlyphText(LeftRightArrow)) + case Tree("^o", _ ,_) => Seq(new GlyphText(Degree)) + case Tree("...", _ ,_) => Seq(new GlyphText(Ellipsis)) + case Tree("Text", ts ,_) => concat(ts.map(textSequenceFromTree)) + case Tree("", Seq() ,_) => Seq() case t => throw new RuntimeException("unable to create [Text] from " + t) } def hostFromTree(t:Tree) : Host = t match { - case Tree("IP", Seq(Tree(_,a),Tree(_,b),Tree(_,c),Tree(_,d))) => + case Tree("IP", Seq(Tree(_,a,_),Tree(_,b,_),Tree(_,c,_),Tree(_,d,_)),_) => new HostIP(intFromTrees(a), intFromTrees(b), intFromTrees(c), intFromTrees(d)) - case Tree("DNS", parts) => - new HostDNS(parts.map( (t:Tree) => t match { case Tree(_, c) => stringFromTrees(c) })) + case Tree("DNS", parts,_) => + new HostDNS(parts.map( (t:Tree) => t match { case Tree(_, c,_) => stringFromTrees(c) })) } def urlFromTree(t:Tree) : URL = t match { - case Tree("URL", stuff) => urlFromTrees(stuff) - case Tree("Email", Seq(Tree("username", un),host)) => new URLEmail(stringFromTrees(un), hostFromTree(host)) - case Tree("Path",stuff) => new URLPath(stuff.map(fromUrlChar).foldLeft("")(_ + _)) + case Tree("URL", stuff,_) => urlFromTrees(stuff) + case Tree("Email", Seq(Tree("username", un,_),host),_) => new URLEmail(stringFromTrees(un), hostFromTree(host)) + case Tree("Path",stuff,_) => new URLPath(stuff.map(fromUrlChar).foldLeft("")(_ + _)) } def urlFromTrees(t:Seq[Tree]) : URL = t match { - case Seq(Tree(_,method), login, host, port, rest @_*) => + case Seq(Tree(_,method,_), login, host, port, rest @_*) => new URLNormal(stringFromTrees(method), None, hostFromTree(host), - port match { case Tree("Port",port) => { + port match { case Tree("Port",port,_) => { val q = stringFromTrees(port) if (q.equals("")) None else Some(java.lang.Integer.parseInt(q)) } case _ => None }, - rest match { case Seq(Tree("Path",p), x@_*) => p.map(fromUrlChar).foldLeft("")(_ + _) + rest match { case Seq(Tree("Path",p,_), x@_*) => p.map(fromUrlChar).foldLeft("")(_ + _) case _ => "" }, - rest match { case Seq(_ , Tree("Path",r), x@_*) => Some(stringFromTrees(r)) + rest match { case Seq(_ , Tree("Path",r,_), x@_*) => Some(stringFromTrees(r)) case _ => None }) } @@ -101,8 +101,8 @@ object Doc { // FIXME: problem here is the "/" vs "%2F" issue, so we "leave urls urlencoded" def fromUrlChar(t:Tree) : String = t match { - case Tree("%", Seq(Tree(a,Seq()),Tree(b,Seq()))) => "%"+a+b - case Tree(x,y) => + case Tree("%", Seq(Tree(a,Seq(),_),Tree(b,Seq(),_)),_) => "%"+a+b + case Tree(x,y,_) => if (x.length==1) x else throw new RuntimeException("could not parse as URL char: " + t) } @@ -112,29 +112,29 @@ object Doc { def paragraphsFromTree(t:Tree) : Seq[Paragraph] = consolidate (t match { - case Tree("Verbatim", Seq(indent,v)) => Seq(new P( Seq(new Verbatim(unindent(indent,unverbate(v)))))) - case Tree("TextParagraph", Seq(Tree(_,text))) => Seq(new P(concatMap(textSequenceFromTree,text))) - case Tree("Pars", pars ) => concatMap(paragraphsFromTree,pars) - case Tree("HR", _ ) => Seq(HR) - case Tree("OL", a ) => - Seq(new OL(a.map( (t:Tree) => t match { case Tree("LI",x) => paragraphsFromTrees(x)}))) - case Tree("UL", a ) => - Seq(new UL(a.map( (t:Tree) => t match { case Tree("LI",x) => paragraphsFromTrees(x)}))) - case Tree("", _ ) => Seq() - case Tree("Blockquote", pars ) => Seq(Blockquote(paragraphsFromTrees(pars))) + case Tree("Verbatim", Seq(indent,v),_) => Seq(new P( Seq(new Verbatim(unindent(indent,unverbate(v)))))) + case Tree("TextParagraph", Seq(Tree(_,text,_)),_) => Seq(new P(concatMap(textSequenceFromTree,text))) + case Tree("Pars", pars ,_) => concatMap(paragraphsFromTree,pars) + case Tree("HR", _ ,_) => Seq(HR) + case Tree("OL", a ,_) => + Seq(new OL(a.map( (t:Tree) => t match { case Tree("LI",x,_) => paragraphsFromTrees(x)}))) + case Tree("UL", a ,_) => + Seq(new UL(a.map( (t:Tree) => t match { case Tree("LI",x,_) => paragraphsFromTrees(x)}))) + case Tree("", _ ,_) => Seq() + case Tree("Blockquote", pars ,_) => Seq(Blockquote(paragraphsFromTrees(pars))) case _ => throw new RuntimeException("unable to create [Paragraph] from " + t) }) def unverbate (t:Tree) : String = t match { - case Tree("Verbatim",x) => x.map(unverbate).foldLeft("")(_ + _) - case Tree("VerbatimBrace",Seq(x,y)) => unverbate(x)+" "+unverbate(y) - case Tree(t,Seq()) => t + case Tree("Verbatim",x,_) => x.map(unverbate).foldLeft("")(_ + _) + case Tree("VerbatimBrace",Seq(x,y),_) => unverbate(x)+" "+unverbate(y) + case Tree(t,Seq(),_) => t } def unindent (t:Tree,v:String) : String = t match { - case Tree("I", indent) => unindent_(indent.length+1, v) + case Tree("I", indent,_) => unindent_(indent.length+1, v) } private def unindent_ (i:Int,v:String) : String = @@ -166,7 +166,7 @@ object Doc { def intFromTrees(t:Seq[Tree]) : Int = java.lang.Integer.parseInt(stringFromTrees(t)) def stringFromTree(t:Tree) : String = - t match { case Tree(h,c) => h++concatMap(stringFromTree,c) } + t match { case Tree(h,c,_) => h++concatMap(stringFromTree,c) } def stringFromTrees(ts:Seq[Tree]) : String = ts.map(stringFromTree).foldLeft("")(_ + _) @@ -277,6 +277,20 @@ abstract class Text extends ToHtml mapToHtml(body)+ "\n" case "br" => "\n
\n" + case "alpha" => "α" + case "beta" => "β" + case "gamma" => "γ" + case "delta" => "δ" + case "epsilon" => "ε" + case "eta" => "η" + case "theta" => "θ" + case "kappa" => "κ" + case "lambda" => "λ" + case "mu" => "μ" + case "nu" => "ν" + case "pi" => "π" + case "rho" => "ρ" + // TO DO: integrate stixfonts stuff case "cent" => "½" case "euro" => "€" // gross hack diff --git a/src/Html.scala b/src/Html.scala index 8ffdea3..d82f9f8 100644 --- a/src/Html.scala +++ b/src/Html.scala @@ -122,6 +122,7 @@ object Html { def jsMath = "\n"+ "\n"+ + "\n"+ // for cs.berkeley.edu "\n"+ "