• 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
katescripthelpers.cpp
Go to the documentation of this file.
1 // This file is part of the KDE libraries
2 // Copyright (C) 2010 Dominik Haumann <dhaumann kde org>
3 //
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Library General Public
6 // License as published by the Free Software Foundation; either
7 // version 2 of the License, or (at your option) version 3.
8 //
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Library General Public License for more details.
13 //
14 // You should have received a copy of the GNU Library General Public License
15 // along with this library; see the file COPYING.LIB. If not, write to
16 // the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 // Boston, MA 02110-1301, USA.
18 
19 #include "katescripthelpers.h"
20 #include "katescript.h"
21 #include "katescriptdocument.h"
22 #include "katescriptview.h"
23 #include "kateview.h"
24 #include "katedocument.h"
25 
26 #include <iostream>
27 
28 #include <QScriptEngine>
29 #include <QScriptValue>
30 #include <QScriptContext>
31 #include <QFile>
32 
33 #include <kdebug.h>
34 #include <klocale.h>
35 #include <klocalizedstring.h>
36 #include <kstandarddirs.h>
37 
38 namespace Kate {
39 namespace Script {
40 
41 bool readFile(const QString& sourceUrl, QString& sourceCode)
42 {
43  sourceCode = QString();
44 
45  QFile file(sourceUrl);
46  if (!file.open(QIODevice::ReadOnly)) {
47  kDebug(13050) << i18n("Unable to find '%1'", sourceUrl);
48  return false;
49  } else {
50  QTextStream stream(&file);
51  stream.setCodec("UTF-8");
52  sourceCode = stream.readAll();
53  file.close();
54  }
55  return true;
56 }
57 
58 QScriptValue read(QScriptContext *context, QScriptEngine *)
59 {
63  QString fullContent;
64  for(int i = 0; i < context->argumentCount(); ++i) {
69  const QString name = context->argument(i).toString();
70  const QString fullName = KGlobal::dirs()->findResource ("data", "katepart/script/files/" + name);
71  if (fullName.isEmpty())
72  continue;
73 
78  QString content;
79  if (!readFile (fullName, content))
80  continue;
81 
85  fullContent += content;
86  }
87 
91  return QScriptValue (fullContent);
92 }
93 
94 QScriptValue require(QScriptContext *context, QScriptEngine *engine)
95 {
99  for(int i = 0; i < context->argumentCount(); ++i) {
104  const QString name = context->argument(i).toString();
105  const QString fullName = KGlobal::dirs()->findResource ("data", "katepart/script/libraries/" + name);
106  if (fullName.isEmpty())
107  continue;
108 
112  QScriptValue require_guard = engine->globalObject().property ("require_guard");
113  if (require_guard.property (fullName).toBool ())
114  continue;
115 
120  QString code;
121  if (!readFile (fullName, code))
122  continue;
123 
130  QScriptContext *context = engine->currentContext();
131  QScriptContext *parent = context->parentContext();
132  if (parent) {
133  context->setActivationObject(context->parentContext()->activationObject());
134  context->setThisObject(context->parentContext()->thisObject());
135  }
136 
140  engine->evaluate (code, fullName);
141 
145  require_guard.setProperty (fullName, QScriptValue (true));
146  }
147 
151  return engine->nullValue();
152 }
153 
154 QScriptValue debug(QScriptContext *context, QScriptEngine *engine)
155 {
156  QStringList message;
157  for(int i = 0; i < context->argumentCount(); ++i) {
158  message << context->argument(i).toString();
159  }
160  // debug in blue to distance from other debug output if necessary
161  std::cerr << "\033[31m" << qPrintable(message.join(" ")) << "\033[0m\n";
162  return engine->nullValue();
163 }
164 
165 //BEGIN code adapted from kdelibs/kross/modules/translation.cpp
167 KLocalizedString substituteArguments( const KLocalizedString &kls, const QVariantList &arguments, int max = 99 )
168 {
169  KLocalizedString ls = kls;
170  int cnt = qMin( arguments.count(), max ); // QString supports max 99
171  for ( int i = 0; i < cnt; ++i ) {
172  QVariant arg = arguments[i];
173  switch ( arg.type() ) {
174  case QVariant::Int: ls = ls.subs(arg.toInt()); break;
175  case QVariant::UInt: ls = ls.subs(arg.toUInt()); break;
176  case QVariant::LongLong: ls = ls.subs(arg.toLongLong()); break;
177  case QVariant::ULongLong: ls = ls.subs(arg.toULongLong()); break;
178  case QVariant::Double: ls = ls.subs(arg.toDouble()); break;
179  default: ls = ls.subs(arg.toString()); break;
180  }
181  }
182  return ls;
183 }
184 
186 QScriptValue i18n( QScriptContext *context, QScriptEngine *engine )
187 {
188  Q_UNUSED(engine)
189  QString text;
190  QVariantList args;
191  const int argCount = context->argumentCount();
192 
193  if (argCount == 0) {
194  kWarning(13050) << "wrong usage of i18n:" << context->backtrace().join("\n\t");
195  }
196 
197  if (argCount > 0) {
198  text = context->argument(0).toString();
199  }
200 
201  for (int i = 1; i < argCount; ++i) {
202  args << context->argument(i).toVariant();
203  }
204 
205  KLocalizedString ls = ki18n(text.toUtf8());
206  return substituteArguments( ls, args ).toString();
207 }
208 
210 QScriptValue i18nc( QScriptContext *context, QScriptEngine *engine )
211 {
212  Q_UNUSED(engine)
213  QString text;
214  QString textContext;
215  QVariantList args;
216  const int argCount = context->argumentCount();
217 
218  if (argCount < 2) {
219  kWarning(13050) << "wrong usage of i18nc:" << context->backtrace().join("\n\t");
220  }
221 
222  if (argCount > 0) {
223  textContext = context->argument(0).toString();
224  }
225 
226  if (argCount > 1) {
227  text = context->argument(1).toString();
228  }
229 
230  for (int i = 2; i < argCount; ++i) {
231  args << context->argument(i).toVariant();
232  }
233 
234  KLocalizedString ls = ki18nc(textContext.toUtf8(), text.toUtf8());
235  return substituteArguments( ls, args ).toString();
236 }
237 
239 QScriptValue i18np( QScriptContext *context, QScriptEngine *engine )
240 {
241  Q_UNUSED(engine)
242  QString trSingular;
243  QString trPlural;
244  int number = 0;
245  QVariantList args;
246  const int argCount = context->argumentCount();
247 
248  if (argCount < 3) {
249  kWarning(13050) << "wrong usage of i18np:" << context->backtrace().join("\n\t");
250  }
251 
252  if (argCount > 0) {
253  trSingular = context->argument(0).toString();
254  }
255 
256  if (argCount > 1) {
257  trPlural = context->argument(1).toString();
258  }
259 
260  if (argCount > 2) {
261  number = context->argument(2).toInt32();
262  }
263 
264  for (int i = 3; i < argCount; ++i) {
265  args << context->argument(i).toVariant();
266  }
267 
268  KLocalizedString ls = ki18np(trSingular.toUtf8(), trPlural.toUtf8()).subs(number);
269  return substituteArguments( ls, args, 98 ).toString();
270 }
271 
273 QScriptValue i18ncp( QScriptContext *context, QScriptEngine *engine )
274 {
275  Q_UNUSED(engine)
276  QString trContext;
277  QString trSingular;
278  QString trPlural;
279  int number = 0;
280  QVariantList args;
281  const int argCount = context->argumentCount();
282 
283  if (argCount < 4) {
284  kWarning(13050) << "wrong usage of i18ncp:" << context->backtrace().join("\n\t");
285  }
286 
287  if (argCount > 0) {
288  trContext = context->argument(0).toString();
289  }
290 
291  if (argCount > 1) {
292  trSingular = context->argument(1).toString();
293  }
294 
295  if (argCount > 2) {
296  trPlural = context->argument(2).toString();
297  }
298 
299  if (argCount > 3) {
300  number = context->argument(3).toInt32();
301  }
302 
303  for (int i = 4; i < argCount; ++i) {
304  args << context->argument(i).toVariant();
305  }
306 
307  KLocalizedString ls = ki18ncp(trContext.toUtf8(), trSingular.toUtf8(), trPlural.toUtf8()).subs( number );
308  return substituteArguments( ls, args, 98 ).toString();
309 }
310 //END code adapted from kdelibs/kross/modules/translation.cpp
311 
312 }
313 }
314 
315 // kate: space-indent on; indent-width 2; replace-tabs on;
QTextStream::setCodec
void setCodec(QTextCodec *codec)
QVariant::toLongLong
qlonglong toLongLong(bool *ok) const
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
QScriptContext::setThisObject
void setThisObject(const QScriptValue &thisObject)
Kate::Script::i18np
QScriptValue i18np(QScriptContext *context, QScriptEngine *engine)
i18np("singular", "plural", number, arguments [optional])
Definition: katescripthelpers.cpp:239
QScriptContext::backtrace
QStringList backtrace() const
Kate::Script::i18nc
QScriptValue i18nc(QScriptContext *context, QScriptEngine *engine)
i18nc("context", "text", arguments [optional])
Definition: katescripthelpers.cpp:210
QScriptValue
katedocument.h
QScriptEngine::evaluate
QScriptValue evaluate(const QString &program, const QString &fileName, int lineNumber)
katescript.h
katescripthelpers.h
QStringList::join
QString join(const QString &separator) const
QScriptValue::toVariant
QVariant toVariant() const
QScriptContext::argumentCount
int argumentCount() const
QVariant::toULongLong
qulonglong toULongLong(bool *ok) const
QScriptEngine::currentContext
QScriptContext * currentContext() const
QScriptValue::toString
QString toString() const
QFile
Kate::Script::i18ncp
QScriptValue i18ncp(QScriptContext *context, QScriptEngine *engine)
i18ncp("context", "singular", "plural", number, arguments [optional])
Definition: katescripthelpers.cpp:273
QTextStream
Kate::Script::readFile
bool readFile(const QString &sourceUrl, QString &sourceCode)
read complete file contents, helper
Definition: katescripthelpers.cpp:41
QScriptContext::setActivationObject
void setActivationObject(const QScriptValue &activation)
QScriptEngine
Kate::Script::require
QScriptValue require(QScriptContext *context, QScriptEngine *engine)
Definition: katescripthelpers.cpp:94
QVariant::toUInt
uint toUInt(bool *ok) const
QVariant::toInt
int toInt(bool *ok) const
QScriptValue::toBool
bool toBool() const
QString::isEmpty
bool isEmpty() const
Kate::Script::read
QScriptValue read(QScriptContext *context, QScriptEngine *)
Definition: katescripthelpers.cpp:58
QString
QScriptContext
QScriptEngine::nullValue
QScriptValue nullValue()
QFile::open
virtual bool open(QFlags< QIODevice::OpenModeFlag > mode)
QScriptValue::property
QScriptValue property(const QString &name, const ResolveFlags &mode) const
QStringList
QScriptContext::thisObject
QScriptValue thisObject() const
QScriptContext::parentContext
QScriptContext * parentContext() const
katescriptdocument.h
QFile::close
virtual void close()
Kate::Script::substituteArguments
KLocalizedString substituteArguments(const KLocalizedString &kls, const QVariantList &arguments, int max=99)
helper function to do the substitution from QtScript > QVariant > real values
Definition: katescripthelpers.cpp:167
QScriptValue::toInt32
qint32 toInt32() const
QVariant::toDouble
double toDouble(bool *ok) const
QScriptContext::argument
QScriptValue argument(int index) const
QScriptContext::activationObject
QScriptValue activationObject() const
QVariant::type
Type type() const
QTextStream::readAll
QString readAll()
QScriptEngine::globalObject
QScriptValue globalObject() const
QVariant::toString
QString toString() const
katescriptview.h
QVariant
QScriptValue::setProperty
void setProperty(const QString &name, const QScriptValue &value, const PropertyFlags &flags)
QString::toUtf8
QByteArray toUtf8() const
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