Сабж касается сорцов inkscape, точнее одного мелкого бага. Глядя на количество открытых багов и активных разработчиков понял я, что если и дойдут у кого-то руки до фикса, то очень не скоро, т.к. даже подтвердить или опровергнуть не могут довольно долго. В итоге решил сам поковырять. Нашел причину в файле /inkscape/src/id-clash.cpp, а именно в функции
void rename_id(SPObject *elem, Glib::ustring const &new_name)
{
if (new_name.empty()){
g_message("Invalid Id, will not change.");
return;
}
gchar *id = g_strdup(new_name.c_str()); //id is not empty here as new_name is check to be not empty
g_strcanon (id, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.:", '_');
Glib::ustring new_name2 = id; //will not fail as id can not be NULL, see length check on new_name
g_free (id);
if (!isalnum (new_name2[0])) {
g_message("Invalid Id, will not change.");
return;
}
SPDocument *current_doc = elem->document;
refmap_type refmap;
find_references(current_doc->getRoot(), refmap);
std::string old_id(elem->getId());
if (current_doc->getObjectById(id)) {
// Choose a new ID.
// To try to preserve any meaningfulness that the original ID
// may have had, the new ID is the old ID followed by a hyphen
// and one or more digits.
new_name2 += '-';
for (;;) {
new_name2 += "0123456789"[std::rand() % 10];
if (current_doc->getObjectById(new_name2) == NULL)
break;
}
}
// Change to the new ID
elem->getRepr()->setAttribute("id", new_name2);
// Make a note of this change, if we need to fix up refs to it
id_changelist_type id_changes;
if (refmap.find(old_id) != refmap.end()) {
id_changes.push_back(id_changeitem_type(elem, old_id));
}
fix_up_refs(refmap, id_changes);
}
Вот как могло в голову прийти такое? Зачем они добавляют к концу имени свои циферки, когда используют эту функцию в том числе для ручной смены названия? Честно говоря, не вдупляю, зачем вообще это было делать? Как бы комментарий о том, что они не хотят терять старую информацию о ID мне ясен, но при использовании этой функции и так теряется всё, кроме нового значения и рандомных циферок на конце. Или им просто хочется гарантировать, чтобы новый id не совпадал с уже имеющимся (но всё равно это реализовано криво и логически неправильно)?
c++, inkscape, говнокод, я познаю мир