Парсинг атрибута transform SVG с помощью javascript

Предположим, у нас есть строка преобразования SVG:

transform = "translate(6,5),scale(3,3)";

Есть ли гладкая функция регулярного выражения, которую мы могли бы использовать, чтобы преобразовать ее во что-то полезное?

Свободный перевод вопроса Parse SVG transform attribute with javascript от участника @Yarin.


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

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

Предполагая, что вы работаете в браузере, вы также можете использовать SVG DOM для анализа и декодирования строки преобразования.

var svgns = "http://www.w3.org/2000/svg";

function getTransformList(transformStr)
{
  // Создайте поддельный элемент <rect>, чтобы установить преобразование в
  var rect = document.createElementNS(svgns, "rect");
  rect.setAttribute("transform", transformStr);
  // Используйте DOM, чтобы получить список декодированных преобразований
  dumpTransform(rect.transform.baseVal);
}

function dumpTransform(transformList)
{
  for (var i = 0; i < transformList.numberOfItems; i++)
  {
    var transform = transformList.getItem(i);
    var m = transform.matrix;
    switch (transform.type)
    {
      case 2:
        console.log("translate("+m.e+","+m.f+")");
        break;
      case 3:
        console.log("scale("+m.a+","+m.d+")");
        break;
      case 4:
        console.log("rotate("+transform.angle+")");
        // TODO need to also handle rotate(angle, x, y) form
        break;
      case 5:
        // TODO skewX()
        break;
      case 6:
        // TODO skewY(()
        break;
      case 1:
      default:
        console.log("matrix("+m.a+","+m.b+","+m.c+","+m.d+","+m.e+","+m.f+")");
        break;
    }
  }
}

getTransformList("translate(6,5),scale(3,3)");

Свободный перевод ответа от участника @Paul LeBeau.

→ Ссылка
Автор решения: Alexandr_TT

Вот изящный небольшой фрагмент кода, который может дать вам то, что вам нужно, он должен охватывать большинство сценариев в случае, если строка, которую вы собираетесь анализировать, имеет другое количество аргументов:

function parse (a)
{
    var b={};
    for (var i in a = a.match(/(\w+\((\-?\d+\.?\d*e?\-?\d*,?)+\))+/g))
    {
        var c = a[i].match(/[\w\.\-]+/g);
        b[c.shift()] = c;
    }
    return b;
}

Запуск этого:

parse('translate(6,5),scale(3,3.5),a(1,1),b(2,23,-34),c(300)');

Will result in this:

В результате получится:

{
    translate: [ '6', '5' ],
    scale: [ '3', '3.5' ],
    a: [ '1', '1' ],
    b: [ '2', '23', '-34' ],
    c: [ '300' ]
}

Свободный перевод ответа от участника @chernjie.

→ Ссылка