Функция, которая анализирует строку стилей CSS во встроенном стиле JS

#css #reactjs #wordpress #string #parsing

#css #reactjs #wordpress #строка #синтаксический анализ

Вопрос:

Мне нужно создать функцию, которая анализирует строку CSS, которая будет использоваться во встроенном стиле js.

Например: то, что я получаю, это что-то вроде const styles = "background-color:#FFFFFF;color:#000000" , и мне нужно преобразовать в:

       <h1
        className={classes}
        style={{ color: fontColor, background: backgroundColor }}
      >
        {copy}
      </h1>
 

что я сейчас делаю, так это

 const [backgroundColor, setBackgroundColor] = useState();
  const [fontColor, setFontColor] = useState();
  const colors = styles?.match(/(#)([^;]*)/g);

  useEffect(() => {
    if (colors) {
      if (colors.length > 1) {
        setBackgroundColor(colors[0]);
        setFontColor(colors[1]);
      }

      if (colors.length === 1) {
        setFontColor(colors[0]);
      }
    }
  }, [colors]);
 

Но меня попросили создать чистую отдельную функцию, которая анализирует строку стилей.

Итак, мне было интересно, есть ли решение, в котором мне не нужно «регулярно выражать» каждый конкретный селектор, а затем его значение. Если есть что-то вроде того, что перед двоеточием является селектором, чем после этого, пока точка с запятой не станет его значением.

Какие-нибудь советы?

Спасибо

Комментарии:

1. да, это возможно

Ответ №1:

Вы можете сделать это следующим образом, а затем сопоставить с ней свою функцию

 const styles = "background-color:#FFFFFF;color:#000000";

const css = styles.split(';').map(cur => cur.split(':'));

console.log(css);

const cssInObject = styles.split(';').map(cur => cur.split(':')).reduce((acc, val) => {
    let [key, value] = val;
    key = key.replace(/-./g, css => css.toUpperCase()[1])
    acc[key] = value;
    return acc;
}, {});

console.log(cssInObject); 

Комментарии:

1. Я добавил способ реагирования на css, обратите внимание

2. ваше решение работает также в Safari !.. Отлично! Спасибо! 🙂

3. Я рад, что вам понравился мой ответ, спасибо 🙂

Ответ №2:

Может быть, что-то вроде этого (которое преобразует строку css в объект) (не работает в Safari):

 const convertCssToObject = value => {
    
  const regex = /(?<=^|;)s*([^:] )s*:s*([^;] )s*/g, o = {};
  value.replace(regex, (m,p,v) => o[p] = v);
  return o;
    
}

console.log( convertCssToObject("background-color:#FFFFFF;color:#000000;") )

 

Я отредактировал регулярное выражение, чтобы оно работало и в Safari:

 const convertCssToObject = value => {
  // Without the look behind
  const regex = /([w-.] )s*:([^;] );?/g, o = {}; // Heck I think this should also work for Chrome as well
  value.replace(regex, (m,p,v) => o[p] = v);
  return o;
}

console.log( convertCssToObject("background-color:#FFFFFF;color:#000000;") )





 

Комментарии:

1. к сожалению, мне только что сообщили, что ваше решение не работает в Safari. Мне очень понравилось, потому что это очень лаконично, но, в конце концов, я не смогу ее использовать. В любом случае спасибо

2. Ах, я думаю, Safari не любит «оглядываться назад». Я обновлю свой комментарий