You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
370 lines
7.0 KiB
370 lines
7.0 KiB
#include <tqstringlist.h>
|
|
|
|
#include "rurl.h"
|
|
|
|
namespace Relative{
|
|
|
|
|
|
//class Name
|
|
|
|
Name::Name( const TQString & rurl, const Type type )
|
|
:m_rurl(rurl), m_type(type)
|
|
{
|
|
correct();
|
|
}
|
|
|
|
Name::Name( const char * rurl, const Type type )
|
|
:m_rurl(rurl), m_type(type)
|
|
{
|
|
correct();
|
|
}
|
|
|
|
void Name::correct()
|
|
{
|
|
cleanRURL();
|
|
if (m_rurl[0] == '/')
|
|
m_rurl = m_rurl.mid(1);
|
|
switch (m_type)
|
|
{
|
|
case File:
|
|
if (m_rurl.endsWith("/"))
|
|
m_rurl = m_rurl.mid(0, m_rurl.length()-1);
|
|
break;
|
|
case Directory:
|
|
if (!m_rurl.endsWith("/"))
|
|
m_rurl += "/";
|
|
break;
|
|
case Auto:
|
|
if (m_rurl.endsWith("/"))
|
|
m_type = Directory;
|
|
else
|
|
m_type = File;
|
|
break;
|
|
}
|
|
}
|
|
|
|
TQString Name::correctName( const TQString & rurl, const Type type )
|
|
{
|
|
TQString temp = rurl;
|
|
temp = Name::cleanName(temp);
|
|
if (temp[0] == '/')
|
|
temp = temp.mid(1);
|
|
|
|
switch (type)
|
|
{
|
|
case File:
|
|
if (temp.endsWith("/"))
|
|
temp = temp.mid(0, temp.length()-1);
|
|
break;
|
|
case Directory:
|
|
if (!temp.endsWith("/"))
|
|
temp += "/";
|
|
break;
|
|
}
|
|
|
|
return temp;
|
|
}
|
|
|
|
void Name::setRURL( const TQString & rurl, const Type type )
|
|
{
|
|
m_rurl = rurl;
|
|
m_type = type;
|
|
correct();
|
|
}
|
|
|
|
TQString Name::rurl( ) const
|
|
{
|
|
return m_rurl;
|
|
}
|
|
|
|
void Name::addPath( const TQString & addendum )
|
|
{
|
|
TQString temp = correctName(addendum, Directory);
|
|
m_rurl = directory() + temp + fileName();
|
|
}
|
|
|
|
void Name::cleanRURL( )
|
|
{
|
|
m_rurl = cleanName(m_rurl);
|
|
}
|
|
|
|
TQString Name::cleanName( const TQString & rurl )
|
|
{
|
|
TQString temp;
|
|
bool wasSlash = false;
|
|
for (unsigned int i = 0; i < rurl.length(); ++i)
|
|
{
|
|
if (wasSlash && (rurl[i] == '/'))
|
|
continue;
|
|
|
|
temp += rurl[i];
|
|
if (rurl[i] == '/')
|
|
wasSlash = true;
|
|
else if (wasSlash)
|
|
wasSlash = false;
|
|
}
|
|
|
|
return temp;
|
|
}
|
|
|
|
TQString Name::extension( bool complete ) const
|
|
{
|
|
if (m_type == File)
|
|
{
|
|
TQString temp = fileName();
|
|
if (complete)
|
|
return temp.mid(temp.find('.')+1);
|
|
else
|
|
return temp.mid(temp.findRev('.')+1);
|
|
}
|
|
return TQString();
|
|
}
|
|
|
|
TQString Name::fileName( ) const
|
|
{
|
|
if (m_type == File)
|
|
return m_rurl.section('/', -1);
|
|
return TQString();
|
|
}
|
|
|
|
TQString Name::directory( ) const
|
|
{
|
|
if ( (m_type == File) && (m_rurl.findRev('/') == -1) )
|
|
return TQString();
|
|
|
|
return m_rurl.mid(0, m_rurl.findRev('/')+1);
|
|
}
|
|
|
|
bool Name::isFile( ) const
|
|
{
|
|
return m_type == File;
|
|
}
|
|
|
|
bool Name::isDirectory( ) const
|
|
{
|
|
return m_type == Directory;
|
|
}
|
|
|
|
bool Name::operator ==( const Name & rname )
|
|
{
|
|
return rname.rurl() == m_rurl;
|
|
}
|
|
|
|
bool Name::operator !=( const Name & rname )
|
|
{
|
|
return rname.rurl() != m_rurl;
|
|
}
|
|
|
|
bool Name::isValid( ) const
|
|
{
|
|
if (m_rurl.startsWith("/"))
|
|
return false;
|
|
if (m_rurl.contains("//"))
|
|
return false;
|
|
if ( (m_rurl.endsWith("/")) && (m_type == File) )
|
|
return false;
|
|
if ( (!m_rurl.endsWith("/")) && (m_type == Directory) )
|
|
return false;
|
|
if (m_type == Auto)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
Name::Type Name::type( ) const
|
|
{
|
|
return m_type;
|
|
}
|
|
|
|
void Name::setType( const Type type )
|
|
{
|
|
m_type = type;
|
|
}
|
|
|
|
Name Name::relativeName( const TQString &base, const TQString &url )
|
|
{
|
|
TQString dirUrl = base;
|
|
TQString fileUrl = url;
|
|
|
|
if (dirUrl.isEmpty() || (dirUrl == "/"))
|
|
return Name(fileUrl);
|
|
|
|
TQStringList dir = TQStringList::split("/", dirUrl, false);
|
|
TQStringList file = TQStringList::split("/", fileUrl, false);
|
|
|
|
TQString resFileName = file.last();
|
|
if (url.endsWith("/"))
|
|
resFileName += "/";
|
|
file.remove(file.last());
|
|
|
|
uint i = 0;
|
|
while ( (i < dir.count()) && (i < (file.count())) && (dir[i] == file[i]) )
|
|
i++;
|
|
|
|
TQString result_up;
|
|
TQString result_down;
|
|
TQString currDir;
|
|
TQString currFile;
|
|
do
|
|
{
|
|
i >= dir.count() ? currDir = "" : currDir = dir[i];
|
|
i >= file.count() ? currFile = "" : currFile = file[i];
|
|
// qWarning("i = %d, currDir = %s, currFile = %s", i, currDir.latin1(), currFile.latin1());
|
|
if (currDir.isEmpty() && currFile.isEmpty())
|
|
break;
|
|
else if (currDir.isEmpty())
|
|
result_down += file[i] + "/";
|
|
else if (currFile.isEmpty())
|
|
result_up += "../";
|
|
else
|
|
{
|
|
result_down += file[i] + "/";
|
|
result_up += "../";
|
|
}
|
|
i++;
|
|
}
|
|
while ( (!currDir.isEmpty()) || (!currFile.isEmpty()) );
|
|
|
|
return result_up + result_down + resFileName;
|
|
}
|
|
|
|
|
|
|
|
//class URL
|
|
|
|
URL::URL( KURL base, KURL url, Type type )
|
|
:Name(Name::relativeName(base.path(), url.path()).rurl(), type), m_base(base)
|
|
{
|
|
}
|
|
|
|
URL::URL( KURL base, TQString url, bool isUrlRelative, Type type )
|
|
:Name(isUrlRelative ? url : Name::relativeName(base.path(), url).rurl(), type), m_base(base)
|
|
{
|
|
}
|
|
|
|
void URL::setBase( const KURL & base )
|
|
{
|
|
m_base = base;
|
|
}
|
|
|
|
void URL::setBase( const TQString & base )
|
|
{
|
|
KURL url;
|
|
url.setPath(base);
|
|
m_base = url;
|
|
}
|
|
|
|
KURL URL::base( ) const
|
|
{
|
|
return m_base;
|
|
}
|
|
|
|
TQString URL::basePath( ) const
|
|
{
|
|
return m_base.path(1);
|
|
}
|
|
|
|
KURL URL::url( ) const
|
|
{
|
|
KURL url = m_base;
|
|
url.addPath(rurl());
|
|
url.cleanPath();
|
|
return url;
|
|
}
|
|
|
|
TQString URL::urlPath( ) const
|
|
{
|
|
KURL url = m_base;
|
|
url.addPath(rurl());
|
|
int mod = 0;
|
|
if (type() == File)
|
|
mod = -1;
|
|
else if (type() == Directory)
|
|
mod = 1;
|
|
url.cleanPath();
|
|
return url.path(mod);
|
|
}
|
|
|
|
TQString URL::urlDirectory( ) const
|
|
{
|
|
KURL url = m_base;
|
|
url.addPath(rurl());
|
|
url.cleanPath();
|
|
return url.directory(false, false);
|
|
}
|
|
|
|
URL URL::relativeTo( KURL base )
|
|
{
|
|
return URL(base, url(), type());
|
|
}
|
|
|
|
URL URL::relativeURL( KURL base, KURL url )
|
|
{
|
|
return URL(base, url);
|
|
}
|
|
|
|
URL URL::relativeURL( KURL base, TQString url, bool isUrlRelative )
|
|
{
|
|
return URL(base, url, isUrlRelative);
|
|
}
|
|
|
|
bool Relative::URL::operator ==( const URL & url )
|
|
{
|
|
return (m_base == url.base()) && (rurl() == url.rurl());
|
|
}
|
|
|
|
bool Relative::URL::operator !=( const URL & url )
|
|
{
|
|
return (m_base != url.base()) || (rurl() != url.rurl());
|
|
}
|
|
|
|
|
|
|
|
// Directory class
|
|
|
|
Directory::Directory( KURL base, KURL url )
|
|
:URL(base, url, Name::Directory)
|
|
{
|
|
}
|
|
|
|
Directory::Directory( KURL base, TQString url, bool isRelativeUrl )
|
|
:URL(base, url, isRelativeUrl, Name::Directory)
|
|
{
|
|
}
|
|
|
|
void Directory::setRURL( TQString rurl )
|
|
{
|
|
URL::setRURL(rurl, Name::Directory);
|
|
}
|
|
|
|
void Directory::setRURL( TQString rurl, Type type )
|
|
{
|
|
URL::setRURL(rurl, type);
|
|
}
|
|
|
|
|
|
|
|
//File class
|
|
|
|
File::File( KURL base, KURL url )
|
|
:URL(base, url, Name::File)
|
|
{
|
|
}
|
|
|
|
File::File( KURL base, TQString url, bool isRelativeUrl )
|
|
:URL(base, url, isRelativeUrl, Name::File)
|
|
{
|
|
}
|
|
|
|
void File::setRURL( TQString rurl, Type type )
|
|
{
|
|
URL::setRURL(rurl, type);
|
|
}
|
|
|
|
void File::setRURL( TQString rurl )
|
|
{
|
|
URL::setRURL(rurl, Name::File);
|
|
}
|
|
|
|
}
|