Issue #2573💬 RespondidoAbierto el 17 de febrero de 2020por rastaprime20Reacciones 0

Obtén todas las reglas CSS relacionadas de seleccionadores CSS a nivel multi

Respuesta rápidapor artf

Este es el comando que uso en Grapedrop para obtener todo el CSS de un componente '''js importar cada uno de 'lodash/each'; export default (config = {}) => ({ run(editor, snd, opts = {}) { const component = opts.target || editor.getWrapper(); const cssc = editor. CssCompositor; reglas const = cssc.getAll(); Sea result...

Lee la respuesta completa abajo ↓

Pregunta

Hola @artf

Espero que estés bien. He estado dándole vueltas a este asunto los últimos días, he estado buscando si me ha pasado lo mismo con los demás, pero desafortunadamente no encuentro ninguna solución que pueda solucionar mi problema, así que decidí abrir un ticket. Espero que tenga sentido.

Así que tengo una función de 'Guardar bloque/componente' que necesito para obtener el HTML y CSS del componente seleccionado. Puedo obtener fácilmente el HTML del componente seleccionado con sus elementos hijos. haciendo 'const blockHTML = block.toHTML();' eso funciona bien. Sin embargo, mi problema radica en las reglas CSS de los elementos del elemento padre que van a los elementos hijos.

  1. Así que mi primer intento es iterar a cada componente hijo del componente seleccionado para poder usar la función 'getStyle()' y extraer el CSS de los componentes hijos, pero desafortunadamente, está devolviendo un objeto vacío. Por favor, consulta la captura de pantalla a continuación para ver el bloque de código que hace esto.

! Captura de pantalla del 17-02-15-34 de 2020

Aquí están los registros del navegador para el punto 1.

! Captura de pantalla del 17-02-2020 16-01-43

Parece que funciona con el componente padre, que es el '#banner', puede coger las reglas CSS, pero cuando profundizo en los componentes hijos, devuelve un objeto vacío. Por favor, consulta a continuación una captura de pantalla del marcado HTML del componente con sus reglas CSS.

#banner ! Captura de pantalla del 17-02-2020 03-16-08-03

#banner cabezaje ! Captura de pantalla del 17-02-2020 16-08-43

  1. Luego mi segundo intento fue elegir 'editor. CodeManager.getCode(childBlock, 'css', {cssc: editor. CssComposer});' Eso resultó en los siguientes registros.

! Captura de pantalla del 17-02-2020 16-12-37

Da todas las reglas CSS en el editor de código CSS, no pude extraer las reglas de clase relacionadas para el componente específico.

  1. Probé la API 'CssComposer' con el siguiente bloque de código, por favor consulta más abajo, pero al final obtuve todos los resultados como 'null'

! Captura de pantalla del 17-02-17-2020

No sé cómo puedo resolver este problema a estas alturas, así que busco ayuda para que me guíes hacia una solución adecuada. Espero con ganas saber de ti. Gracias.

Saludos, Tyrone

Respuestas (2)

artf7 de marzo de 2020

Este es el comando que uso en Grapedrop para obtener todo el CSS de un componente '''js importar cada uno de 'lodash/each';

export default (config = {}) => ({ run(editor, snd, opts = {}) { const component = opts.target || editor.getWrapper(); const cssc = editor. CssCompositor; reglas const = cssc.getAll(); Sea resultado = '';

const { atRules, notAtRules } = this.splitRules(this.matchedRules(component, rules)); notAtRules.forEach(rule => result += rule.toCSS()); this.sortMediaObject(atRules).forEach(item => { sea rulesStr = ''; const atRule = item.key; const mRules = valor.elemento;

mRules.forEach(rule => { const ruleStr = rule.getDeclaration();

if (rule.get('singleAtRule')) { resultado += '${atRule}{${ruleStr}}'; } else { rulesStr += ruleStr; } });

si (rulesStr) resulta += '${atRule}{${rulesStr}}'; });

resultado de retorno; },

/**

  • Consigue reglas emparejadas de un componente
  • @param {Component} componente
  • @param reglas {Array<CSSRule>}
  • @returns {Array<CSSRule>} */ matchedRules(component, rules) { const el = component.getEl(); Sea resultado = [];

rules.forEach(rule => { try { si (rule.selectorsToString().split(',').some( selector => el.matches(this.cleanSelector(selector)) )) { resultado.push(regla); } } atrapar (err) {} });

component.components().forEach(component => { result = result.concat(this.matchedRules(component, rules)) });

Eliminar duplicados resultado = resultado.filter((regla, i) => resultado.indexOf(regla) == i);

resultado de retorno; },

/**

  • Devolver el selector pasado sin estados
  • @param selector {String}
  • @returns {Cuerda} */ cleanSelector(selector) { return selector.split(' ').map(item => item.split(':')[0]).join(' '); },

/**

  • Divide una serie de reglas en atRules y no
  • @param reglas {Array<CSSRule>}
  • @returns {Objeto} */ splitRules(rules) { const atRules = {}; const notAtRules = [];

rules.forEach(rule => { const atRule = rule.getAtRule();

if (atRule) { const mRules = atRules[atRule];

if (mRules) { mRules.push(regla); } else { atRules[atRule] = [regla]; } } else { notAtRules.push(regla); } });

return { atRules, notAtRules, }; },

/**

  • Obtener la longitud numérica de la cadena de consulta de medios
  • @param {String} cadena de consulta mediaQuery Media
  • @return {número} / getQueryLength(mediaQuery) { longitud const = /(-?\d.? \d+)\w{0,}/.exec(mediaQuery); si (!length) devuelve Number.MAX_VALUE;

return parseFloat(length[1]); },

/**

  • Devolver un array ordenado desde el objeto de consulta de medios
  • @param elementos {Objeto}
  • @return {Array} */ sortMediaObject(items = {}) { const itemsArr = []; each(items, (valor, clave) => itemsArr.push({ clave, valor })); return itemsArr.sort( (a, b) => this.getQueryLength(b.key) - this.getQueryLength(a.key) ); } })
rastaprime207 de marzo de 2020

Hola @artf

¡Muchas gracias por tu respuesta! Lo probaré y os avisaré si tengo algún problema. De verdad lo agradezco.

Preguntas y respuestas relacionadas

Continúa investigando con debates sobre temas similares.

Plugins de pago que cumplen con este problema

Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.

Ver todos los plugins

Cargando recomendaciones de plugins de pago...

Opción gratuita

Consulta los plugins de código abierto de GrapesJS en GitHub O haz una búsqueda rápida en nuestro catálogo gratuito.

Explora plugins gratuitos →
Opción premium

Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.

Explora plugins premium →

Explorar categorías de plugins

Ve directamente a las páginas de categorías de plugins en el marketplace.