я распарсил сайт и достал svg (слоями) есть ли какая-то библиотека для REACT или JS которая сможет собрать исходный SVG?

Кусок примера

"parts": {
  "Quin-fix": "<g id=\"Quin_-fix\">
  <g id=\"_x33__00000126299276090262442540000016471221998082769802_\" class=\"st0\">
  <path class=\"st1\" d=\"M57.6,97.7L57.6,97.7c-4.8,0-8.8-3.9-8.8-8.8v0c0-4.8,3.9-8.8,8.8-8.8l0,0c4.8,0,8.8,3.9,8.8,8.8v0     C66.3,93.8,62.4,97.7,57.6,97.7z\"\/>
  <path class=\"st1\" d=\"M118.5,97.7L118.5,97.7c-4.8,0-8.8-3.9-8.8-8.8v0c0-4.8,3.9-8.8,8.8-8.8l0,0c4.8,0,8.8,3.9,8.8,8.8v0     C127.3,93.8,123.4,97.7,118.5,97.7z\"\/>
  <path class=\"st2\" d=\"M88.1,129.4H88c-16.6,0-30.1-13.5-30.1-30.1V79.3c0-16.6,13.5-30.1,30.1-30.1h0.1     c16.6,0,30.1,13.5,30.1,30.1v19.9C118.2,115.9,104.7,129.4,88.1,129.4z\"\/>
  <path class=\"st3\" d=\"M77.6,83.9c0,1.5-1.2,2.7-2.7,2.7c-1.5,0-2.7-1.2-2.7-2.7c0-1.5,1.2-2.7,2.7-2.7     C76.4,81.2,77.6,82.4,77.6,83.9z\"\/>

Ответы (1 шт):

Автор решения: Neverm1ndo

Для этого не нужны никакие библиотеки. Собрать svg можно средствами DOM API.

Для создания SVGSVGElement существует метод document.createElementNS(). Отличие от document.createElement() в том, что document.createElementNS() создает элемент с указанием пространства имен URI.

Пространства имен XML предоставляют простой метод уточнения имен элементов и атрибутов, используемых в документах Extensible Markup Language, путем связывания их с пространствами имен, идентифицированными ссылками URI.

Это нужно, чтобы браузер понимал с какой разметкой он имеет дело.

Можно не заморачиваться и создать функцию, которая создаст svg элемент и добавить в него нужное содержимое через innerHTML:

const source = {  
  "parts": {
    "Quin-fix": `
    <g id=\"Quin_-fix\">
      <g id=\"_x33__00000126299276090262442540000016471221998082769802_\" class=\"st0\">
        <path class=\"st1\" d=\"M57.6,97.7L57.6,97.7c-4.8,0-8.8-3.9-8.8-8.8v0c0-4.8,3.9-8.8,8.8-8.8l0,0c4.8,0,8.8,3.9,8.8,8.8v0     C66.3,93.8,62.4,97.7,57.6,97.7z\"\/>
        <path class=\"st1\" d=\"M118.5,97.7L118.5,97.7c-4.8,0-8.8-3.9-8.8-8.8v0c0-4.8,3.9-8.8,8.8-8.8l0,0c4.8,0,8.8,3.9,8.8,8.8v0     C127.3,93.8,123.4,97.7,118.5,97.7z\"\/>
        <path class=\"st2\" d=\"M88.1,129.4H88c-16.6,0-30.1-13.5-30.1-30.1V79.3c0-16.6,13.5-30.1,30.1-30.1h0.1     c16.6,0,30.1,13.5,30.1,30.1v19.9C118.2,115.9,104.7,129.4,88.1,129.4z\"\/>
        <path class=\"st3\" d=\"M77.6,83.9c0,1.5-1.2,2.7-2.7,2.7c-1.5,0-2.7-1.2-2.7-2.7c0-1.5,1.2-2.7,2.7-2.7     C76.4,81.2,77.6,82.4,77.6,83.9z\"\/>
      </g>
    </g>`
  }
}

function createSVGFromParts(parts) {
   /**
   * создаем SVG
   */
   const element = document.createElementNS("http://www.w3.org/2000/svg", "svg");
         /**
         * перебираем куски из объекта
         */
         for (let part in parts) {
          element.innerHTML += parts[part]; // добавляем в svg
         }
  return element;
}

document.body.append(createSVGFromParts(source.parts));

Такой вариант простой, но у него есть минусы:

  • innerHTML - это небезопасно
  • Текст никак не валидируется

Вариант посложнее, где сначала текст парсится с помощью DOMParser. Он покажет ошибки в разметке, а так же даст возможность выполнять любые манипуляции с document, который будет возвращен из метода DOMParser.parseFromString(), до вставки в основной документ. Например, убрать элементы с тэгом script или задать атрибут fill для path.

const source = {  
  "parts": {
    "Quin-fix": `
    <g id=\"Quin_-fix\">
      <g id=\"_x33__00000126299276090262442540000016471221998082769802_\" class=\"st0\">
        <path class=\"st1\" d=\"M57.6,97.7L57.6,97.7c-4.8,0-8.8-3.9-8.8-8.8v0c0-4.8,3.9-8.8,8.8-8.8l0,0c4.8,0,8.8,3.9,8.8,8.8v0     C66.3,93.8,62.4,97.7,57.6,97.7z\"\/>
        <path class=\"st1\" d=\"M118.5,97.7L118.5,97.7c-4.8,0-8.8-3.9-8.8-8.8v0c0-4.8,3.9-8.8,8.8-8.8l0,0c4.8,0,8.8,3.9,8.8,8.8v0     C127.3,93.8,123.4,97.7,118.5,97.7z\"\/>
        <path class=\"st2\" d=\"M88.1,129.4H88c-16.6,0-30.1-13.5-30.1-30.1V79.3c0-16.6,13.5-30.1,30.1-30.1h0.1     c16.6,0,30.1,13.5,30.1,30.1v19.9C118.2,115.9,104.7,129.4,88.1,129.4z\"\/>
        <path class=\"st3\" d=\"M77.6,83.9c0,1.5-1.2,2.7-2.7,2.7c-1.5,0-2.7-1.2-2.7-2.7c0-1.5,1.2-2.7,2.7-2.7     C76.4,81.2,77.6,82.4,77.6,83.9z\"\/>
      </g>
    </g>`
  }
};

function createSVGFromParts(parts) {
  const svgNS = "http://www.w3.org/2000/svg";
  const parser = new DOMParser(); // DOMParser, который с помощью метода parseFromString() спарсит текст и вернет document
  const element = document.createElementNS(svgNS, "svg");
  
  /**
  * Из элемента созадет элемент с namespace URI(возможно есть способы попроще)
  * Без этого элементы просто не будут правильно рендериться 
  */
  function _elementToElementNS(element) {
    const elementNS = document.createElementNS(svgNS, element.tagName);
    for (let attribute of element.attributes) {
      elementNS.setAttribute(attribute.name, attribute.value);
    }
    for (let child of element.children) {
      elementNS.append(_elementToElementNS(child));
    };
    return elementNS;
  }
  
  function _throwOnXMLParseError(dom) {
    const parsererror = dom.getElementsByTagName('parsererror')[0];
    if (!parsererror) return;
    throw new Error('XMLParseError: ' + parsererror.textContent);
  }
  
  element.setAttribute('xmlns', svgNS);
  
  try {        
    for (let part in parts) {
      const dom = parser.parseFromString(parts[part], "application/xml");
      _throwOnXMLParseError(dom);
      element.appendChild(_elementToElementNS(dom.children[0]));
    }
  } catch(err) {
    console.error(err);
  }
  
  return element;
}


document.body.append(createSVGFromParts(source.parts));

Оба варианта рабочие, хоть и не идеальные.

→ Ссылка