• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • applications API Reference
  • KDE Home
  • Contact Us
 

Kate

  • kde-4.14
  • applications
  • kate
  • part
  • script
katescript.cpp
Go to the documentation of this file.
1 // This file is part of the KDE libraries
2 // Copyright (C) 2008 Paul Giannaros <paul@giannaros.org>
3 // Copyright (C) 2009, 2010 Dominik Haumann <dhaumann kde org>
4 // Copyright (C) 2010 Joseph Wenninger <jowenn@kde.org>
5 //
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Library General Public
8 // License as published by the Free Software Foundation; either
9 // version 2 of the License, or (at your option) version 3.
10 //
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Library General Public License for more details.
15 //
16 // You should have received a copy of the GNU Library General Public License
17 // along with this library; see the file COPYING.LIB. If not, write to
18 // the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 // Boston, MA 02110-1301, USA.
20 
21 #include "katescript.h"
22 #include "katescriptdocument.h"
23 #include "katescriptview.h"
24 #include "katescripthelpers.h"
25 #include "kateview.h"
26 #include "katedocument.h"
27 
28 #include <iostream>
29 
30 #include <QFile>
31 
32 #include <QScriptEngine>
33 #include <QScriptValue>
34 #include <QScriptContext>
35 #include <QFileInfo>
36 
37 #include <kdebug.h>
38 #include <klocale.h>
39 #include <kstandarddirs.h>
40 #include <klocalizedstring.h>
41 
42 //BEGIN conversion functions for Cursors and Ranges
44 static QScriptValue cursorToScriptValue(QScriptEngine *engine, const KTextEditor::Cursor &cursor)
45 {
46  QString code = QString("new Cursor(%1, %2);").arg(cursor.line())
47  .arg(cursor.column());
48  return engine->evaluate(code);
49 }
50 
52 static void cursorFromScriptValue(const QScriptValue &obj, KTextEditor::Cursor &cursor)
53 {
54  cursor.setPosition(obj.property("line").toInt32(),
55  obj.property("column").toInt32());
56 }
57 
59 static QScriptValue rangeToScriptValue(QScriptEngine *engine, const KTextEditor::Range &range)
60 {
61  QString code = QString("new Range(%1, %2, %3, %4);").arg(range.start().line())
62  .arg(range.start().column())
63  .arg(range.end().line())
64  .arg(range.end().column());
65  return engine->evaluate(code);
66 }
67 
69 static void rangeFromScriptValue(const QScriptValue &obj, KTextEditor::Range &range)
70 {
71  range.start().setPosition(obj.property("start").property("line").toInt32(),
72  obj.property("start").property("column").toInt32());
73  range.end().setPosition(obj.property("end").property("line").toInt32(),
74  obj.property("end").property("column").toInt32());
75 }
76 //END
77 
78 KateScript::KateScript(const QString &urlOrScript, enum InputType inputType)
79  : m_loaded(false)
80  , m_loadSuccessful(false)
81  , m_url(inputType == InputURL ? urlOrScript : QString())
82  , m_engine(0)
83  , m_document(0)
84  , m_view(0)
85  , m_inputType(inputType)
86  , m_script(inputType == InputSCRIPT ? urlOrScript : QString())
87 {
88 }
89 
90 KateScript::~KateScript()
91 {
92  if(m_loadSuccessful) {
93  // unload i18n catalog if available + loaded
94  if (!generalHeader().catalog().isEmpty()) {
95  kDebug() << "unloading i18n catalog" << generalHeader().catalog();
96  KGlobal::locale()->removeCatalog(generalHeader().catalog());
97  }
98 
99  // remove data...
100  delete m_engine;
101  delete m_document;
102  delete m_view;
103  }
104 }
105 
106 QString KateScript::backtrace( const QScriptValue& error, const QString& header )
107 {
108  QString bt;
109  if(!header.isNull())
110  bt += header + ":\n";
111  if(error.isError())
112  bt += error.toString() + '\n';
113 
114  bt += m_engine->uncaughtExceptionBacktrace().join("\n") + '\n';
115 
116  return bt;
117 }
118 
119 void KateScript::displayBacktrace(const QScriptValue &error, const QString &header)
120 {
121  if(!m_engine) {
122  std::cerr << "KateScript::displayBacktrace: no engine, cannot display error\n";
123  return;
124  }
125  std::cerr << "\033[31m" << qPrintable(backtrace(error, header)) << "\033[0m" << '\n';
126 }
127 
128 void KateScript::clearExceptions()
129 {
130  if (!load())
131  return;
132  m_engine->clearExceptions();
133 }
134 
135 QScriptValue KateScript::global(const QString &name)
136 {
137  // load the script if necessary
138  if(!load())
139  return QScriptValue();
140  return m_engine->globalObject().property(name);
141 }
142 
143 QScriptValue KateScript::function(const QString &name)
144 {
145  QScriptValue value = global(name);
146  if(!value.isFunction())
147  return QScriptValue();
148  return value;
149 }
150 
151 bool KateScript::load()
152 {
153  if(m_loaded)
154  return m_loadSuccessful;
155 
156  m_loaded = true;
157  m_loadSuccessful = false; // here set to false, and at end of function to true
158 
159  // read the script file into memory
160  QString source;
161  if (m_inputType == InputURL) {
162  if (!Kate::Script::readFile(m_url, source)) {
163  return false;
164  }
165  } else source = m_script;
166 
167  // create script engine, register meta types
168  m_engine = new QScriptEngine();
169  qScriptRegisterMetaType (m_engine, cursorToScriptValue, cursorFromScriptValue);
170  qScriptRegisterMetaType (m_engine, rangeToScriptValue, rangeFromScriptValue);
171 
172  // export read & require function and add the require guard object
173  m_engine->globalObject().setProperty("read", m_engine->newFunction(Kate::Script::read));
174  m_engine->globalObject().setProperty("require", m_engine->newFunction(Kate::Script::require));
175  m_engine->globalObject().setProperty("require_guard", m_engine->newObject());
176 
177  // export debug function
178  m_engine->globalObject().setProperty("debug", m_engine->newFunction(Kate::Script::debug));
179 
180  // export translation functions
181  m_engine->globalObject().setProperty("i18n", m_engine->newFunction(Kate::Script::i18n));
182  m_engine->globalObject().setProperty("i18nc", m_engine->newFunction(Kate::Script::i18nc));
183  m_engine->globalObject().setProperty("i18ncp", m_engine->newFunction(Kate::Script::i18ncp));
184  m_engine->globalObject().setProperty("i18np", m_engine->newFunction(Kate::Script::i18np));
185 
186  // register scripts itself
187  QScriptValue result = m_engine->evaluate(source, m_url);
188  if (hasException(result, m_url))
189  return false;
190 
191  // AFTER SCRIPT: set the view/document objects as necessary
192  m_engine->globalObject().setProperty("document", m_engine->newQObject(m_document = new KateScriptDocument()));
193  m_engine->globalObject().setProperty("view", m_engine->newQObject(m_view = new KateScriptView()));
194 
195  // yip yip!
196  m_loadSuccessful = true;
197 
198  // load i18n catalog if available
199  if (!generalHeader().catalog().isEmpty()) {
200  kDebug() << "loading i18n catalog" << generalHeader().catalog();
201  KGlobal::locale()->insertCatalog(generalHeader().catalog());
202  }
203  return true;
204 }
205 
206 bool KateScript::hasException(const QScriptValue& object, const QString& file)
207 {
208  if(m_engine->hasUncaughtException()) {
209  displayBacktrace(object, i18n("Error loading script %1\n", file));
210  m_errorMessage = i18n("Error loading script %1", file);
211  delete m_engine;
212  m_engine = 0;
213  m_loadSuccessful = false;
214  return true;
215  }
216  return false;
217 }
218 
219 bool KateScript::setView(KateView *view)
220 {
221  if (!load())
222  return false;
223  // setup the stuff
224  m_document->setDocument (view->doc());
225  m_view->setView (view);
226  return true;
227 }
228 
229 void KateScript::setGeneralHeader(const KateScriptHeader& generalHeader)
230 {
231  m_generalHeader = generalHeader;
232 }
233 
234 KateScriptHeader& KateScript::generalHeader()
235 {
236  return m_generalHeader;
237 }
238 
239 // kate: space-indent on; indent-width 2; replace-tabs on;
Kate::Script::debug
QScriptValue debug(QScriptContext *context, QScriptEngine *engine)
Definition: katescripthelpers.cpp:154
kateview.h
Kate::Script::i18n
QScriptValue i18n(QScriptContext *context, QScriptEngine *engine)
i18n("text", arguments [optional])
Definition: katescripthelpers.cpp:186
cursorFromScriptValue
static void cursorFromScriptValue(const QScriptValue &obj, KTextEditor::Cursor &cursor)
Converstion function from QtScript cursor to KTextEditor::Cursor.
Definition: katescript.cpp:52
KateScript::KateScript
KateScript(const QString &urlOrScript, enum InputType inputType=InputURL)
Create a new script representation, passing either a file or the script content urlOrScript to it...
Definition: katescript.cpp:78
Kate::Script::i18np
QScriptValue i18np(QScriptContext *context, QScriptEngine *engine)
i18np("singular", "plural", number, arguments [optional])
Definition: katescripthelpers.cpp:239
Kate::Script::i18nc
QScriptValue i18nc(QScriptContext *context, QScriptEngine *engine)
i18nc("context", "text", arguments [optional])
Definition: katescripthelpers.cpp:210
KateScript::InputURL
Definition: katescript.h:110
QScriptEngine::uncaughtExceptionBacktrace
QStringList uncaughtExceptionBacktrace() const
QScriptEngine::newObject
QScriptValue newObject()
QScriptValue
katedocument.h
QScriptEngine::evaluate
QScriptValue evaluate(const QString &program, const QString &fileName, int lineNumber)
KateScript::global
QScriptValue global(const QString &name)
Get a QScriptValue for a global item in the script given its name, or an invalid QScriptValue if no s...
Definition: katescript.cpp:135
katescript.h
KateScript::backtrace
QString backtrace(const QScriptValue &error, const QString &header=QString())
Returns the backtrace when a script has errored out.
Definition: katescript.cpp:106
katescripthelpers.h
QScriptEngine::hasUncaughtException
bool hasUncaughtException() const
KateScript::load
bool load()
Load the script.
Definition: katescript.cpp:151
KateScriptHeader
Definition: katescript.h:53
QStringList::join
QString join(const QString &separator) const
QScriptValue::toString
QString toString() const
Kate::Script::i18ncp
QScriptValue i18ncp(QScriptContext *context, QScriptEngine *engine)
i18ncp("context", "singular", "plural", number, arguments [optional])
Definition: katescripthelpers.cpp:273
QString::isNull
bool isNull() const
Kate::Script::readFile
bool readFile(const QString &sourceUrl, QString &sourceCode)
read complete file contents, helper
Definition: katescripthelpers.cpp:41
QScriptEngine
Kate::Script::require
QScriptValue require(QScriptContext *context, QScriptEngine *engine)
Definition: katescripthelpers.cpp:94
QScriptEngine::clearExceptions
void clearExceptions()
KateScriptDocument
Thinish wrapping around KateDocument, exposing the methods we want exposed and adding some helper met...
Definition: katescriptdocument.h:46
QString::isEmpty
bool isEmpty() const
KateScript::~KateScript
virtual ~KateScript()
Definition: katescript.cpp:90
Kate::Script::read
QScriptValue read(QScriptContext *context, QScriptEngine *)
Definition: katescripthelpers.cpp:58
KateScriptDocument::setDocument
void setDocument(KateDocument *document)
Definition: katescriptdocument.cpp:39
KateScript::generalHeader
KateScriptHeader & generalHeader()
Return the general header.
Definition: katescript.cpp:234
QString
KateScriptHeader::catalog
const QString & catalog() const
Definition: katescript.h:83
KateScript::clearExceptions
void clearExceptions()
Clears any uncaught exceptions in the script engine.
Definition: katescript.cpp:128
KateScript::setGeneralHeader
void setGeneralHeader(const KateScriptHeader &generalHeader)
set the general header after construction of the script
Definition: katescript.cpp:229
QScriptValue::property
QScriptValue property(const QString &name, const ResolveFlags &mode) const
KateView
Definition: kateview.h:77
QScriptValue::isFunction
bool isFunction() const
katescriptdocument.h
KateScript::m_engine
QScriptEngine * m_engine
The Qt interpreter for this script.
Definition: katescript.h:188
rangeToScriptValue
static QScriptValue rangeToScriptValue(QScriptEngine *engine, const KTextEditor::Range &range)
Converstion function from QtScript range to KTextEditor::Range.
Definition: katescript.cpp:59
KateScriptView
Thinish wrapping around KateView, exposing the methods we want exposed and adding some helper methods...
Definition: katescriptview.h:43
QScriptValue::toInt32
qint32 toInt32() const
QScriptEngine::newQObject
QScriptValue newQObject(QObject *object, ValueOwnership ownership, const QObjectWrapOptions &options)
KateScript::InputType
InputType
Definition: katescript.h:109
KateScript::function
QScriptValue function(const QString &name)
Return a function in the script of the given name, or an invalid QScriptValue if no such function exi...
Definition: katescript.cpp:143
KateScript::setView
bool setView(KateView *view)
set view for this script for the execution will trigger load!
Definition: katescript.cpp:219
rangeFromScriptValue
static void rangeFromScriptValue(const QScriptValue &obj, KTextEditor::Range &range)
Converstion function from QtScript range to KTextEditor::Range.
Definition: katescript.cpp:69
KateScript::displayBacktrace
void displayBacktrace(const QScriptValue &error, const QString &header=QString())
Displays the backtrace when a script has errored out.
Definition: katescript.cpp:119
QScriptValue::isError
bool isError() const
KateScriptView::setView
void setView(KateView *view)
Definition: katescriptview.cpp:32
KateView::doc
KateDocument * doc()
accessor to katedocument pointer
Definition: kateview.h:553
QScriptEngine::newFunction
QScriptValue newFunction(FunctionSignature fun, int length)
QScriptEngine::globalObject
QScriptValue globalObject() const
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
katescriptview.h
cursorToScriptValue
static QScriptValue cursorToScriptValue(QScriptEngine *engine, const KTextEditor::Cursor &cursor)
Converstion function from KTextEditor::Cursor to QtScript cursor.
Definition: katescript.cpp:44
KateScript::hasException
bool hasException(const QScriptValue &object, const QString &file)
Checks for exception and gives feedback on the console.
Definition: katescript.cpp:206
QScriptValue::setProperty
void setProperty(const QString &name, const QScriptValue &value, const PropertyFlags &flags)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Sat May 9 2020 03:56:58 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

Kate

Skip menu "Kate"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

applications API Reference

Skip menu "applications API Reference"
  •   kate
  •       kate
  •   KTextEditor
  •   Kate
  • Konsole

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal