File indexing completed on 2024-05-26 11:22:07

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2009-2012 Alexander Rieder <alexanderrieder@gmail.com>
0004 */
0005 
0006 #include "maximasyntaxhelpobject.h"
0007 #include "maximakeywords.h"
0008 
0009 #include "maximasession.h"
0010 #include "maximaexpression.h"
0011 
0012 #include "result.h"
0013 
0014 #include <QDebug>
0015 
0016 MaximaSyntaxHelpObject::MaximaSyntaxHelpObject(const QString& cmd, MaximaSession* session) : Cantor::SyntaxHelpObject(cmd, session)
0017 {
0018     m_expression=nullptr;
0019 }
0020 
0021 void MaximaSyntaxHelpObject::fetchInformation()
0022 {
0023     bool isValid=false;
0024     for (const QString& func : MaximaKeywords::instance()->functions())
0025     {
0026         if(command()==func)
0027         {
0028             isValid=true;
0029             break;
0030         }
0031     }
0032 
0033     if(isValid)
0034     {
0035         if (session()->status() != Cantor::Session::Disable)
0036         {
0037             if (m_expression)
0038                 return;
0039 
0040             //use the lisp command, instead of directly calling the
0041             //maxima function "describe" to avoid generating a new
0042             //output label that would mess up history
0043             QString cmd=QLatin1String(":lisp(cl-info::info-exact \"%1\")");
0044 
0045             m_expression=session()->evaluateExpression(cmd.arg(command()), Cantor::Expression::FinishingBehavior::DoNotDelete, true);
0046 
0047             connect(m_expression, &Cantor::Expression::statusChanged, this, &MaximaSyntaxHelpObject::expressionChangedStatus);
0048         }
0049         else
0050             // We can't get function's detailed description, because session not login yet, so do nothing
0051             emit done();
0052 
0053     }else
0054     {
0055         qDebug()<<"invalid syntax request";
0056         emit done();
0057     }
0058 }
0059 
0060 void MaximaSyntaxHelpObject::expressionChangedStatus(Cantor::Expression::Status status)
0061 {
0062     switch(status)
0063     {
0064         case Cantor::Expression::Done:
0065         {
0066             qDebug()<<"expr done";
0067             QString text=m_expression->result()->data().toString();
0068             QStringList lines=text.split(QLatin1Char('\n'));
0069 
0070             QString syntax;
0071             for (QString line : lines)
0072             {
0073                 if(line.endsWith(QLatin1Char('\r')))
0074                     line.chop(1);
0075                 if(line.startsWith(QLatin1String("-- Function:")))
0076                 {
0077                     line.remove(QLatin1String("-- Function:"));
0078                     line.remove(QLatin1String("<br/>"));
0079                 }
0080                 syntax+=line;
0081                 qDebug() << "line: " << line;
0082             }
0083 
0084             setHtml(QLatin1String("<p style='white-space:pre'>")+syntax+QLatin1String("</p>"));
0085             emit done();
0086 
0087             m_expression->deleteLater();
0088             m_expression=nullptr;
0089             break;
0090         }
0091         case Cantor::Expression::Error:
0092         {
0093             qWarning() << "syntax object error" << m_expression->result()->toHtml();
0094             emit done();
0095 
0096             m_expression->deleteLater();
0097             m_expression=nullptr;
0098             break;
0099         }
0100         default:
0101             break;
0102     }
0103 }