Source code for enable.savage.svg.css.identifier
# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
""" Parse CSS identifiers. More complicated than it sounds"""
from pyparsing import Combine, Literal, Optional, Regex, White, ZeroOrMore
import re
[docs]class White(White):
""" Customize whitespace to match the CSS spec values"""
def __init__(self, ws=" \t\r\n\f", min=1, max=0, exact=0):
super().__init__(ws, min, max, exact)
escaped = (
Literal("\\").suppress()
+
# chr(20)-chr(126) + chr(128)-unichr(sys.maxunicode)
Regex("[\u0020-\u007e\u0080-\uffff]", re.IGNORECASE)
)
[docs]def convertToUnicode(t):
return chr(int(t[0], 16))
hex_unicode = (
Literal("\\").suppress()
+ Regex("[0-9a-f]{1,6}", re.IGNORECASE)
+ Optional(White(exact=1)).suppress()
).setParseAction(convertToUnicode)
escape = hex_unicode | escaped
# any unicode literal outside the 0-127 ascii range
nonascii = Regex("[^\u0000-\u007f]")
# single character for starting an identifier.
nmstart = Regex("[A-Z]", re.IGNORECASE) | nonascii | escape
nmchar = Regex("[0-9A-Z-]", re.IGNORECASE) | nonascii | escape
identifier = Combine(nmstart + ZeroOrMore(nmchar))