src/Pure/PIDE/markup_tree.scala
changeset 56743 81370dfadb1d
parent 56313 84d047625f70
child 56782 433cf57550fa
equal deleted inserted replaced
56737:e4f363e16bdc 56743:81370dfadb1d
    18 {
    18 {
    19   /* construct trees */
    19   /* construct trees */
    20 
    20 
    21   val empty: Markup_Tree = new Markup_Tree(Branches.empty)
    21   val empty: Markup_Tree = new Markup_Tree(Branches.empty)
    22 
    22 
    23   def merge(trees: List[Markup_Tree], range: Text.Range, elements: Document.Elements): Markup_Tree =
    23   def merge(trees: List[Markup_Tree], range: Text.Range, elements: Markup.Elements): Markup_Tree =
    24     (empty /: trees)(_.merge(_, range, elements))
    24     (empty /: trees)(_.merge(_, range, elements))
    25 
    25 
    26   def merge_disjoint(trees: List[Markup_Tree]): Markup_Tree =
    26   def merge_disjoint(trees: List[Markup_Tree]): Markup_Tree =
    27     trees match {
    27     trees match {
    28       case Nil => empty
    28       case Nil => empty
    52     rev_markup: List[XML.Elem],
    52     rev_markup: List[XML.Elem],
    53     subtree: Markup_Tree)
    53     subtree: Markup_Tree)
    54   {
    54   {
    55     def markup: List[XML.Elem] = rev_markup.reverse
    55     def markup: List[XML.Elem] = rev_markup.reverse
    56 
    56 
    57     def filter_markup(elements: Document.Elements): List[XML.Elem] =
    57     def filter_markup(elements: Markup.Elements): List[XML.Elem] =
    58     {
    58     {
    59       var result: List[XML.Elem] = Nil
    59       var result: List[XML.Elem] = Nil
    60       for { elem <- rev_markup; if (elements(elem.name)) }
    60       for { elem <- rev_markup; if (elements(elem.name)) }
    61         result ::= elem
    61         result ::= elem
    62       result.toList
    62       result.toList
   159           }
   159           }
   160         }
   160         }
   161     }
   161     }
   162   }
   162   }
   163 
   163 
   164   def merge(other: Markup_Tree, root_range: Text.Range, elements: Document.Elements): Markup_Tree =
   164   def merge(other: Markup_Tree, root_range: Text.Range, elements: Markup.Elements): Markup_Tree =
   165   {
   165   {
   166     def merge_trees(tree1: Markup_Tree, tree2: Markup_Tree): Markup_Tree =
   166     def merge_trees(tree1: Markup_Tree, tree2: Markup_Tree): Markup_Tree =
   167       (tree1 /: tree2.branches)(
   167       (tree1 /: tree2.branches)(
   168         { case (tree, (range, entry)) =>
   168         { case (tree, (range, entry)) =>
   169             if (!range.overlaps(root_range)) tree
   169             if (!range.overlaps(root_range)) tree
   179       if (tree1.is_empty) tree2
   179       if (tree1.is_empty) tree2
   180       else merge_trees(tree1, tree2)
   180       else merge_trees(tree1, tree2)
   181     }
   181     }
   182   }
   182   }
   183 
   183 
   184   def cumulate[A](root_range: Text.Range, root_info: A, elements: Document.Elements,
   184   def cumulate[A](root_range: Text.Range, root_info: A, elements: Markup.Elements,
   185     result: (A, Text.Markup) => Option[A]): List[Text.Info[A]] =
   185     result: (A, Text.Markup) => Option[A]): List[Text.Info[A]] =
   186   {
   186   {
   187     def results(x: A, entry: Entry): Option[A] =
   187     def results(x: A, entry: Entry): Option[A] =
   188     {
   188     {
   189       var y = x
   189       var y = x
   228     }
   228     }
   229     traverse(root_range.start,
   229     traverse(root_range.start,
   230       List((Text.Info(root_range, root_info), overlapping(root_range).toList)))
   230       List((Text.Info(root_range, root_info), overlapping(root_range).toList)))
   231   }
   231   }
   232 
   232 
   233   def to_XML(root_range: Text.Range, text: CharSequence, elements: Document.Elements): XML.Body =
   233   def to_XML(root_range: Text.Range, text: CharSequence, elements: Markup.Elements): XML.Body =
   234   {
   234   {
   235     def make_text(start: Text.Offset, stop: Text.Offset): XML.Body =
   235     def make_text(start: Text.Offset, stop: Text.Offset): XML.Body =
   236       if (start == stop) Nil
   236       if (start == stop) Nil
   237       else List(XML.Text(text.subSequence(start, stop).toString))
   237       else List(XML.Text(text.subSequence(start, stop).toString))
   238 
   238