parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Согласен со всем

Азат Разетдинов 18.05.2007 02:58

Исправленный вариант:
@CLASS
WebForms

@USE
Node.p



@auto[]
$FIELD[field]
$MATCHES[
	$.date[\d{4}-\d{2}-\d{2}]
	$.month[\d{4}-\d{2}]
	$.week[\d{4}-W\d{2}]
	$.time[\d{4}:\d{2}(?::\d{2}(?:\.\d+)?)?]
	$.url[(?:[a-z]+://)?[:\w~%{}./?=&@,#-]+]
	$.number[-?\d+(?:\.\d+)?(?:e\d+)?]
]
^MATCHES.add[
	$.range[$MATCHES.number]
	$.datetime[${MATCHES.date}T${MATCHES.time}Z]
	$.datetime-local[${MATCHES.date}T$MATCHES.time]
]
#end @auto[]



@checkValidity[xForm][hNodes;xNode]
$hNodes[^xForm.select[//$FIELD]]
^hNodes.foreach[;xNode]{^checkNode[$xNode]}
$result(^xForm.selectBool[not(//${FIELD}[@valid = 0])])
#end @checkValidity[]



@checkNode[xNode][hAttr;bIsValid]
$hAttr[^Node:getAttributes[$xNode]]
^xNode.setAttribute[valid;1]
^if(def $hAttr.value){
	^if($hAttr.type eq email){
		^use[Lib.p]
		$bIsValid(^Lib:isEmail[$hAttr.value])
	}{
		$bIsValid(
			!def $MATCHES.[$hAttr.type]
			|| ^hAttr.value.match[^^$MATCHES.[$hAttr.type]^$]
		)
	}
	^if(!$bIsValid){
		^xNode.setAttribute[typeMismatch;1]
		^xNode.setAttribute[valid;0]
	}
	^if(def $hAttr.maxlength && ^hAttr.value.length[] > ^hAttr.maxlength.int(0)){
		^xNode.setAttribute[tooLong;1]
		^xNode.setAttribute[valid;0]
	}
	^if(def $hAttr.pattern){
		^try{
			^if(!^hAttr.value.match[^^(?:$hAttr.pattern)^$]){
				^xNode.setAttribute[patternMismatch;1]
				^xNode.setAttribute[valid;0]
			}
		}{
			$exception.handled(1)
		}
	}
}{
	^if(def $hAttr.required){
		^xNode.setAttribute[valueMissing;1]
		^xNode.setAttribute[valid;0]
	}
}
^if(def $hAttr.customError){
	^xNode.setAttribute[valid;0]
}
$result[]
#end @checkNode[]
P.S. Про ^Node:getAttributes[] не знал, пока не скачал новую версию. У вас там в двух местах есть конструкция
(!def $sNodeName || (def $sNodeName && $xNode.nodeName eq $sNodeName))
которую можно сократить до
(!def $sNodeName || $xNode.nodeName eq $sNodeName)