def filter_markup(elements: Markup.Elements): List[XML.Elem] = { var result: List[XML.Elem] = Nil for (elem <- rev_markup if elements(elem.name))
result ::= elem
result
}
branches.get(new_range) match { case None => new Markup_Tree(branches, Entry(new_markup, empty)) case Some(entry) => if (entry.range == new_range) new Markup_Tree(branches, entry + new_markup) elseif (entry.range.contains(new_range)) new Markup_Tree(branches, entry \ new_markup) elseif (new_range.contains(branches.head._1) && new_range.contains(branches.last._1)) new Markup_Tree(Branches.empty, Entry(new_markup, this)) else { val body = overlapping(new_range) if (body.forall(e => new_range.contains(e._1))) new Markup_Tree(branches -- body.keys, Entry(new_markup, new Markup_Tree(body))) else {
Output.warning("Ignored overlapping markup information: " + new_markup + "\n" +
body.filter(e => !new_range.contains(e._1)).values.mkString("\n")) this
}
}
}
}
def merge(other: Markup_Tree, root_range: Text.Range, elements: Markup.Elements): Markup_Tree = { def merge_trees(tree1: Markup_Tree, tree2: Markup_Tree): Markup_Tree =
tree2.branches.foldLeft(tree1) { case (tree, (range, entry)) => if (!range.overlaps(root_range)) tree else {
entry.filter_markup(elements).foldLeft(merge_trees(tree, entry.subtree)) { case (t, elem) => t + Text.Info(range, elem)
}
}
}
if (this eq other) this else { val tree1 = this.restrict(root_range) val tree2 = other.restrict(root_range) if (tree1.is_empty) tree2 else merge_trees(tree1, tree2)
}
}
def cumulate[A](
root_range: Text.Range,
root_info: A,
elements: Markup.Elements,
result: (A, Text.Markup) => Option[A]
): List[Text.Info[A]] = { def results(x: A, entry: Entry): Option[A] = { var y = x var changed = false for {
elem <- entry.filter_markup(elements)
y1 <- result(y, Text.Info(entry.range, elem))
} { y = y1; changed = true } if (changed) Some(y) else None
}
def traverse(
last: Text.Offset,
stack: List[(Text.Info[A], List[(Text.Range, Entry)])]
): List[Text.Info[A]] = {
stack match { case (parent, (range, entry) :: more) :: rest => val subrange = range.restrict(root_range) val subtree = entry.subtree.overlapping(subrange).toList val start = subrange.start
results(parent.info, entry) match { case Some(res) => val next = Text.Info(subrange, res) val nexts = traverse(start, (next, subtree) :: (parent, more) :: rest) if (last < start) parent.restrict(Text.Range(last, start)) :: nexts else nexts case None => traverse(last, (parent, subtree ::: more) :: rest)
}
case (parent, Nil) :: rest => val stop = parent.range.stop val nexts = traverse(stop, rest) if (last < stop) parent.restrict(Text.Range(last, stop)) :: nexts else nexts
case Nil => val stop = root_range.stop if (last < stop) List(Text.Info(Text.Range(last, stop), root_info)) else Nil
}
}
traverse(root_range.start,
List((Text.Info(root_range, root_info), overlapping(root_range).toList)))
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.