Max Diesel писал(а):Нет никакой проблемы в восприятии новой версией старых стилей, так как автоматически будет произведена конвертация под новый формат. Проблема лишь в восприятии новых стилей старыми версиями...
Старые версии вполне могут обойтись теми расширениями, которые не содержат шаблоных символов... Конвертирование в поисковые запросы лично я считаю ненужным.
Max Diesel писал(а):Если новая версия отправляя стиль на сайт будет переводить его в старый формат (вот только регрессивного конвертера и не хватало), тогда уж старые версии "поймут его правильно", но тогда маски будут принудительно превращены в расширения, которые не всегда превращаются в те же маски после конвертации.
А вот тут не согласен... Старые версии работают по принципу "сравнить расширение с тем, что находится между точками". Соответственно, если между точками будут находиться (в том числе) символы, которые не могут находиться в имени файла, то будет всего лишь тратиться лишнее время на заведомо ложное сравнение. Поэтому просто перед каждой '.' поставим '>', а перед каждым ':' - '.'. И всё - совместимость есть, при этом стили хранятся в старом формате. Вот программа, позволяющая делать любое необходимое конвертирование:
Код: Выделить всё
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
string new_to_old(const string &str)
{
string res;
const char *s;
res.reserve(str.length());
for(s=str.c_str(); *s; ++s)
{
if(*s==':')
res.push_back('.');
else if(*s=='.')
res.push_back('>');
res.push_back(*s);
}
if(*res.rbegin()==':')
res.erase(--res.end());
return res;
}
string any_to_new(const string &str)
{
string res;
const char *s;
if(str.length()<3) // incorrect or "::"
return "::";
if(*(s=str.c_str())==':') // new style
return str;
if(*s!='.') // incorrect
return "::";
if(*++s!=':') // old style
{
res.reserve(str.length()+1);
res.push_back(':');
for(--s; *s; ++s)
if(*s!='.')
res.push_back(*s);
else if(s[1])
res+=":*?.";
}
else // converted to old style
{
res.reserve(str.length()>>1);
res.push_back(':');
res.push_back(':');
*++s=='.' && *++s==':' || --s;
while(*++s)
if(*s!='>' && (*s!='.' || s[1] && s[1]!=':'))
res.push_back(*s);
}
if(*res.rbegin()!=':')
res.push_back(':');
return res;
}
int main(void)
{
string str, res, old;
while(1)
{
puts("Enter the string.");
getline(cin, str);
printf(" str == \"%s\"\n", str .c_str());
printf("(res=any_to_new(str)) == \"%s\"\n", (res=any_to_new(str)).c_str());
printf("(old=new_to_old(res)) == \"%s\"\n", (old=new_to_old(res)).c_str());
printf(" any_to_new(old) == \"%s\"\n\n", any_to_new(old) .c_str());
}
return 0;
}
а вот её проверка
Код: Выделить всё
Enter the string.
.qqq.
str == ".qqq."
(res=any_to_new(str)) == "::*?.qqq:"
(old=new_to_old(res)) == ".:.:*?>.qqq."
any_to_new(old) == "::*?.qqq:"
Enter the string.
.qqq.www.eee.rrr.
str == ".qqq.www.eee.rrr."
(res=any_to_new(str)) == "::*?.qqq:*?.www:*?.eee:*?.rrr:"
(old=new_to_old(res)) == ".:.:*?>.qqq.:*?>.www.:*?>.eee.:*?>.rrr."
any_to_new(old) == "::*?.qqq:*?.www:*?.eee:*?.rrr:"
Enter the string.
::*.qqq:
str == "::*.qqq:"
(res=any_to_new(str)) == "::*.qqq:"
(old=new_to_old(res)) == ".:.:*>.qqq."
any_to_new(old) == "::*.qqq:"
Enter the string.
::*.qqq:*.www.eee:rrr.*:
str == "::*.qqq:*.www.eee:rrr.*:"
(res=any_to_new(str)) == "::*.qqq:*.www.eee:rrr.*:"
(old=new_to_old(res)) == ".:.:*>.qqq.:*>.www>.eee.:rrr>.*."
any_to_new(old) == "::*.qqq:*.www.eee:rrr.*:"
Enter the string.
Max Diesel писал(а):Поэтому отложим это мероприятие, возможно позже оно будет как-либо реализовано.
Полагаю, теперь нет необходимости откладывать...
PS: Вы никак не прокомментировали найденную мной причину добавления проверки на отсутствие расширения... Эта проверка будет убрана?