| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /**
- * @import {Schema} from 'property-information'
- */
- import {DefinedInfo} from './util/defined-info.js'
- import {Info} from './util/info.js'
- import {normalize} from './normalize.js'
- const cap = /[A-Z]/g
- const dash = /-[a-z]/g
- const valid = /^data[-\w.:]+$/i
- /**
- * Look up info on a property.
- *
- * In most cases the given `schema` contains info on the property.
- * All standard,
- * most legacy,
- * and some non-standard properties are supported.
- * For these cases,
- * the returned `Info` has hints about the value of the property.
- *
- * `name` can also be a valid data attribute or property,
- * in which case an `Info` object with the correctly cased `attribute` and
- * `property` is returned.
- *
- * `name` can be an unknown attribute,
- * in which case an `Info` object with `attribute` and `property` set to the
- * given name is returned.
- * It is not recommended to provide unsupported legacy or recently specced
- * properties.
- *
- *
- * @param {Schema} schema
- * Schema;
- * either the `html` or `svg` export.
- * @param {string} value
- * An attribute-like or property-like name;
- * it will be passed through `normalize` to hopefully find the correct info.
- * @returns {Info}
- * Info.
- */
- export function find(schema, value) {
- const normal = normalize(value)
- let property = value
- let Type = Info
- if (normal in schema.normal) {
- return schema.property[schema.normal[normal]]
- }
- if (normal.length > 4 && normal.slice(0, 4) === 'data' && valid.test(value)) {
- // Attribute or property.
- if (value.charAt(4) === '-') {
- // Turn it into a property.
- const rest = value.slice(5).replace(dash, camelcase)
- property = 'data' + rest.charAt(0).toUpperCase() + rest.slice(1)
- } else {
- // Turn it into an attribute.
- const rest = value.slice(4)
- if (!dash.test(rest)) {
- let dashes = rest.replace(cap, kebab)
- if (dashes.charAt(0) !== '-') {
- dashes = '-' + dashes
- }
- value = 'data' + dashes
- }
- }
- Type = DefinedInfo
- }
- return new Type(property, value)
- }
- /**
- * @param {string} $0
- * Value.
- * @returns {string}
- * Kebab.
- */
- function kebab($0) {
- return '-' + $0.toLowerCase()
- }
- /**
- * @param {string} $0
- * Value.
- * @returns {string}
- * Camel.
- */
- function camelcase($0) {
- return $0.charAt(1).toUpperCase()
- }
|