SVG

Корректность SVG Path по заданным данным

Проверьте корректность данных SVG Path.

Бесплатный лимит - 500 символов. Свыше лимита - 50 ₽.

Проверка
команд path

Разбор синтаксиса и параметров атрибута d с наглядным предпросмотром.

SVG
Команды
Проверка

Анализ SVG Path

Проверьте синтаксис команд и корректность данных атрибута path.

Результат
—
После проверки здесь появится анализ SVG Path.

Инструмент определяет корректность SVG Path по заданным данным, выполняя синтаксический анализ строки в атрибуте d элемента <path>. В качестве входных параметров передается текстовая последовательность буквенных команд и числовых координат, задающая геометрию векторного контура. Валидатор последовательно разбирает каждый сегмент пути и сверяет его структуру с правилами спецификаций W3C SVG 1.1 и SVG 2. Это позволяет обнаружить опечатки и структурные сбои до рендеринга векторной графики в браузере.

Даже один пропущенный аргумент или неверный символ внутри атрибута d приводит к обрыву отрисовки фигуры. Браузер прекращает обработку контура строго на том участке, где нарушена грамматика спецификации, оставляя изображение неполным или пустым.

При анализе кода инструмент проверяет три базовых аспекта записи пути:

  • допустимость используемых буквенных команд построения и перемещения;
  • точное соответствие количества числовых аргументов и флагов выбранному типу сегмента;
  • соблюдение правил форматирования координат, знаков препинания, пробелов и чисел с плавающей точкой.

На выходе формируется отчет о валидности контура с указанием точной позиции и причины синтаксического сбоя. Разработчик или дизайнер сразу видит, какая именно команда или координата нарушает спецификацию W3C, что избавляет от ручного поиска опечаток в длинных массивах чисел.

Проверка SVG Path

Структура атрибута d и правила синтаксиса SVG Path

Элемент <path> является универсальным примитивом для построения сложных векторных фигур, а вся информация о его геометрии передается внутри строкового атрибута d . В спецификации SVG 2 атрибут d также классифицируется как презентационное свойство, но правила записи самой строки контура опираются на единый лексический стандарт. Вся последовательность символов внутри кавычек представляет собой плоский массив инструкций, где за однобуквенным идентификатором операции следуют числовые аргументы.

Синтаксический разбор этой строки подчиняется формальной грамматике EBNF, закрепленной в стандартах W3C SVG 1.1 и SVG 2. Грамматика EBNF строго определяет, как именно текстовый поток разбивается на отдельные лексемы (токены): буквенные команды, знаки чисел, целые и дробные части, экспоненциальные записи и разделители. Проверка синтаксиса по правилам EBNF гарантирует, что строка будет однозначно прочитана при последовательном движении слева направо.

Базовая конструкция и разделители аргументов

Любой участок пути строится по схеме: буква команды и привязанный к ней блок числовых параметров. Между самой буквой и первым числом разделитель не требуется - запись вида M10 20 и M 10 20 полностью эквивалентна с точки зрения спецификации.

Для отделения числовых параметров друг от друга грамматика допускает использование пробельных символов и запятых. К валидным пробельным символам относятся обычный пробел (код U+0020), табуляция (U+0009), перевод строки (U+000A), возврат каретки (U+000D) и подача страницы (U+000C). Запятая может применяться только между двумя числами, но не между буквой команды и числом. Нарушение этого правила (например, запись L,10,20 или две запятые подряд 10,,20 ) является синтаксической ошибкой.

Правила сжатия строки и опускания пробелов

Спецификация SVG проектировалась с учетом минимизации объема передаваемых текстовых данных. Грамматика EBNF работает по жадному принципу: каждое число считывается до первого символа, который не может быть частью этого числа. Это позволяет полностью опускать пробелы и запятые в тех местах, где граница между токенами очевидна математически.

При сжатии и оптимизации векторной графики действуют следующие правила разделения лексем без использования пробелов:

  • Перед отрицательными числами разделитель не нужен, так как знак минуса однозначно указывает на начало нового числового аргумента (запись 10-20 читается как два отдельных числа: 10 и -20 ).
  • После числа, содержащего десятичную дробь, можно сразу писать следующее дробное число, если оно начинается с точки. Поскольку в одном числе не может быть двух десятичных точек, вторая точка автоматически завершает чтение первого параметра и начинает второй (строка 0.5.25 разбирается как 0.5 и 0.25 ).
  • Ведущий ноль у десятичных дробей в диапазоне от -1 до 1 разрешено опускать (вместо 0.5 и -0.5 допустимо писать .5 и -.5 ).
  • Числа могут записываться в экспоненциальной нотации с использованием символов e или E (например, 1.5e-3 ), при этом знак степени относится к текущему числу, а не разделяет аргументы.
  • Буква следующей команды всегда завершает список параметров предыдущей инструкции и не требует пробела перед собой (например, 10 20L30 40 ).

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

Неявное повторение команд

Еще один механизм сокращения записи внутри атрибута d - передача нескольких наборов координат после одной буквенной инструкции. Если после выполнения команды и чтения всех ее обязательных параметров в строке сразу идут новые числа (без объявления новой буквы), синтаксический анализатор применяет правило неявного повторения.

Предыдущая команда автоматически дублируется для каждого следующего полного комплекта аргументов. Например, если команда построения линии требует два параметра, а после нее передано шесть чисел подряд, эти данные будут обработаны как три последовательных линейных сегмента. Единственное исключение в грамматике касается стартовой команды перемещения, где дополнительные пары чисел интерпретируются по особому правилу построения линий. Во всех остальных случаях неявное повторение строго сохраняет как тип исходной операции, так и ее регистр, требуя лишь соблюдения точной кратности передаваемых числовых аргументов.

Сравнение развернутой и сжатой записи

Ниже приведены примеры того, как одни и те же участки контура записываются в стандартном читаемом виде и в плотном формате с применением правил грамматики EBNF.

Применяемое правило синтаксиса Стандартная запись с разделителями Валидная сжатая запись Как интерпретируются параметры
Слитное написание команды и отрицательных значений M 10, -20 L -30, -40 M10-20L-30-40 Команда M с аргументами 10 , -20 и команда L с аргументами -30 , -40
Разделение десятичными точками без ведущих нулей L 0.5, 0.25 L.5.25 Команда L с двумя дробными координатами: 0.5 и 0.25
Неявное повторение инструкции L 10 20 L 30 40 L 50 60 L10 20 30 40 50 60 Три последовательных вызова команды L с парами чисел (10, 20) , (30, 40) и (50, 60)
Комбинация точек, минусов и повторения l 0.4 -0.8 l 0.15 0.3 l.4-.8.15.3 Два вызова команды l с парами смещений (0.4, -0.8) и (0.15, 0.3)

Абсолютные и относительные координаты в декартовой плоскости

Геометрическое построение векторных контуров в SVG происходит в двумерной декартовой системе пользовательских координат. В отличие от классической математической плоскости, точка отсчета с координатами (0, 0) по умолчанию располагается в левом верхнем углу рабочей области. Ось абсцисс (X) направлена строго горизонтально слева направо: положительные значения смещают координаты вправо, а отрицательные - влево. Ось ординат (Y) инвертирована и направлена вертикально сверху вниз: увеличение числового параметра Y сдвигает узел вниз, а уменьшение или уход в отрицательную область - вверх.

Регистр команд и принцип отсчета координат

Каждая инструкция построения пути существует в двух вариантах написания: в верхнем и нижнем регистре. Выбор регистра определяет математическую логику, по которой синтаксический анализатор интерпретирует переданные числовые аргументы и рассчитывает финальное положение опорных точек (anchor points) на сетке.

Команды в верхнем регистре (заглавные буквы, например M , L , C ) задают абсолютные координаты. Это означает, что любые переданные числа отсчитываются напрямую от глобального начала координат (0, 0) текущей пользовательской системы, независимо от того, где закончился предыдущий участок контура.

Команды в нижнем регистре (строчные буквы, например m , l , c ) указывают на использование относительных координат. В этом режиме числовые параметры представляют собой приращения (смещения dx и dy ) относительно текущей точки (current point) - позиции, в которой завершилось выполнение непосредственно предшествующего сегмента.

Характеристика Абсолютные координаты (верхний регистр) Относительные координаты (нижний регистр)
Точка отсчета Фиксированное начало координат (0, 0) Динамическая текущая точка (current point)
Формула вычисления нового узла X_new = x , Y_new = y X_new = X_current + dx , Y_new = Y_current + dy
Зависимость от предыдущих сегментов Отсутствует; изменение одного узла не сдвигает последующие абсолютные точки Прямая; изменение смещения в одном сегменте сдвигает все последующие относительные узлы
Устойчивость к переносу подконтура Для переноса фигуры требуется пересчет всех координат в строке Достаточно изменить координаты только начальной точки подконтура

Вычисление положения узлов при чтении сегментов и подконтуров

При последовательном разборе строки пути синтаксический анализатор непрерывно отслеживает и обновляет состояние текущей точки (current point) и начальной точки активного подконтура (subpath). Весь маршрут разбивается на отдельные сегменты (segments), каждый из которых перемещает текущую активную позицию из одного узла (node) в другой.

Пошаговый расчет координат при последовательном чтении цепочки команд строится по следующим правилам:

  • Перед чтением первого символа в строке координата текущей точки не определена, однако если путь начинается с относительного смещения в нижнем регистре, в качестве базовой отправной точки для первой операции берется (0, 0) .
  • Каждый обработанный сегмент завершается в новой опорной точке (anchor point). Как только сегмент прочитан, его конечная опорная точка немедленно становится новой текущей точкой (current point) для следующего сегмента в цепочке.
  • Если в строке объявляется новый подконтур (subpath) с использованием относительных координат, отсчет его стартового узла ведется от последней активной точки предыдущего подконтура, а не от глобального нуля.
  • Внутри одной строки допускается свободное чередование верхнего и нижнего регистра. Переход от относительной команды к абсолютной сбрасывает накопленное влияние предыдущих смещений и жестко привязывает очередной узел к глобальной сетке.

Для проверки правильности позиционирования узлов можно сопоставить две идентичные по геометрии записи, использующие смешанный и чисто относительный подходы. В следующей таблице показано, как вычисляются реальные координаты опорных точек на плоскости при последовательном чтении сегментов строки M 20 30 l 40 -10 L 100 50 l -20 30 .

Порядок чтения сегмента Тип и регистр инструкции Текущая точка (до выполнения) Переданные параметры Математическая операция Координата новой опорной точки
M 20 30 Абсолютная (верхний) Не определена x = 20 , y = 30 Прямое присвоение от (0, 0) (20, 30)
l 40 -10 Относительная (нижний) (20, 30) dx = 40 , dy = -10 20 + 40 , 30 + (-10) (60, 20)
L 100 50 Абсолютная (верхний) (60, 20) x = 100 , y = 50 Прямое присвоение от (0, 0) (100, 50)
l -20 30 Относительная (нижний) (100, 50) dx = -20 , dy = 30 100 + (-20) , 50 + 30 (80, 80)

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

Анализ линейных команд перемещения и построения: M, L, H, V, Z

Линейные команды образуют геометрический каркас большинства плоских векторных фигур, иконок и технических схем. При синтаксическом анализе строки пути для каждой из этих команд проверяется строгое соответствие количества переданных числовых аргументов установленной спецификации.

Команда перемещения M и m и правило неявных линий

Команда M (или m в относительном режиме) отвечает за операцию Move to - установку курсора в заданную координату без отрисовки видимой линии. Любая валидная строка данных пути обязана начинаться именно с команды M или m . Если первой в строке указана любая другая буква, контур считается синтаксически некорректным с самого начала.

Базовый вызов команды принимает ровно два параметра: координату по горизонтали и координату по вертикали. Вызов M x y (или m dx dy ) выполняет сразу два технических действия:

  • Устанавливает новую текущую точку, от которой будет отсчитываться следующий сегмент.
  • Инициализирует новый подконтур (subpath), фиксируя переданную координату как начальную точку этого подконтура.

Если команда M или m встречается в середине строки пути, она прерывает текущую непрерывную линию и начинает независимый фрагмент фигуры. Это свойство применяется при создании составных объектов с внутренними вырезами, например, букв с замкнутыми петлями или шестеренок.

При проверке синтаксиса учитывается особое правило обработки множественных пар координат после команды перемещения. Если за буквой M или m следует более одной пары чисел, только первая пара интерпретируется как перемещение без рисования. Все последующие пары координат разбираются как неявные команды проведения прямой линии ( L для заглавной M и l для строчной m ). Например, запись M 10 20 30 40 50 60 полностью эквивалентна записи M 10 20 L 30 40 L 50 60 . Наличие нечетного количества чисел после M нарушает парность координат и приводит к ошибке разбора.

Построение произвольных и ортогональных отрезков: L, H, V

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

Команда L (Line to) проводит прямую линию из текущей точки в указанную координату (x, y) , а ее относительный аналог l смещает линию на вектор (dx, dy) . Для успешного прохождения проверки после буквы команды должно идти четное количество числовых аргументов (минимум два). Каждая следующая пара чисел формирует новый звено полилинии, последовательно обновляя текущую опорную точку.

Когда отрезок расположен строго параллельно одной из осей координат, передача двух параметров становится избыточной. Для сокращения объема кода применяются ортогональные команды:

  • Горизонтальная линия H (Horizontal lineto) и h : принимает только один параметр - координату x (или смещение dx ). Координата по оси Y остается неизменной и наследуется от предыдущей точки.
  • Вертикальная линия V (Vertical lineto) и v : принимает один параметр - координату y (или смещение dy ). Координата по оси X фиксируется на уровне предыдущего узла.

При передаче цепочки одиночных чисел после H или V (например, H 20 50 80 ) каждое число рассматривается как отдельный последовательный шаг вдоль той же оси. Подобная запись синтаксически допустима, хотя на практике несколько подряд идущих однонаправленных отрезков обычно объединяют в один.

Замыкание подконтура командой Z и z

Команда Z (или z ) выполняет операцию ClosePath. Она завершает текущий активный подконтур, проводя прямую линию от текущей точки обратно к начальной точке этого подконтура (которая была задана последней предшествующей командой M или m ).

С точки зрения синтаксического анализатора, команда Z обладает двумя уникальными характеристиками:

  • Она не принимает никаких числовых параметров. Появление любого числа сразу после буквы Z без указания новой буквенной команды является нарушением грамматики.
  • Регистр буквы не имеет значения: заглавная Z и строчная z выполняют абсолютно идентичное действие, так как начальная точка подконтура уже жестко зафиксирована в координатной плоскости.

Визуально результат работы Z похож на проведение обычной линии L в стартовую координату, однако между ними есть техническое различие при отрисовке обводки (stroke). Команда Z физически спаивает начальный и конечный сегменты в единый замкнутый узел, к которому применяются правила оформления угловых соединений ( stroke-linejoin ). Если же вернуть линию в начало через команду L , контур останется геометрически разомкнутым, и на стыке отобразятся два независимых торца линии ( stroke-linecap ), что часто приводит к визуальным дефектам на углах прямоугольников и многоугольников.

Ниже приведена сводная спецификация линейных команд для проверки корректности передаваемых параметров:

Команда Назначение операции Обязательные параметры (на 1 сегмент) Кратность аргументов Пример валидной записи Геометрический результат примера
M / m Перемещение без рисования (Move to) x y / dx dy Четное число (минимум 2) M 10 10 40 10 Установка старта в (10, 10) и проведение линии в (40, 10)
L / l Линия в точку (Line to) x y / dx dy Четное число (минимум 2) L 50 60 Отрезок от текущей точки до координаты (50, 60)
H / h Горизонтальная линия (Horizontal lineto) x / dx Любое целое число (минимум 1) h 35 Горизонтальное смещение вправо на 35 единиц при том же Y
V / v Вертикальная линия (Vertical lineto) y / dy Любое целое число (минимум 1) V 120 Вертикальный отрезок до отметки y = 120 при том же X
Z / z Замыкание подконтура (ClosePath) Отсутствуют Ровно 0 Z Прямой отрезок к координатам последней команды M / m

Комбинация команд M , H , V и Z позволяет максимально компактно записывать прямоугольные области. Например, контур квадрата со стороной 50 единиц и началом в точке (10, 10) через стандартные линии записывается как M 10 10 L 60 10 L 60 60 L 10 60 Z , а с использованием ортогональных команд сжимается до M10 10H60V60H10Z без потери читаемости для парсера.

Проверка синтаксиса и параметров кривых Безье: C, S, Q, T

Криволинейные сегменты в SVG строятся на основе математического аппарата кривых Безье (Bezier curves), где траектория изгиба между начальным и конечным узлами определяется положением управляющих, или контрольных, точек (control points). В графических редакторах векторы от узлов к этим точкам отображаются как направляющие рычаги (Bezier handles). При синтаксическом анализе строки пути проверяется соответствие выбранного типа кривой строгому количеству переданных числовых координат, так как пропуск даже одного значения нарушает структуру кортежа и смещает парсинг всех последующих сегментов.

В спецификациях SVG предусмотрены два порядка кривых Безье - кубические и квадратичные, каждый из которых имеет полную и сокращенную (сглаженную) форму записи.

Кубические кривые Безье: команды C и S

Базовая кубическая кривая задается командой C (в абсолютных координатах) или c (в относительных приращениях) и требует передачи ровно шести параметров на один сегмент: x1 y1 x2 y2 x y . При проверке этой команды анализатор группирует поток чисел в шестерки, где каждая пара выполняет свою геометрическую роль:

  • x1, y1 - координаты первой контрольной точки, определяющей угол и силу натяжения рычага, выходящего из начальной точки сегмента (текущей точки пути).
  • x2, y2 - координаты второй контрольной точки, задающей направление входного рычага для конечного узла.
  • x, y - координаты самой конечной опорной точки, которая после завершения построения сегмента становится новой текущей точкой.

При построении плавных волнообразных линий соседние сегменты часто сопрягаются так, чтобы рычаги с обеих сторон узла лежали на одной прямой. Для сокращения записи таких последовательностей используется команда сглаженной кубической кривой S / s (Smooth cubic Bezier), принимающая четыре параметра: x2 y2 x y .

При разборе команды S или s первая управляющая точка (x1, y1) не передается в строке данных, а вычисляется математически как зеркальное отражение второй контрольной точки (x2, y2) предыдущего сегмента относительно текущей опорной точки. Если текущий узел имеет координаты (Px, Py) , а предыдущая контрольная точка находилась в (Cx2, Cy2) , то скрытая точка рассчитывается по формуле x1 = 2 * Px - Cx2 и y1 = 2 * Py - Cy2 . Это правило работает исключительно в том случае, если непосредственно перед командой S / s шла другая кубическая команда ( C , c , S или s ). Если же перед ней стоит линейный сегмент, перемещение M или квадратичная кривая, отражать нечего: первая контрольная точка приравнивается к текущей точке пути (x1 = Px, y1 = Py) , из-за чего начало кривой лишается изгибающего рычага.

Квадратичные кривые Безье: команды Q и T

Квадратичные кривые устроены проще кубических: форма дуги от начала до конца регулируется одной общей управляющей точкой, к которой сходятся оба рычага. Полная команда квадратичной кривой Q / q (Quadratic Bezier) требует четыре параметра: x1 y1 x y . Здесь пара (x1, y1) задает координаты единственной вершины управления, а (x, y) фиксирует конечный узел сегмента.

Для цепочки плавно перетекающих квадратичных дуг применяется команда T / t (Smooth quadratic Bezier), которой достаточно всего двух параметров - координат конечной точки x y . Управляющая точка (x1, y1) для нее выводится путем симметричного отражения контрольной точки предыдущей команды Q , q , T или t относительно начального узла текущего сегмента. По аналогии с кубическими кривыми, если перед T или t расположена любая команда, не являющаяся квадратичной кривой Безье, управляющая точка совмещается с текущей точкой, и сегмент вырождается в обычный прямой отрезок, идентичный команде L .

Правила проверки кратности аргументов

Поскольку синтаксис SVG допускает неявное повторение команд при перечислении нескольких наборов координат подряд, валидация опирается на строгую проверку кратности общего числа параметров после буквенного идентификатора. В таблице ниже приведены требования к количеству аргументов и условия вычисления управляющих точек для всех команд Безье.

Команда Тип кривой Безье Сигнатура одного сегмента Требуемая кратность параметров Источник первой контрольной точки (x1, y1) Пример валидной записи (2 сегмента подряд)
C / c Кубическая (Cubic Bezier) x1 y1 x2 y2 x y Кратно 6 (6, 12, 18...) Задается явно первыми двумя числами C 10 20, 40 20, 50 10, 60 0, 80 0, 90 10
S / s Сглаженная кубическая (Smooth cubic) x2 y2 x y Кратно 4 (4, 8, 12...) Отражение (x2, y2) от предыдущей C / S или текущая точка S 120 30, 140 10, 160 -10, 180 10
Q / q Квадратичная (Quadratic Bezier) x1 y1 x y Кратно 4 (4, 8, 12...) Задается явно первыми двумя числами q 25 -30, 50 0, 25 30, 50 0
T / t Сглаженная квадратичная (Smooth quadratic) x y Кратно 2 (2, 4, 6...) Отражение (x1, y1) от предыдущей Q / T или текущая точка T 150 50, 200 50

Проверка кратности позволяет выявить поврежденные при экспорте или ручном редактировании цепочки координат. Например, если после буквы C передано 10 чисел (как в строке M 0 0 C 10 10 20 10 30 0 40 -10 50 -10 ), анализатор успешно соберет первый сегмент из первых шести чисел (до координаты 30 0 ), но оставшиеся четыре числа не смогут сформировать второй кубический сегмент. Аналогично, передача нечетного количества аргументов в любую из команд C , S , Q или T гарантированно указывает на потерю одной из осей (абсциссы или ординаты) внутри пары координат.

Синтаксический разбор эллиптической дуги (команда A) и флагов

Команда построения эллиптической дуги ( A или a , Elliptical arc) отличается самым строгим набором требований к типам передаваемых данных во всей грамматике SVG. В отличие от линейных сегментов или кривых, где все аргументы представляют собой однородные числа с плавающей точкой, каждый сегмент дуги требует передачи ровно 7 параметров с разной синтаксической ролью. При неявном повторении команды общее количество чисел в цепочке должно быть строго кратно семи (7, 14, 21 и так далее).

Структура одного сегмента эллиптической дуги подчиняется шаблону A rx ry x-axis-rotation large-arc-flag sweep-flag x y . Назначение, геометрический смысл и правила проверки каждого из семи аргументов приведены в таблице ниже:

Позиция Параметр Допустимый тип данных Назначение в геометрии дуги
1 rx Число с плавающей точкой Радиус эллипса по оси абсцисс (горизонтальная полуось)
2 ry Число с плавающей точкой Радиус эллипса по оси ординат (вертикальная полуось)
3 x-axis-rotation Число с плавающей точкой Угол наклона главной оси эллипса в градусах относительно текущей системы координат
4 large-arc-flag Булев флаг (строго 0 или 1 ) Выбор размера дуги: 0 - малая дуга (угловая мера до 180 градусов включительно), 1 - большая дуга (более 180 градусов)
5 sweep-flag Булев флаг (строго 0 или 1 ) Направление отрисовки: 0 - движение против часовой стрелки (в сторону уменьшения углов), 1 - по часовой стрелке
6 x Число с плавающей точкой Конечная координата сегмента по горизонтали (или смещение dx для строчной a )
7 y Число с плавающей точкой Конечная координата сегмента по вертикали (или смещение dy для строчной a )

Геометрический выбор из четырех дуг и проверка булевых флагов

Две точки на плоскости и заданный эллипс с радиусами rx и ry в общем случае допускают проведение двух разных эллипсов, которые в совокупности образуют четыре возможных дуговых маршрута между стартовым и конечным узлом. Параметры large-arc-flag и sweep-flag (arc flags) выступают переключателями, однозначно определяющими, какой именно из четырех сегментов необходимо построить.

На этапе лексического и синтаксического анализа к четвертому и пятому аргументам применяются жесткие ограничения. В то время как радиусы, угол поворота и координаты могут быть любыми корректными десятичными числами (включая дробные значения и экспоненциальную запись), оба флага обязаны принимать исключительно односимвольные значения 0 или 1 . Передача любого другого числа (например, 2 , -1 или даже 1.0 ) на четвёртой или пятой позиции нарушает грамматику. Согласно стандарту, знак минуса или десятичная точка не могут входить в состав булевого флага.

Слитная запись флагов и ошибки при разборе через RegEx

Поскольку грамматика жестко фиксирует длину large-arc-flag и sweep-flag ровно одним символом ( 0 или 1 ), после чтения флага отпадает необходимость в явном разделителе (пробеле или запятой). На практике минификаторы и векторные редакторы активно используют эту особенность для сжатия объема кода, склеивая флаги друг с другом и с последующей координатой x .

Такая оптимизация порождает последовательности, которые выглядят как обычные многозначные числа, но на самом деле содержат несколько независимых параметров. Именно на этих участках чаще всего ломаются самописные анализаторы и простые шаблоны RegEx, пытающиеся разбить строку на токены по границам чисел или пробелам. Рассмотрим примеры корректного посимвольного разбора сжатых записей команды A :

  • A 50 50 0 01 100 100 - после угла поворота 0 идет блок 01 . Первый символ 0 извлекается как large-arc-flag , а второй символ 1 сразу же считывается как sweep-flag . Далее следуют координаты 100 и 100 . Наивный шаблон RegEx, ищущий числа целиком, прочитает 01 как единое число 1 , из-за чего в сегменте окажется всего 6 аргументов вместо 7.
  • a 25,25 -30 1150,-25 - в блоке 1150 первые два символа - это large-arc-flag ( 1 ) и sweep-flag ( 1 ), а оставшиеся цифры 50 формируют относительное смещение dx . После запятой следует смещение dy , равное -25 .
  • A 10 10 0 00.5.5 - экстремальный, но полностью валидный случай сжатия. После радиусов 10 , 10 и угла 0 расположена строка 00.5.5 . Первые два нуля - это флаги 0 и 0 . Сразу за ними без пробела начинается дробная координата .5 ( x = 0.5 ), за которой следует вторая дробная координата .5 ( y = 0.5 ).

Для безошибочной проверки эллиптических дуг лексический анализатор обязан менять режим чтения данных в зависимости от позиции аргумента внутри текущей семерки параметров. При чтении позиций 1, 2, 3, 6 и 7 применяется стандартное правило захвата чисел с плавающей точкой, тогда как на позициях 4 и 5 парсер считывает ровно один символ, проверяет его принадлежность множеству {0, 1} и немедленно переходит к разбору следующего токена, пропуская возможные пробелы или одну запятую.

Типичные ошибки синтаксиса SVG Path и поведение парсера при сбоях

Строгие правила лексического анализа приводят к тому, что нарушение грамматики в одном символе прерывает обработку дальнейшей цепочки координат. При проверке строки атрибута d выявляются дефекты структуры данных, возникающие при ручном редактировании кода, сбоях экспорта из графических редакторов или некорректной программной конкатенации строк.

Классификация синтаксических дефектов

Большинство сбоев при разборе данных пути сводится к пяти категориям нарушений грамматики W3C:

  • Отсутствие начальной инструкции перемещения. Любой непустой контур обязан начинаться с команды M или m . Если строка открывается командой рисования линии (например, L 10 10 ) или кривой ( C 10 10 20 20 30 30 ), парсер не имеет начальной текущей точки для отсчета сегмента и фиксирует ошибку с первого же токена.
  • Нарушение кратности аргументов. Каждая инструкция требует строго определенного числа параметров для формирования одного сегмента. Передача неполного набора координат (например, L 50 вместо пары значений, C 10 20 30 40 50 из пяти чисел вместо шести или Q 10 10 20 из трех чисел вместо четырех) оставляет команду незавершенной. Аналогичная ошибка возникает при передаче числовых аргументов команде Z или z .
  • Неизвестные команды и посторонние символы. Появление в строке латинских букв, не входящих в зарезервированный набор команд (например, B , G , P , X ), кириллических символов, точек с запятой, скобок или единиц измерения ( px , em , % ) немедленно нарушает структуру токенов. Указание размерностей вроде M 10px 20px недопустимо, так как координаты в атрибуте d задаются исключительно безразмерными числами в текущей пользовательской системе.
  • Искажение формата чисел и разделителей. Ошибки возникают при нарушении правил записи десятичных дробей и экспоненциальной нотации. Хотя запись 10.5.3 корректно разбирается на два числа ( 10.5 и 0.3 ), последовательность с двумя точками подряд ( 10..5 ) или число с незавершенным порядком экспоненты ( 15e , 10e+ без последующей цифры) являются синтаксически невалидными. Сюда же относится дублирование запятых между аргументами ( M 10,,20 ) или постановка запятой сразу после буквы команды ( L, 10 20 ).
  • Недопустимые значения булевых флагов дуги. В сегментах A и a четвертый и пятый параметры проверяются на точное соответствие символам 0 или 1 . Передача любого другого числа (например, 2 , -1 или 0.5 ) на позиции large-arc-flag или sweep-flag классифицируется как синтаксический сбой.

Правило обработки ошибок по спецификации W3C и частичный рендеринг

В отличие от строгого разбора XML, где незакрытый тег блокирует отображение всего документа, для данных внутри атрибута d в спецификациях W3C действует принцип частичной отказоустойчивости. Рендеринг пути прекращается строго на первом некорректном сегменте, но вся валидная геометрия, успешно разобранная до момента сбоя, сохраняется и может быть отрисована в браузере.

Поведение синтаксического анализатора при встрече с ошибкой подчиняется жесткому алгоритму отсечения данных. Если нарушение обнаружено внутри набора параметров конкретного сегмента, этот сегмент отбрасывается целиком. Например, в строке M 10 10 L 50 50 C 20 20 30 30 40 L 100 100 команды M 10 10 и L 50 50 сформируют видимую линию. Следующая за ними команда C содержит только 5 параметров вместо 6: парсер дойдет до буквы L , зафиксирует нехватку шестой координаты для кубической кривой, отменит построение этого сегмента C и полностью проигнорирует остаток строки ( L 100 100 ).

Тот же принцип действует при неявном повторении команд. Если записать M 0 0 L 10 10 20 20 30 , анализатор успешно построит начальную точку и два линейных отрезка до координат (10, 10) и (20, 20) . Одиночное число 30 в конце строки вызовет ошибку неполной пары координат для неявной команды L , но два предыдущих отрезка останутся валидными.

Ниже приведены примеры строк с различными нарушениями синтаксиса и результат их обработки согласно стандарту:

Строка атрибута d Тип синтаксической ошибки Отрисованная валидная часть Отброшенный фрагмент
L 20 20 M 0 0 L 40 40 Отсутствие начальной команды M или m Ничего (путь полностью игнорируется) L 20 20 M 0 0 L 40 40
M 0 0 H 50 V 50 Z 10 Лишний числовой аргумент у команды Z M 0 0 H 50 V 50 Z 10
M 10,10 Q 20,20 30,30, 40,40 Нарушение кратности параметров Q (передано 6 чисел вместо 4 или 8) M 10,10 Q 20,20 30,30 , 40,40
m 5 5 l 10 10 k 20 20 l 5 5 Неизвестная буква команды k m 5 5 l 10 10 k 20 20 l 5 5
M 0 0 A 15 15 0 2 1 30 30 Значение large-arc-flag равно 2 (допустимы только 0 или 1 ) M 0 0 (только установка начальной точки) A 15 15 0 2 1 30 30
M 10 10 L 20..5 30 L 40 40 Две десятичные точки подряд в одном числе M 10 10 L 20..5 30 L 40 40

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

Геометрическая диагностика и контекст отображения контура

Синтаксическая валидность атрибута d не гарантирует, что фигура появится на экране. На практике часто возникают ситуации, когда строка пути полностью соответствует грамматике W3C, не содержит запрещенных символов и передана с правильной кратностью аргументов, однако при рендеринге в DOM элемент остается невидимым или отображается с визуальными артефактами. Причина кроется в геометрических аномалиях самих координат, неверных настройках координатной области родительского контейнера или конфликтах презентационных стилей.

Геометрические аномалии и вырожденные сегменты

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

К основным геометрическим дефектам валидного пути относятся следующие сценарии:

  • Совпадение начальной и конечной точек сегмента: команды вроде M 25 25 L 25 25 или M 10 10 h 0 v 0 создают линию нулевой длины. В стандартных условиях рендеринга такой участок не формирует видимого контура.
  • Вырожденные кривые Безье: если в кубической или квадратичной кривой опорные и управляющие точки полностью совпадают в одной координате (например, M 50 50 C 50 50 50 50 50 50 ), кривая стягивается в математическую точку. Другой случай - расположение всех контрольных точек строго на одной прямой, что превращает кривую в плоский линейный отрезок без внутренней площади для заливки.
  • Нулевые радиусы эллиптической дуги: передача нуля в параметрах rx или ry (например, A 0 20 0 0 1 40 40 ) не является синтаксической ошибкой. Согласно спецификации, при нулевом радиусе парсер принудительно заменяет дугу прямым отрезком (аналогично команде L ) до конечной точки, а если начальная и конечная координаты дуги совпадают, сегмент полностью игнорируется при отрисовке.
  • Лишние одиночные узлы (stray nodes): последовательность нескольких команд перемещения подряд ( M 10 10 M 100 100 M 50 50 L 60 60 ) часто остается после неаккуратного экспорта из графических редакторов. Первые две команды только переставляют текущую точку, создавая пустые подконтуры без сегментов построения. Они не видны при обычной обводке, но могут неожиданно проявиться, если к пути применены свойства скругления концов линий ( stroke-linecap="round" ) или маркеры узлов ( marker-start , marker-mid ).

Экстремумы координат, ограничивающая рамка и viewBox

Другая распространенная причина исчезновения валидного контура - выход его геометрии за пределы видимой области. Каждый путь обладает пространственными экстремумами: минимальными и максимальными значениями по обеим осям ( minX , minY , maxX , maxY ). При вычислении этих границ учитываются не только узловые точки команд, но и физические вершины изгибов кривых Безье и эллиптических дуг.

На основе экстремумов формируется ограничивающая рамка фигуры - bounding box (или bbox ), которая определяется стартовой точкой (minX, minY) , шириной width = maxX - minX и высотой height = maxY - minY . Чтобы контур был виден пользователю, его bbox должен пересекаться с областью просмотра, заданной в атрибуте viewBox корневого элемента, и укладываться в размеры видового экрана (viewport).

Ниже приведены типичные расхождения между геометрией пути и контекстом его отображения, приводящие к визуальным сбоям:

Сценарий при рендеринге Геометрическая или стилевая причина Пример валидного кода с проблемой Способ диагностики и устранения
Контур полностью отсутствует на экране Смещение bbox за границы viewBox (промах по координатам) viewBox="0 0 100 100" при пути d="M 500 500 L 600 600" Сравнить экстремумы minX/minY и maxX/maxY с параметрами viewBox , скорректировать область просмотра или перенести узлы
Прямая горизонтальная или вертикальная линия не видна Нулевая высота или ширина bbox при отсутствии обводки d="M 10 20 H 90" со стилями fill="black" stroke="none" У плоской линии площадь равна нулю (заливка не работает); необходимо явно задать цвет в атрибуте stroke и толщину stroke-width
Фигура выглядит микроскопической или гигантской Несоответствие масштаба координат пути и размеров видового экрана (viewport) viewBox="0 0 2000 2000" для иконки с d="M 2 2 L 10 10" Масштабировать координаты пути или привести значения viewBox к реальным габаритам ограничивающей рамки bbox
Исчезают внутренние отверстия в составном пути Конфликт направления обхода подконтуров и алгоритма заливки Два вложенных контура M...Z M...Z , нарисованных по часовой стрелке, при fill-rule="nonzero" Изменить направление обхода внутреннего подконтура на противоположное или переключить правило заливки на evenodd

Роль презентационных атрибутов при проверке пути

Контекст отображения напрямую зависит от атрибутов оформления: fill , stroke и stroke-width . По умолчанию в спецификации SVG для любого пути установлена черная заливка ( fill="black" ) и полностью отключена обводка ( stroke="none" ).

Это правило создает ловушку при отладке разомкнутых и прямолинейных контуров. Если путь состоит только из одного прямого сегмента (например, M 0 0 L 100 0 ), его геометрическая площадь равна нулю. Поскольку заливать внутри линии нечего, а обводка по умолчанию отсутствует, абсолютно корректный элемент не оставляет на холсте ни одного пикселя. Аналогичная проблема возникает, когда цвету обводки задано значение, но параметр stroke-width установлен в 0 или экстремально малую дробную величину (например, 0.001 при большом размере viewBox ), из-за чего линия не проходит порог растеризации на экране.

Диагностика через интерфейс SVGGeometryElement

В браузерном окружении элемент <path> наследует свойства и методы DOM-интерфейса SVGGeometryElement . Программное обращение к этим методам при проверке и отладке позволяет оценить физические характеристики контура независимо от того, виден ли он сейчас на экране.

Метод getTotalLength() вычисляет и возвращает общую длину всех сегментов пути в пользовательских единицах координат в виде числа с плавающей точкой. Если для длинной строки d этот метод возвращает 0 , значит путь состоит исключительно из команд перемещения M/m или вырожденных сегментов нулевой длины. В ситуациях, когда в середине строки допущена синтаксическая ошибка, getTotalLength() рассчитает длину только для той части пути, которую парсер смог обработать до момента сбоя.

Метод getPointAtLength(distance) принимает числовое значение дистанции от начала пути и возвращает объект DOMPoint с точными координатами x и y , лежащими на контуре на указанном расстоянии. Этот механизм применяется для пошаговой трассировки геометрии: передавая значения от 0 до результата getTotalLength() , можно математически отследить траекторию кривой, найти координаты экстремумов, проверить плавность стыковки сегментов и локализовать участки, которые уходят за пределы рабочей области viewBox . Дополнительно вызов базового метода getBBox() возвращает готовый прямоугольник ограничивающей рамки ( x , y , width , height ), что сразу выявляет вырожденные размеры или смещение фигуры в отрицательную зону координатной плоскости.

Нужен другой
инструмент?

Откройте раздел изображений и выберите инструмент для другой задачи с графикой.

Все инструменты