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.
110 lines
3.3 KiB
110 lines
3.3 KiB
// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; c-brace-offset: 0; -*- |
|
// |
|
// C++ Implementation: dvisourcesplitter |
|
// |
|
// Author: Jeroen Wijnhout <Jeroen.Wijnhout@kdemail.net>, (C) 2004 |
|
// |
|
// Copyright: See COPYING file that comes with this distribution |
|
// |
|
|
|
#include <config.h> |
|
|
|
#include "debug_dvi.h" |
|
#include "dvisourcesplitter.h" |
|
|
|
#include <QDir> |
|
|
|
//#define DEBUG_SOURCESPLITTER |
|
|
|
DVI_SourceFileSplitter::DVI_SourceFileSplitter(const QString &srclink, const QString &dviFile) |
|
{ |
|
QString filepart = srclink, linepart; |
|
// if sourcefilename starts with a number |
|
// then there could be a mix up, i.e. src:123file.tex |
|
// line 123 and file.tex or line 12 and 3file.tex? |
|
bool possibleNumberMixUp = false; |
|
|
|
#ifdef DEBUG_SOURCESPLITTER |
|
qCDebug(OkularDviDebug) << "DVI_SourceSplitter: srclink " << srclink; |
|
#endif |
|
|
|
// remove src: if necessary |
|
if (filepart.left(4) == QLatin1String("src:")) { |
|
filepart = srclink.mid(4); |
|
} |
|
|
|
// split first |
|
quint32 max = filepart.length(), i = 0; |
|
for (i = 0; i < max; ++i) { |
|
if (!filepart[i].isDigit()) { |
|
break; |
|
} |
|
} |
|
linepart = filepart.left(i); |
|
filepart = filepart.mid(i); |
|
|
|
// check for number mix up |
|
if (filepart[0] != QLatin1Char(' ') && (linepart.length() != 1)) { |
|
possibleNumberMixUp = true; |
|
} |
|
|
|
// remove a spaces |
|
filepart = filepart.trimmed(); |
|
linepart = linepart.trimmed(); |
|
|
|
#ifdef DEBUG_SOURCESPLITTER |
|
qCDebug(OkularDviDebug) << "DVI_SourceSplitter: filepart " << filepart << " linepart " << linepart; |
|
#endif |
|
|
|
// test if the file exists |
|
m_fileInfo.setFile(QFileInfo(dviFile).absoluteDir(), filepart); |
|
bool fiExists = m_fileInfo.exists(); |
|
|
|
// if it doesn't exist, but adding ".tex" |
|
if (!fiExists && QFileInfo::exists(m_fileInfo.absoluteFilePath() + QStringLiteral(".tex"))) { |
|
m_fileInfo.setFile(m_fileInfo.absoluteFilePath() + QStringLiteral(".tex")); |
|
} |
|
|
|
// if that doesn't help either, perhaps the file started with a |
|
// number: move the numbers from the sourceline to the filename |
|
// one by one (also try to add .tex repeatedly) |
|
if (possibleNumberMixUp && !fiExists) { |
|
QFileInfo tempInfo(m_fileInfo); |
|
QString tempFileName = tempInfo.fileName(); |
|
quint32 index, maxindex = linepart.length(); |
|
bool found = false; |
|
for (index = 1; index < maxindex; ++index) { |
|
tempInfo.setFile(linepart.right(index) + tempFileName); |
|
#ifdef DEBUG_SOURCESPLITTER |
|
qCDebug(OkularDviDebug) << "DVI_SourceSplitter: trying " << tempInfo.fileName(); |
|
#endif |
|
if (tempInfo.exists()) { |
|
found = true; |
|
break; |
|
} |
|
tempInfo.setFile(linepart.right(index) + tempFileName + QStringLiteral(".tex")); |
|
#ifdef DEBUG_SOURCESPLITTER |
|
qCDebug(OkularDviDebug) << "DVI_SourceSplitter: trying " << tempInfo.fileName(); |
|
#endif |
|
if (tempInfo.exists()) { |
|
found = true; |
|
break; |
|
} |
|
} |
|
|
|
if (found) { |
|
m_fileInfo = tempInfo; |
|
linepart = linepart.left(maxindex - index); |
|
} |
|
} |
|
|
|
bool ok; |
|
m_line = linepart.toInt(&ok); |
|
if (!ok) { |
|
m_line = 0; |
|
} |
|
|
|
#ifdef DEBUG_SOURCESPLITTER |
|
qCDebug(OkularDviDebug) << "DVI_SourceSplitter: result: file " << m_fileInfo.absoluteFilePath() << " line " << m_line; |
|
#endif |
|
}
|
|
|