Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite5cea2d

Browse files
author
Mark Pilgrim
committed
added support for validating class attribute values (space-separated token lists)
--HG--extra : convert_revision : svn%3Aacbfec75-9323-0410-a652-858a13e371e0/trunk%40973
1 parent0cdaa3b commite5cea2d

File tree

1 file changed

+55
-7
lines changed

1 file changed

+55
-7
lines changed

‎src/html5lib/filters/validator.py‎

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
fromsetsimportSetasset
2020
fromsetsimportImmutableSetasfrozenset
2121
import_base
22-
fromhtml5lib.constantsimportE
22+
fromhtml5lib.constantsimportE,spaceCharacters
2323
fromhtml5libimporttokenizer
2424
importgettext
2525
_=gettext.gettext
@@ -37,6 +37,10 @@
3737
_(u"'%(attributeName)s' attribute is not allowed on <input type=%(inputType)s>."),
3838
"deprecated-attribute":
3939
_(u"'%(attributeName)s' attribute is deprecated on <%(tagName)s>."),
40+
"invalid-class-attribute":
41+
_(u"Invalid class attribute value on <%(tagName)s>."),
42+
"duplicate-value-in-token-list":
43+
_(u"Duplicate value '%(attributeValue)s' in token list in '%(attributeName)s' attribute on <%(tagName)s>."),
4044
})
4145

4246
globalAttributes=frozenset(('class','contenteditable','contextmenu','dir',
@@ -225,18 +229,35 @@ def __iter__(self):
225229
fortinmethod(token)or []:yieldt
226230
yieldtoken
227231

232+
defcheckAttributeValues(self,token):
233+
tagName=token.get("name","")
234+
fakeToken= {"tagName":tagName.capitalize()}
235+
forattrName,attrValueintoken.get("data", []):
236+
attrName=attrName.lower()
237+
fakeToken["attributeName"]=attrName.capitalize()
238+
method=getattr(self,"validateAttributeValue%(tagName)s%(attributeName)s"%fakeToken,None)
239+
ifmethod:
240+
fortinmethod(token,tagName,attrName,attrValue)or []:yieldt
241+
else:
242+
method=getattr(self,"validateAttributeValue%(attributeName)s"%fakeToken,None)
243+
ifmethod:
244+
fortinmethod(token,tagName,attrName,attrValue)or []:yieldt
245+
228246
defvalidateStartTag(self,token):
229247
fortinself.checkUnknownStartTag(token)or []:yieldt
230248
fortinself.checkStartTagRequiredAttributes(token)or []:yieldt
231249
fortinself.checkStartTagUnknownAttributes(token)or []:yieldt
250+
fortinself.checkAttributeValues(token)or []:yieldt
232251

233252
defvalidateStartTagEmbed(self,token):
234253
fortinself.checkStartTagRequiredAttributes(token)or []:yieldt
254+
fortinself.checkAttributeValues(token)or []:yieldt
235255
# spec says "any attributes w/o namespace"
236256
# so don't call checkStartTagUnknownAttributes
237257

238258
defvalidateStartTagInput(self,token):
239-
attrDict=dict([(name.lower(),value)forname,valueintoken["data"]])
259+
fortinself.checkAttributeValues(token)or []:yieldt
260+
attrDict=dict([(name.lower(),value)forname,valueintoken.get("data", [])])
240261
inputType=attrDict.get("type","text")
241262
ifinputTypenotininputTypeAllowedAttributeMap.keys():
242263
yield {"type":"ParseError",
@@ -262,18 +283,18 @@ def validateStartTagInput(self, token):
262283

263284
defcheckUnknownStartTag(self,token):
264285
# check for recognized tag name
265-
name=token["name"].lower()
286+
name=token.get("name","").lower()
266287
ifnamenotinallowedAttributeMap.keys():
267288
yield {"type":"ParseError",
268289
"data":"unknown-start-tag",
269290
"datavars": {"tagName":name}}
270291

271292
defcheckStartTagRequiredAttributes(self,token):
272293
# check for presence of required attributes
273-
name=token["name"].lower()
294+
name=token.get("name","").lower()
274295
ifnameinrequiredAttributeMap.keys():
275296
attrsPresent= [attrNameforattrName,attrValue
276-
intoken["data"]]
297+
intoken.get("data", [])]
277298
forattrNameinrequiredAttributeMap[name]:
278299
ifattrNamenotinattrsPresent:
279300
yield {"type":"ParseError",
@@ -283,12 +304,39 @@ def checkStartTagRequiredAttributes(self, token):
283304

284305
defcheckStartTagUnknownAttributes(self,token):
285306
# check for recognized attribute names
286-
name=token["name"].lower()
307+
name=token.get("name").lower()
287308
allowedAttributes=globalAttributes|allowedAttributeMap.get(name,frozenset(()))
288-
forattrName,attrValueintoken["data"]:
309+
forattrName,attrValueintoken.get("data", []):
289310
ifattrName.lower()notinallowedAttributes:
290311
yield {"type":"ParseError",
291312
"data":"unknown-attribute",
292313
"datavars": {"tagName":name,
293314
"attributeName":attrName}}
294315

316+
defvalidateAttributeValueClass(self,token,tagName,attrName,attrValue):
317+
fortinself.checkTokenList(tagName,attrName,attrValue)or []:
318+
yieldt
319+
yield {"type":"ParseError",
320+
"data":"invalid-class-attribute",
321+
"datavars": {"tagName":tagName}}
322+
323+
defcheckTokenList(self,tagName,attrName,attrValue):
324+
# The "token" in the method name refers to tokens in an attribute value
325+
# i.e. http://www.whatwg.org/specs/web-apps/current-work/#set-of
326+
# but the "token" parameter refers to the token generated from
327+
# HTMLTokenizer. Sorry for the confusion.
328+
valueList= []
329+
currentValue=''
330+
forcinattrValue+' ':
331+
ifcinspaceCharacters:
332+
ifcurrentValue:
333+
ifcurrentValueinvalueList:
334+
yield {"type":"ParseError",
335+
"data":"duplicate-value-in-token-list",
336+
"datavars": {"tagName":tagName,
337+
"attributeName":attrName,
338+
"attributeValue":currentValue}}
339+
valueList.append(currentValue)
340+
currentValue=''
341+
else:
342+
currentValue+=c

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp