--------------Boundary-00=_X8DT4H7VQ09651I22XGM Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8bit Hi, I think that this feature is used in many application (at least in mine and quanta+ ;)). I could not find it in Q* and K* classes, so I wrote it down. Thanks to David Faure who helped me improving this routine. enjoy it PS.: is "
" the correct tag to insert code examples in the .h documentation? -- Gioele Barabucci (Gb]) ) mailto:dev@gioelebarabucci.com ) http://www.gioelebarabucci.com ) ) I've been and now I've gone ) ) /Magic Pie^Oasis --------------Boundary-00=_X8DT4H7VQ09651I22XGM Content-Type: text/x-diff; charset="us-ascii"; name="makeRelativePath.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="makeRelativePath.patch" Index: kdecore/kurl.cpp =================================================================== RCS file: /cvs/kdelibs/kdecore/kurl.cpp,v retrieving revision 1.204 diff -u -3 -p -r1.204 kurl.cpp --- kdecore/kurl.cpp 2002/03/30 12:11:14 1.204 +++ kdecore/kurl.cpp 2002/03/30 23:06:51 @@ -327,6 +327,62 @@ bool KURL::isRelativeURL(const QString & return true; // Relative URL } +QString KURL::makeRelativePath(const KURL fromPath, const KURL toPath, + const char* separator = "/", + bool forceComparison = false) +{ +/* the aim of this function: + fromPath = "/home/gioele/proj/site/" + toPath = "/home/gioele/doc/images/icon.png" + relative = "../../doc/images/icon.png" +*/ + QString pwd = fromPath.path(); + QString target = toPath.path(); + + //in suffix we have everything that is after the path + //even custom fields! + QString suffix = toPath.url(); + suffix = suffix.mid(suffix.find(target) + target.length()); + + // if they are remote and from differents hosts then you can't have a + // relative name, unless you specify to force it + bool local = (fromPath.isLocalFile() && toPath.isLocalFile()); + bool sameHost = (fromPath.host() == toPath.host()); + if (!local && !sameHost && !forceComparison) + return QString::null; + + QStringList pwdSections = QStringList::split(separator, pwd); + QStringList targetSections = QStringList::split(separator, target); + QStringList::iterator pwdIt = pwdSections.begin(); + QStringList::iterator targetIt = targetSections.begin(); + + // strip common dirs + while ((*pwdIt) == (*targetIt)) { + ++pwdIt; + //we remove the common dirs so we can use .join() later + targetIt = targetSections.remove(targetIt); + } + + /* now start to build the relative... + we have: + from = "proj" "site" + to = "doc" "images" "icon.png" + */ + QString relative; + while (pwdIt != pwdSections.end()) { + // let's came back as many times as the number of dir in pwd + relative.append("../"); + ++pwdIt; + } + + // we've put enought "../", time to insert the target. + relative.append(targetSections.join(QString(separator))); + // ...and the suffix + relative.append(suffix); + + return relative; +} + KURL::List::List(const KURL &url) { append( url ); Index: kdecore/kurl.h =================================================================== RCS file: /cvs/kdelibs/kdecore/kurl.h,v retrieving revision 1.92 diff -u -3 -p -r1.92 kurl.h --- kdecore/kurl.h 2002/03/22 00:10:15 1.92 +++ kdecore/kurl.h 2002/03/30 23:06:53 @@ -576,6 +576,30 @@ public: */ static bool isRelativeURL(const QString &_url); + /** + * Convenience function. + * + * Returns the string to go from "fromPath" to "toPath" using "../". + *+ * KURL root("http://www.kde.org/developers"); + * KURL file("http://www.kde.org/common/style.css"); + * QString relativePath = KURL::makeRelativePath(root, file); + * // relativePath == "../common/style.css" + *+ * @param fromPath the origin + * @param toPath the destination + * @param separator the string that delimites dir names ('/' in *nix + * environments) + * @param forceComparison whether it should output the relative path even + * if is impossible to go from @p fromPath to @p toPath + * @return a QString with the relative path, QString::null if is impossible + * to have a relative path. + */ + static QString makeRelativePath(const KURL fromPath, + const KURL toPath, + const char* separator = "/", + bool forceComparison = false); + #ifdef KDE_NO_COMPAT private: #endif --------------Boundary-00=_X8DT4H7VQ09651I22XGM-- >> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<