/* sxr -- Scala X-Ray
 * Copyright 2009 Mark Harrah
 */

package sxr

import scala.collection.jcl.TreeSet
import scala.tools.nsc.ast.parser.Tokens

private trait trait Styler extends java.lang.Object with NotNullStyler extends NotNullNotNull
{
	def => Stringhead: StringString
	def (sxr.Token)List[sxr.Annotation]apply(sxr.Tokentoken: sxr.TokenToken): List[sxr.Annotation]List[Annotation]
	def => Stringtail: StringString
}
private case class class Annotation extends java.lang.Object with NotNull with ScalaObject with ProductAnnotation(Stringopen: StringString, Stringclose: StringString) extends NotNullNotNull

object object sxr.ClassesClasses
{
	val java.lang.StringKeyword = java.lang.String("keyword")"keyword"
}
private class class BasicStyler extends java.lang.Object with sxr.Styler with ScalaObjectBasicStyler(scala.collection.jcl.TreeSet[sxr.Token]tokens: scala.collection.jcl.TreeSet[sxr.Token]TreeSet[Token], Stringtitle: StringString, StringbaseStyle: StringString, StringbaseJs: StringString) extends sxr.StylerStyler
{
	import Classes._
	def => Stringhead =
		(java.lang.String("<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\012\011\011\011|<html xmlns="http://www.w3.org/1999/xhtml">\012\011\011\011|    <head>\012\011\011\011|        <title>")"""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
			|<html xmlns="http://www.w3.org/1999/xhtml">
			|    <head>
			|        <title>""" (Any)java.lang.String+ Stringtitle (Any)java.lang.String+ java.lang.String("</title>\012\011\011\011|        <script type="text/javascript" src=")"""</title>
			|        <script type="text/javascript" src=""" (Any)java.lang.String+ Char('"')'"' (Any)java.lang.String+ StringbaseJs (Any)java.lang.String+ Char('"')'"' (Any)java.lang.String+ java.lang.String("></script>\012\011\011\011|        <link rel="stylesheet" type="text/css" href=")"""></script>
			|        <link rel="stylesheet" type="text/css" href=""" (Any)java.lang.String+ Char('"')'"' (Any)java.lang.String+ StringbaseStyle (Any)java.lang.String+ Char('"')'"' implicit scala.Predef.stringWrapper : (String)scala.runtime.RichString+ java.lang.String(" title="Style">\012\011\011\011|    </head>\012\011\011\011|    <body onload="initializeLinked()">\012\011\011\011|        <pre>\012\011\011\011|")""" title="Style">
			|    </head>
			|    <body onload="initializeLinked()">
			|        <pre>
			|""").=> StringstripMargin
	def => Stringtail =
		implicit scala.Predef.stringWrapper : (String)scala.runtime.RichString"""|
			|        </pre>
			|    </body>
		    |</html>""".=> StringstripMargin
	
	def (sxr.Token)List[sxr.Annotation]apply(sxr.Tokentoken: sxr.TokenToken) =
	{
		val List[java.lang.String]styleClasses = (Int)List[java.lang.String]classes(sxr.Tokentoken.=> Intcode)
		List[sxr.Annotation]if(sxr.Tokentoken.=> BooleanisPlain (Boolean)Boolean&& List[java.lang.String]styleClasses.=> BooleanisEmpty)
			object NilNil
		else
			(sxr.Token,List[String])List[sxr.Annotation]annotateToken(sxr.Tokentoken, List[java.lang.String]styleClasses)
	}
	private def (sxr.Token,List[String])List[sxr.Annotation]annotateToken(sxr.Tokentoken: sxr.TokenToken, List[String]styleClasses: List[String]List[String]) =
	{
		val java.lang.StringtagName = java.lang.Stringif(sxr.Tokentoken.=> BooleanisSimple) java.lang.String("span")"span" else java.lang.String("a")"a"
		val scala.collection.immutable.Set[Int]definitions = (Int*)scala.collection.immutable.Set[Int]Set(sxr.Tokentoken.=> List[Int]definitions : _*)
		val Option[sxr.Link]reference = sxr.Tokentoken.=> Option[sxr.Link]reference.((sxr.Link) => Boolean)Option[sxr.Link]filter
			{ sxr.Linklink =>
				Booleanif(sxr.Linklink (AnyRef)Boolean== object sxr.BlockLinkBlockLink)
					Boolean(false)false
				else
				{
					val IntrefID = sxr.Linklink.implicit scala.Predef.stringWrapper : (String)scala.runtime.RichStringtarget.=> InttoInt
					=> Boolean!scala.collection.immutable.Set[Int]definitions.(Int)Booleancontains(IntrefID)
				}
			}
		val List[Int]definitionsList = scala.collection.immutable.Set[Int]definitions.=> List[Int]toList
		val List[String]attributes = Option[sxr.Link]reference.((sxr.Link) => java.lang.String)Option[java.lang.String]map(java.lang.String("href="")"href=\"" (Any)java.lang.String+ sxr.Link_ (Any)java.lang.String+ java.lang.String(""")"\"").=> List[java.lang.String]toList (List[String])List[String]:::
			//token.tpe.map(t => "title=\"" + Escape(t.name) + "\"").toList :::
			List[Int]definitionsList.=> Option[Int]firstOption.((Int) => java.lang.String)Option[java.lang.String]map(java.lang.String("id="")"id=\"" (Any)java.lang.String+ Int_ (Any)java.lang.String+ java.lang.String(""")"\"").=> List[java.lang.String]toList (List[String])List[String]:::
			( List[String]styleClasses List[String]match
			{
				Nil.typecase object NilNil => object NilNil
				List[String]case List[String]c => List[String]c.(String,String,String)StringmkString(java.lang.String("class="")"class=\"", java.lang.String(",")",", java.lang.String(""")"\"") (String)List[String]:: object NilNil
			})
		val List[sxr.Annotation]extraIDs = List[sxr.Annotation]if(List[Int]definitionsList.=> BooleanisEmpty) object NilNil else List[Int]definitionsList.=> List[Int]tail.((Int) => sxr.Annotation)List[sxr.Annotation]map(Intid => (String,String)sxr.AnnotationAnnotation(java.lang.String("<span id="")"<span id=\"" (Any)java.lang.String+ Intid (Any)java.lang.String+ java.lang.String("">")"\">",java.lang.String("</span>")"</span>"))
		val sxr.Annotationmain = (String,String)sxr.AnnotationAnnotation(java.lang.String("<")"<" (Any)java.lang.String+ java.lang.StringtagName (Any)java.lang.String+ java.lang.String(" ")" " (Any)java.lang.String+ List[String]attributes.(String)StringmkString(java.lang.String(" ")" ") (Any)java.lang.String+ java.lang.String(">")">", java.lang.String("</")"</" (Any)java.lang.String+ java.lang.StringtagName (Any)java.lang.String+ java.lang.String(">")">")
		//(main :: extraIDs).reverse // ensure that the a is always the most nested
		(sxr.Token,List[sxr.Annotation])List[sxr.Annotation]addType(sxr.Tokentoken, (sxr.Annotationmain (sxr.Annotation)List[sxr.Annotation]:: List[sxr.Annotation]extraIDs).=> List[sxr.Annotation]reverse)
	}
	private def (sxr.Token,List[sxr.Annotation])List[sxr.Annotation]addType(sxr.Tokentoken: sxr.TokenToken, List[sxr.Annotation]baseAnnotations: List[sxr.Annotation]List[Annotation]) =
	{
		val java.lang.StringtypeSpan = sxr.Tokentoken.=> Option[sxr.TypeAttribute]tpe.((sxr.TypeAttribute) => java.lang.String)Option[java.lang.String]map(sxr.TypeAttributet => java.lang.String("<span class="type">")"<span class=\"type\">" (Any)java.lang.String+ (String)StringEscape(sxr.TypeAttributet.=> Stringname) (Any)java.lang.String+ java.lang.String("</span>")"</span>").(=> java.lang.String)java.lang.StringgetOrElse(java.lang.String("")"")
		List[sxr.Annotation]if(implicit scala.Predef.stringWrapper : (String)scala.runtime.RichStringtypeSpan.=> BooleanisEmpty)
			List[sxr.Annotation]baseAnnotations
		else
			(String,String)sxr.AnnotationAnnotation(java.lang.String("<span class="typed">")"""<span class="typed">""" (Any)java.lang.String+ java.lang.StringtypeSpan, java.lang.String("</span>")"</span>") (sxr.Annotation)List[sxr.Annotation]:: List[sxr.Annotation]baseAnnotations
	}
	private def (Int)List[java.lang.String]classes(Intcode: IntInt) =
	{
		import Tokens._
		Intcode List[java.lang.String]match
		{
			List[java.lang.String]case Int(1)CHARLIT => java.lang.String("char")"char" (java.lang.String)List[java.lang.String]:: object NilNil
			List[java.lang.String]case Int(2)INTLIT => java.lang.String("int")"int" (java.lang.String)List[java.lang.String]:: object NilNil
			List[java.lang.String]case Int(3)LONGLIT => java.lang.String("long")"long" (java.lang.String)List[java.lang.String]:: object NilNil
			List[java.lang.String]case Int(4)FLOATLIT => java.lang.String("float")"float" (java.lang.String)List[java.lang.String]:: object NilNil
			List[java.lang.String]case Int(5)DOUBLELIT => java.lang.String("double")"double" (java.lang.String)List[java.lang.String]:: object NilNil
			List[java.lang.String]case Int(6)STRINGLIT => java.lang.String("string")"string" (java.lang.String)List[java.lang.String]:: object NilNil
			List[java.lang.String]case Int(7)SYMBOLLIT => java.lang.String("symbol")"symbol" (java.lang.String)List[java.lang.String]:: object NilNil
			List[java.lang.String]case Int(97)COMMENT => java.lang.String("comment")"comment" (java.lang.String)List[java.lang.String]:: object NilNil
			List[java.lang.String]case _ =>
				List[java.lang.String]if((Int)BooleanisKeyword(Intcode))
					java.lang.String("keyword")"keyword" (java.lang.String)List[java.lang.String]:: object NilNil
				else
					object NilNil
		}
	}
}