mai62 сделал вариант, которому нужен конвертор
добавлениями будет намного сложнее
[more=Доработаный вариант (с кодом)]Доработаный вариант:
Заменяются всегда:
* -> #x
: -> #!
\ -> #~
| -> #i
До первого '?' :
/ -> \
// -> \#n\
./ -> .#n\
? -> #\
После первого '?'
(вариант, когда запросы (query) не делим на цепочку папок):
/ -> #%
// -> #%#%
./ -> .#%
? -> #^
Опционально (предложил
C0USIN):
%D0%xx -> символ с кодом xxh (только для кирилицы)
%20 -> пробел
Если имеем редирект, то FileName:=FileName+'#m'
Если последний символ '\' или '.', то FileName:=FileName+'#_'
Код: unit URLConverter;
interface
const
Normal=0;
Redirect=1;
function CheckURL(s: string): integer; //недоделано
function URL2File(s: string; redir: byte): string;
function File2URL(s: string): string;
function File2URLtype(s: string): byte;
implementation
//////////////////////////////////
function URL2File(s: string; redir: byte): string;
var
i,l:integer;
q: boolean;
begin
q:=false; // индикатор query
l:=Length(s);
//пожразумеваем что урл правильный,
//(правильннй браузер либо проверен CheckURL)
// поэтому пропускаю
http:// for i:=8 to l do
case s
of
'*': result:=result+'#x';
':': result:=result+'#!';
'\': result:=result+'#~';
'|': result:=result+'#i';
'/': if q
then result:=result+'#%'
else
begin
//имя файла не может быть пустым
// и оканчиваться на точку
if (s[i-1]='/') or (s[i-1]='.')
then result:=result+'#n\'
else result:=result+'\';
end;
'?': if q
// если ? уже втречался
then result:=result+'#^'
else
begin
q:=true;
result:=result+'#\';
end;
else result:=result+s[i]
end;
//если редирект, добавляе #m
if redir=1
then result:=result+'#m';
//если имя файла пустое, добавляе #_
if result[Length(result)]='\'
then result:=result+'#_';
end;
//////////////////////////////////
function File2URL(s: string): string;
var
i,l :integer;
ok{, q} :boolean;
begin
ok:=true;
//q:=false;
l:=Length(s);
//чтобы при работе с кодам не выйти за границы,
//сразу это исключим
if s[l]='#' then ok:=false;
//подразумеваю имя файла без пути к папке кеша
i:=0;
result:='http://';
while ok and (i<l) do
begin
inc(i);
if (s[i]='#')
then
begin
inc(i);
case s[i] of
'x': result:=result+'*';
'!': result:=result+':';
'~': result:=result+'/';
'i': result:=result+'|';
'%': result:=result+'/';
'\': result:=result+'?';
'^': result:=result+'?';
'_', 'n', 'm':result:=result;//ничего не делаем
else ok:=false //неизвестный код
end;
end
else
begin
if (s[i]='\')
then result:=result+'/'
//во всех остальных случаях
else result:=result+s[i];
end;
end;
if ok=false
then result:='#Error!!!';//
//проверял только на неизвестные коды.
//если использовать переменную q, то можно
//добавить проверку местоположения кодов
//или после проверить весь урл сразу CheckURL
end;
//////////////////////////////////
function File2URLtype(s: string): byte;
var
l:integer;
begin
l:=Length(s);
if (s[l-1]='#') and (s[l]='m')
then result:=Redirect
else result:=Normal;
end;