validatingmarkuphandler.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 121 行
SCALA
121 行
/* __ *\** ________ ___ / / ___ Scala API **** / __/ __// _ | / / / _ | (c) 2002-2007, LAMP/EPFL **** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **** /____/\___/_/ |_/____/_/ | | **** |/ **\* */// $Id: ValidatingMarkupHandler.scala 11950 2007-06-08 12:08:26Z michelou $package scala.xml.parsingimport scala.xml.dtd._import scala.util.logging.Loggedabstract class ValidatingMarkupHandler extends MarkupHandler with Logged { var rootLabel:String = _ var qStack: List[Int] = Nil var qCurrent: Int = -1 var declStack: List[ElemDecl] = Nil var declCurrent: ElemDecl = null final override val isValidating = true override def log(msg: String) {} /* override def checkChildren(pos: Int, pre: String, label:String,ns:NodeSeq): Unit = { Console.println("checkChildren()"); val decl = lookupElemDecl(label); // @todo: nice error message val res = decl.contentModel.validate(ns); Console.println("res = "+res); if(!res) //error("invalid!"); } */ override def endDTD(n:String) = { rootLabel = n } override def elemStart(pos: Int, pre: String, label: String, attrs: MetaData, scope:NamespaceBinding) { def advanceDFA(dm:DFAContentModel) = { val trans = dm.dfa.delta(qCurrent) log("advanceDFA(dm): " + dm) log("advanceDFA(trans): " + trans) trans.get(ContentModel.ElemName(label)) match { case Some(qNew) => qCurrent = qNew case _ => reportValidationError(pos, "DTD says, wrong element, expected one of "+trans.keys.toString()); } } // advance in current automaton log("[qCurrent = "+qCurrent+" visiting "+label+"]") if (qCurrent == -1) { // root log(" checking root") if (label != rootLabel) reportValidationError(pos, "this element should be "+rootLabel) } else { log(" checking node") declCurrent.contentModel match { case ANY => case EMPTY => reportValidationError(pos, "DTD says, no elems, no text allowed here") case PCDATA => reportValidationError(pos, "DTD says, no elements allowed here") case m @ MIXED(r) => advanceDFA(m) case e @ ELEMENTS(r) => advanceDFA(e) } } // push state, decl qStack = qCurrent :: qStack declStack = declCurrent :: declStack declCurrent = lookupElemDecl(label) qCurrent = 0 log(" done now") } override def elemEnd(pos: Int, pre: String, label: String) { log(" elemEnd") qCurrent = qStack.head qStack = qStack.tail declCurrent = declStack.head declStack = declStack.tail log(" qCurrent now" + qCurrent) log(" declCurrent now" + declCurrent) } final override def elemDecl(name: String, cmstr: String) { decls = ElemDecl(name, ContentModel.parse(cmstr)) :: decls } final override def attListDecl(name: String, attList: List[AttrDecl]) { decls = AttListDecl(name, attList) :: decls } final override def unparsedEntityDecl(name: String, extID: ExternalID, notat: String) { decls = UnparsedEntityDecl(name, extID, notat) :: decls } final override def notationDecl(notat: String, extID: ExternalID) { decls = NotationDecl(notat, extID) :: decls; } final override def peReference(name: String) { decls = PEReference(name) :: decls } /** report a syntax error */ def reportValidationError(pos: Int, str: String): Unit}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?