Показать сообщение отдельно
  #6 (permalink)  
Старый 26.04.2018, 12:11
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

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

Вот написанный на коленке скрипт на виндовом jscript'е для этого:
(function(file){
var nextId = function(){  
  var hash = 0;
  var index = 0;
  
  for (var i = 0, chr; i < file.length; i++) {
    chr   = file.charCodeAt(i);
    hash  = ((hash << 5) - hash) + chr;
    hash |= 0; 
  }
  
  hash = hash.toString(36) + (+new Date()).toString(36);

  return function(){
    return 'st-' + hash + '-' + index++;
  }
}();
var classMap = {};

var xml = new ActiveXObject("MSXML2.DOMDocument");
xml.load(file);

var style = xml.selectSingleNode('svg/style');

if(!style) return;

var css = style.text;

var elements = xml.selectNodes('//@class');
for (var i = 0, className; i < elements.length; i++) {
  if(!classMap[className = elements[i].text]){  
    classMap[className] = nextId();
    css = css.replace(
      new RegExp('((?:^|\\})\\s*\\.)' + className + '(?=\\s|\\{)', 'mg'), 
      '$1' + classMap[className]
    );
  }
  elements[i].text = classMap[className];
}

style.text = css;

xml.save(file)
}(WScript.arguments(0)));
(сохранить как файл js, перетянуть на него svg файл, либо вызывать с передачей адреса файла в параметре)

Таким же образом с минимальными правками можно сделать на любом другом языке поддерживающем работу с xml, либо, как вы и хотели, на продакшене, но последнее я бы не рекомендовал.
__________________
29375, 35

Последний раз редактировалось Aetae, 26.04.2018 в 13:56.
Ответить с цитированием