File indexing completed on 2024-05-05 11:55:47
0001 /* 0002 SPDX-License-Identifier: GPL-2.0-or-later 0003 SPDX-FileCopyrightText: 2016 Ivan Lakhtanov <ivan.lakhtanov@gmail.com> 0004 */ 0005 #include "juliaexpression.h" 0006 0007 #include <QDir> 0008 #include <QUuid> 0009 0010 #include "settings.h" 0011 #include "juliasession.h" 0012 #include "juliakeywords.h" 0013 #include "textresult.h" 0014 #include "imageresult.h" 0015 0016 const QStringList JuliaExpression::plotExtensions({ 0017 QLatin1String("svg"), 0018 QLatin1String("png") 0019 }); 0020 0021 JuliaExpression::JuliaExpression(Cantor::Session *session, bool internal) 0022 : Cantor::Expression(session, internal) 0023 { 0024 } 0025 0026 void JuliaExpression::evaluate() 0027 { 0028 auto juliaSession = static_cast<JuliaSession *>(session()); 0029 0030 juliaSession->enqueueExpression(this); 0031 } 0032 0033 QString JuliaExpression::internalCommand() 0034 { 0035 QString cmd = command(); 0036 auto juliaSession = static_cast<JuliaSession *>(session()); 0037 0038 // Plots integration 0039 m_plot_filename.clear(); 0040 // Not sure about how this code will work with two graphic packages activated in the same time (they both will save to one file?)... 0041 if (!session()->enabledGraphicPackages().isEmpty() && !isInternal()) 0042 { 0043 QStringList cmdWords = cmd.split(QRegularExpression(QStringLiteral("\\b")), QString::SkipEmptyParts); 0044 for (const Cantor::GraphicPackage& package : session()->enabledGraphicPackages()) 0045 { 0046 for (const QString& plotCmd : package.plotCommandPrecentsKeywords()) 0047 if (cmdWords.contains(plotCmd)) 0048 { 0049 if (package.isHavePlotCommand()) 0050 { 0051 m_plot_filename = juliaSession->plotFilePrefixPath() + QString::number(id()) + QLatin1String(".") + plotExtensions[JuliaSettings::inlinePlotFormat()]; 0052 cmd.append(QLatin1String("\n")); 0053 cmd.append(package.savePlotCommand(juliaSession->plotFilePrefixPath(), id(), plotExtensions[JuliaSettings::inlinePlotFormat()])); 0054 } 0055 break; 0056 } 0057 } 0058 } 0059 0060 qDebug() << "expression internal command:" << cmd; 0061 0062 return cmd; 0063 } 0064 0065 void JuliaExpression::finalize(const QString& output, const QString& error, bool wasException) 0066 { 0067 if (wasException) { 0068 setErrorMessage(error); 0069 if (!output.isEmpty()) 0070 setResult(new Cantor::TextResult(output)); 0071 setStatus(Cantor::Expression::Error); 0072 } else { 0073 if (!m_plot_filename.isEmpty() && QFileInfo(m_plot_filename).exists()) { 0074 // If we have plot in result, show it 0075 setResult(new Cantor::ImageResult(QUrl::fromLocalFile(m_plot_filename))); 0076 } else { 0077 if (!output.isEmpty()) 0078 setResult(new Cantor::TextResult(output)); 0079 } 0080 setStatus(Cantor::Expression::Done); 0081 } 0082 }