Add initial support for built-in javascript functs

Summary:
This starts by adding support for AFSimple_Calculate which
is the standard "calculate" function in Adobe Acrobat Pro.

Reviewers: #okular

Subscribers: aacid

Tags: #okular

Maniphest Tasks: T7805

Differential Revision: https://phabricator.kde.org/D10049
remotes/origin/Applications/18.04
Andre Heinecke 8 years ago committed by Albert Astals Cid
parent d50c06df25
commit cead2bbef3
  1. 4
      CMakeLists.txt
  2. 62
      core/script/builtin.js
  3. 5
      core/script/builtin.qrc
  4. 18
      core/scripter.cpp

@ -175,6 +175,10 @@ set(okularcore_SRCS
core/synctex/synctex_parser_utils.c
)
qt5_add_resources(okularcore_SRCS
core/script/builtin.qrc
)
ki18n_wrap_ui(okularcore_SRCS
conf/textdocumentsettings.ui
)

@ -0,0 +1,62 @@
/***************************************************************************
* Copyright (C) 2018 Intevation GmbH <intevation@intevation.de> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
/* Builtin functions for Okular's PDF JavaScript interpretation. */
/** AFSimple_Calculate
*
* cFunction is a string that identifies the operation.
* It is one of AVG, SUM, PRD, MIN, MAX
* cFields is an array of the names of the fields used to calculate.
*/
function AFSimple_Calculate( cFunction, cFields )
{
var ret = 0;
if ( cFunction === "PRD" )
{
ret = 1;
}
for (i = 0; i < cFields.length; i++)
{
var field = Doc.getField( cFields[i] );
var val = Number( field.value );
if ( cFunction === "SUM" || cFunction === "AVG" )
{
ret += val;
}
else if ( cFunction === "PRD" )
{
ret *= val;
}
else if ( cFunction === "MIN" )
{
if ( i === 0 || val < ret )
{
ret = val;
}
}
else if ( cFunction === "MAX" )
{
if ( i === 0 || val > ret )
{
ret = val;
}
}
}
if ( cFunction === "AVG" )
{
ret /= cFields.length;
}
event.value = ret;
}

@ -0,0 +1,5 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="/script">
<file>builtin.js</file>
</qresource>
</RCC>

@ -10,6 +10,7 @@
#include "scripter.h"
#include <QtCore/QDebug>
#include <QFile>
#include "debug_p.h"
#include "script/executor_kjs_p.h"
@ -53,6 +54,21 @@ QString Scripter::execute( ScriptType type, const QString &script )
else
qDebug() << script.left( 1000 ) << "[...]";
#endif
static QString builtInScript;
if ( builtInScript.isNull() )
{
QFile builtInResource ( ":/script/builtin.js" );
if (!builtInResource.open( QIODevice::ReadOnly ))
{
qCDebug(OkularCoreDebug) << "failed to load builtin script";
}
else
{
builtInScript = QString::fromUtf8( builtInResource.readAll() );
builtInResource.close();
}
}
switch ( type )
{
case JavaScript:
@ -60,7 +76,7 @@ QString Scripter::execute( ScriptType type, const QString &script )
{
d->m_kjs = new ExecutorKJS( d->m_doc );
}
d->m_kjs->execute( script, d->m_event );
d->m_kjs->execute( builtInScript + script, d->m_event );
break;
}
return QString();

Loading…
Cancel
Save