Как стать автором
Обновить

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

Сарказм: даже если оставить в стороне ваш очаровательный микс чистого Си и C++ (с чем связано?) и фатальную нелюбовь к обработке ошибок (например, даже при наличии файла вам могут его не дать открыть и тем более записать - по многим причинам), остаются вопросы по коду.

Пардонь-те, зачем такие изыски: сначала декремент указателя, потом инкремент?:

    data--;
    t[i].tag[0]=readu8(data++);
    t[i].tag[1]=readu8(data++);
    t[i].tag[2]=readu8(data++);
    t[i].tag[3]=readu8(data++);
    t[i].tag[4]='\0';
    data++;

Может слегка исправить возможный баг: переписать:

u8 readu8(u8 *tempN)
{
  u8 t=tempN[1] ;

  return t;
}

как:

u8 readu8(u8 *tempN)
{
  u8 t=tempN[0] ;

  return t;
}

Прим.: индекс изменить с 1 на 0.

По-идее должно быть легче и понятнее.

Или, как вариант, в этом подходе есть "верхний" смысл ... Не раскроете тему?

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

спасибо опечатался (с -- и ++ тогда давно отладку делал заметилось и оставил так), проверил опечатался извините.


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

фаерфокс или то что в нём запоминает некоторую группу g1 и она проходит дублем от родителя

пример

суть статьи только емодзи, этот кусочек кода подходит под него, в самом текстовом движке проще конечно на С++ будет

под движок надо скрипт какойто писать под локализацию и сам принцип очень много тем охватывает, в видео он делает скорее всего АСКИ, у меня уже строки u32string на все языки работает, потому и нужен скрипт (на язык по атласу наверно соотв это по 1 вызову)

ошибки пока не обрабатываю надо будет, написать проверки на виды сборки, пока это несерьёзная реализация пока присматриваюсь с тем что получается

кто будет читать эту статью знайте, все браузеры группы svg-inline рисуют по разному, кто-то их по каким-то причинам пересчитывает соотв если это группа из svg то пропуск. в целом начало алгоритма не знаю, но далее чтобы изолировать каждый елемент-SVG надо вести счет групп. в С++ это делать накладно проще делать в js

соотв для кросс-браузера и такого количества SVG елементов, надо изолировать каждый елемент по g id(изменить) и его fill/use ="url(#его сюда продублировать)"

Скрытый текст
// Получаем все элементы <svg> на странице
var elements = document.body.getElementsByTagName('svg');

// Создаем объект для хранения значений атрибута id и fill
var fillCounts = {};
var idCounts = {};

// Начинаем с 12000 для id
var idStart = 12000;

// Сначала обрабатываем элементы <defs> для id
for (var i = 0; i < elements.length; i++) {
    // Находим элемент <defs> внутри текущего svg
    var defs = elements[i].getElementsByTagName('defs')[0];

    // Если элемент <defs> существует
    if (defs) {
        // Получаем все дочерние элементы текущего defs
        var defsChildren = defs.getElementsByTagName('*'); // Получаем все элементы внутри defs

        for (var j = 0; j < defsChildren.length; j++) {
            // Получаем значение атрибута id
            var idValue = defsChildren[j].getAttribute('id');

            // Обрабатываем id
            if (idValue && /^g\d+$/.test(idValue)) {
                if (!idCounts[idValue]) {
                    idCounts[idValue] = 0;
                }
                idCounts[idValue]++;
            }
        }
    }

    // Обрабатываем элементы <path> для fill
    var paths = elements[i].getElementsByTagName('path'); // Получаем все элементы <path>

    for (var j = 0; j < paths.length; j++) {
        var fillValue = paths[j].getAttribute('fill');

        // Обрабатываем fill
        if (fillValue && /^url\D#g\d+/.test(fillValue)) { 
            if (!fillCounts[fillValue]) {
                fillCounts[fillValue] = 0;
            }
            fillCounts[fillValue]++;
        }
    }
}

// Теперь изменяем id и fill элементов на уникальные значения g12000, g12001 и т.д.
let currentIdNumber = idStart; // Начинаем с 12000

for (var i = 0; i < elements.length; i++) {
    var defs = elements[i].getElementsByTagName('defs')[0];

    if (defs) {
        var defsChildren = defs.getElementsByTagName('*');
        
        // Сначала создаем мапу для соответствия старых ID новым ID
        let oldToNewIdMap = {};

        for (var j = 0; j < defsChildren.length; j++) {
            var idValue = defsChildren[j].getAttribute('id');

            // Изменяем id и запоминаем соответствие старого ID новому ID
            if (idValue && /^g\d+$/.test(idValue)) {
                let newId = 'g' + currentIdNumber;
                oldToNewIdMap[idValue] = newId; // Сохраняем соответствие старого ID новому ID
                defsChildren[j].setAttribute('id', newId);
                currentIdNumber++; // Увеличиваем номер для следующего ID
            }
        }

        // Теперь обновляем fill в элементах <path>
        var paths = elements[i].getElementsByTagName('path'); // Получаем все элементы <path>

        for (var j = 0; j < paths.length; j++) {
            var fillValue = paths[j].getAttribute('fill');

            // Изменяем fill, если он соответствует старым ID из oldToNewIdMap
            if (fillValue && /^url\D#g\d+/.test(fillValue)) { 
                let oldFillIdMatch = fillValue.match(/#(g\d+)/);
                if (oldFillIdMatch && oldToNewIdMap[oldFillIdMatch[1]]) {
                    paths[j].setAttribute('fill', 'url(#' + oldToNewIdMap[oldFillIdMatch[1]] + ')');
                }
            }
        }

        // Теперь обрабатываем элементы <use>
        var uses = elements[i].getElementsByTagName('use'); // Получаем все элементы <use>

        for (var j = 0; j < uses.length; j++) {
            var fillValue = uses[j].getAttribute('fill');

            if (fillValue && /^url\D#g\d+/.test(fillValue)) { 
                let oldUseIdMatch = fillValue.match(/#(g\d+)/);
                if (oldUseIdMatch && oldToNewIdMap[oldUseIdMatch[1]]) {
                    uses[j].setAttribute('fill', 'url(#' + oldToNewIdMap[oldUseIdMatch[1]] + ')');
                }
            }
        }
    }
}
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации