@@ -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+
97105void 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
129187QStringList 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);
0 commit comments