parser

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

 

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

Отлично! Следующая версия

Азат Разетдинов 18.05.2007 17:35

1. Добавил поддержку min/max (выдаются флаги rangeUnderFlow и rangeOverFlow).

2. Добавил поддержку зависимых полей/блоков. Если поле или его предок (например, fieldset) имеют атрибут willValidate=0, то оно будет пропущено. Это оказалось проще, чем передавать логику зависимости в xml.

3. Если поле содержит атрибут disabled или readonly, то оно также будет пропущено (согласно спецификации).

Мои потребности класс уже удовлетворяет. Если есть идеи по расширению функциональности, можно обсудить.
@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}[	
	not(@readonly or @disabled or ancestor-or-self::*[@willValidate=0])
]]]
^hNodes.foreach[;xNode]{^checkNode[$xNode]}
$result(^xForm.selectBool[not(//${FIELD}[@valid = 0])])
#end @checkValidity[]



@checkNode[xNode][bIsValid;hAttr]
$bIsValid(true)
$hAttr[^Node:getAttributes[$xNode]]
^if(def $hAttr.value){
	^if(
		def $MATCHES.[$hAttr.type]
		&& !^hAttr.value.match[^^(?:$MATCHES.[$hAttr.type])^$]
	){
		^xNode.setAttribute[typeMismatch;1]
		$bIsValid(false)
	}
	^if($bIsValid){
		^switch[$hAttr.type]{
			^case[email]{
				^use[Lib.p]
				^if(!^Lib:isEmail[$hAttr.value]){
					^xNode.setAttribute[typeMismatch;1]
					$bIsValid(false)
				}
			}
			^case[number;range]{
				^if(
					^hAttr.min.double(0)
					&& ^hAttr.value.double(0) < ^hAttr.min.double(0)
				){
					^xNode.setAttribute[rangeUnderFlow;1]
					$bIsValid(false)
				}
				^if(
					^hAttr.max.double(0)
					&& ^hAttr.value.double(0) > ^hAttr.max.double(0)
				){
					^xNode.setAttribute[rangeOverFlow;1]
					$bIsValid(false)
				}
			}
			^case[date;time;datetime;datetime-local]{
				^if(def $hAttr.min && $hAttr.value lt $hAttr.min){
					^xNode.setAttribute[rangeUnderFlow;1]
					$bIsValid(false)
				}
				^if(def $hAttr.max && $hAttr.value gt $hAttr.max){
					^xNode.setAttribute[rangeOverFlow;1]
					$bIsValid(false)
				}
			}
		}
	}
	^if(
		^hAttr.maxlength.int(0)
		&& ^hAttr.value.length[] > ^hAttr.maxlength.int(0)
	){
		^xNode.setAttribute[tooLong;1]
		$bIsValid(false)
	}
	^if(def $hAttr.pattern){
		^try{
			^if(!^hAttr.value.match[^^(?:$hAttr.pattern)^$]){
				^xNode.setAttribute[patternMismatch;1]
				$bIsValid(false)
			}
		}{
			$exception.handled(true)
		}
	}
}{
	^if(def $hAttr.required){
		^xNode.setAttribute[valueMissing;1]
		$bIsValid(false)
	}
}
^if(def $hAttr.customError){
	$bIsValid(false)
}
^xNode.setAttribute[valid;^if($bIsValid){1;0}]
$result[]
#end @checkNode[]