Skip to content

Commit e1896ad

Browse files
committed
speed-up miktex package scan by using a miktex ini file
1 parent afc113c commit e1896ad

File tree

2 files changed

+77
-4
lines changed

2 files changed

+77
-4
lines changed

src/kpathseaParser.cpp

Lines changed: 74 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ MiktexPackageScanner::MiktexPackageScanner(QString mpmcmd, QString settingsDir,
8484
: PackageScanner(parent)
8585
{
8686
this->mpmCmd = mpmcmd;
87+
this->kpseWhichCmd = mpmcmd.replace("mpm.exe","kpsewhich.exe");
8788
this->settingsDir = settingsDir;
8889
}
8990

@@ -94,6 +95,13 @@ QString MiktexPackageScanner::mpm(const QString &arg)
9495
return execProgram.m_standardOutput;
9596
}
9697

98+
QString MiktexPackageScanner::kpsewhich(const QString &arg)
99+
{
100+
ExecProgram execProgram(kpseWhichCmd + " " + arg, "");
101+
execProgram.execAndWait();
102+
return execProgram.m_standardOutput;
103+
}
104+
97105
void MiktexPackageScanner::savePackageMap(const QHash<QString, QStringList> &map)
98106
{
99107
QFile f(ensureTrailingDirSeparator(settingsDir) + "miktexPackageNames.dat");
@@ -123,7 +131,57 @@ QHash<QString, QStringList> MiktexPackageScanner::loadPackageMap()
123131
result.insert(lst[0], lst[1].split(","));
124132
}
125133
}
126-
return result;
134+
return result;
135+
}
136+
137+
QHash<QString, QStringList> MiktexPackageScanner::loadMiktexPackageMap()
138+
{
139+
QHash<QString, QStringList> result;
140+
// try to load packages-manifest.ini
141+
QString txt=kpsewhich("-show-path=web2c");
142+
QStringList paths=txt.split(';');
143+
paths.pop_front(); // remove .
144+
QString fn;
145+
foreach(QString path,paths){
146+
path.replace("web2c//","miktex/config/package-manifests.ini");
147+
if(QFileInfo::exists(path.simplified())){
148+
fn=path.simplified();
149+
break;
150+
}
151+
}
152+
if(!fn.isEmpty()){
153+
QFile f(fn);
154+
if (f.open(QFile::ReadOnly | QFile::Text)) {
155+
QTextStream in(&f);
156+
QString line;
157+
QStringList lst;
158+
QString name;
159+
while (!in.atEnd()) {
160+
line = in.readLine();
161+
if(line.startsWith('[')){
162+
if(!name.isEmpty()){
163+
result.insert(name, lst);
164+
lst.clear();
165+
}
166+
// package name
167+
name=line.mid(1,line.size()-2);
168+
}
169+
if(line.startsWith("run[]=")){
170+
QString fn=line.mid(6);
171+
if(fn.contains('/')){
172+
int i=fn.lastIndexOf('/');
173+
fn=fn.mid(i+1);
174+
}
175+
if (fn.endsWith(".sty") || fn.endsWith(".cls")) {
176+
fn.chop(4);
177+
lst<<fn;
178+
}
179+
}
180+
181+
}
182+
}
183+
}
184+
return result;
127185
}
128186

129187
QStringList MiktexPackageScanner::stysForPackage(const QString &pck)
@@ -141,6 +199,10 @@ QStringList MiktexPackageScanner::stysForPackage(const QString &pck)
141199
QStringList styles=rest.split(';');
142200
foreach(auto fn,styles){
143201
fn = QFileInfo(fn).fileName();
202+
if(fn.contains('/')){
203+
int i=fn.lastIndexOf('/');
204+
fn=fn.mid(i+1);
205+
}
144206
if (fn.endsWith(".sty") || fn.endsWith(".cls")) {
145207
fn.chop(4);
146208
result.append(fn);
@@ -152,6 +214,10 @@ QStringList MiktexPackageScanner::stysForPackage(const QString &pck)
152214
QString fn = l.simplified();
153215
if (fn.endsWith(":")) break; // start of a new section
154216
fn = QFileInfo(fn).fileName();
217+
if(fn.contains('/')){
218+
int i=fn.lastIndexOf('/');
219+
fn=fn.mid(i+1);
220+
}
155221
if (fn.endsWith(".sty") || fn.endsWith(".cls")) {
156222
fn.chop(4);
157223
result.append(fn);
@@ -166,6 +232,7 @@ void MiktexPackageScanner::run()
166232
std::set<QString> results;
167233

168234
QHash<QString, QStringList> cachedStys = loadPackageMap();
235+
QHash<QString, QStringList> cachedMiktexStys = loadMiktexPackageMap();
169236

170237
QStringList lstOfPackages = mpm("--list").split("\n");
171238
foreach (QString pck, lstOfPackages) {
@@ -179,8 +246,12 @@ void MiktexPackageScanner::run()
179246
if (cachedStys.contains(pck)) {
180247
stys = cachedStys.value(pck);
181248
} else {
182-
stys = stysForPackage(pck);
183-
cachedStys.insert(pck, stys);
249+
if(cachedMiktexStys.contains(pck)){
250+
stys = cachedMiktexStys.value(pck);
251+
}else{
252+
stys = stysForPackage(pck);
253+
cachedStys.insert(pck, stys);
254+
}
184255
}
185256
foreach (const QString &sty, stys) {
186257
results.insert(sty);

src/kpathseaParser.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,14 @@ class MiktexPackageScanner : public PackageScanner
5454
protected:
5555
void run();
5656
QString mpm(const QString &arg);
57+
QString kpsewhich(const QString &arg);
5758
void savePackageMap(const QHash<QString, QStringList> &map);
5859
QHash<QString, QStringList> loadPackageMap();
60+
QHash<QString, QStringList> loadMiktexPackageMap();
5961
QStringList stysForPackage(const QString &pck);
6062

6163
private:
62-
QString mpmCmd;
64+
QString mpmCmd,kpseWhichCmd;
6365
QString settingsDir;
6466
};
6567

0 commit comments

Comments
 (0)