|
|
|
|
@ -8,9 +8,16 @@ import { regex_double_quotes } from '../../../../utils/patterns.js';
|
|
|
|
|
*/
|
|
|
|
|
export function get_class_attribute_value(attribute) {
|
|
|
|
|
// handle special case — `class={possiblyUndefined}` with scoped CSS
|
|
|
|
|
if (attribute.chunks.length === 2 && ( /** @type {import('../../../nodes/Text.js').default} */(attribute.chunks[1])).synthetic) {
|
|
|
|
|
const value = ( /** @type {import('../../../nodes/shared/Expression.js').default} */(attribute.chunks[0])).node;
|
|
|
|
|
return x `@escape(@null_to_empty(${value}), true) + "${( /** @type {import('../../../nodes/Text.js').default} */(attribute.chunks[1])).data}"`;
|
|
|
|
|
if (
|
|
|
|
|
attribute.chunks.length === 2 &&
|
|
|
|
|
/** @type {import('../../../nodes/Text.js').default} */ (attribute.chunks[1]).synthetic
|
|
|
|
|
) {
|
|
|
|
|
const value = /** @type {import('../../../nodes/shared/Expression.js').default} */ (
|
|
|
|
|
attribute.chunks[0]
|
|
|
|
|
).node;
|
|
|
|
|
return x`@escape(@null_to_empty(${value}), true) + "${
|
|
|
|
|
/** @type {import('../../../nodes/Text.js').default} */ (attribute.chunks[1]).data
|
|
|
|
|
}"`;
|
|
|
|
|
}
|
|
|
|
|
return get_attribute_value(attribute);
|
|
|
|
|
}
|
|
|
|
|
@ -20,20 +27,22 @@ export function get_class_attribute_value(attribute) {
|
|
|
|
|
* @returns {import("C:/repos/svelte/svelte/node_modules/.pnpm/@types+estree@1.0.0/node_modules/@types/estree/index").Expression}
|
|
|
|
|
*/
|
|
|
|
|
export function get_attribute_value(attribute) {
|
|
|
|
|
if (attribute.chunks.length === 0)
|
|
|
|
|
return x `""`;
|
|
|
|
|
if (attribute.chunks.length === 0) return x`""`;
|
|
|
|
|
/**
|
|
|
|
|
* For value attribute of textarea, it will render as child node of `<textarea>` element.
|
|
|
|
|
* Therefore, we need to escape as content (not attribute).
|
|
|
|
|
*/
|
|
|
|
|
const is_textarea_value = attribute.parent.name.toLowerCase() === 'textarea' && attribute.name.toLowerCase() === 'value';
|
|
|
|
|
const is_textarea_value =
|
|
|
|
|
attribute.parent.name.toLowerCase() === 'textarea' && attribute.name.toLowerCase() === 'value';
|
|
|
|
|
return attribute.chunks
|
|
|
|
|
.map((chunk) => {
|
|
|
|
|
return chunk.type === 'Text'
|
|
|
|
|
? ( /** @type {ESTreeExpression} */(string_literal(chunk.data.replace(regex_double_quotes, '"'))))
|
|
|
|
|
: x `@escape(${chunk.node}, ${is_textarea_value ? 'false' : 'true'})`;
|
|
|
|
|
? /** @type {ESTreeExpression} */ (
|
|
|
|
|
string_literal(chunk.data.replace(regex_double_quotes, '"'))
|
|
|
|
|
)
|
|
|
|
|
: x`@escape(${chunk.node}, ${is_textarea_value ? 'false' : 'true'})`;
|
|
|
|
|
})
|
|
|
|
|
.reduce((lhs, rhs) => x `${lhs} + ${rhs}`);
|
|
|
|
|
.reduce((lhs, rhs) => x`${lhs} + ${rhs}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -42,11 +51,10 @@ export function get_attribute_value(attribute) {
|
|
|
|
|
*/
|
|
|
|
|
export function get_attribute_expression(attribute) {
|
|
|
|
|
if (attribute.chunks.length === 1 && attribute.chunks[0].type === 'Expression') {
|
|
|
|
|
return /** @type {ESTreeExpression} */ (( /** @type {import('../../../nodes/shared/Expression.js').default} */(attribute.chunks[0])).node);
|
|
|
|
|
return /** @type {ESTreeExpression} */ (
|
|
|
|
|
/** @type {import('../../../nodes/shared/Expression.js').default} */ (attribute.chunks[0])
|
|
|
|
|
.node
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
return get_attribute_value(attribute);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|