Implement raw HTML elements (#627)
This commit is contained in:
parent
0164c44495
commit
de0f80dba6
@ -3,6 +3,7 @@
|
||||
Anything imported here will be available in the default Pynecone import as `pc.*`.
|
||||
"""
|
||||
|
||||
from . import el
|
||||
from .app import App, UploadFile
|
||||
from .base import Base
|
||||
from .components import *
|
||||
|
3
pynecone/el/__init__.py
Normal file
3
pynecone/el/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
"""The el package exports raw HTML elements."""
|
||||
|
||||
from .elements import *
|
5
pynecone/el/constants/__init__.py
Normal file
5
pynecone/el/constants/__init__.py
Normal file
@ -0,0 +1,5 @@
|
||||
"""Constants used to compile element classes."""
|
||||
|
||||
from .html import *
|
||||
from .pynecone import *
|
||||
from .react import *
|
343
pynecone/el/constants/html.py
Normal file
343
pynecone/el/constants/html.py
Normal file
@ -0,0 +1,343 @@
|
||||
"""HTML constants."""
|
||||
|
||||
# See https://html.spec.whatwg.org/#elements-3.
|
||||
ELEMENTS = {
|
||||
"a",
|
||||
"abbr",
|
||||
"address",
|
||||
"area",
|
||||
"article",
|
||||
"aside",
|
||||
"audio",
|
||||
"b",
|
||||
"base",
|
||||
"bdi",
|
||||
"bdo",
|
||||
"blockquote",
|
||||
"body",
|
||||
"br",
|
||||
"button",
|
||||
"canvas",
|
||||
"caption",
|
||||
"cite",
|
||||
"code",
|
||||
"col",
|
||||
"colgroup",
|
||||
"data",
|
||||
"datalist",
|
||||
"dd",
|
||||
"del",
|
||||
"details",
|
||||
"dfn",
|
||||
"dialog",
|
||||
"div",
|
||||
"dl",
|
||||
"dt",
|
||||
"em",
|
||||
"embed",
|
||||
"fieldset",
|
||||
"figcaption",
|
||||
"figure",
|
||||
"footer",
|
||||
"form",
|
||||
"h1",
|
||||
"h2",
|
||||
"h3",
|
||||
"h4",
|
||||
"h5",
|
||||
"h6",
|
||||
"head",
|
||||
"header",
|
||||
"hr",
|
||||
"html",
|
||||
"i",
|
||||
"iframe",
|
||||
"img",
|
||||
"input",
|
||||
"ins",
|
||||
"kbd",
|
||||
"label",
|
||||
"legend",
|
||||
"li",
|
||||
"link",
|
||||
"main",
|
||||
"map",
|
||||
"mark",
|
||||
"math",
|
||||
"menu",
|
||||
"meta",
|
||||
"meter",
|
||||
"nav",
|
||||
"noscript",
|
||||
"object",
|
||||
"ol",
|
||||
"optgroup",
|
||||
"option",
|
||||
"output",
|
||||
"p",
|
||||
"picture",
|
||||
"portal",
|
||||
"pre",
|
||||
"progress",
|
||||
"q",
|
||||
"rp",
|
||||
"rt",
|
||||
"ruby",
|
||||
"s",
|
||||
"samp",
|
||||
"script",
|
||||
"section",
|
||||
"select",
|
||||
"slot",
|
||||
"small",
|
||||
"source",
|
||||
"span",
|
||||
"strong",
|
||||
"style",
|
||||
"sub",
|
||||
"summary",
|
||||
"sup",
|
||||
"svg",
|
||||
"table",
|
||||
"tbody",
|
||||
"td",
|
||||
"template",
|
||||
"textarea",
|
||||
"tfoot",
|
||||
"th",
|
||||
"thead",
|
||||
"time",
|
||||
"title",
|
||||
"tr",
|
||||
"track",
|
||||
"u",
|
||||
"ul",
|
||||
"var",
|
||||
"video",
|
||||
"wbr",
|
||||
}
|
||||
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes.
|
||||
ATTR_TO_ELEMENTS = {
|
||||
"accept": {"form", "input"},
|
||||
"accept-charset": {"form"},
|
||||
"accesskey": ELEMENTS,
|
||||
"action": {"form"},
|
||||
"align": {
|
||||
"applet",
|
||||
"caption",
|
||||
"col",
|
||||
"colgroup",
|
||||
"hr",
|
||||
"iframe",
|
||||
"img",
|
||||
"table",
|
||||
"tbody",
|
||||
"td",
|
||||
"tfoot",
|
||||
"th",
|
||||
"thead",
|
||||
"tr",
|
||||
},
|
||||
"allow": {"iframe"},
|
||||
"alt": {"applet", "area", "img", "input"},
|
||||
"async": {"script"},
|
||||
"autocapitalize": ELEMENTS,
|
||||
"autocomplete": {"form", "input", "select", "textarea"},
|
||||
"autofocus": {"button", "input", "keygen", "select", "textarea"},
|
||||
"autoplay": {"audio", "video"},
|
||||
"background": {"body", "table", "td", "th"},
|
||||
"bgcolor": {
|
||||
"body",
|
||||
"col",
|
||||
"colgroup",
|
||||
"marquee",
|
||||
"table",
|
||||
"tbody",
|
||||
"tfoot",
|
||||
"td",
|
||||
"th",
|
||||
"tr",
|
||||
},
|
||||
"border": {"img", "object", "table"},
|
||||
"buffered": {"audio", "video"},
|
||||
"capture": {"input"},
|
||||
"challenge": {"keygen"},
|
||||
"charset": {"meta", "script"},
|
||||
"checked": {"input"},
|
||||
"cite": {"blockquote", "del", "ins", "q"},
|
||||
"class": ELEMENTS,
|
||||
"code": {"applet"},
|
||||
"codebase": {"applet"},
|
||||
"color": {"font", "hr"},
|
||||
"cols": {"textarea"},
|
||||
"colspan": {"td", "th"},
|
||||
"content": {"meta"},
|
||||
"contenteditable": ELEMENTS,
|
||||
"contextmenu": ELEMENTS,
|
||||
"controls": {"audio", "video"},
|
||||
"coords": {"area"},
|
||||
"crossorigin": {"audio", "img", "link", "script", "video"},
|
||||
"csp": {"iframe"},
|
||||
"data": {"object"},
|
||||
"datetime": {"del", "ins", "time"},
|
||||
"decoding": {"img"},
|
||||
"default": {"track"},
|
||||
"defer": {"script"},
|
||||
"dir": ELEMENTS,
|
||||
"dirname": {"input", "textarea"},
|
||||
"disabled": {
|
||||
"button",
|
||||
"fieldset",
|
||||
"input",
|
||||
"keygen",
|
||||
"optgroup",
|
||||
"option",
|
||||
"select",
|
||||
"textarea",
|
||||
},
|
||||
"download": {"a", "area"},
|
||||
"draggable": ELEMENTS,
|
||||
"enctype": {"form"},
|
||||
"enterkeyhint": ELEMENTS,
|
||||
"for": {"label", "output"},
|
||||
"form": {
|
||||
"button",
|
||||
"fieldset",
|
||||
"input",
|
||||
"keygen",
|
||||
"label",
|
||||
"meter",
|
||||
"object",
|
||||
"output",
|
||||
"progress",
|
||||
"select",
|
||||
"textarea",
|
||||
},
|
||||
"formaction": {"button", "input"},
|
||||
"formenctype": {"button", "input"},
|
||||
"formmethod": {"button", "input"},
|
||||
"formnovalidate": {"button", "input"},
|
||||
"formtarget": {"button", "input"},
|
||||
"headers": {"td", "th"},
|
||||
"height": {"canvas", "embed", "iframe", "img", "input", "object", "video"},
|
||||
"hidden": ELEMENTS,
|
||||
"high": {"meter"},
|
||||
"href": {"a", "area", "base", "link"},
|
||||
"hreflang": {"a", "area", "link"},
|
||||
"http-equiv": {"meta"},
|
||||
"icon": {"command"},
|
||||
"id": ELEMENTS,
|
||||
"integrity": {"link", "script"},
|
||||
"intrinsicsize": {"img"},
|
||||
"inputmode": ELEMENTS,
|
||||
"ismap": {"img"},
|
||||
"itemprop": ELEMENTS,
|
||||
"keytype": {"keygen"},
|
||||
"kind": {"track"},
|
||||
"label": {"optgroup", "option", "track"},
|
||||
"lang": ELEMENTS,
|
||||
"language": {"script"},
|
||||
"loading": {"img", "iframe"},
|
||||
"list": {"input"},
|
||||
"loop": {"audio", "bgsound", "marquee", "video"},
|
||||
"low": {"meter"},
|
||||
"manifest": {"html"},
|
||||
"max": {"input", "meter", "progress"},
|
||||
"maxlength": {"input", "textarea"},
|
||||
"minlength": {"input", "textarea"},
|
||||
"media": {"a", "area", "link", "source", "style"},
|
||||
"method": {"form"},
|
||||
"min": {"input", "meter"},
|
||||
"multiple": {"input", "select"},
|
||||
"muted": {"audio", "video"},
|
||||
"name": {
|
||||
"button",
|
||||
"form",
|
||||
"fieldset",
|
||||
"iframe",
|
||||
"input",
|
||||
"keygen",
|
||||
"object",
|
||||
"output",
|
||||
"select",
|
||||
"textarea",
|
||||
"map",
|
||||
"meta",
|
||||
"param",
|
||||
},
|
||||
"novalidate": {"form"},
|
||||
"open": {"details", "dialog"},
|
||||
"optimum": {"meter"},
|
||||
"pattern": {"input"},
|
||||
"ping": {"a", "area"},
|
||||
"placeholder": {"input", "textarea"},
|
||||
"playsinline": {"video"},
|
||||
"poster": {"video"},
|
||||
"preload": {"audio", "video"},
|
||||
"readonly": {"input", "textarea"},
|
||||
"referrerpolicy": {"a", "area", "iframe", "img", "link", "script"},
|
||||
"rel": {"a", "area", "link"},
|
||||
"required": {"input", "select", "textarea"},
|
||||
"reversed": {"ol"},
|
||||
"role": ELEMENTS,
|
||||
"rows": {"textarea"},
|
||||
"rowspan": {"td", "th"},
|
||||
"sandbox": {"iframe"},
|
||||
"scope": {"th"},
|
||||
"scoped": {"style"},
|
||||
"selected": {"option"},
|
||||
"shape": {"a", "area"},
|
||||
"size": {"input", "select"},
|
||||
"sizes": {"link", "img", "source"},
|
||||
"slot": ELEMENTS,
|
||||
"span": {"col", "colgroup"},
|
||||
"spellcheck": ELEMENTS,
|
||||
"src": {
|
||||
"audio",
|
||||
"embed",
|
||||
"iframe",
|
||||
"img",
|
||||
"input",
|
||||
"script",
|
||||
"source",
|
||||
"track",
|
||||
"video",
|
||||
},
|
||||
"srcdoc": {"iframe"},
|
||||
"srclang": {"track"},
|
||||
"srcset": {"img", "source"},
|
||||
"start": {"ol"},
|
||||
"step": {"input"},
|
||||
"style": ELEMENTS,
|
||||
"summary": {"table"},
|
||||
"tabindex": ELEMENTS,
|
||||
"target": {"a", "area", "base", "form"},
|
||||
"title": ELEMENTS,
|
||||
"translate": ELEMENTS,
|
||||
"type": {
|
||||
"button",
|
||||
"input",
|
||||
"embed",
|
||||
"object",
|
||||
"ol",
|
||||
"script",
|
||||
"source",
|
||||
"style",
|
||||
"menu",
|
||||
"link",
|
||||
},
|
||||
"usemap": {"img", "input", "object"},
|
||||
"value": {
|
||||
"button",
|
||||
"data",
|
||||
"input",
|
||||
"li",
|
||||
"meter",
|
||||
"option",
|
||||
"progress",
|
||||
"param",
|
||||
},
|
||||
"width": {"canvas", "embed", "iframe", "img", "input", "object", "video"},
|
||||
"wrap": {"textarea"},
|
||||
}
|
51
pynecone/el/constants/pynecone.py
Normal file
51
pynecone/el/constants/pynecone.py
Normal file
@ -0,0 +1,51 @@
|
||||
"""Constants used to compile element classes."""
|
||||
|
||||
from collections import defaultdict
|
||||
|
||||
from pynecone.utils import to_snake_case
|
||||
|
||||
from .html import ATTR_TO_ELEMENTS
|
||||
from .react import POSSIBLE_STANDARD_NAMES
|
||||
|
||||
# Maps HTML attributes that are invalid Python identifiers to their Pynecone
|
||||
# prop equivalents.
|
||||
ATTR_TO_PROP_OVERRIDES = {
|
||||
"async": "async_", # `async` is a reserved keyword in Python.
|
||||
}
|
||||
|
||||
|
||||
def attr_to_prop(attr_name: str) -> str:
|
||||
"""Convert an HTML attribute name to its Pynecone name.
|
||||
|
||||
This function first uses React's `possibleStandardNames` to convert the
|
||||
HTML attribute name to its standard React name, then converts the standard
|
||||
name to a Pynecone name.
|
||||
|
||||
Args:
|
||||
attr_name: The HTML attribute name.
|
||||
|
||||
Returns:
|
||||
A Pynecone prop name that maps to the HTML attribute.
|
||||
"""
|
||||
if attr_name in ATTR_TO_PROP_OVERRIDES:
|
||||
return ATTR_TO_PROP_OVERRIDES[attr_name]
|
||||
return to_snake_case(POSSIBLE_STANDARD_NAMES.get(attr_name, attr_name))
|
||||
|
||||
|
||||
# Names of HTML attributes that are provided by Pynecone out of the box.
|
||||
PYNECONE_PROVIDED_ATTRS = {"class", "id", "style"}
|
||||
|
||||
# ATTR_TO_ELEMENTS contains HTML attribute names, which might be invalid as
|
||||
# Pynecone prop names. PROP_TO_ELEMENTS contains the corresponding Pynecone
|
||||
# prop names. It omits props that are provided by Pynecone out of the box.
|
||||
PROP_TO_ELEMENTS = {
|
||||
attr_to_prop(attr_name): elements
|
||||
for attr_name, elements in ATTR_TO_ELEMENTS.items()
|
||||
if attr_name not in PYNECONE_PROVIDED_ATTRS
|
||||
}
|
||||
|
||||
# Invert PROP_TO_ELEMENTS to enable easier lookup.
|
||||
ELEMENT_TO_PROPS = defaultdict(list)
|
||||
for prop, elements in PROP_TO_ELEMENTS.items():
|
||||
for el in elements:
|
||||
ELEMENT_TO_PROPS[el].append(prop)
|
501
pynecone/el/constants/react.py
Normal file
501
pynecone/el/constants/react.py
Normal file
@ -0,0 +1,501 @@
|
||||
"""Constants used to compile element classes.
|
||||
|
||||
Ported from React DOM's possibleStandardNames.js. See the following link for
|
||||
more information:
|
||||
|
||||
https://github.com/facebook/react/blob/d1ad984db1591b131d16739a24dee4ba44886a09/packages/react-dom-bindings/src/shared/possibleStandardNames.js
|
||||
"""
|
||||
|
||||
# Possible misspellings of React prop names, including incorrect casing.
|
||||
POSSIBLE_STANDARD_NAMES = {
|
||||
# HTML
|
||||
"accept": "accept",
|
||||
"acceptcharset": "acceptCharset",
|
||||
"accept-charset": "acceptCharset",
|
||||
"accesskey": "accessKey",
|
||||
"action": "action",
|
||||
"allowfullscreen": "allowFullScreen",
|
||||
"alt": "alt",
|
||||
"as": "as",
|
||||
"async": "async",
|
||||
"autocapitalize": "autoCapitalize",
|
||||
"autocomplete": "autoComplete",
|
||||
"autocorrect": "autoCorrect",
|
||||
"autofocus": "autoFocus",
|
||||
"autoplay": "autoPlay",
|
||||
"autosave": "autoSave",
|
||||
"capture": "capture",
|
||||
"cellpadding": "cellPadding",
|
||||
"cellspacing": "cellSpacing",
|
||||
"challenge": "challenge",
|
||||
"charset": "charSet",
|
||||
"checked": "checked",
|
||||
"children": "children",
|
||||
"cite": "cite",
|
||||
"class": "className",
|
||||
"classid": "classID",
|
||||
"classname": "className",
|
||||
"cols": "cols",
|
||||
"colspan": "colSpan",
|
||||
"content": "content",
|
||||
"contenteditable": "contentEditable",
|
||||
"contextmenu": "contextMenu",
|
||||
"controls": "controls",
|
||||
"controlslist": "controlsList",
|
||||
"coords": "coords",
|
||||
"crossorigin": "crossOrigin",
|
||||
"dangerouslysetinnerhtml": "dangerouslySetInnerHTML",
|
||||
"data": "data",
|
||||
"datetime": "dateTime",
|
||||
"default": "default",
|
||||
"defaultchecked": "defaultChecked",
|
||||
"defaultvalue": "defaultValue",
|
||||
"defer": "defer",
|
||||
"dir": "dir",
|
||||
"disabled": "disabled",
|
||||
"disablepictureinpicture": "disablePictureInPicture",
|
||||
"disableremoteplayback": "disableRemotePlayback",
|
||||
"download": "download",
|
||||
"draggable": "draggable",
|
||||
"enctype": "encType",
|
||||
"enterkeyhint": "enterKeyHint",
|
||||
"fetchpriority": "fetchPriority",
|
||||
"for": "htmlFor",
|
||||
"form": "form",
|
||||
"formmethod": "formMethod",
|
||||
"formaction": "formAction",
|
||||
"formenctype": "formEncType",
|
||||
"formnovalidate": "formNoValidate",
|
||||
"formtarget": "formTarget",
|
||||
"frameborder": "frameBorder",
|
||||
"headers": "headers",
|
||||
"height": "height",
|
||||
"hidden": "hidden",
|
||||
"high": "high",
|
||||
"href": "href",
|
||||
"hreflang": "hrefLang",
|
||||
"htmlfor": "htmlFor",
|
||||
"httpequiv": "httpEquiv",
|
||||
"http-equiv": "httpEquiv",
|
||||
"icon": "icon",
|
||||
"id": "id",
|
||||
"imagesizes": "imageSizes",
|
||||
"imagesrcset": "imageSrcSet",
|
||||
"innerhtml": "innerHTML",
|
||||
"inputmode": "inputMode",
|
||||
"integrity": "integrity",
|
||||
"is": "is",
|
||||
"itemid": "itemID",
|
||||
"itemprop": "itemProp",
|
||||
"itemref": "itemRef",
|
||||
"itemscope": "itemScope",
|
||||
"itemtype": "itemType",
|
||||
"keyparams": "keyParams",
|
||||
"keytype": "keyType",
|
||||
"kind": "kind",
|
||||
"label": "label",
|
||||
"lang": "lang",
|
||||
"list": "list",
|
||||
"loop": "loop",
|
||||
"low": "low",
|
||||
"manifest": "manifest",
|
||||
"marginwidth": "marginWidth",
|
||||
"marginheight": "marginHeight",
|
||||
"max": "max",
|
||||
"maxlength": "maxLength",
|
||||
"media": "media",
|
||||
"mediagroup": "mediaGroup",
|
||||
"method": "method",
|
||||
"min": "min",
|
||||
"minlength": "minLength",
|
||||
"multiple": "multiple",
|
||||
"muted": "muted",
|
||||
"name": "name",
|
||||
"nomodule": "noModule",
|
||||
"nonce": "nonce",
|
||||
"novalidate": "noValidate",
|
||||
"open": "open",
|
||||
"optimum": "optimum",
|
||||
"pattern": "pattern",
|
||||
"placeholder": "placeholder",
|
||||
"playsinline": "playsInline",
|
||||
"poster": "poster",
|
||||
"preload": "preload",
|
||||
"profile": "profile",
|
||||
"radiogroup": "radioGroup",
|
||||
"readonly": "readOnly",
|
||||
"referrerpolicy": "referrerPolicy",
|
||||
"rel": "rel",
|
||||
"required": "required",
|
||||
"reversed": "reversed",
|
||||
"role": "role",
|
||||
"rows": "rows",
|
||||
"rowspan": "rowSpan",
|
||||
"sandbox": "sandbox",
|
||||
"scope": "scope",
|
||||
"scoped": "scoped",
|
||||
"scrolling": "scrolling",
|
||||
"seamless": "seamless",
|
||||
"selected": "selected",
|
||||
"shape": "shape",
|
||||
"size": "size",
|
||||
"sizes": "sizes",
|
||||
"span": "span",
|
||||
"spellcheck": "spellCheck",
|
||||
"src": "src",
|
||||
"srcdoc": "srcDoc",
|
||||
"srclang": "srcLang",
|
||||
"srcset": "srcSet",
|
||||
"start": "start",
|
||||
"step": "step",
|
||||
"style": "style",
|
||||
"summary": "summary",
|
||||
"tabindex": "tabIndex",
|
||||
"target": "target",
|
||||
"title": "title",
|
||||
"type": "type",
|
||||
"usemap": "useMap",
|
||||
"value": "value",
|
||||
"width": "width",
|
||||
"wmode": "wmode",
|
||||
"wrap": "wrap",
|
||||
# SVG
|
||||
"about": "about",
|
||||
"accentheight": "accentHeight",
|
||||
"accent-height": "accentHeight",
|
||||
"accumulate": "accumulate",
|
||||
"additive": "additive",
|
||||
"alignmentbaseline": "alignmentBaseline",
|
||||
"alignment-baseline": "alignmentBaseline",
|
||||
"allowreorder": "allowReorder",
|
||||
"alphabetic": "alphabetic",
|
||||
"amplitude": "amplitude",
|
||||
"arabicform": "arabicForm",
|
||||
"arabic-form": "arabicForm",
|
||||
"ascent": "ascent",
|
||||
"attributename": "attributeName",
|
||||
"attributetype": "attributeType",
|
||||
"autoreverse": "autoReverse",
|
||||
"azimuth": "azimuth",
|
||||
"basefrequency": "baseFrequency",
|
||||
"baselineshift": "baselineShift",
|
||||
"baseline-shift": "baselineShift",
|
||||
"baseprofile": "baseProfile",
|
||||
"bbox": "bbox",
|
||||
"begin": "begin",
|
||||
"bias": "bias",
|
||||
"by": "by",
|
||||
"calcmode": "calcMode",
|
||||
"capheight": "capHeight",
|
||||
"cap-height": "capHeight",
|
||||
"clip": "clip",
|
||||
"clippath": "clipPath",
|
||||
"clip-path": "clipPath",
|
||||
"clippathunits": "clipPathUnits",
|
||||
"cliprule": "clipRule",
|
||||
"clip-rule": "clipRule",
|
||||
"color": "color",
|
||||
"colorinterpolation": "colorInterpolation",
|
||||
"color-interpolation": "colorInterpolation",
|
||||
"colorinterpolationfilters": "colorInterpolationFilters",
|
||||
"color-interpolation-filters": "colorInterpolationFilters",
|
||||
"colorprofile": "colorProfile",
|
||||
"color-profile": "colorProfile",
|
||||
"colorrendering": "colorRendering",
|
||||
"color-rendering": "colorRendering",
|
||||
"contentscripttype": "contentScriptType",
|
||||
"contentstyletype": "contentStyleType",
|
||||
"cursor": "cursor",
|
||||
"cx": "cx",
|
||||
"cy": "cy",
|
||||
"d": "d",
|
||||
"datatype": "datatype",
|
||||
"decelerate": "decelerate",
|
||||
"descent": "descent",
|
||||
"diffuseconstant": "diffuseConstant",
|
||||
"direction": "direction",
|
||||
"display": "display",
|
||||
"divisor": "divisor",
|
||||
"dominantbaseline": "dominantBaseline",
|
||||
"dominant-baseline": "dominantBaseline",
|
||||
"dur": "dur",
|
||||
"dx": "dx",
|
||||
"dy": "dy",
|
||||
"edgemode": "edgeMode",
|
||||
"elevation": "elevation",
|
||||
"enablebackground": "enableBackground",
|
||||
"enable-background": "enableBackground",
|
||||
"end": "end",
|
||||
"exponent": "exponent",
|
||||
"externalresourcesrequired": "externalResourcesRequired",
|
||||
"fill": "fill",
|
||||
"fillopacity": "fillOpacity",
|
||||
"fill-opacity": "fillOpacity",
|
||||
"fillrule": "fillRule",
|
||||
"fill-rule": "fillRule",
|
||||
"filter": "filter",
|
||||
"filterres": "filterRes",
|
||||
"filterunits": "filterUnits",
|
||||
"floodopacity": "floodOpacity",
|
||||
"flood-opacity": "floodOpacity",
|
||||
"floodcolor": "floodColor",
|
||||
"flood-color": "floodColor",
|
||||
"focusable": "focusable",
|
||||
"fontfamily": "fontFamily",
|
||||
"font-family": "fontFamily",
|
||||
"fontsize": "fontSize",
|
||||
"font-size": "fontSize",
|
||||
"fontsizeadjust": "fontSizeAdjust",
|
||||
"font-size-adjust": "fontSizeAdjust",
|
||||
"fontstretch": "fontStretch",
|
||||
"font-stretch": "fontStretch",
|
||||
"fontstyle": "fontStyle",
|
||||
"font-style": "fontStyle",
|
||||
"fontvariant": "fontVariant",
|
||||
"font-variant": "fontVariant",
|
||||
"fontweight": "fontWeight",
|
||||
"font-weight": "fontWeight",
|
||||
"format": "format",
|
||||
"from": "from",
|
||||
"fx": "fx",
|
||||
"fy": "fy",
|
||||
"g1": "g1",
|
||||
"g2": "g2",
|
||||
"glyphname": "glyphName",
|
||||
"glyph-name": "glyphName",
|
||||
"glyphorientationhorizontal": "glyphOrientationHorizontal",
|
||||
"glyph-orientation-horizontal": "glyphOrientationHorizontal",
|
||||
"glyphorientationvertical": "glyphOrientationVertical",
|
||||
"glyph-orientation-vertical": "glyphOrientationVertical",
|
||||
"glyphref": "glyphRef",
|
||||
"gradienttransform": "gradientTransform",
|
||||
"gradientunits": "gradientUnits",
|
||||
"hanging": "hanging",
|
||||
"horizadvx": "horizAdvX",
|
||||
"horiz-adv-x": "horizAdvX",
|
||||
"horizoriginx": "horizOriginX",
|
||||
"horiz-origin-x": "horizOriginX",
|
||||
"ideographic": "ideographic",
|
||||
"imagerendering": "imageRendering",
|
||||
"image-rendering": "imageRendering",
|
||||
"in2": "in2",
|
||||
"in": "in",
|
||||
"inlist": "inlist",
|
||||
"intercept": "intercept",
|
||||
"k1": "k1",
|
||||
"k2": "k2",
|
||||
"k3": "k3",
|
||||
"k4": "k4",
|
||||
"k": "k",
|
||||
"kernelmatrix": "kernelMatrix",
|
||||
"kernelunitlength": "kernelUnitLength",
|
||||
"kerning": "kerning",
|
||||
"keypoints": "keyPoints",
|
||||
"keysplines": "keySplines",
|
||||
"keytimes": "keyTimes",
|
||||
"lengthadjust": "lengthAdjust",
|
||||
"letterspacing": "letterSpacing",
|
||||
"letter-spacing": "letterSpacing",
|
||||
"lightingcolor": "lightingColor",
|
||||
"lighting-color": "lightingColor",
|
||||
"limitingconeangle": "limitingConeAngle",
|
||||
"local": "local",
|
||||
"markerend": "markerEnd",
|
||||
"marker-end": "markerEnd",
|
||||
"markerheight": "markerHeight",
|
||||
"markermid": "markerMid",
|
||||
"marker-mid": "markerMid",
|
||||
"markerstart": "markerStart",
|
||||
"marker-start": "markerStart",
|
||||
"markerunits": "markerUnits",
|
||||
"markerwidth": "markerWidth",
|
||||
"mask": "mask",
|
||||
"maskcontentunits": "maskContentUnits",
|
||||
"maskunits": "maskUnits",
|
||||
"mathematical": "mathematical",
|
||||
"mode": "mode",
|
||||
"numoctaves": "numOctaves",
|
||||
"offset": "offset",
|
||||
"opacity": "opacity",
|
||||
"operator": "operator",
|
||||
"order": "order",
|
||||
"orient": "orient",
|
||||
"orientation": "orientation",
|
||||
"origin": "origin",
|
||||
"overflow": "overflow",
|
||||
"overlineposition": "overlinePosition",
|
||||
"overline-position": "overlinePosition",
|
||||
"overlinethickness": "overlineThickness",
|
||||
"overline-thickness": "overlineThickness",
|
||||
"paintorder": "paintOrder",
|
||||
"paint-order": "paintOrder",
|
||||
"panose1": "panose1",
|
||||
"panose-1": "panose1",
|
||||
"pathlength": "pathLength",
|
||||
"patterncontentunits": "patternContentUnits",
|
||||
"patterntransform": "patternTransform",
|
||||
"patternunits": "patternUnits",
|
||||
"pointerevents": "pointerEvents",
|
||||
"pointer-events": "pointerEvents",
|
||||
"points": "points",
|
||||
"pointsatx": "pointsAtX",
|
||||
"pointsaty": "pointsAtY",
|
||||
"pointsatz": "pointsAtZ",
|
||||
"prefix": "prefix",
|
||||
"preservealpha": "preserveAlpha",
|
||||
"preserveaspectratio": "preserveAspectRatio",
|
||||
"primitiveunits": "primitiveUnits",
|
||||
"property": "property",
|
||||
"r": "r",
|
||||
"radius": "radius",
|
||||
"refx": "refX",
|
||||
"refy": "refY",
|
||||
"renderingintent": "renderingIntent",
|
||||
"rendering-intent": "renderingIntent",
|
||||
"repeatcount": "repeatCount",
|
||||
"repeatdur": "repeatDur",
|
||||
"requiredextensions": "requiredExtensions",
|
||||
"requiredfeatures": "requiredFeatures",
|
||||
"resource": "resource",
|
||||
"restart": "restart",
|
||||
"result": "result",
|
||||
"results": "results",
|
||||
"rotate": "rotate",
|
||||
"rx": "rx",
|
||||
"ry": "ry",
|
||||
"scale": "scale",
|
||||
"security": "security",
|
||||
"seed": "seed",
|
||||
"shaperendering": "shapeRendering",
|
||||
"shape-rendering": "shapeRendering",
|
||||
"slope": "slope",
|
||||
"spacing": "spacing",
|
||||
"specularconstant": "specularConstant",
|
||||
"specularexponent": "specularExponent",
|
||||
"speed": "speed",
|
||||
"spreadmethod": "spreadMethod",
|
||||
"startoffset": "startOffset",
|
||||
"stddeviation": "stdDeviation",
|
||||
"stemh": "stemh",
|
||||
"stemv": "stemv",
|
||||
"stitchtiles": "stitchTiles",
|
||||
"stopcolor": "stopColor",
|
||||
"stop-color": "stopColor",
|
||||
"stopopacity": "stopOpacity",
|
||||
"stop-opacity": "stopOpacity",
|
||||
"strikethroughposition": "strikethroughPosition",
|
||||
"strikethrough-position": "strikethroughPosition",
|
||||
"strikethroughthickness": "strikethroughThickness",
|
||||
"strikethrough-thickness": "strikethroughThickness",
|
||||
"string": "string",
|
||||
"stroke": "stroke",
|
||||
"strokedasharray": "strokeDasharray",
|
||||
"stroke-dasharray": "strokeDasharray",
|
||||
"strokedashoffset": "strokeDashoffset",
|
||||
"stroke-dashoffset": "strokeDashoffset",
|
||||
"strokelinecap": "strokeLinecap",
|
||||
"stroke-linecap": "strokeLinecap",
|
||||
"strokelinejoin": "strokeLinejoin",
|
||||
"stroke-linejoin": "strokeLinejoin",
|
||||
"strokemiterlimit": "strokeMiterlimit",
|
||||
"stroke-miterlimit": "strokeMiterlimit",
|
||||
"strokewidth": "strokeWidth",
|
||||
"stroke-width": "strokeWidth",
|
||||
"strokeopacity": "strokeOpacity",
|
||||
"stroke-opacity": "strokeOpacity",
|
||||
"suppresscontenteditablewarning": "suppressContentEditableWarning",
|
||||
"suppresshydrationwarning": "suppressHydrationWarning",
|
||||
"surfacescale": "surfaceScale",
|
||||
"systemlanguage": "systemLanguage",
|
||||
"tablevalues": "tableValues",
|
||||
"targetx": "targetX",
|
||||
"targety": "targetY",
|
||||
"textanchor": "textAnchor",
|
||||
"text-anchor": "textAnchor",
|
||||
"textdecoration": "textDecoration",
|
||||
"text-decoration": "textDecoration",
|
||||
"textlength": "textLength",
|
||||
"textrendering": "textRendering",
|
||||
"text-rendering": "textRendering",
|
||||
"to": "to",
|
||||
"transform": "transform",
|
||||
"transformorigin": "transformOrigin",
|
||||
"transform-origin": "transformOrigin",
|
||||
"typeof": "typeof",
|
||||
"u1": "u1",
|
||||
"u2": "u2",
|
||||
"underlineposition": "underlinePosition",
|
||||
"underline-position": "underlinePosition",
|
||||
"underlinethickness": "underlineThickness",
|
||||
"underline-thickness": "underlineThickness",
|
||||
"unicode": "unicode",
|
||||
"unicodebidi": "unicodeBidi",
|
||||
"unicode-bidi": "unicodeBidi",
|
||||
"unicoderange": "unicodeRange",
|
||||
"unicode-range": "unicodeRange",
|
||||
"unitsperem": "unitsPerEm",
|
||||
"units-per-em": "unitsPerEm",
|
||||
"unselectable": "unselectable",
|
||||
"valphabetic": "vAlphabetic",
|
||||
"v-alphabetic": "vAlphabetic",
|
||||
"values": "values",
|
||||
"vectoreffect": "vectorEffect",
|
||||
"vector-effect": "vectorEffect",
|
||||
"version": "version",
|
||||
"vertadvy": "vertAdvY",
|
||||
"vert-adv-y": "vertAdvY",
|
||||
"vertoriginx": "vertOriginX",
|
||||
"vert-origin-x": "vertOriginX",
|
||||
"vertoriginy": "vertOriginY",
|
||||
"vert-origin-y": "vertOriginY",
|
||||
"vhanging": "vHanging",
|
||||
"v-hanging": "vHanging",
|
||||
"videographic": "vIdeographic",
|
||||
"v-ideographic": "vIdeographic",
|
||||
"viewbox": "viewBox",
|
||||
"viewtarget": "viewTarget",
|
||||
"visibility": "visibility",
|
||||
"vmathematical": "vMathematical",
|
||||
"v-mathematical": "vMathematical",
|
||||
"vocab": "vocab",
|
||||
"widths": "widths",
|
||||
"wordspacing": "wordSpacing",
|
||||
"word-spacing": "wordSpacing",
|
||||
"writingmode": "writingMode",
|
||||
"writing-mode": "writingMode",
|
||||
"x1": "x1",
|
||||
"x2": "x2",
|
||||
"x": "x",
|
||||
"xchannelselector": "xChannelSelector",
|
||||
"xheight": "xHeight",
|
||||
"x-height": "xHeight",
|
||||
"xlinkactuate": "xlinkActuate",
|
||||
"xlink:actuate": "xlinkActuate",
|
||||
"xlinkarcrole": "xlinkArcrole",
|
||||
"xlink:arcrole": "xlinkArcrole",
|
||||
"xlinkhref": "xlinkHref",
|
||||
"xlink:href": "xlinkHref",
|
||||
"xlinkrole": "xlinkRole",
|
||||
"xlink:role": "xlinkRole",
|
||||
"xlinkshow": "xlinkShow",
|
||||
"xlink:show": "xlinkShow",
|
||||
"xlinktitle": "xlinkTitle",
|
||||
"xlink:title": "xlinkTitle",
|
||||
"xlinktype": "xlinkType",
|
||||
"xlink:type": "xlinkType",
|
||||
"xmlbase": "xmlBase",
|
||||
"xml:base": "xmlBase",
|
||||
"xmllang": "xmlLang",
|
||||
"xml:lang": "xmlLang",
|
||||
"xmlns": "xmlns",
|
||||
"xml:space": "xmlSpace",
|
||||
"xmlnsxlink": "xmlnsXlink",
|
||||
"xmlns:xlink": "xmlnsXlink",
|
||||
"xmlspace": "xmlSpace",
|
||||
"y1": "y1",
|
||||
"y2": "y2",
|
||||
"y": "y",
|
||||
"ychannelselector": "yChannelSelector",
|
||||
"z": "z",
|
||||
"zoomandpan": "zoomAndPan",
|
||||
}
|
45
pynecone/el/element.py
Normal file
45
pynecone/el/element.py
Normal file
@ -0,0 +1,45 @@
|
||||
"""Base class definition for raw HTML elements."""
|
||||
|
||||
from pynecone import utils
|
||||
from pynecone.components.component import Component
|
||||
|
||||
|
||||
class Element(Component):
|
||||
"""The base class for all raw HTML elements.
|
||||
|
||||
The key difference between `Element` and `Component` is that elements do not
|
||||
use Chakra's `sx` prop, instead passing styles directly to the React style
|
||||
prop.
|
||||
"""
|
||||
|
||||
def render(self) -> str:
|
||||
"""Render the element.
|
||||
|
||||
Returns:
|
||||
The code to render the element.
|
||||
"""
|
||||
tag = self._render()
|
||||
return str(
|
||||
tag.add_props(
|
||||
**self.event_triggers,
|
||||
key=self.key,
|
||||
id=self.id,
|
||||
style=self.style,
|
||||
class_name=self.class_name,
|
||||
).set(
|
||||
contents=utils.join(
|
||||
[str(tag.contents)] + [child.render() for child in self.children]
|
||||
).strip(),
|
||||
)
|
||||
)
|
||||
|
||||
def __eq__(self, other):
|
||||
"""Two elements are equal if they have the same tag.
|
||||
|
||||
Args:
|
||||
other: The other element.
|
||||
|
||||
Returns:
|
||||
True if the elements have the same tag, False otherwise.
|
||||
"""
|
||||
return isinstance(other, Element) and self.tag == other.tag
|
3325
pynecone/el/elements/__init__.py
Normal file
3325
pynecone/el/elements/__init__.py
Normal file
File diff suppressed because it is too large
Load Diff
108
pynecone/el/precompile.py
Executable file
108
pynecone/el/precompile.py
Executable file
@ -0,0 +1,108 @@
|
||||
"""Dynamically compile classes for all HTML elements and output them to the
|
||||
elements directory.
|
||||
|
||||
This script generates the element classes in the pynecone.el.elements module.
|
||||
Run as follows:
|
||||
|
||||
python -m pynecone.el.precompile
|
||||
|
||||
Make sure to delete the __init__.py file in the elements directory before
|
||||
running this script.
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
from pynecone.compiler.templates import join
|
||||
|
||||
from .constants import ELEMENT_TO_PROPS, ELEMENTS
|
||||
|
||||
FILE_DIR = os.path.dirname(os.path.realpath(__file__))
|
||||
ELEMENTS_DIR = os.path.join(FILE_DIR, "elements")
|
||||
INIT_PY_PATH = os.path.join(ELEMENTS_DIR, "__init__.py")
|
||||
|
||||
|
||||
def element_path(element: str) -> str:
|
||||
"""Get the name of the Python file for the given element.
|
||||
|
||||
Args:
|
||||
element: The name of the element. For example, `a` or `div`.
|
||||
|
||||
Returns:
|
||||
The name of the Python file for the given element.
|
||||
"""
|
||||
return os.path.join(ELEMENTS_DIR, f"{element}.py")
|
||||
|
||||
|
||||
PROP = " {prop}: PCVar[Union[str, int, bool]]".format
|
||||
|
||||
|
||||
def compile_pyclass_props(element: str) -> str:
|
||||
"""Compile props for an element.
|
||||
|
||||
Args:
|
||||
element: The name of the element. For example, `a` or `div`.
|
||||
|
||||
Returns:
|
||||
A string containing compiled props for the element.
|
||||
"""
|
||||
return join(PROP(prop=prop) for prop in ELEMENT_TO_PROPS[element])
|
||||
|
||||
|
||||
PYCLASS = join(
|
||||
[
|
||||
"",
|
||||
"class {name}(Element): # noqa: E742",
|
||||
' """Display the {element} element."""',
|
||||
"",
|
||||
' tag = "{element}"',
|
||||
"",
|
||||
"{props}",
|
||||
"",
|
||||
"",
|
||||
"{call_name} = {name}.create",
|
||||
"",
|
||||
]
|
||||
).format
|
||||
|
||||
|
||||
def compile_pyclass(element: str) -> str:
|
||||
"""Compile a Python class for an element.
|
||||
|
||||
Args:
|
||||
element: The name of the element. For example, `a` or `div`.
|
||||
|
||||
Returns:
|
||||
A string containing a Python class for the element.
|
||||
"""
|
||||
name = element.capitalize()
|
||||
props = compile_pyclass_props(element)
|
||||
|
||||
# Handle the `del` element, which is a Python keyword. Note that the class
|
||||
# name is still `Del`.
|
||||
call_name = "del_" if element == "del" else element
|
||||
|
||||
return PYCLASS(
|
||||
name=name,
|
||||
element=element,
|
||||
props=props,
|
||||
call_name=call_name,
|
||||
)
|
||||
|
||||
|
||||
INIT_PY = [
|
||||
'"""Element classes. This is an auto-generated file. Do not edit. See ../generate.py."""',
|
||||
"from typing import Union",
|
||||
"",
|
||||
"from pynecone.el.element import Element",
|
||||
"from pynecone.var import Var as PCVar",
|
||||
"",
|
||||
]
|
||||
|
||||
|
||||
for element in sorted(ELEMENTS):
|
||||
INIT_PY.append(compile_pyclass(element))
|
||||
|
||||
|
||||
os.makedirs(ELEMENTS_DIR, exist_ok=True)
|
||||
with open(INIT_PY_PATH, "w+") as f:
|
||||
f.write(join(INIT_PY))
|
Loading…
Reference in New Issue
Block a user